1. Grade 함수로 구현하기
double grade(double midterm, double final, double homework) { return 0.2 * midterm + 0.4 * final + 0.4 * homework; }
2. median 함수로 구현하기
// vector<double>의 가운데 값을 구합니다. // 함수를 호출하면 인수로 제공된 벡터를 통째로 복사 double median(vector<double> vec) { typedef vector<double>::size_type vec_sz; vec_sz size = vec.size(); // 과제 점수의 유무 확인 if (size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size / 2; return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; }
3. grade()와 median() 함수를 코드에 적용하기
#include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <string> #include <vector> using namespace std; double grade(double midterm, double final, double homework) { return 0.2 * midterm + 0.4 * final + 0.4 * homework; } // vector<double>의 가운데 값을 구합니다. // 함수를 호출하면 인수로 제공된 벡터를 통째로 복사 double median(vector<double> vec) { typedef vector<double>::size_type vec_sz; vec_sz size = vec.size(); // 과제 점수의 유무 확인 if (size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size / 2; return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; } int main() { // 학생의 이름을 묻고 입력받음 cout << "이름을 입력하세요: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; // 중간시험과 기말시험의 점수를 묻고 입력받음 cout << "중간, 기말 시험 점수 입력(예 69.0 79.0): "; double midterm, final; cin >> midterm >> final; // 과제 점수를 물음 cout << "과제 점수 입력, ""마지막에 EOF(end-of-file)입력 : "; vector<double> homework; double x; // 불변성: homework는 지금까지 입력받은 과제 점수가 있음 while (cin >> x) homework.push_back(x); double median_value = median(homework); // 결과 출력 double result = grade(midterm, final, median_value); streamsize prec = cout.precision(); cout << "당신의 최종 점수는 \n" << setprecision(3) << result << '\n' // 총 세자리 정밀도 << fixed << setprecision(3) << result << '\n' //소수점 아래 3자리 << fixed << setprecision(prec) << result << '\n'//C++ 기본 6자리 << setprecision(prec) << '\n'; // 후속 출력 정밀도를 초기화 return 0; }
4. grade()함수를 수정하여 meian()함수 포함시키기
#include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <string> #include <vector> using namespace std; double grade(double midterm, double final, double homework); double median(vector<double> vec); double grade(double midterm, double final, const vector<double>& hw); int main() { // 학생의 이름을 묻고 입력받음 cout << "이름을 입력하세요: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; // 중간시험과 기말시험의 점수를 묻고 입력받음 cout << "중간, 기말 시험 점수 입력(예 69.0 79.0): "; double midterm, final; cin >> midterm >> final; // 과제 점수를 물음 cout << "과제 점수 입력, ""마지막에 EOF(end-of-file)입력 : "; vector<double> homework; double x; // 불변성: homework는 지금까지 입력받은 과제 점수가 있음 while (cin >> x) homework.push_back(x); // 결과 출력 double result = grade(midterm, final, homework); streamsize prec = cout.precision(); cout << "당신의 최종 점수는 \n" << setprecision(3) << result << '\n' // 총 세자리 정밀도 << fixed << setprecision(3) << result << '\n' //소수점 아래 3자리 << fixed << setprecision(prec) << result << '\n'//C++ 기본 6자리 << setprecision(prec) << '\n'; // 후속 출력 정밀도를 초기화 return 0; } // vector<double>의 가운데 값을 구합니다. // 함수를 호출하면 인수로 제공된 벡터를 통째로 복사 double median(vector<double> vec) { typedef vector<double>::size_type vec_sz; vec_sz size = vec.size(); // 과제 점수의 유무 확인 if (size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size / 2; return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; } double grade(double midterm, double final, double homework) { return 0.2 * midterm + 0.4 * final + 0.4 * homework; } // 중간시험, 기말시험, 과제 점수의 벡터로 학생의 종합 점수를 구함 // 이 함수는 인수를 복사하지 않고 median 함수가 해당 작업을 진행 double grade(double midterm, double final, const vector<double>& hw) { if (hw.size() == 0) throw domain_error("과제 데이터가 없습니다."); return grade(midterm, final, median(hw)); }
5. 과제 (homework) 자료 입력하기를 함수로 지정하기
// 입력 스트림에서 과제 점수를 읽어서 vector<double>에 넣음 istream& read_homework(istream& in, vector<double>& homework) { if (in) { //이전 내용 삭제 homework.clear(); //과제 점수 읽기 double x; // 불변성: homework는 지금까지 입력받은 과제 점수가 있음 while (in >> x) homework.push_back(x); in.clear(); } return in; }
#include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <string> #include <vector> using namespace std; double grade(double midterm, double final, double homework); double median(vector<double> vec); double grade(double midterm, double final, const vector<double>& hw); istream& read_homework(istream& in, vector<double>& homework); int main() { // 학생의 이름을 묻고 입력받음 cout << "이름을 입력하세요: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; // 중간시험과 기말시험의 점수를 묻고 입력받음 cout << "중간, 기말 시험 점수 입력(예 69.0 79.0): "; double midterm, final; cin >> midterm >> final; // 과제 점수를 물음 cout << "과제 점수 입력, ""마지막에 EOF(end-of-file)입력 : "; // 과제 자료 읽어오기 vector<double> homework; read_homework(cin, homework); // compute and generate the final grade, if possible try { double final_grade = grade(midterm, final, homework); streamsize prec = cout.precision(); cout << "당신의 최종 점수는 \n" << fixed << setprecision(3) << final_grade << '\n' //소수점 아래 3자리 << setprecision(prec) << '\n'; // 후속 출력 정밀도를 초기화 } catch (domain_error) { cout << endl << "점수를 다시 입력하세요" << endl; return 1; } return 0; } // vector<double>의 가운데 값을 구합니다. // 함수를 호출하면 인수로 제공된 벡터를 통째로 복사 double median(vector<double> vec) { typedef vector<double>::size_type vec_sz; vec_sz size = vec.size(); // 과제 점수의 유무 확인 if (size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size / 2; return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; } double grade(double midterm, double final, double homework) { return 0.2 * midterm + 0.4 * final + 0.4 * homework; } // 중간시험, 기말시험, 과제 점수의 벡터로 학생의 종합 점수를 구함 // 이 함수는 인수를 복사하지 않고 median 함수가 해당 작업을 진행 double grade(double midterm, double final, const vector<double>& hw) { if (hw.size() == 0) throw domain_error("과제 데이터가 없습니다."); return grade(midterm, final, median(hw)); } // 입력 스트림에서 과제 점수를 읽어서 vector<double>에 넣음 istream& read_homework(istream& in, vector<double>& homework) { if (in) { //이전 내용 삭제 homework.clear(); //과제 점수 읽기 double x; // 불변성: homework는 지금까지 입력받은 과제 점수가 있음 while (in >> x) homework.push_back(x); in.clear(); } return in; }
- 구조체로 학생 데이터 통합하기
struct Student_info{ string name; double midterm, final; vector<double> homework; }; //마지막에 세미콜론 붙여야함
-학생의 정보를 구조체로 입력받기
istream& read(istream& is, Student_info& s) { // 학생의 이름, 중간, 기말 시험 점수를 저장 is >> s.name >> s.midterm >> s.final; read_homework(is, s.homework); //학생의 모든 과제 점수를 읽어 저장 return is; }
- Student_info를 입력으로 하는 grade 함수의 overloading
double grade(const Student_info& s) { return grade(s.midterm, s.final, s.homework); }
- sort함수를 Student_info구조체에 사용하기 위해서는 마지막에 서술함수를 적용하여 사용할수있다.
bool compare(const Student_info& x, const Student_info& y) { return x.name < y.name; }
-합쳐진 코드
#include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <string> #include <vector> using namespace std; struct Student_info { string name; double midterm, finalterm; vector<double> homework; }; double grade(double midterm, double finalterm, double homework); double grade(double midterm, double finalterm, const vector<double>& hw); double grade(const Student_info& s); double median(vector<double> vec); istream& read_homework(istream& in, vector<double>& homework); istream& read(istream& is, Student_info& s); bool compare(const Student_info& x, const Student_info& y); int main() { vector<Student_info> students; Student_info record; string::size_type maxlen = 0; while (read(cin, record)) { maxlen = max(maxlen, record.name.size()); students.push_back(record); } sort(students.begin(), students.end(), compare); cout << endl; for (vector<Student_info>::size_type i = 0; i < students.size(); i++) { // 이름, 오른쪽 공백을 포함해서 maxlen+1 사이즈의 문자 출력 cout << students[i].name << string(maxlen + 1 - students[i].name.size(), ' '); //최종 점수 계산 후 출력 try { double final_grade = grade(students[i]); streamsize prec = cout.precision(); cout << "당신의 최종 점수는 : " << fixed << setprecision(3) << final_grade << setprecision(prec); } catch(domain_error e){ cout << e.what(); } cout << endl; } return 0; } double grade(double midterm, double finalterm, double homework) { return 0.2 * midterm + 0.4 * finalterm + 0.4 * homework; } double grade(double midterm, double finalterm, const vector<double>& hw) { if (hw.size() == 0) throw domain_error("과제 데이터가 없습니다."); return grade(midterm, finalterm, median(hw)); } double grade(const Student_info&s) { return grade(s.midterm,s.finalterm, s.homework); } double median(vector<double> vec) { // 과제 점수의 유무 확인 typedef vector<double>::size_type vec_sz; vec_sz size = vec.size(); if (size == 0) { throw domain_error("벡터가 비었습니다."); } // 점수를 정렬 sort(vec.begin(), vec.end()); // 과제 점수의 가운데값(median) 구함 vec_sz mid = size / 2; double output = size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; return output; } istream& read_homework(istream& in, vector<double>& homework) { if (in) { //이전 내용 삭제 homework.clear(); //과제 점수 읽기 double x; // 불변성: homework는 지금까지 입력받은 과제 점수가 있음 while (in >> x) homework.push_back(x); in.clear(); } return in; } istream& read(istream& is, Student_info& s) { is >> s.name >> s.midterm >> s.finalterm; read_homework(is, s.homework); return is; } bool compare(const Student_info& x, const Student_info& y) { return x.name < y.name; }
'PROGRAM > C++' 카테고리의 다른 글
CH5. 문자열 분할 (0) | 2020.08.20 |
---|---|
4. 프로그램 및 데이터 구조화 -2 (0) | 2020.08.18 |
CH03. 데이터 일괄처리 (0) | 2020.08.17 |
Hello Johns! 출력하기 (0) | 2020.08.16 |
입력한숫자만큼 별 출력하기(4자리수 한정) (0) | 2020.08.12 |