U E D R , A S I H C RSS

AcceleratedC++/Chapter3

2. Chapter 3 Working with batches of data


μ—¬νƒœκΉŒμ§€μ˜ 기초적인 μž…μΆœλ ₯ λ¬Έμ œλΌ λ„˜μ–΄μ„œμ„œ 본격적인 μž‘μ—…μ„ 닀루기 μ‹œμž‘ν•˜λŠ” μž₯이닀.
ν•™μƒλ“€μ˜ 성적 관리 ν”„λ‘œκ·Έλž¨μœΌλ‘œ μž‘μ—…μ„ ν•˜λ©΄μ„œ, λ­”κ°€λΌ μ €μž₯ν•˜λŠ” 방법 등등을 λ…Όμ˜ν•  것이닀.

2.1. 3.1 Computing student grades

  • λ¨Όμ € μš°λ¦¬κ°€ 가지고 놀 μ½”λ“œλΌ λ³΄μž.
    ~cpp 
    #include <iostream>
    #include <iomanip>
    #include <string>
    
    using std::cin;
    using std::setprecision;
    using std::streamsize;
    using std::cout;
    using std::string;
    using std::endl;
    
    int main() {
    	// ask for and read the students's name
    	cout << "Please enter your first name: ";
    	string name;
    	cin >> name;
    	const string greeting = "Hello, " + name + "!";
    	
    	// ask for and read the midterm and final grades
    	cout << "Please enter your midterm and final exam grades: ";
    	double midterm, final;
    	cin >> midterm >> final;
    
    	// ask for the homework grades
    	cout << "Enter all your homework grades, "
    		"follewd by end-of-file: ";
    
    	// the number and sum of grades read so far
    	int count = 0;
    	double sum = 0;
    
    	// a variable into which to read
    	double x;
    
    	// invariant:
    	//		we hava read count grades so far, and
    	//		sum is the sum of the first count grades
    	while(cin >> x) {
    		++count;
    		sum += x;
    	}
    	
    	// write the result
    	streamsize prec = cout.precision();
    	cout << "Your final grade is " << setprecision(3)
    		<< 0.2 * midterm + 0.4 * final + 0.4 * sum / count
    		<< setprecision(prec) << endl;
    
    	return 0;
    }
     
  • cin
    ~cpp 
    cin >> a >> b;
    // 이 λ¬Έμž₯은 λ‹€μŒκ³Ό κ°™λ‹€.
    cin >> a;
    cin >> b;
    // >> μ—°μ‚°μžλŠ” left operandλΌ λ¦¬ν„΄ν•œλ‹€.
     
  • λ³€μˆ˜ 선언에 κ΄€ν•΄μ„œ..
    ~cpp 
    string insu("insu"); 
    // μš”κ±΄ stringν˜• λ³€μˆ˜ insu에 "insu"λΌλŠ” λ¬Έμžμ—΄μ΄ λ“€μ–΄κ°„λ‹€.
    string insu; 
    // μš”κ±΄ λ””ν΄νŠΈ μƒμ„±μž(κ·Έλƒ₯ λ„˜μ–΄κ°€μž. μ±…μ—λŠ” Default Initialization이라고 μ¨μžˆλ‹€.)에 μ˜ν•΄ κ·Έλƒ₯ λΉ„μ–΄μžˆκ²Œ λœλ‹€.
    int num = 0; 
    // num을 0으둜 μ΄ˆκΈ°ν™”ν•΄μ€λ‹€.
    int num; 
    // numμ—λŠ” 무슨 값이 λ“€μ–΄κ°ˆκΉŒ? μ±…μ—λŠ” undefined라고 μ¨μžˆλ‹€. λ©”λͺ¨λ¦¬μ— 있던 μ“°λ ˆκΈ°κ°’μ΄ λ“€μ–΄κ°€κ²Œ λœλ‹€. 
    // -8437535 이거 λΉ„μŠ·ν•œ μ΄μƒν•œ μˆ«μžκ°€ λ“€μ–΄κ°€κ²Œ λ˜λŠ”κ±Έ 보게 될 것이닀.
     
  • while(cin >> x)
    ~cpp 
    // λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” cin >> xλΌ λ§Œμ±ν•  λ™μ•ˆ 돌게 λœλ‹€. 이게 무슨 λ§μΈμ§€λŠ” 일단 λ„˜μ–΄κ°€μž.(3.1.1)
    while (cin >> x) {
        ++count; 
        // count에 1을 λ”ν•œλ‹€.
        sum += x;
        // sum에 xλΌ λ”ν•œλ‹€.
    }
     
  • setprecision
    ~cpp 
    // 숫자의 μ •λ°€λ„λΌ μ‘°μ ˆν•΄μ€λ‹€. 
    setprecision(3);
    // μœ νš¨μˆ«μžλŠ” 3μžλ¦¬κ°€ 되고, 일반적으둜 μ†Œμˆ«μ  μ•žμ˜(μ •μˆ˜λΆ€λΆ„μ˜) 2자리, μ†Œμˆ˜λ³΄λΆ„μ˜ 1자리둜 μ±„μ›Œμ§€κ²Œ λœλ‹€.
     

