<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter3</id>
	<title>AcceleratedC++/Chapter3 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter3"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter3&amp;action=history"/>
	<updated>2026-05-14T12:37:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter3&amp;diff=27496&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter3&amp;diff=27496&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[AcceleratedC++/Chapter2]]&lt;br /&gt;
| [[AcceleratedC++/Chapter4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 목차 =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
= Chapter 3 Working with batches of data =&lt;br /&gt;
&lt;br /&gt;
여태까지의 기초적인 입출력 문제를 넘어서서 본격적인 작업을 다루기 시작하는 장이다.&lt;br /&gt;
학생들의 성적 관리 프로그램으로 작업을 하면서, 뭔가를 저장하는 방법 등등을 논의할 것이다.&lt;br /&gt;
&lt;br /&gt;
== 3.1 Computing student grades ==&lt;br /&gt;
* 먼저 우리가 가지고 놀 코드를 보자.&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iomanip&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using std::cin;&lt;br /&gt;
 using std::setprecision;&lt;br /&gt;
 using std::streamsize;&lt;br /&gt;
 using std::cout;&lt;br /&gt;
 using std::string;&lt;br /&gt;
 using std::endl;&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
 	// ask for and read the students&amp;#039;s name&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Please enter your first name: &amp;quot;;&lt;br /&gt;
 	string name;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; name;&lt;br /&gt;
 	const string greeting = &amp;quot;Hello, &amp;quot; + name + &amp;quot;!&amp;quot;;&lt;br /&gt;
 	&lt;br /&gt;
 	// ask for and read the midterm and final grades&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Please enter your midterm and final exam grades: &amp;quot;;&lt;br /&gt;
 	double midterm, final;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; midterm &amp;amp;gt;&amp;amp;gt; final;&lt;br /&gt;
 &lt;br /&gt;
 	// ask for the homework grades&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Enter all your homework grades, &amp;quot;&lt;br /&gt;
 		&amp;quot;follewd by end-of-file: &amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	// the number and sum of grades read so far&lt;br /&gt;
 	int count = 0;&lt;br /&gt;
 	double sum = 0;&lt;br /&gt;
 &lt;br /&gt;
 	// a variable into which to read&lt;br /&gt;
 	double x;&lt;br /&gt;
 &lt;br /&gt;
 	// invariant:&lt;br /&gt;
 	//		we hava read count grades so far, and&lt;br /&gt;
 	//		sum is the sum of the first count grades&lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; x) {&lt;br /&gt;
 		++count;&lt;br /&gt;
 		sum += x;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// write the result&lt;br /&gt;
 	streamsize prec = cout.precision();&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Your final grade is &amp;quot; &amp;amp;lt;&amp;amp;lt; setprecision(3)&lt;br /&gt;
 		&amp;amp;lt;&amp;amp;lt; 0.2 * midterm + 0.4 * final + 0.4 * sum / count&lt;br /&gt;
 		&amp;amp;lt;&amp;amp;lt; setprecision(prec) &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
* cin&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; a &amp;amp;gt;&amp;amp;gt; b;&lt;br /&gt;
 // 이 문장은 다음과 같다.&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; a;&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; b;&lt;br /&gt;
 // &amp;amp;gt;&amp;amp;gt; 연산자는 left operand를 리턴한다.&lt;br /&gt;
  &lt;br /&gt;
* 변수 선언에 관해서..&lt;br /&gt;
 string insu(&amp;quot;insu&amp;quot;); &lt;br /&gt;
 // 요건 string형 변수 insu에 &amp;quot;insu&amp;quot;라는 문자열이 들어간다.&lt;br /&gt;
 string insu; &lt;br /&gt;
 // 요건 디폴트 생성자(그냥 넘어가자. 책에는 Default Initialization이라고 써있다.)에 의해 그냥 비어있게 된다.&lt;br /&gt;
 int num = 0; &lt;br /&gt;
 // num을 0으로 초기화해준다.&lt;br /&gt;
 int num; &lt;br /&gt;
 // num에는 무슨 값이 들어갈까? 책에는 undefined라고 써있다. 메모리에 있던 쓰레기값이 들어가게 된다. &lt;br /&gt;
 // -8437535 이거 비슷한 이상한 숫자가 들어가게 되는걸 보게 될 것이다.&lt;br /&gt;
  &lt;br /&gt;
* while(cin &amp;gt;&amp;gt; x)&lt;br /&gt;
 // 다음과 같은 코드는 cin &amp;amp;gt;&amp;amp;gt; x를 만족할 동안 돌게 된다. 이게 무슨 말인지는 일단 넘어가자.(3.1.1)&lt;br /&gt;
 while (cin &amp;amp;gt;&amp;amp;gt; x) {&lt;br /&gt;
     ++count; &lt;br /&gt;
     // count에 1을 더한다.&lt;br /&gt;
     sum += x;&lt;br /&gt;
     // sum에 x를 더한다.&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
* setprecision&lt;br /&gt;
 // 숫자의 정밀도를 조절해준다. &lt;br /&gt;
 setprecision(3);&lt;br /&gt;
 // 유효숫자는 3자리가 되고, 일반적으로 소숫점 앞의(정수부분의) 2자리, 소수보분의 1자리로 채워지게 된다.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=== 3.1.1 Testing for end of input ===&lt;br /&gt;
 위에서 살펴본 while(cin&amp;gt;&amp;gt;x)구문을 살펴보도록 하자. 위에 써놓은 바에 의하면 cin &amp;gt;&amp;gt; x가 성공할동안 계속 루프를 돈다고 했다. 그러면 언제 실패할까?&lt;br /&gt;
# 입력 작업 빠져 나갈때&lt;br /&gt;
# x의 타입에 맞지 않는 값이 들어올때&lt;br /&gt;
&lt;br /&gt;
* &amp;gt;&amp;gt;&lt;br /&gt;
 if (cin &amp;amp;gt;&amp;amp;gt; x)&lt;br /&gt;
 ...&lt;br /&gt;
 // 이 문장은 다음과 같다.&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; x;&lt;br /&gt;
 if(cin) &lt;br /&gt;
 ...&lt;br /&gt;
 // istream 내부의 복잡한 작업이 있긴 하지만 12장까진 몰라도 된다. 그냥 이것마 알아도 충분히 쓸수 있다.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* bool과 숫자 : 조건문 내에서 0이외의 숫자는 모두 true로 변환, 0은 false로 변환된다.&lt;br /&gt;
&lt;br /&gt;
* bool과 cin : 역시 cin도 조건문 내에서 쓸수 있게 변환된다. 지금은 자세히 알 필요 없다. &lt;br /&gt;
&lt;br /&gt;
* stream으로부터 읽어들이는데 실패할 경우&lt;br /&gt;
** 입력파일의 끝에 도달했을때&lt;br /&gt;
** type이 맞지 않을때&lt;br /&gt;
** 입력 하드웨어 상에 문제가 생길때&lt;br /&gt;
&lt;br /&gt;
* 실패했을 경우에는 stream 초기화를 시켜줘야 한다.(4장에서 보자)&lt;br /&gt;
&lt;br /&gt;
== 3.2 Using medians instead of averages ==&lt;br /&gt;
* 평균값 대신에 중간값을 사용하는 프로그램으로 변경한다.&lt;br /&gt;
* 평균값보다 중간값이 좋을 때도 있다.&lt;br /&gt;
* 평균값은 그냥 다 더해서 나눠주면 되니까 하나하나의 값을 저장할 필요가 없었다.&lt;br /&gt;
* 하지만.. 중간값은 그렇지가 못하다. 다 저장해놔야 한다. 그리고 sort를 해야할 것이다.&lt;br /&gt;
* 이제부터 그 방법들을 살펴보도록 하자.&lt;br /&gt;
&lt;br /&gt;
=== 3.2.1. Storing a collection of data in a vector ===&lt;br /&gt;
* vector란? - 주어진 타입의 값들의 모음을 가지고 있는 컨테이너이다. 확장요청이 있을때 커진다. &lt;br /&gt;
&lt;br /&gt;
* 이러한 것들을 Telplate Classes 라고 한다. 11장에서 자세히 보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* vector 사용하기&lt;br /&gt;
 // 다음과 같은 코드를&lt;br /&gt;
 	int count = 0;&lt;br /&gt;
 	double sum = 0;&lt;br /&gt;
 &lt;br /&gt;
 	double x;&lt;br /&gt;
 &lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; x) {&lt;br /&gt;
 		++count;&lt;br /&gt;
 		sum += x;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 // 다음과 같은 코드로 바꿀수 있다.&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; homework;  // double값들을 저장할 vector&lt;br /&gt;
 	double x;&lt;br /&gt;
 &lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; x)  // while루프는 값들을 읽어들이면서 homework에 저장한다.&lt;br /&gt;
 		homework.push_back(x);&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* push_back : vector의 멤버 함수. vector의 끝에다 집어넣는 역할을 한다. 그러면서 벡터의 크기를 하나 증가시킨다.&lt;br /&gt;
&lt;br /&gt;
=== 3.2.2 Generating the output ===&lt;br /&gt;
* size() 멤버 함수 : vector가 소지하고 있는 값들의 갯수를 리턴해준다.&lt;br /&gt;
 typedef vector&amp;amp;lt;double&amp;amp;gt;::size_type vec_sz;&lt;br /&gt;
 vec_sz size = homework.size();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* typedef : vector&amp;amp;lt;double&amp;amp;gt;::size_type이라고 일일히 쳐주기엔 너무 길기 ㅤㄸㅒㅤ문에 vec_sz로 줄여쓴 것이다.&lt;br /&gt;
&lt;br /&gt;
* 또한 vector의 크기가 0이면 아무것도 안들어있다는 것이므로 중간값의 의미가 없다. 0일때 처리&lt;br /&gt;
 	if(size == 0) {&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; endl &amp;amp;lt;&amp;amp;lt; &amp;quot;you must enter your grades. &amp;quot;&lt;br /&gt;
 						&amp;quot;Please try again.&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		return 1; // main함수가 0을 리턴하면 성공적으로 끝난것이고, 그 외의 숫자는 실패적으로 끝난것이다.&lt;br /&gt;
 	}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* 중간값을 찾기 위해 먼저 해야할 작업 sort : algorithm 헤더에 정의되어 있다.&lt;br /&gt;
 	// sort the grades&lt;br /&gt;
 	sort(homework.begin(),homework.end());&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* begin() 메소드와, end() 메소드&lt;br /&gt;
** begin() : 컨테이너의 맨 처음 값을 가리킨다.&lt;br /&gt;
** end() : 컨테이너의 맨 마지막 원소에서 한칸 지난 값을 가리킨다.&lt;br /&gt;
** 5장에선 이 둘을 자세하게 살펴볼것이며, 8장에서는 한칸 지난다는 것의 의미를 살펴볼 것이다.&lt;br /&gt;
&lt;br /&gt;
* find a median&lt;br /&gt;
 	median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2 : homework[mid];&lt;br /&gt;
 // 개수가 홀수이면 딱 가운데꺼, 짝수개면 가운데 두개의 평균을 median 변수에 넣어준다.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
* % : 나머지 연산&lt;br /&gt;
* ? : : ? 앞의 문장이 참이면 ?와 :사이의 문장을 수행, 거짓이면 : 뒤의 문장을 수행&lt;br /&gt;
&lt;br /&gt;
* etc : vector의 맨 처음 인덱스는 &amp;amp;#91;0&amp;amp;#93;이다. 마지막은 &amp;amp;#91;size-1&amp;amp;#93;&lt;br /&gt;
&lt;br /&gt;
* 최종 소스&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iomanip&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;ios&amp;amp;gt;&lt;br /&gt;
 // 원래 책에는 위 소스 처럼 각각 이름공간을 주었지만 이제부터 무난한 std로 쓰겠습니다.&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 int main() &lt;br /&gt;
 {&lt;br /&gt;
 	// ask for and read the students&amp;#039;s name&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Please enter your first name: &amp;quot;;&lt;br /&gt;
 	string name;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; name;&lt;br /&gt;
 	const string greeting = &amp;quot;Hello, &amp;quot; + name + &amp;quot;!&amp;quot;;&lt;br /&gt;
 	&lt;br /&gt;
 	// ask for and read the midterm and final grades&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Please enter your midterm and final exam grades: &amp;quot;;&lt;br /&gt;
 	double midterm, final;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; midterm &amp;amp;gt;&amp;amp;gt; final;&lt;br /&gt;
 &lt;br /&gt;
 	// ask for the homework grades&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Enter all your homework grades, &amp;quot;&lt;br /&gt;
 		&amp;quot;follewd by end-of-file: &amp;quot;;&lt;br /&gt;
 	&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; homework;&lt;br /&gt;
 	&lt;br /&gt;
 	double x;&lt;br /&gt;
 &lt;br /&gt;
 	// invariant: homework contains all the homework grades read so far&lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; x)&lt;br /&gt;
 		homework.push_back(x);&lt;br /&gt;
 	&lt;br /&gt;
 	// check that the student entered some homework&lt;br /&gt;
 	&lt;br /&gt;
 	// 바로 밑에 소스가 이상합니다.&lt;br /&gt;
 	// 원래 책에는 &amp;quot;typedef vector&amp;amp;lt;double&amp;amp;gt;::size_type vec_sz;&amp;quot; 이렇게 되어있지만&lt;br /&gt;
 	// 컴파일시 에러가 나서 같은 의미인 unsigned int형을 써서 vec_sz을 표현했습니다.&lt;br /&gt;
 	typedef unsigned int vec_sz;&lt;br /&gt;
 	vec_sz size = homework.size();&lt;br /&gt;
 &lt;br /&gt;
 	if(size == 0) {&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; endl &amp;amp;lt;&amp;amp;lt; &amp;quot;you must enter your grades. &amp;quot;&lt;br /&gt;
 						&amp;quot;Please try again.&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	// sort the grades&lt;br /&gt;
 	sort(homework.begin(),homework.end());&lt;br /&gt;
 &lt;br /&gt;
 	// compute the median homework grade&lt;br /&gt;
 	vec_sz mid = size / 2;&lt;br /&gt;
 	double median;&lt;br /&gt;
 	median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2 : homework[mid];&lt;br /&gt;
 &lt;br /&gt;
 	// compute and write the final grade&lt;br /&gt;
 	streamsize prec = cout.precision();&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Your final grade is &amp;quot; &amp;amp;lt;&amp;amp;lt; setprecision(3)&lt;br /&gt;
 		&amp;amp;lt;&amp;amp;lt; 0.2 * midterm + 0.4 * final + 0.4 * median&lt;br /&gt;
 		&amp;amp;lt;&amp;amp;lt; setprecision(prec) &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=== 3.2.3 Some additional observations ===&lt;br /&gt;
* homework가 비어있을때 왜 프로그램을 끝내야 할까?&lt;br /&gt;
* 끝내지 않는다면, size/2=0 이다. homework&amp;amp;#91;0&amp;amp;#93;은 정의되어 있지 않다. 그런 것이다.&lt;br /&gt;
* size_type은 unsigned int 이다.&lt;br /&gt;
* vector와 sort의 수행성능에 관해&lt;br /&gt;
** vector에다 값을 새로 추가하는 데에는 Θ(n)의 시간이 걸린다.&lt;br /&gt;
** sort 작업은 Θ(nlog(n))의 시간이 걸린다.&lt;br /&gt;
* C++의 스탠다드 라이브러리들은 걱정하지 말고 써도 된다. C++은 performance-critical한 애플리케이션 제작을 위해 만들어졌기 때문이다.&lt;br /&gt;
----&lt;br /&gt;
SeeAlso [[STL/vector]]&lt;br /&gt;
----&lt;br /&gt;
[[AcceleratedC++]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>