picture from Shutterstock
C++로 성적 입/출력 프로그램을 만들었습니다.
포인터를 사용하고, 메모리 동적 할당을 사용하여 메모리를 할당하여 프로그램을 작성하였습니다.
(메인함수)
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 |
#include<iostream>
using namespace std;
void input(char *p_name, int *p_score, float *p_avg, int num);
void output(char *p_name, int *p_score, float *p_avg, int num);
int main() {
int num = 0;
int sel = 0;
int *score = NULL; //포인터의 초기화
char *name = NULL;
float *avg = NULL;
//메인 반복문
while (sel != 3) {
cout << "무엇을 하시겠습니까?" << endl;
cout << "1. 입력\t" << "2. 출력\t" << "3. 종료" << endl;
cin >> sel;
switch (sel) {
case 1: cout << "몇명의 성적을 입력하시겠습니까?" << endl;
cin >> num;
name = new char[num * 10];
score = new int[num * 4];
avg = new float[num];
input(name, score, avg, num); break; //정보 입력
case 2: output(name, score, avg, num); break; //정보 출력
case 3: delete []name;
delete []score;
delete []avg;
cout << "종료합니다" << endl;
exit(-1);
default: cout << "잘못된 입력입니다" << "\n" << endl;
}
}
}
|
cs |
while문을 사용하여 sel의 입력이 3이 아닐때까지 반복하게 하였습니다.
case 1 : 1을 입력하게되면 몇명의 성적을 입력받을것인지 물어본 후
인원수(num)를 입력하게 되면 24~26번줄에서 동적 메모리 할당을 합니다.
그 후 28번줄에서 input(입력)으로 들어갑니다.
case 2 : 2를 입력하게 되면 output(출력)으로 들어갑니다.
case 3 : 32~34번줄에서 각 변수의 메모리를 해제하고 종료합니다.
defalut : 그 외에 숫자를 입력하게 되면 "잘못된 입력입니다"라고 메세지를 출력 한 후 다시 while문의 처음으로 돌아갑니다.
(입력함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
void input(char *p_name, int *p_score, float *p_avg, int num) { //정보 입력
for (int i = 0; i < num; i++) {
cout << "이름을 입력하세요" << endl;
cin >> p_name ;
p_score[3] = 0;
for (int j = 0; j < 3; j++) {
cout << "성적을 입력하세요(국어, 영어, 수학)" << endl;
cin >> p_score[j];
p_score[3] += p_score[j];
}
p_avg[0] = p_score[3] / 3.f;
p_name += 10;
p_score += 4;
p_avg += 1;
}
} |
cs |
입력함수 부분입니다.
1에 들어오며 인원수를 입력받은 만큼 반복하도록 for문을 사용하였습니다.
그 후 이름의 입력을 받고 p_name에 입력을 합니다.
p_score[3]은 성적의 총합을 넣을 곳인데 0으로 초기화를 시켜줍니다. 그렇지않으면 쓰레기값이 들어가 오류가 발생합니다.
첫번째 반복문 안에 하나의 반복문을 더 만들어 성적을 3개(국,영,수)를
입력할 수 있도록 합니다.
그리고 p_score[3]에 각각의 성적을 더하여 넣었습니다.
반복문이 끝나고 밖으로 나와 p_avg[0]에 총합을 3으로 나누어 평균값을 구합니다.
그리고 포인터의 위치를 p_name 10, p_score 4, p_avg, 1만큼씩 옮겨줍니다.
(출력함수)
1
2
3
4
5
6
7
8
9
10
11
12 |
void output(char *p_name, int *p_score, float *p_avg, int num) { //정보 출력
for (int i = 0; i < num; i++) {
cout << "이름 : " << p_name << endl;
for (int j = 0; j < 4; j++) {
cout << "\t" << p_score[j];
}
cout << "\t" << *p_avg << endl;
p_score += 4;
p_name += 10;
p_avg += 1;
}
} |
cs |
출력함수 부분입니다.
반복문을 이용하여 입력함수에서 넣은 정보들을 모두 출력합니다.
(메인함수의 case 3 종료부분)
1
2
3
4
5 |
case 3: delete []name;
delete []score;
delete []avg;
cout << "종료합니다" << endl;
exit(-1); |
cs |
메인함수 case 3 종료부분입니다.
동적메모리는 할당 한 후 종료하기 전 메모리를 해제해주어야합니다.
동적메모리를 할당하게 된다면 사용자가 해제하기 전까지 계속적으로 할당되므로 delete를 사용하여 해제해주어야 합니다.
delete는 하나의 메모리를 해제할 때 사용합니다.
delete [ ] 는 배열을 해제할 때 사용합니다.
'Programming > C++' 카테고리의 다른 글
(C++) 생성자 함수란 무엇일까? (0) | 2018.03.08 |
---|---|
(C++) 성적 입/출력 다차원 프로그램 (0) | 2018.03.07 |
(C++) 오버로딩(overloading)이란?? (0) | 2018.03.07 |
(C++) \t, 공백 언제까지 다 치고있을건가요? (setw) (3) | 2018.03.06 |
(C++) 표준 입/출력방법<cout, cin> (1) | 2018.03.06 |