티스토리 뷰

Programing/C++, C

Accelerated C++ ch3.

미류[miryu17] 2010. 7. 31. 14:58
사용된 소스코드는 다음과 같다.

#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.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 이렇게 표시된다.

'Programing > C++, C' 카테고리의 다른 글

String to integer (C++에서 string을 int 로 바꾸기)  (0) 2010.05.28
cin 버퍼 지워주기  (0) 2010.05.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
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
글 보관함