본문 바로가기

IT/C언어

C언어 예제 - 프로젝트 회사 프로그램 만들기(4)

안녕하세요!

오늘은 프로젝트 회사 프로그램 만들기(4)를 진행하겠습니다.

 

일단 전 시간들을 통해서 프로젝트 보기, 프로젝트 생성, 프로젝트 삭제 기능을 구현했습니다.

하지만 프로젝트를 완료 시키고 완료된 프로젝트를 보는 것이 없어서 이번 시간에 구현을 시키도록 하겠습니다.

1편

kegums.tistory.com/10

2편

kegums.tistory.com/11

3편

kegums.tistory.com/12

 

먼저 소스코드를 보실까요?

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
#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][900][200];
    char Project_Title[4][900][30];
    //두개의 변수 더 선언(완료용)
    char Project_fin_Title[4][100][200];
    char Project_fin_Contents[4][100][30];
    int N, K, i;
    int _W = 0, _C = 0, _Cpp = 0, _J = 0*_N = 0;
    int _FW = 0, _FC = 0, _FCpp = 0, _FJ = 0*_FN=0;
    int del, fin;
    while (1) {
        printf("프로젝트 종류를 선택하여 주세요. Web : 0, C : 1, C++ : 2, JAVA : 3\n");
        scanf_s("%d"&N);
        if (N > 3 || N < 0) { printf("잘못된 종류를 입력하셨습니다.\n"); continue; }
        printf("1. 프로젝트 보기 2. 프로젝트 생성 3. 프로젝트 삭제 4. 프로젝트 완료 5. 프로젝트 완료 보기\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]);
                }
                if (_W == 0printf("생성된 프로젝트가 없습니다.\n");
                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]);
                }
                if (_C == 0printf("생성된 프로젝트가 없습니다.\n");
                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]);
                }
                if (_Cpp == 0printf("생성된 프로젝트가 없습니다.\n");
                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]);
                }
                if (_J == 0printf("생성된 프로젝트가 없습니다.\n");
                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);
            //포인터 이용해서 코드 줄이기
            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)--;
                printf("프로젝트 삭제가 완료되었습니다.");
            }
            else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
        }
        //TODO
        else if (K == 4) {
            printf("프로젝트 보기를 통해 완료할 프로젝트 번호를 입력해주세요(index입력) : ");
            scanf_s("%d"&fin);
            //포인터 이용해서 코드 줄이기
            N == 0 ? _N = &_W : N == 1 ? _N = &_C : N == 2 ? _N = &_Cpp : N == 3 ? _N = &_J : printf("X");
            N == 0 ? _FN = &_FW : N == 1 ? _FN = &_FC : N == 2 ? _FN = &_FCpp : N == 3 ? _FN = &_FJ : printf("X");
            if (project[N][fin] == 1) {
                strcpy_s(Project_fin_Title[N][*_FN], 30, Project_Title[N][fin]);
                strcpy_s(Project_fin_Contents[N][(*_FN)++], 200, Project_Contents[N][fin]);
                //완료하는 원소가 처음일 경우에
                if (fin == 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 (fin == *_N - 1) {
                    //완료하는 원소가 마지막일 경우에
                }
                else {
                    //완료하는 원소가 중간에 있을 경우에
                    for (i = fin + 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)--;
                printf("프로젝트 완료를 성공적으로 했습니다.");
            }
            else printf("생성이 안 되어 있는 프로젝트 번호(index)입니다. 확인해주세요\n");
        }
        //TODO
        else if (K == 5) {
            printf("프로젝트 완료 보기 메뉴를 선택하셨습니다.\n");
            switch (N) {
            case 0:
                printf("Web을 선택하셨습니다.\n");
                for (i = 0; i < _FW; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_fin_Title[0][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_fin_Contents[0][i]);
                }
                if (_FW == 0printf("생성된 프로젝트가 없습니다.\n");
                break;
            case 1:
                printf("C를 선택하셨습니다.\n");
                for (i = 0; i < _FC; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_fin_Title[1][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_fin_Contents[1][i]);
                }
                if (_C == 0printf("생성된 프로젝트가 없습니다.\n");
                break;
            case 2:
                printf("Cpp를 선택하셨습니다.\n");
                for (i = 0; i < _FCpp; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_fin_Title[2][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_fin_Contents[2][i]);
                }
                if (_FCpp == 0printf("생성된 프로젝트가 없습니다.\n");
                break;
            case 3:
                printf("JAVA를 선택하셨습니다.\n");
                for (i = 0; i < _FJ; i++) {
                    printf("프로젝트 제목[%d] : %s\n", i, Project_fin_Title[3][i]);
                    printf("프로젝트 내용[%d] : %s\n", i, Project_fin_Contents[3][i]);
                }
                if (_FJ == 0printf("생성된 프로젝트가 없습니다.\n");
                break;
            }
        }
        else printf("보기에 없는 메뉴입니다. 다시 입력해주세요!\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Line 12 ~ 13 : 프로젝트를 완료 하였을 때 그 프로젝트들을 저장하기 위해 변수 두개를 할당했습니다.

 

Line 16 ~ 17 : 각 프로젝트(Web,C,Cpp,Java)마다 프로젝트가 몇개가 있는지 조사할 변수들을 선언하고 0으로 초기화 했습니다. 그리고 완료할 프로젝트의 숫자를 입력 받기 위해서 fin 변수를 선언했습니다.

 

Line 130 ~ 162 : 저번에 삭제 시간에 포인터를 통해서 소스를 더 짧게 줄일 수가 있다고 했죠? 그걸 그대로 복사하여 완료 기능을 위해 사용했습니다. 달라진 점은 _FN 포인터 변수를 이용하여서 각 프로젝트의 개수를 저장했습니다. 저번 시간에는 _N을 통해서 저장을 했었죠? 딱히 달라진 점이 없습니다. 달라진 점은 Line 137 ~ 138에서 완료할 프로젝트를 저장할 변수에 옮기고 개수를 줄여주고 늘여주는 작업 밖에 하지 않았습니다.

 

Line 163 : //TODO라는 표시를 통해 '이거는 해야할 일이다.'라는 주석을 단 것입니다. 이렇게 할 경우 나중에 다른 코드를 짜다가 해야될 것이 무엇이 있는지 쉽게 Ctrl+F키로 찾으실 수 있습니다. 또한 다른 개발자랑 협업을 할 때에도 어떤걸 해야하는지 알기 쉽게 되겠죠?

 

Line 164 ~ 200 : 프로젝트 보기입니다. 이것도 사실 포인터를 통해서 코드를 더 짧게 줄일 수 있는데 이미 위에서 만들어 놓은 프로젝트 보기 코드가 있기 때문에 그 코드를 그대로 복사해서 사용한 것입니다. if문의 제어문에서 완료를 위한 개수로 바꾸고 출력을 할 때에 완료 변수들에 담아놓은 것을 출력하도록 한 것입니다. 그렇게 된다면 1번 프로젝트 보기 처럼 잘 출력이 되겠죠?

 

출력창을 한번 보실게요~

먼저 2번 보기인 프로젝트 생성을 통해

1번 프로젝트(index : 0)에 프로젝트 제목 1 프로젝트 내용 eee를 넣었습니다.

2번 프로젝트(index : 1)에 프로젝트 제목 2 프로젝트 내용 eee를 넣었습니다.

3번 프로젝트(index : 2)에 프로젝트 제목 3 프로젝트 내용 aaa를 넣었습니다.

4번 프로젝트(index : 3)에 프로젝트 제목 4 프로젝트 내용 aaa를 넣었습니다.

다음으로 4번 보기인 프로젝트 완료를 통해 3을 입력하여 4번 프로젝트(index : 3)을 완료 프로젝트로 넣었습니다.

이 후에 5번 보기인 프로젝트 완료 보기를 통해 완료된 프로젝트인 4번 프로젝트가 출력되도록 했습니다.

 

실제적으로 프로젝트 완료 4번 프로젝트 완료 보기 5번 기능을 앞에서 미리 짜놓은 소스코드를 통해 쉽게 구현할 수 있습니다. 대부분의 프로그래밍도 마찬가지입니다. 이제 필요한 기능들을 다 구현을 했으니 다음 시간에 함수화만 남았네요! 솔직히 이정도 코드만 짜더라도 대학교 2학년 수준까지는 올라갔다고 보실 수 있습니다. 아직 갈 길이 먼데 어떻게 그렇냐 생각하실 수도 있을텐데 대학교 1년 내내 C언어를 배워도 어떠한 문제가 주어졌을 때 그걸 해결할 수 있는 사람이 몇이나 될까요? 제가 아는 대부분의 1학년 친구들은 문법적인 부분에만 집중하고 시험 성적을 높이기 위해서 외우다 시피 하고 있습니다. 영어를 배운다고 칩시다. 영어 독해, 작문, 회화 등 여러가지가 있겠죠. 그런데 영어 문법만 배운다고 해서 독해실력이 늘고 작문실력이 늘고 회화실력이 늘까요? 여러가지 예제나 흉내를 내면서 실력이 늡니다. 즉, 컴퓨터도 여러가지 예제와 잘 모르겠으면 따라 코딩 해보기를 통해서 실력이 상승하지 않을까요?

 

문법에 대해서 잘 모르시겠으면 천천히 타이핑 해보시고 '이게 왜 이렇게 되는걸까?'라는 생각을 통해서 생각의 폭이 넓어지셨으면 좋겠습니다! 다음 시간에는 함수화에 대해서 배우도록 하겠습니다!