2.1.1. 3.1.1 Testing for end of input

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ while(cin>>x)ꡬ문을 μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž. μœ„μ— 써놓은 바에 μ˜ν•˜λ©΄ cin >> xκ°€ μ„±κ³΅ν• λ™μ•ˆ 계속 λ£¨ν”„λΌ λˆλ‹€κ³  ν–ˆλ‹€. 그러면 μ–Έμ œ μ‹€νŒ¨ν• κΉŒ?
  1. μž…λ ₯ μž‘μ—… λΉ μ Έ λ‚˜κ°ˆλ•Œ
  2. x의 νƒ€μž…μ— λ§žμ§€ μ•ŠλŠ” 값이 λ“€μ–΄μ˜¬λ•Œ

  3. >>
    ~cpp 
    if (cin >> x)
    ...
    // 이 λ¬Έμž₯은 λ‹€μŒκ³Ό κ°™λ‹€.
    cin >> x;
    if(cin) 
    ...
    // istream λ‚΄λΆ€μ˜ λ³΅μž‘ν•œ μž‘μ—…μ΄ 있긴 ν•˜μ§€λ§Œ 12μž₯κΉŒμ§„ λͺ°λΌλ„ λœλ‹€. κ·Έλƒ₯ μ΄κ²ƒλ§ˆ μ•Œμ•„λ„ μΆ©λΆ„νžˆ μ“Έμˆ˜ μžˆλ‹€.
     

  4. boolκ³Ό 숫자 : 쑰건문 λ‚΄μ—μ„œ 0μ΄μ™Έμ˜ μˆ«μžλŠ” λͺ¨λ‘ true둜 λ³€ν™˜, 0은 false둜 λ³€ν™˜λœλ‹€.

  5. boolκ³Ό cin : μ—­μ‹œ cin도 쑰건문 λ‚΄μ—μ„œ μ“Έμˆ˜ 있게 λ³€ν™˜λœλ‹€. μ§€κΈˆμ€ μžμ„Ένžˆ μ•Œ ν•„μš” μ—†λ‹€.

  6. streamμœΌλ‘œλΆ€ν„° μ½μ–΄λ“€μ΄λŠ”λ° μ‹€νŒ¨ν•  경우
    • μž…λ ₯파일의 끝에 λ„λ‹¬ν–ˆμ„λ•Œ
    • type이 λ§žμ§€ μ•Šμ„λ•Œ
    • μž…λ ₯ ν•˜λ“œμ›¨μ–΄ 상에 λ¬Έμ œκ°€ μƒκΈΈλ•Œ

  7. μ‹€νŒ¨ν–ˆμ„ κ²½μš°μ—λŠ” stream μ΄ˆκΈ°ν™”λΌ μ‹œμΌœμ€˜μ•Ό ν•œλ‹€.(4μž₯μ—μ„œ 보자)

2.2. 3.2 Using medians instead of averages

  • 평균값 λŒ€μ‹ μ— 쀑간값을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ³€κ²½ν•œλ‹€.
  • 평균값보닀 쀑간값이 쒋을 λ•Œλ„ μžˆλ‹€.
  • 평균값은 κ·Έλƒ₯ λ‹€ λ”ν•΄μ„œ λ‚˜λˆ μ£Όλ©΄ λ˜λ‹ˆκΉŒ ν•˜λ‚˜ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•  ν•„μš”κ°€ μ—†μ—ˆλ‹€.
  • ν•˜μ§€λ§Œ.. 쀑간값은 그렇지가 λͺ»ν•˜λ‹€. λ‹€ μ €μž₯해놔야 ν•œλ‹€. 그리고 sortλΌ ν•΄μ•Όν•  것이닀.
  • μ΄μ œλΆ€ν„° κ·Έ 방법듀을 μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.

