Programing/C++, C
Accelerated C++ ch3.
미류[miryu17]
2010. 7. 31. 14:58
사용된 소스코드는 다음과 같다.
참고하여야 할 내용은
2. 불변식
각 라인에서 발생하는 상황은 아래 박스와 같다.
홀수 일때
짝수 일때

#include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <string> #include <vector> using std::cin; using std::sort; using std::cout; using std::streamsize; using std::endl; using std::string; using std::vector; using std::setprecision; int main() { // 학생의 이름을 요청하고 읽어들임 cout << "Please enter your first name: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; // 중간고사 및 기말고사 성적을 요청하고 읽어들임 cout << "Please, enter your midterm and final exam grade : "; double midterm, final; cin >> midterm >> final; // 과제성적을 요청하고 읽어들임 cout << "Enter all your homework grade, " "followed by end-of-file: "; vector<double> homework; double x; // 불변식 : homework는 모든 과제성적을 담습니다 while( cin >> x ) homework.push_back(x); // 학생이 과제성적을 입력했는지 확인 typedef vector<double>::size_type vec_sz; vec_sz size = homework.size(); if( size == 0 ) { cout << endl << "You must enter your grades." "Please try again." << endl; return 1; } // 성적 정렬 sort( homework.begin(), homework.end() ); // 과제 성적의 중앙 값 계산 vec_sz mid = size/2; double median; median = size % 2 == 0 ? ( homework[mid] + homework[mid-1] ) / 2 : homework[mid]; // 최종성적을 계산 streamsize prec = cout.precision(); // 이전 형식을 저장 cout << "Yout final grade is " << setprecision(3) // 자리수 표현 형식 설정 << 0.2 * midterm + 0.4 * final + 0.4 * median << setprecision(prec) << endl; // 복원 return 0; }
참고하여야 할 내용은
1. cout 에서 긴 문자열 출력
cout << "Enter all your homework grade, " "followed by end-of-file: ";28 라인. 두개의 문자열 리터럴을 출력하는 것처럼 보이지만, 사실은 하나의 << 만을 사용하는 구문이다. 프로그램에서 공백문자만으로 구분된 둘 또는 그 이상의 문자열 리터럴이 자동적으로 합쳐진다. 즉, 이 구문은
cout << "Enter all your homework grade, followed by end-of-file: "
과 동일한 효과를 가진다.
2. 불변식
// 불변식 : homework는 모든 과제성적을 담습니다 while( cin >> x ) homework.push_back(x);34 라인. 이 책에서는 while 문이 성립하는 조건은 불변식으로 표현한다.
각 라인에서 발생하는 상황은 아래 박스와 같다.
// 불변식 : homework는 모든 과제성적을 담습니다
// 여기의 homework에는 모든 과제 성적이 담겨져 있기 때문에 불변식이 참이다.
while( cin >> x ) // 여기의 homework에는 입력 받은 x 가 담겨져 있지 않기 때문에 불변식이 거짓이다.
// 거짓을 불변식을 해결하기 위한 코드를 작성한다.
// 여기의 homework에는 모든 과제 성적이 담겨져 있기 때문에 불변식이 참이다.
while( cin >> x ) // 여기의 homework에는 입력 받은 x 가 담겨져 있지 않기 때문에 불변식이 거짓이다.
// 거짓을 불변식을 해결하기 위한 코드를 작성한다.
homework.push_back(x); // x가 homework에 담기기때문에 모든 과제성적이 담기고 불변식이 참이 된다.
3. vector<double>::size_type
typedef vector<double>::size_type vec_sz;39 라인. vector template의 원소의 개수를 저장하는 변수이다. size_type의 정의되는 타입은 unsigned 타입이며, vector가 담을 수 있는 최대한 큰 사이즈 값을 저장할 수 있다. 즉, 그냥 int나 unsigned int를 사용하는 것보다 안정성이 높다.
4. 원소의 개수가 홀, 짝수일때
median = size % 2 == 0 ? ( homework[mid] + homework[mid-1] ) / 2 : homework[mid];55 라인. 짝수일때는 중간값과 한칸 전 값의 평균을 선택하고 홀수일때는 그냥 중간값. 짝수일때 중간값을 선택하기 애매하니까 두개 모두 선택해서 평균을 선택한다.
홀수 일때
짝수 일때

5. 자리수표현
streamsize prec = cout.precision(); // 이전 형식을 저장 cout << "Yout final grade is " << setprecision(3) // 자리수 표현 형식 설정 << 0.2 * midterm + 0.4 * final + 0.4 * median << setprecision(prec) << endl; // 복원59 라인. 59 라인에서 기존의 형식을 저장한다. 60 라인에서는 새로운 자리수 형식을 설정하고 62 라인에서 복원한다. setprecision() 함수에 대한 설명은 MSDN에 잘 나와있다. 간단하게 설명하면 setprecision(3) 같은 경우 표시되는 형식은 무조건 3자리이다. 즉, 1.23 또는 12.3 또는 123 이렇게 표시된다.