λͺ©μ°¨ ¶
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κ° μ±κ³΅ν λμ κ³μ 루νλ₯Ό λλ€κ³ νλ€. κ·Έλ¬λ©΄ μΈμ μ€ν¨ν κΉ?
- μ
λ ₯ μμ
λΉ μ Έ λκ°λ
- xμ νμ
μ λ§μ§ μλ κ°μ΄ λ€μ΄μ¬λ
- >>
~cpp if (cin >> x) ... // μ΄ λ¬Έμ₯μ λ€μκ³Ό κ°λ€. cin >> x; if(cin) ... // istream λ΄λΆμ 볡μ‘ν μμ μ΄ μκΈ΄ νμ§λ§ 12μ₯κΉμ§ λͺ°λΌλ λλ€. κ·Έλ₯ μ΄κ²λ§ μμλ μΆ©λΆν μΈμ μλ€.
- boolκ³Ό μ«μ : 쑰건문 λ΄μμ 0μ΄μΈμ μ«μλ λͺ¨λ trueλ‘ λ³ν, 0μ falseλ‘ λ³νλλ€.
- boolκ³Ό cin : μμ cinλ 쑰건문 λ΄μμ μΈμ μκ² λ³νλλ€. μ§κΈμ μμΈν μ νμ μλ€.
- streamμΌλ‘λΆν° μ½μ΄λ€μ΄λλ° μ€ν¨ν κ²½μ°
- μ
λ ₯νμΌμ λμ λλ¬νμλ
- typeμ΄ λ§μ§ μμλ
- μ
λ ₯ νλμ¨μ΄ μμ λ¬Έμ κ° μκΈΈλ
- μ
λ ₯νμΌμ λμ λλ¬νμλ
- μ€ν¨νμ κ²½μ°μλ 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μ₯μμλ νμΉΈ μ§λλ€λ κ²μ μλ―Έλ₯Ό μ΄ν΄λ³Ό κ²μ΄λ€.
- begin() : 컨ν
μ΄λμ 맨 μ²μ κ°μ κ°λ¦¬ν¨λ€.
- 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))μ μκ°μ΄ κ±Έλ¦°λ€.
- vectorμλ€ κ°μ μλ‘ μΆκ°νλ λ°μλ Ξ(n)μ μκ°μ΄ κ±Έλ¦°λ€.
- C++μ μ€ν λ€λ λΌμ΄λΈλ¬λ¦¬λ€μ κ±±μ νμ§ λ§κ³ μ¨λ λλ€. C++μ performance-criticalν μ ν리μΌμ΄μ
μ μμ μν΄ λ§λ€μ΄μ‘κΈ° λλ¬Έμ΄λ€.