반응형
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
|
#include <iostream>
#define NAME_SIZE 32
#define STUDENT_MAX 10
#define PHONENUMBER_MAX 128
struct Student {
char name[NAME_SIZE];
char phone[PHONENUMBER_MAX];
int number;
int korScore;
int engScore;
int mathScore;
int totalScore;
float avg;
};
enum MENU {
MENU_INSERT = 1,
MENU_DELETE,
MENU_SEARCH,
MENU_OUTPUT,
MENU_EXIT
};
int main() {
Student studentArr[STUDENT_MAX] = {};
char studentName[NAME_SIZE] = {};
int studentCount = 0;
int studentNum = 1;
int menu;
while (true) {
system("cls");
if (studentCount >= STUDENT_MAX) break;
// 메뉴를 출력한다.
std::cout << "1. 학생 등록" << std::endl;
std::cout << "2. 학생 삭제" << std::endl;
std::cout << "3. 학생 검색" << std::endl;
std::cout << "4. 학생 출력" << std::endl;
std::cout << "5. 종료" << std::endl;
std::cout << "메뉴를 선택하세요 : ";
std::cin >> menu;
/*
cin은 입력받을 변수의 타입에 맞춰서 값을 입력해야 한다.
변수의 타입에 맞지 않게 값을 입력할 경우 에러가 발생한다.
따라서 예외처리로 에러가 발생했는지를 체크하여 에러가 발생하면
cin 내부의 에러버퍼를 비워주고 cin 내부의 입력버퍼를 순회하여 버퍼 내부의 \n을 지워준다.
(cin은 내부의 입력버퍼에 입력한 값을 저장해두고, 그 값을 변수에 넣어주는 역할을 한다.)
*/
if (std::cin.fail()) {
std::cin.clear(); // 입력버퍼 비워주기
// 입력버퍼에 남아있는 \n 검색 후 삭제
// 첫번째 인자는 검색하고자 하는 버퍼 크기. 여기서는 1024로 큰 값을 넉넉하게 설정해둠.
// 두번째 인자는 찾고자 하는 문자.
// 입력버퍼 처음부터 \n이 있는 곳까지 찾아서 그 부분을 모두 삭제하여 다시 입력받을 수 있도록 해준다.
std::cin.ignore(1024, '\n');
continue;
}
if (menu == MENU_EXIT) break;
switch (menu) {
case MENU_INSERT:
system("cls");
std::cout << "================= 학생 추가 =================" << std::endl << std::endl;
// 학생 정보 추가. 이름, 전화번호, 국어, 영어, 수학 점수 까지는 입력받음
// 학번, 총점, 평균은 계산을 통해 구해준다.
std::cout << "이름 : ";
std::cin >> studentArr[studentCount].name;
std::cin.ignore(1024, '\n');
std::cout << "전화번호 : ";
std::cin.getline(studentArr[studentCount].phone, PHONENUMBER_MAX);
std::cout << "국어 성적 : ";
std::cin >> studentArr[studentCount].korScore;
std::cout << "영어 성적 : ";
std::cin >> studentArr[studentCount].engScore;
std::cout << "수학 성적 : ";
std::cin >> studentArr[studentCount].mathScore;
studentArr[studentCount].totalScore = studentArr[studentCount].korScore + studentArr[studentCount].engScore + studentArr[studentCount].mathScore;
studentArr[studentCount].avg = studentArr[studentCount].totalScore / 3.0f;
studentArr[studentCount].number = studentNum;
++studentCount;
++studentNum;
break;
case MENU_DELETE:
system("cls");
std::cout << "================= 학생 삭제 =================" << std::endl << std::endl;
std::cout << "삭제할 이름을 입력하세요 : ";
std::cin.ignore(1024, '\n');
std::cin.getline(studentName, NAME_SIZE);
for (int i = 0; i < studentCount; ++i) {
if (strcmp(studentName, studentArr[i].name) == 0) {
for (int j = i; j < studentCount - 1; ++j) {
studentArr[j] = studentArr[j + 1];
}
--studentCount;
std::cout << std::endl << "학생을 삭제하였습니다." << std::endl << std::endl;
break;
}
}
break;
case MENU_SEARCH:
system("cls");
std::cout << "================= 학생 검색 =================" << std::endl << std::endl;
std::cout << "검색할 이름을 입력하세요 : ";
std::cin.ignore(1024, '\n');
std::cin.getline(studentName, NAME_SIZE);
for (int i = 0; i < studentCount; ++i) {
if (strcmp(studentName, studentArr[i].name) == 0) {
std::cout << "이름 : " << studentArr[i].name << std::endl;
std::cout << "학번 : " << studentArr[i].number << std::endl;
std::cout << "전화번호 : " << studentArr[i].phone << std::endl;
std::cout << "국어 성적 : " << studentArr[i].korScore << std::endl;
std::cout << "영어 성적 : " << studentArr[i].engScore << std::endl;
std::cout << "수학 성적 : " << studentArr[i].mathScore << std::endl;
std::cout << "성적 총 합 : " << studentArr[i].totalScore << std::endl;
std::cout << "평균 : " << studentArr[i].avg << std::endl << std::endl;
break;
}
}
break;
case MENU_OUTPUT:
system("cls");
std::cout << "================= 학생 출력 =================" << std::endl << std::endl;
if (studentCount == 0) {
std::cout << std::endl << "등록된 학생이 없습니다." << std::endl << std::endl;
break;
}
for (int i = 0; i < studentCount; ++i) {
std::cout << "이름 : " << studentArr[i].name << std::endl;
std::cout << "학번 : " << studentArr[i].number << std::endl;
std::cout << "전화번호 : " << studentArr[i].phone << std::endl;
std::cout << "국어 성적 : " << studentArr[i].korScore << std::endl;
std::cout << "영어 성적 : " << studentArr[i].engScore << std::endl;
std::cout << "수학 성적 : " << studentArr[i].mathScore << std::endl;
std::cout << "성적 총 합 : " << studentArr[i].totalScore << std::endl;
std::cout << "평균 : " << studentArr[i].avg << std::endl<<std::endl;
}
break;
default:
std::cout << std::endl << "잘못된 메뉴를 선택하였습니다." << std::endl << std::endl;
break;
}
// pause 시키지 않으면 system("cls") 때문에 출력되는 내용이 전혀 보이지 않고 바로 사라짐.
// 따라서 pause 시켜서 프로그램을 잠시 멈추게 한다.
system("pause");
}
std::cout << std::endl << "프로그램이 종료되었습니다. " << std::endl;
return 0;
}
|
cs |
C/C++ 에서 구조체를 학습한 후 흔히들 실습하는 학생 관리 프로그램입니다.
관리 프로그램에는 학생 추가, 삭제, 검색, 출력 기능이 있습니다.
학생 개개인의 정보를 담을 구조체와 각 메뉴 번호를 저장할 열거형을 정의하였습니다.
학생들의 목록을 저장할 구조체 배열 studentArr
학생을 검색할 때, 학생의 이름을 입력할 문자열 studentName
현재까지 관리 프로그램에 저장된 학생의 수를 나타내는 studentCount
각 학생에게 지정해줄 학번 studentNum
사용자의 메뉴 선택을 저장할 menu
학생 삭제를 처리하는 코드입니다.
104~113 라인은 학생을 삭제한 후, 해당 학생 뒷번호에 있는 학생들을 모두 한칸씩 앞으로 이동해주는 코드입니다.
이와같이 배열은 하나의 요소를 중간에 삽입, 삭제한다면 뒤의 요소들을 모두 이동해주어야 할 필요가 생겨 삽입, 삭제가 빈번한 코드에는 사용을 자제하는 편이 좋습니다.
크게 어려운 내용을 다루지 않았고 대부분 반복문 조건문만 사용하여 제작된 프로그램입니다.
변수 네이밍 의도만 알고 코드를 따라가도 쉽게 이해할 수 있을 것이라 생각합니다.
또한, 코드에 주석도 작성되어 있으니 굳이 코드를 하나하나 분석하지는 않겠습니다.
궁금하거나 이상한 부분이 있다면 편하게 댓글로 지적해주세요.
감사합니다.
출처
(10) C언어/C++ 강의 21화 구조체를 이용한 학생관리프로그램 1 [어소트락 게임아카데미] - YouTube
반응형
'C,C++ > 코드정리' 카테고리의 다른 글
[C/C++] 미로 + 크레이지 아케이드 프로토타입 구현 (0) | 2022.09.26 |
---|---|
[C/C++] TextRPG 구현 (0) | 2022.09.16 |
[C/C++] 빙고 게임 AI 대전 (0) | 2022.09.08 |
[C/C++] 빙고 게임 구현 (0) | 2022.09.07 |
[C/C++] 숫자 퍼즐 게임 구현 (0) | 2022.09.07 |
댓글