IT/C언어

C언어 예제 - 프로젝트 회사 프로그램(3) 포인터, if, switch-case문 사용하기

케굼스 2020. 4. 7. 13:39

안녕하세요!

오늘은 프로젝트 삭제 기능을 구현해보기로 할거에요!

코드가 230줄 정도 되는데 뭔가 많아보입니다.

왜냐하면 함수로 기능을 나눠서 짠 것이 아니라 그냥 주먹구구식으로 짠거여서 그래요!

내일 함수로 다 만들테니까 끝까지 따라와주세요!

만약 프로젝트 생성 기능 및 보기 기능이 궁금하시다면 아래 링크에서 공부하시면 됩니다!

 

프로젝트 회사 프로그램 만들기(1)

https://kegums.tistory.com/10

프로젝트 회사 프로그램 만들기(2)

https://kegums.tistory.com/11

먼저 소스코드를 보실게요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <stdio.h>
#include <string.h>//본문, 제목 옮기기 위해서 선언
#define Web 0
#define C 1
#define Cpp 2
#define JAVA 3
int main() {
    int project[4][1000];
    char Project_Contents[4][1000][200];
    char Project_Title[4][1000][30];
    int N, K,i;
    int _W = 0, _C = 0, _Cpp = 0, _J = 0,*_N=0;
    int del,fin;
    while (1) {
        printf("프로젝트 종류를 선택하여 주세요. Web : 0, C : 1, C++ : 2, JAVA : 3\n");
        scanf_s("%d"&N);
        printf("1. 프로젝트 보기 2. 프로젝트 생성 3. 프로젝트 삭제\n");
        scanf_s("%d"&K);
        //프로젝트 보기
        if (K == 1) {
            printf("프로젝트 보기 메뉴를 선택하셨습니다.\n");
            switch (N) {
            case 0:
                printf("Web을 선택하셨습니다.\n");
                for (i = 0; i < _W; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_Title[0][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_Contents[0][i]);
                }
                break;
            case 1:
                printf("C를 선택하셨습니다.\n");
                for (i = 0; i < _C; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_Title[1][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_Contents[1][i]);
                }
                break;
            case 2:
                printf("Cpp를 선택하셨습니다.\n");
                for (i = 0; i < _Cpp; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_Title[2][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_Contents[2][i]);
                }
                break;
            case 3:
                printf("JAVA를 선택하셨습니다.\n");
                for (i = 0; i < _J; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_Title[3][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_Contents[3][i]);
                }
                break;
            }
        }
        //프로젝트 생성
        else if (K == 2) {
            switch (N) {
            case 0:
                printf("Web을 선택하셨습니다.\n"); project[Web][_W] = 1;
                printf("프로젝트 제목을 입력해주세요(15자이내) : ");
                scanf_s(" %[^\n]s", Project_Title[Web][_W], 30);
                printf("프로젝트 내용을 입력해주세요(100자이내) : ");
                scanf_s(" %[^\n]s", Project_Contents[Web][_W++], 100);
                break;
            case 1:
                printf("C를 선택하셨습니다.\n"); project[C][_C] = 1;
                printf("프로젝트 제목을 입력해주세요(15자이내) : ");
                scanf_s(" %[^\n]s", Project_Title[C][_C], 30);
                printf("프로젝트 내용을 입력해주세요(100자이내) : ");
                scanf_s(" %[^\n]s", Project_Contents[C][_C++], 100);
                break;
            case 2:
                printf("Cpp를 선택하셨습니다.\n"); project[Cpp][_Cpp] = 1;
                printf("프로젝트 제목을 입력해주세요(15자이내) : ");
                scanf_s(" %[^\n]s", Project_Title[Cpp][_Cpp], 30);
                printf("프로젝트 내용을 입력해주세요(100자이내) : ");
                scanf_s(" %[^\n]s", Project_Contents[Cpp][_Cpp++], 100);
                break;
            case 3:
                printf("JAVA를 선택하셨습니다.\n"); project[JAVA][_J] = 1;
                printf("프로젝트 제목을 입력해주세요(15자이내) : ");
                scanf_s(" %[^\n]s", Project_Title[JAVA][_J], 30);
                printf("프로젝트 내용을 입력해주세요(100자이내) : ");
                scanf_s(" %[^\n]s", Project_Contents[JAVA][_J++], 100);
                break;
            defaultprintf("잘못된 프로젝트 종류를 입력하셨습니다. 다시 처음으로 돌아갑니다.\n");
                break;
            }
        }
        //프로젝트 삭제
        else if (K == 3) {
            printf("프로젝트 보기를 통해 삭제할 프로젝트 번호를 입력해주세요(index입력) : ");
            scanf_s("%d"&del);
            switch (N) {
            case 0:
                //삭제할 원소가 있을 경우에 진행
                if (project[Web][del]==1) {
                    printf("Web 프로젝트에서의 삭제가 진행됩니다.\n");
                    //삭제하는 원소가 처음일 경우에
                    if (del == 0) {
                        for (i = 1; i < _W; i++) {
                            //프로젝트 제목, 내용 복사
                            strcpy_s(Project_Title[Web][i - 1], 30,Project_Title[Web][i]);
                            strcpy_s(Project_Contents[Web][i - 1], 200,Project_Contents[Web][i]);
                        }
                    }
                    else if (del == _W - 1) {
                        //삭제하는 원소가 마지막일 경우에
                    }
                    else {
                        //삭제하는 원소가 중간에 있을 경우에
                        for (i = del + 1; i < _W; i++) {
                            strcpy_s(Project_Title[Web][i - 1], 30,Project_Title[Web][i]);
                            strcpy_s(Project_Contents[Web][i - 1], 200,Project_Contents[Web][i]);
                        }
                    }
                    project[Web][_W - 1= 0;
                    _W--;
                }
                else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
                break;
            case 1:
                if (project[C][del] == 1) {
                    printf("C 프로젝트에서의 삭제가 진행됩니다.\n");
                    //삭제하는 원소가 처음일 경우에
                    if (del == 0) {
                        for (i = 1; i < _C; i++) {
                            //프로젝트 제목, 내용 복사
                            strcpy_s(Project_Title[C][i - 1], 30, Project_Title[C][i]);
                            strcpy_s(Project_Contents[C][i - 1], 200, Project_Contents[C][i]);
                        }
                    }
                    else if (del == _C - 1) {
                        //삭제하는 원소가 마지막일 경우에
                    }
                    else {
                        //삭제하는 원소가 중간에 있을 경우에
                        for (i = del + 1; i < _C; i++) {
                            strcpy_s(Project_Title[C][i - 1], 30, Project_Title[C][i]);
                            strcpy_s(Project_Contents[C][i - 1], 200, Project_Contents[C][i]);
                        }
                    }
                    project[C][_C - 1= 0;
                    _C--;
                }
                else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
                break;
            case 2:
                if (project[Cpp][del] == 1) {
                    printf("Cpp 프로젝트에서의 삭제가 진행됩니다.\n");
                    //삭제하는 원소가 처음일 경우에
                    if (del == 0) {
                        for (i = 1; i < _Cpp; i++) {
                            //프로젝트 제목, 내용 복사
                            strcpy_s(Project_Title[Cpp][i - 1], 30, Project_Title[Cpp][i]);
                            strcpy_s(Project_Contents[Cpp][i - 1], 200, Project_Contents[Cpp][i]);
                        }
                    }
                    else if (del == _Cpp - 1) {
                        //삭제하는 원소가 마지막일 경우에
                    }
                    else {
                        //삭제하는 원소가 중간에 있을 경우에
                        for (i = del + 1; i < _Cpp; i++) {
                            strcpy_s(Project_Title[Cpp][i - 1], 30, Project_Title[Cpp][i]);
                            strcpy_s(Project_Contents[Cpp][i - 1], 200, Project_Contents[Cpp][i]);
                        }
                    }
                    project[Cpp][_Cpp - 1= 0;
                    _Cpp--;
                }
                else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
                break;
            case 3:
                if (project[JAVA][del] == 1) {
                    printf("JAVA 프로젝트에서의 삭제가 진행됩니다.\n");
                    //삭제하는 원소가 처음일 경우에
                    if (del == 0) {
                        for (i = 1; i < _J; i++) {
                            //프로젝트 제목, 내용 복사
                            strcpy_s(Project_Title[JAVA][i - 1], 30, Project_Title[JAVA][i]);
                            strcpy_s(Project_Contents[JAVA][i - 1], 200, Project_Contents[JAVA][i]);
                        }
                    }
                    else if (del == _J - 1) {
                        //삭제하는 원소가 마지막일 경우에
                    }
                    else {
                        //삭제하는 원소가 중간에 있을 경우에
                        for (i = del + 1; i < _J; i++) {
                            strcpy_s(Project_Title[JAVA][i - 1], 30, Project_Title[JAVA][i]);
                            strcpy_s(Project_Contents[JAVA][i - 1], 200, Project_Contents[JAVA][i]);
                        }
                    }
                    project[JAVA][_J - 1= 0;
                    _J--;
                }
                else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
                break;
            }
            /*
            //포인터 이용해서 코드 줄이기
            N == 0 ? _N = &_W : N == 1 ? _N = &_C : N == 2 ? _N = &_Cpp : N == 3 ? _N = &_J : printf("X");
            if (project[N][del] == 1) {
                    //삭제하는 원소가 처음일 경우에
                    if (del == 0) {
                        for (i = 1; i < *_N; i++) {
                            //프로젝트 제목, 내용 복사
                            strcpy_s(Project_Title[N][i - 1], 30, Project_Title[N][i]);
                            strcpy_s(Project_Contents[N][i - 1], 200, Project_Contents[N][i]);
                        }
                    }
                    else if (del == *_N - 1) {
                        //삭제하는 원소가 마지막일 경우에
                    }
                    else {
                        //삭제하는 원소가 중간에 있을 경우에
                        for (i = del + 1; i < *_N; i++) {
                            strcpy_s(Project_Title[N][i - 1], 30, Project_Title[N][i]);
                            strcpy_s(Project_Contents[N][i - 1], 200, Project_Contents[N][i]);
                        }
                    }
                    project[N][*_N - 1] = 0;
                    (*_N)--;
                }
                else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
            //
            */
        }
    }
    return 0;
}
 
cs

네.. 뭐가 엄청 길죠? 일단 생성하기, 보기 기능을 제외하고 설명을 드릴게요! 천천히 따라와주세요~

 

Line 89 : K가 3이 들어오면 프로젝트 삭제 기능이 동작하도록 한겁니다.


Line 90 ~ 91 : 프로젝트 보기를 통해 프로젝트의 인덱스를 알아내서 그 인덱스를 통해 삭제를 진행하는겁니다.


Line 95 : 만일 웹에서의 삭제할 프로젝트가 존재 한다면 내용을 진행하는 겁니다.


Line 98 ~ 104 : 주석이 달린대로 삭제하는 원소가 처음에 존재하는 경우에 진행합니다. 말 그대로 해석하자면 '만약 삭제하는 원소가 처음이라면 프로젝트의 개수 만큼 반복을 하는데 그 동안에는 strcpy_s함수를 동작시켜라' 입니다. 이 함수는 strcpy_s(Destination,Size,Source)식으로 사용이 되는데 해석하자면 '얼마만큼의 크기를 가진 Destination에 Source를 복사해라.'라는 의미입니다. C에서 문자열 대입이 안돼서 함수로 사용합니다.

Line 105~107 : '만약 del == _W-1이면 아무 것도 하지 말아라' 입니다. 이유는 삭제하는 원소가 마지막일 경우에는 마지막 부분만 건들면 돼서 이따가 if문이 끝나고 동작하는 것이 처리해줍니다.

Line 108~113 : 만약 다 아니라면 삭제하는 원소가 중간에 있다라는 의미입니다. 결국에 for문을 돌려서 하는데 특이하게 초기식에 del+1이 들어있습니다. 이 뜻은 삭제하려는 원소 다음번부터 복사를 진행한다는 의미입니다. strcpy_s함수에서 i-1의 위치에 i를 넣었으니 삭제하려는 원소는 없어지고 그 자리에 새로 del+1위치에 있던 값이 복사가 되겠지요? 그 이후도 마찬가지입니다.

Line 115~116 : 프로젝트에서 개수 -1의 값을 0으로 했습니다. 즉 제일 마지막에 있던 원소는 0으로 만든다.라는 의미입니다. 그리고 개수를 한개 줄여줬습니다. 이유가 무엇일까요? 앞의 작업에서 여러분들은 삭제를 하고 모든 인덱스를 앞으로 당기는 작업을 했습니다. 그렇게 되어서 마지막에 있는 원소는 필요가 없으니 그냥 0으로 해놓으시면 앞으로 프로젝트 생성을 하지 않는 이상은 사용할 일이 없습니다.

 

나머지 case도 다 똑같으니 생략하겠습니다!

 

Line 200 ~ 224 : 주석처리를 해놨습니다. 저거는 포인터를 사용해서 코드의 길이를 줄였습니다. 하나의 포인터 변수를 통해서  N == 0 ? _N = &_W : N == 1 ? _N = &_C : N == 2 ? _N = &_Cpp : N == 3 ? _N = &_J : printf("X"); 이런 식으로 값을 할당하고 그 할당한 값을 통하여 위에서 한 작업과 똑같이 한 것입니다. 이렇게 포인터 변수를 이용하게 된다면 코드의 길이를 줄이기도 쉽고 길이가 줄으면 그만큼 가독성이 높아집니다.

 

출력예시)

Web 프로젝트에서 프로젝트 3개를 생성하면 0,1,2 인덱스 총 세개로 생성이 되겠죠?

네 잘 됐네요! 그리고 이제 삭제를 진행해보겠습니다. 가운데에 있는 1번 인덱스를 제거할게요!

네 1번 인덱스에 있던 프로젝트 두번째가 사라지고 프로젝트 세번째가 1번인덱스로 왔어요! 자 이제 0번 인덱스 즉, 첫번째로 들어 있는 프로젝트를 삭제해볼게요!

네 잘 나오는게 보이시나요? 0번에서 0번째 인덱스를 삭제했더니 프로젝트 세번째가 0번째로 당겨지고 0번째 인덱스는 삭제가 되었어요! 마지막 인덱스를 삭제하는건 여러분이 직접 한번 해보세요!

 

오늘 내용은 조금 어려울거 같습니다. 일단 들어간 내용이 포인터, switch-case, if-else문, 조건부연산자,strcpy_s함수(string.h 파일 include 필요)입니다. 생각보다 별로 사용한게 없죠? 완료기능까지 넣으려고 했는데 너무 코드가 길어져버리네요.. 다음 시간에 다루고 다다음 시간에는 함수화 진행하도록 하겠습니다! 훨씬 더 어려운 문제도 많으니 하나씩 차근차근 공부하시길 응원하겠습니다!