2.2.1. 3.2.1. Storing a collection of data in a vector

  • vectorλž€? - 주어진 νƒ€μž…μ˜ κ°’λ“€μ˜ λͺ¨μŒμ„ 가지고 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆμ΄λ‹€. ν™•μž₯μš”μ²­μ΄ μžˆμ„λ•Œ 컀진닀.

  • μ΄λŸ¬ν•œ 것듀을 Telplate Classes 라고 ν•œλ‹€. 11μž₯μ—μ„œ μžμ„Ένžˆ 보도둝 ν•˜μž.

  • vector μ‚¬μš©ν•˜κΈ°
    ~cpp 
    // λ‹€μŒκ³Ό 같은 μ½”λ“œλΌ
    	int count = 0;
    	double sum = 0;
    
    	double x;
    
    	while(cin >> x) {
    		++count;
    		sum += x;
    	}
    
    // λ‹€μŒκ³Ό 같은 μ½”λ“œλ‘œ λ°”κΏ€μˆ˜ μžˆλ‹€.
    	vector<double> homework;  // double값듀을 μ €μž₯ν•  vector
    	double x;
    
    	while(cin >> x)  // whileλ£¨ν”„λŠ” 값듀을 μ½μ–΄λ“€μ΄λ©΄μ„œ homework에 μ €μž₯ν•œλ‹€.
    		homework.push_back(x);
     

  • push_back : vector의 멀버 ν•¨μˆ˜. vector의 끝에닀 μ§‘μ–΄λ„£λŠ” 역할을 ν•œλ‹€. κ·ΈλŸ¬λ©΄μ„œ λ²‘ν„°μ˜ ν¬κΈ°λΌ ν•˜λ‚˜ μ¦κ°€μ‹œν‚¨λ‹€.

