~cpp #ifndef CALCULATEGRADE_H_ #define CALCULATEGRADE_H_ #include "Student.h" class CalculateGrade { private: static const int NUM_STUDENT; // 학생 수(상수 멤버) Student * student; // 학생들의 배열 포인터 public: CalculateGrade(); // 생성자 void sort_student(); // 평점으로 정렬 void show_good_student(); // 장학생 명단 출력 void show_bad_student(); // 학고 명단 출력 ~CalculateGrade(); // 파괴자 }; #endif
~cpp #include <iostream> using namespace std; #include "CalculateGrade.h" // 상수멤버 초기화 // - 배열 인덱스를 1부터 쓰기 위해 학생 수보다 하나 더 크게 잡는다. const int CalculateGrade::NUM_STUDENT = 121; // 생성자 CalculateGrade::CalculateGrade() { // 학생 배열을 동적 할당 student = new Student[NUM_STUDENT]; // 점수를 입력받아 객체배열의 멤버를 초기화 for (int i = 1; i < NUM_STUDENT; i++) student[i].input_grade(); } // 평점으로 정렬시킨다. void CalculateGrade::sort_student() { int p; Student temp; for (int i = 1; i < NUM_STUDENT; i++) { p = i; for (int j = i + 1; j < NUM_STUDENT; j++) { if (student[p].average < student[j].average) p = j; } temp = student[i]; student[i] = student[p]; student[p] = temp; } } // 장학생(상위 10%) 의 명단을 보인다. void CalculateGrade::show_good_student() { int num = NUM_STUDENT / 10; sort_student(); cout << "장학생 명단\n"; for (int i = 1; i <= num; i++) student[i].show(); cout << "\n\n"; } // 학고(학점 1.5미만)의 명단을 보인다. void CalculateGrade::show_bad_student() { cout << "학고 명단\n"; for (int i = 1; i < NUM_STUDENT; i++) { if (student[i].average < 1.5) student[i].show(); } cout << "\n\n"; } // 파괴자 CalculateGrade::~CalculateGrade() { delete [] student; }
~cpp #ifndef STUDENT_H_ #define STUDENT_H_ class Student { private: static const int NUM_GRADE; // 과목 수 (상수 멤버) int number; // 학번 double grade[4]; // 4과목 점수 public: double average; // 평점 Student(); // 생성자 void find_average(); // 평점을 구하는 함수 void input_grade(); // 점수을 입력받는 함수 void show(); // 출력함수 }; #endif
~cpp #include <iostream> #include <fstream> #include <cstring> using namespace std; #include "Student.h" // 상수 멤버의 초기화 const int Student::NUM_GRADE = 4; // 생성자 Student::Student() { average = 0.0; number = 0; } // 파일로부터 4과목 점수를 읽는다. void Student::input_grade() { static char alpa_grade[9][3] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"}; static double ital_grade[9] = {4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0.0}; static fstream fin("input.txt"); char str[3]; fin.ignore(100, ' '); // 사용자 지정 문자가 나올때까지 읽어 버리는 함수 fin >> number; fin.ignore(100, ':'); // 해당 학점을 double형 숫자로 1대 1 로 변환 시켜 입력 for (int i = 0; i < NUM_GRADE; i++) { fin >> str; // >> 은 white space(공백)을 무시한다. for (int j = 0; j < 9; j++) { if (strcmp(str, alpa_grade[j]) == 0) { grade[i] = ital_grade[j]; break; } } } fin.ignore(100, '\n'); find_average(); } // 4 과목 점수의 평점을 구한다. void Student::find_average() { double sum = 0.0; for (int i = 0; i < NUM_GRADE; i++) sum += grade[i]; average = sum / NUM_GRADE; } // 학생 정보를 출력한다. void Student::show() { cout << "학번 : " << number << " 평점 : " << average << endl; }
~cpp #include "CalculateGrade.h" int main() { CalculateGrade test; test.show_good_student(); test.show_bad_student(); return 0; }