※요구 사항
- 구조체 배열 선언할 것
- 과목명, 학생수, 성적은 파일에서 읽어 들인다
- 파일의 구조는 아래와 같음
컴퓨터프로그래밍
10
88 92 48 59 100 38 42 10 95 79
인터넷실습
12
73 49 100 91 85 38 96 85 28 77 90 56
... 이런 식으로 5과목에 대한 데이터를 파일에 저장한다.
- 코딩 시 아래 내용 참조
int main() { dcourse class[5]; ifstream fin(“data.txt”); for (int i = 0; i < 5; i++) process(fin, class[i]); return 0; } void process(ifstream &fin, dcourse &m) { /* 한 과목에 대한 과목명, 학생수, 성적을 입력 받아 평균을 구하여 출력하는 코드가 여기에 옴 */ }
완성된 화면
- 전체코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
//#include <cstring>
#define class_num 5
using namespace std;
struct dcourse {
char* name;
int nsize;
int* score;
};
void process(ifstream& fin, dcourse& m);
int main() {
dcourse Class[class_num];
ifstream fin("data.txt");
if (fin.fail()) {
cerr << "파일 열기 에러" << endl; return 1;
}
for (int i = 0; i < class_num; i++) process(fin, Class[i]);
for (int i = 0; i < class_num; i++) {
delete[] Class[i].name;
delete[] Class[i].score;
}
return 0;
}
int length(char* s) {
int len = 0;
while (*s++ != '\0') len++;
return len;
}
char* copy(char* s) {
int len = length(s);
char* p = new char[len];
for (int i = 0; i < len; i++) p[i] = s[i];
return p;
}
void process(ifstream& fin, dcourse& m) {
char name[32];
fin >> name;
m.name = copy(name); //strcpy(m.name, name);
fin >> m.nsize;
m.score = new int[m.nsize];
int sum = 0;
for (int j = 0; j < m.nsize; j++) {
fin >> m.score[j];
sum += m.score[j];
}
int result = sum / m.nsize;
cout << "과목: " << m.name << " 평균점수: " << result << endl;
}
- length(char* s)
int length(char* s) { int len = 0; while (*s++ != '\0') len++; return len; }
포인터로 받은 name배열에서 개행문자가 나올때까지 len에 1을 더하고, 결과값 len을 리턴하는 함수
- char* copy(char* s)
char* copy(char* s) { int len = length(s); char* p = new char[len]; for (int i = 0; i < len; i++) p[i] = s[i]; return p; }
len함수를 이용해서 얻은 name의 길이만큼을 동적할당해주고 for문을 사용하여 포인터로 받은 name배열에서 한글자씩 새로운 char배열에 저장해준다. 그리고 새롭게 name의 크기만큼 복사된 배열을 return해준다.
결과적으로 class구조체에서 name포인터는 copy함수에서 리턴된 p라는 배열을 가르키고 있다.
- void process(ifstream& fin, dcourse& m)
void process(ifstream& fin, dcourse& m) { char name[32]; fin >> name; m.name = copy(name); //strcpy(m.name, name); fin >> m.nsize; m.score = new int[m.nsize]; int sum = 0; for (int j = 0; j < m.nsize; j++) { fin >> m.score[j]; sum += m.score[j]; } int result = sum / m.nsize; cout << "과목: " << m.name << " 평균점수: " << result << endl; }
구조체에 값을 저장하고, 평균을 출력하는 함수
배운 점, 느낀 점
포인터나 클래스를 사용할때, 데이터가 사용되는 것을 어림짐작으로 생각하고 사용하였는데, 과제를 하면서 구조를 직접 그려보고 더 확실하게 이해할 수 있었다. 앞으로도 포인터가 사용되는 것을 그려보면서 활용해야겠다.
그런데 교수님이 주신 파일구조의 과목명은 한글로 되어있는데 강의시간에 설명해주신 프로그램과 같이 char을 활용하면 아스키코드에 한글이 없기때문에 제대로 출력이 되지않는다. 그래서 data.txt에 영어로 바꿔서 실행하긴 했지만..
'학교생활!' 카테고리의 다른 글
[230414] 자료구조 과제4: LinkedList클래스 (0) | 2023.04.17 |
---|---|
[230325]컴퓨터 구조: Bit-Level Representations and Manipulations in C (0) | 2023.04.07 |
[230330]자료구조 과제3: Print (0) | 2023.04.02 |
[230325]자료구조 과제2: BankAccount (1) | 2023.03.25 |
[220619]파이썬 실습문제: 전화번호부 프로그램 (0) | 2022.08.08 |