2.2.2. 3.2.2 Generating the output

  • size() 멀버 ν•¨μˆ˜ : vectorκ°€ μ†Œμ§€ν•˜κ³  μžˆλŠ” κ°’λ“€μ˜ κ°μˆ˜λΌ 리턴해μ€λ‹€.
    ~cpp 
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
     

  • typedef : vector<double>::size_type이라고 일일히 쳐주기엔 λ„ˆλ¬΄ κΈΈκΈ° ㅀㄸㅒㅀ문에 vec_sz둜 μ„μ—¬μ“΄ 것이닀.

  • λ˜ν•œ vector의 크기가 0이면 아무것도 μ•ˆλ“€μ–΄μžˆλ‹€λŠ” 것이λ€λ‘œ μ€‘κ°„κ°’μ˜ 의λΈκ°€ μ—†λ‹€. 0μΌλ•Œ 처리
    ~cpp 
    	if(size == 0) {
    		cout << endl << "you must enter your grades. "
    						"Please try again." << endl;
    		return 1; // mainν•¨μˆ˜κ°€ 0을 λ¦¬ν„΄ν•˜λ©΄ μ„±κ³΅μ μœΌλ‘œ λλ‚œκ²ƒμ΄κ³ , κ·Έ μ™Έμ˜ μˆ«μžλŠ” μ‹€νŒ¨μ μœΌλ‘œ λλ‚œκ²ƒμ΄λ‹€.
    	}
     

  • 쀑간값을 μ°ΎκΈ° μœ„ν•΄ λ¨Όμ € ν•΄μ•Όν•  μž‘μ—… sort : algorithm 헀더에 μ •μ˜λ˜μ–΄ μžˆλ‹€.
    ~cpp 
    	// sort the grades
    	sort(homework.begin(),homework.end());
     

  • begin() λ©”μ†Œλ“œμ™€, end() λ©”μ†Œλ“œ
    • begin() : μ»¨ν…Œμ΄λ„ˆμ˜ 맨 처음 값을 가리킨닀.
    • end() : μ»¨ν…Œμ΄λ„ˆμ˜ 맨 λ§ˆμ§€λ§‰ μ›μ†Œμ—μ„œ ν•œμΉΈ μ§€λ‚œ 값을 가리킨닀.
    • 5μž₯에선 이 λ‘˜μ„ μžμ„Έν•˜κ²Œ μ‚΄νŽ΄λ³Όκ²ƒμ΄λ©°, 8μž₯μ—μ„œλŠ” ν•œμΉΈ μ§€λ‚œλ‹€λŠ” κ²ƒμ˜ 의λΈλΌ μ‚΄νŽ΄λ³Ό 것이닀.

  • find a median
    ~cpp 
    	median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2 : homework[mid];
    // κ°œμˆ˜κ°€ ν™€μˆ˜μ΄λ©΄ λ”± κ°€μš΄λ°κΊΌ, 짝수개면 κ°€μš΄λ° λ‘κ°œμ˜ 평균을 median λ³€μˆ˜μ— λ„£μ–΄μ€λ‹€.
     

  • % : λ‚˜λ¨Έμ§€ μ—°μ‚°
  • ? : : ? μ•žμ˜ λ¬Έμž₯이 참이면 ?와 :μ‚¬μ΄μ˜ λ¬Έμž₯을 μˆ˜ν–‰, 거짓이면 : λ’€μ˜ λ¬Έμž₯을 μˆ˜ν–‰

  • etc : vector의 맨 처음 μΈλ±μŠ€λŠ” 0이닀. λ§ˆμ§€λ§‰μ€ size-1

  • μ΅œμ’… μ†ŒμŠ€
    ~cpp 
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <ios>
    // μ›λž˜ μ±…μ—λŠ” μœ„ μ†ŒμŠ€ 처럼 각각 이름곡간을 μ£Όμ—ˆμ§€λ§Œ μ΄μ œλΆ€ν„° λ¬΄λ‚œν•œ std둜 μ“°κ² μŠ΅λ‹ˆλ‹€.
    using namespace std;
    
    int main() 
    {
    	// ask for and read the students's name
    	cout << "Please enter your first name: ";
    	string name;
    	cin >> name;
    	const string greeting = "Hello, " + name + "!";
    	
    	// ask for and read the midterm and final grades
    	cout << "Please enter your midterm and final exam grades: ";
    	double midterm, final;
    	cin >> midterm >> final;
    
    	// ask for the homework grades
    	cout << "Enter all your homework grades, "
    		"follewd by end-of-file: ";
    	
    	vector<double> homework;
    	
    	double x;
    
    	// invariant: homework contains all the homework grades read so far
    	while(cin >> x)
    		homework.push_back(x);
    	
    	// check that the student entered some homework
    	
    	// λ°”λ‘œ 밑에 μ†ŒμŠ€κ°€ μ΄μƒν•©λ‹ˆλ‹€.
    	// μ›λž˜ μ±…μ—λŠ” "typedef vector<double>::size_type vec_sz;" μ΄λ ‡κ²Œ λ˜μ–΄μžˆμ§€λ§Œ
    	// μ»΄νŒŒμΌμ‹œ μ—λŸ¬κ°€ λ‚˜μ„œ 같은 의λΈμΈ unsigned intν˜•μ„ μ¨μ„œ vec_sz을 ν‘œν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
    	typedef unsigned int vec_sz;
    	vec_sz size = homework.size();
    
    	if(size == 0) {
    		cout << endl << "you must enter your grades. "
    						"Please try again." << endl;
    		return 1;
    	}
    
    	// sort the grades
    	sort(homework.begin(),homework.end());
    
    	// compute the median homework grade
    	vec_sz mid = size / 2;
    	double median;
    	median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2 : homework[mid];
    
    	// compute and write the final grade
    	streamsize prec = cout.precision();
    	cout << "Your final grade is " << setprecision(3)
    		<< 0.2 * midterm + 0.4 * final + 0.4 * median
    		<< setprecision(prec) << endl;
    
    	return 0;
    }
     

2.2.3. 3.2.3 Some additional observations

  • homeworkκ°€ λΉ„μ–΄μžˆμ„λ•Œ μ™œ ν”„λ‘œκ·Έλž¨μ„ 끝내야 ν• κΉŒ?
  • 끝내지 μ•ŠλŠ”λ‹€λ©΄, size/2=0 이닀. homework0은 μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. 그런 것이닀.
  • size_type은 unsigned int 이닀.
  • vector와 sort의 μˆ˜ν–‰μ„±λŠ₯에 κ΄€ν•΄
    • vector에닀 값을 μƒˆλ‘œ μΆ”κ°€ν•˜λŠ” λ°μ—λŠ” Θ(n)의 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.
    • sort μž‘μ—…μ€ Θ(nlog(n))의 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.
  • C++의 μŠ€νƒ λ‹€λ“œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ€ κ±±μ •ν•˜μ§€ 말고 써도 λœλ‹€. C++은 performance-criticalν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ œμž‘μ„ μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒκΈ° λ•Œλ¬Έμ΄λ‹€.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:25
Processing time 0.0472 sec