U E D R , A S I H C RSS

AcceleratedC++/Chapter4

2. Chapter 4 Organizing programs and data

  • ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.
  • ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ๋…๋ฆฝ์ ์ด๋‹ค.
  • ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    3์žฅ๊นŒ์ง€ ๋ดค๋˜ ๊ฒƒ์€ ์ฒซ๋ฒˆ์งธ๊ฒƒ๋งŒ ์žˆ๊ณ , ๋‚˜๋จธ์ง€ ๊ฒƒ์€ ์—†๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘์„๋•Œ๋Š” ๋ณ„๋กœ ์ƒ๊ด€์—†์ง€๋งŒ, ์ปค์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ๋ถ€ํ„ฐ 2,3๋ฒˆ์งธ ๊ฒƒ์ด ๊ฒฐ์—ฌ๋˜๋ฉด, ๋‚˜์ค‘์—” ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. C++์—์„œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜ + ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ, ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์กฐํ™”์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜ + ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฌถ์–ด์„œ ๊ฐ€์ง€๊ณ  ๋†€ ์ˆ˜ ์žˆ๋Š” class๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.(Chapter9๋ถ€ํ„ฐ ์ž์„ธํžˆ ์‚ดํŽด๋ณธ๋‹ค.)
    ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋ฒˆ์žฅ๋ถ€ํ„ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜๋ˆ ์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅ, ์ปดํŒŒ์ผํ•˜๋Š” ๋ฒ•๊ณผ, ๋‚˜์ค‘์— ํ•ฉ์น˜๋Š” ๋ฒ• ๋“ฑ์„ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค.

2.1. 4.1 Organizing computations

  • 3์žฅ๊นŒ์ง€์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณด๋ฉด ๋“ฑ๊ธ‰์„ ๋ฉ”๊ธฐ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•ด๋ณด์ž. ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•จ์œผ๋กœ์จ, ๋‚˜์ค‘์— ๋˜‘๊ฐ™์€ ๋‚ด์šฉ์„ ๋˜ ์ฝ”๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ์•Œ์•„๋ณด๊ธฐ๋„ ์‰ฌ์›Œ์ง„๋‹ค. ๋˜ํ•œ ๋“ฑ๊ธ‰ ๋ฉ”๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐ”๊ฟ€๋•Œ ๊ทธ ํ•จ์ˆ˜ ๋ถ€๋ถ„์—๋งŒ ๋ฌธ์ œ๋ฅผ ํ•œ์ •์ง€์„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜์— ์ด๋ฆ„์„ ์ง€์–ด์คŒ์œผ๋กœ์จ, ๋”์šฑ ์ถ”์ƒํ™”์‹œํ‚ฌ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์•ž์žฅ์—์„œ ๋“ฑ๊ธ‰์„ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด,
    ~cpp 
    	cout << "Your final grade is " << setprecision(3)
    		<< 0.2 * midterm + 0.4 * final + 0.4 * median
    		<< setprecision(prec) << endl;
     
    ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค. ๋‘˜์งธ์ค„์˜ ๋“ฑ๊ธ‰ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
    ~cpp 
    double grade(double midterm, double final, double homework)
    {
        return 0.2 * midterm + 0.4 * final + 0.4 * homework;
    }
    /* ... */
    int main() 
    {
    /* ... */
    	cout << "Your final grade is " << setprecision(3)
    		<< grade(midterm, final, sum / count)
    		<< setprecision(prec) << endl;
    
    	return 0;
    }
    
     

  • ํ•จ์ˆ˜ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ์š”์•ฝํ•ด๋ณด์ž๋ฉด
    ~cpp 
    return_type function_name(parameter lists...) { ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•  ์ผ๋“ค }
     
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋•Œ ์ฃผ์–ด์กŒ๋˜ parameter lists๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๊ฐ’๋“ค์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ์ˆœ์„œ๋„ ๋งž์ถฐ์ค˜์•ผ ํ•œ๋‹ค. arguments๋ผ๊ณ ๋„ ํ•œ๋‹ค. arguments๋Š” ์‹์ด ๋ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ ๋’ค์— ํ•จ์ˆ˜๋กœ ๋„˜์–ด๊ฐ„ parameter๋“ค์€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜(ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ์†Œ๋ฉธ๋˜๋Š”)์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ๊ทธ ๊ฐ’๋“ค์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ call by value๋ผ ํ•œ๋‹ค.

  • 2.1.1. 4.1.1. Finding medians

  • ์•ž์—์„œ ์šฐ๋ฆฌ๋Š” vector์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฐ’์—์„œ ์ค‘๊ฐ„๊ฐ’ ์ฐพ๋Š” ๊ฑธ ํ–ˆ์—ˆ๋‹ค. Chapter8์—์„œ๋Š” vector์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” type์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ด๋‹ค. ์ง€๊ธˆ์€ vector<double>๋กœ๋งŒ ํ•œ์ •์ง“์ž. median ๊ตฌํ•˜๋Š” ๋ฃจํ‹ด์„ ํ•จ์ˆ˜๋กœ ๋นผ๋ณด์ž.
    ~cpp 
    double median(vector<double> vec)
    {
    	typedef vector<double>::size_type vec_sz;
    
    	vec_sz size = vec.size();
    	if (size == 0)
    		throw domain_error("median of an empty vector.");
    	
    	sort(vec.begin(), vec.end());
    	vec_sz mid = size/2;
    
    	return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
    }
     
  • ์—ฌ๊ธฐ์„œ ์‚ดํŽด๋ณผ ๊ฒŒ ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค. ์ง€๋‚œ๋ฒˆ์—๋Š” vector์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋ฉด ๊ทธ๋ƒฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œ์ผœ๋ฒ„๋ ธ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ผ๋Š” ์‹ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์„œ ๋๋‚ด์ง€ ์•Š๊ณ  ๋‹ค์Œ ๋ถ€๋ถ„์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. <stdexcept>๋ฅผ ํฌํ•จ์‹œ์ผœ ์ฃผ๋ฉด ๋œ๋‹ค.
  • ๋˜ํ•œ, ์•„๊นŒ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋ฉด์„œ parameter๋กœ ๋„˜๊ฒจ์ค„๋•Œ์—๋Š” ๊ทธ ๊ฐ’์„ ๋ณต์‚ฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ €๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ, ์›๋ž˜ vector๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋ณต์‚ฌ๋ณธ vector์—์„œ sort๋ฅผ ํ•ด์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด ์ค„์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋น„๋ก ์‹œ๊ฐ„์ด ์ข€ ๋” ๊ฑธ๋ฆฌ๊ธด ํ•˜์ง€๋งŒ..

  • 2.1.2. 4.1.2 Reimplementing out grading policy

  • ์ด์ฏค ์™€์„œ ํ•จ์ˆ˜์˜ ์œ ์šฉํ•จ์„ ์•Œ์•˜๋‹ค๋ฉด, ์šฐ๋ฆฌ์˜ ์„ฑ์  ๋งค๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.
    ~cpp 
    double grade(double midterm, double final, const vector<double>& hw)
    {
    	if(hw.empty())		// ์ฑ…์—์„œ๋Š” hw.size()==0 ์ด๋ผ๊ณ  ๋˜์–ด ์žˆ์ง€๋งŒ 
    				// empty()๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•˜๋”๊ตฐ์š”.
    		throw domain_error("student has done no homework");
    	return grade(midterm, final, median(hw));
    }
     
  • ์—ฌ๊ธฐ์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์„ธ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ๋‹ค.
    • const vector<double>& hw : ์ด๊ฒƒ์„ ์šฐ๋ฆฌ๋Š” doubleํ˜• const vector๋กœ์˜ ์ฐธ์กฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. reference๋ผ๋Š” ๊ฒƒ์€ ์–ด๋– ํ•œ ๊ฐ์ฒด์˜ ๋˜๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋งํ•œ๋‹ค. ๋˜ํ•œ const๋ฅผ ์”€์œผ๋กœ์จ, ์ € ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค€๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” reference๋ฅผ ์”€์œผ๋กœ์จ, ๊ทธ parameter๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ parameter๊ฐ€ ์ปค๋‹ค๋ž€ ๊ฐ์ฒด์ผ๋•Œ, ๊ทธ๊ฒƒ์„ ๋ณต์‚ฌํ•จ์œผ๋กœ์จ ์ƒ๊ธฐ๋Š” overhead๋ฅผ ์—†์•จ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

  • ~cpp 
    vector<double> homework;
    vector<double>& hw = homework;
    // hw๋Š” homework์™€ ๊ฐ™๋‹ค. ์ฆ‰, ์ด๋ฆ„์€ ๋‹ค๋ฅด์ง€๋งŒ, hw๋ฅผ ๊ณ ์น˜๋ฉด homework๋„ ๊ฐ™์ด ๊ณ ์ณ์ง„๋‹ค. ์™œ๋ƒ? ๊ฐ™์œผ๋‹ˆ๊นŒ
     
    • grade() function : ์šฐ๋ฆฌ๋Š” ์•„๊นŒ grade๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์— ์ด๋ฆ„์€ ๊ฐ™์œผ๋ฉด์„œ parameter๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ grade()๋ฅผ ๋˜ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋Ÿฐ๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€? ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ์„ ํ•จ์ˆ˜์˜ overloading์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœํ• ๋•Œ ์–ด๋–ค๊ฒŒ ํ˜ธ์ถœ๋ ๊นŒ๋Š” ๋”ฐ๋ผ๊ฐ€๋Š” parameter lists์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.
    • exception : ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”๊ฐ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” exception์„ ๋˜์ ธ์ค€๋‹ค.

    2.1.3. 4.1.3 Reading homework grades

  • ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋Š”, ์ˆ™์ œ์˜ ๋“ฑ๊ธ‰์„ vector๋กœ ์ฝ์–ด๋“ค์ด๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘๊ฐ€์ง€์˜ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฆฌํ„ด๊ฐ’์ด ๋‘๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ํ•˜๋‚˜๋Š” ์ฝ์–ด๋“ค์ธ ๋“ฑ๊ธ‰๋“ค์ด๊ณ , ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์„ฑ๊ณตํ–ˆ๋‚˜ ํ•˜๋Š”๊ฐ€์ด๋‹ค. ํ•˜๋‚˜์˜ ๋Œ€์•ˆ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ๋ง๊ณ , ๊ทธ๊ฒƒ์„ reference๋กœ ๋„˜๊ฒจ์„œ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๋ฒ•์ด๋‹ค. const๋ฅผ ๋ถ™์ด์ง€ ์•Š์€ reference๋Š” ํ”ํžˆ ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ• ๋•Œ ์“ฐ์ธ๋‹ค. reference๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์–ด๋–ค ์‹(expression)์ด reference๋กœ ๋„˜์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.(lvalue๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ ๋„ ํ•œ๋‹ค. lvalue๋ž€ ์ž„์‹œ์ ์ธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.)
    ~cpp 
    istream& read_hw(istream& in, vector<double>& hw)
    {
    	double x;
    	while(in >> x)				// ์ฐจ์ฐจ ์‚ดํŽด๋ณผํ…Œ์ง€๋งŒ ์ด๊ฑด ์ž˜๋ชป๋˜์—ˆ๋‹ค.
    		hw.push_back(x);
    }
    
    read_hw(cin, homework);	// ํ˜ธ์ถœ
     
  • ์œ„์—์„œ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด์ž.
    • hw๊ฐ€ ๋„˜์–ด์˜ค๋ฉด์„œ hw์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ• ์ˆ˜ ์žˆ๊ฒ ๋Š”๊ฐ€? ๋จผ์ €๋ฒˆ์— ์“ฐ๋˜ ํ•™์ƒ๋“ค์˜ ์ ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ํ™•์‹คํ•˜๊ฒŒ ์—†์• ์ฃผ๊ธฐ ์œ„ํ•ด hw.clear()๋ฅผ ํ•ด์ฃผ์ž.
    • ์ € while ๋ฃจํ”„๊ฐ€ ์–ธ์ œ ๋ฉˆ์ถœ์ง€ ์•Œ์ˆ˜ ์žˆ๋Š”๊ฐ€? ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ–ˆ๊ฑฐ๋‚˜, ์ž…๋ ฅ๋ฐ›์€๊ฒŒ ๋“ฑ๊ธ‰์ด ์•„๋‹๋•Œ์ผ ๊ฒƒ์ด๋‹ค.
      • ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ–ˆ๋‹ค๋Š” ๊ฒƒ = ์ฝ๊ธฐ ์‹คํŒจ
      • ์ž…๋ ฅ๋ฐ›์€๊ฒŒ ๋“ฑ๊ธ‰์ด ์•„๋‹๋•Œ(์ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ๋˜๋Š”๋ฐ ์ด์ƒํ•œ ๊ฒƒ์„ ์ž…๋ ฅํ–ˆ์„๋•Œ) istream ๊ฐ์ฒด in์€ ์‹คํŒจ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ์ฝ์ง€ ์•Š๋Š”๋‹ค. ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ•œ๊ฒƒ ์ฒ˜๋Ÿผ...
    • ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๊ทธ๋ƒฅ in๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค˜๋ฒ„๋ฆฌ์ž. in.clear() ๋ชจ๋“  ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ๋ฆฌ์…‹์‹œ์ผœ์ค€๋‹ค.

  • ~cpp 
    istream& read_hw(istream& in, vector<double>& hw)
    {
    	if(in)
    	{
    		hw.clear();
    		double x;
    		while(in >> x)
    			hw.push_back(x);
    		in.clear();
    	}
    	return in;
    }
     
    DeleteMe) ๋‘๋ฒˆ์งธ๊ฐ€ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๋„ค.. ๋ˆ„๊ฐ€ ์ž˜ ์•„์‹œ๋Š” ๋ถ„์€ ๋ช…์พŒํ•œ ์„ค๋ช… ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

    2.1.4. 4.1.4 Three kinds of function parameters

  • ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ์„ธ๊ฐœ์˜ ํ•จ์ˆ˜ median, grade, read_hw ๋ฅผ ์‚ดํŽด๋ณด์ž.
    • median ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, vector<double> ํŒŒ๋ผ๋ฉ”ํ„ฐ๊ฐ€ ์ฐธ์กฐ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ํ•™์ƒ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋งค์šฐ ํฐ ๊ฐ์ฒด๊ฐ€ ๋ ํ…๋ฐ ๋‚ญ๋น„๊ฐ€ ์•„๋‹Œ๊ฐ€? ํ•˜๊ณ  ์ƒ๊ฐํ• ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์–ด์ฉ”์ˆ˜ ์—†๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์†ŒํŒ…์„ ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๋กœ ๋„˜๊ธฐ๋ฉด, ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•ด๋ฒ„๋ฆฐ๋‹ค.
    • grade ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, vector๋Š” const ์ฐธ์กฐ๋กœ ๋„˜๊ธฐ๊ณ , double์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. int๋‚˜ double๊ฐ™์€ ๊ธฐ๋ณธํ˜•์€ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋ƒฅ ๋ณต์‚ฌ๋กœ ๋„˜๊ฒจ๋„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋‹ค. ๋ญ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ• ๋•Œ๋ผ๋ฉด ์ฐธ์กฐ๋กœ ๋„˜๊ฒจ์•ผ๊ฒ ์ง€๋งŒ... const ์ฐธ์กฐ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ „๋‹ฌ๋ฐฉ์‹์ด๋‹ค.
    • read_hw ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, ๋ณต์‚ฌ๋Š” ํ•˜์ง€ ์•Š๊ณ , ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ๋งŒ ์ผ๋‹ค.
  • const๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐํ˜• ํŒŒ๋ผ๋ฉ”ํ„ฐ๋Š” lvalue์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.

  • 2.1.5. 4.1.5 Using functions to calculate a student's grade

  • ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์ƒˆ๋กœ์šด๊ฒŒ ๋ˆˆ์— ๋ˆ๋‹ค. ๋ฐ”๋กœ try์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ด๋‹ค.
    ~cpp 
    	try {
    		// ํ•˜๋‹ค๊ฐ€ ์˜ˆ์™ธ ๋ฐœ์ƒํ•˜๋ฉด, ์ค‘๋‹จํ•˜๊ณ 
    	}
    	catch(domain_error) {
    		// ์ด๋ฆฌ๋กœ ์˜จ๋‹ค. ๋งŒ์•ฝ์— try ์•ˆ์—์„œ ์˜ˆ์™ธ ์•ˆ ๋œจ๋ฉด catch ์•ˆ์€ ์ˆ˜ํ–‰์•ˆํ•œ๋‹ค.
    	}
     

  • ์—ฌ๊ธฐ๊นŒ์ง€ ์ตœ์ข…์†Œ์Šค

    ~cpp 
    #include <ios>
    #include <iomanip>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <stdexcept>
    
    using namespace std;
    
    double grade(double midterm, double final, double homework);
    double grade(double midterm, double final, const vector<double>& hw);
    double median(vector<double> vec);
    istream& read_hw(istream& in, vector<double>& hw);
    
    int main()
    {
    	cout << "Please enter your first name: ";
    	string name;
    	cin >> name;
    	cout << "Hello, " << name << "!";
    
    	cout << "Please enter your midterm and final exam grades: ";
    	double midterm, final;
    	cin >> midterm >> final;
    
    	cout << "Enter all your homework grades, "
    			"follewd by end-of-file: ";
    
    	vector<double> homework;
    
    	read_hw(cin, homework);
    
    	try
    	{
    		double final_grade = grade(midterm, final, homework);
    
    		streamsize prec = cout.precision();
    		cout << "Your final grade is " << setprecision(3)
    			<< final_grade << setprecision(prec) << endl;
    	}
    	catch(domain_error)
    	{
    		cout << endl << "You must enter your grades. "
    			"Please try again." << endl;
    		return 1;
    	}
    
    	return 0;
    }
    
    double grade(double midterm, double final, double homework)
    {
    	return 0.2 * midterm + 0.4 * final + 0.4 * homework;
    }
    
    double grade(double midterm, double final, const vector<double>& hw)
    {
    	if(hw.size() == 0)
    		throw domain_error("Student has done no homework");
    
    	return grade(midterm, final, median(hw));
    }
    
    double median(vector<double> vec)
    {
    	typedef vector<double>::size_type vec_sz; 
    
    	vec_sz size = vec.size();
    
    	if(size == 0)
    		throw domain_error("median of an empty vector");
    
    	sort(vec.begin(),vec.end());
    
    	vec_sz mid = size / 2;
    
    	return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
    }
    
    istream& read_hw(istream& in, vector<double>& hw)
    {
    	if(in)
    	{
    		hw.clear();
    
    		double x;
    		while(in >> x)
    			hw.push_back(x);
    
    		in.clear();
    	}
    	return in;
    }
    

    2.2. 4.2 Organizing data

    • ์—ฌํƒœ๊นŒ์ง€๋Š” ํ•œ ํ•™์ƒ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ง€๊ณ  ๋†€์•˜๋‹ค. ํ•˜์ง€๋งŒ ์„ฑ์  ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์€, ๋ชจ๋“  ํ•™์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค. ์ด์— ๋‹ค์‹œ ์ฒด๊ณ„์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    2.2.1. 4.2.1 Keeping all of a student's data together

  • ํ•™์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด ๋ณด์ž. ์—ฌ๊ธฐ์„œ struct๋ž€ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ๋‚˜์˜จ๋‹ค. {}์•ˆ์— ๋ฉค๋ฒ„๋กœ ๋„ฃ๊ณ  ์‹ถ์€ ๋ณ€์ˆ˜๋“ค์„ ์ซ™ ์จ์ฃผ๋ฉด ๋œ๋‹ค. ์ ‘๊ทผํ• ๋ผ๋ฉด . ์จ์ฃผ๊ณ  ๋ณ€์ˆ˜ ์“ฐ๋ฉด ๋œ๋‹ค.
    ~cpp 
    struct Student_info {
    	string name;
    	double midterm, final;
    	vector<double> homework;
    };
     
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ, ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ๋„ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝ์„ ํ•ด์•ผํ•  ๊ฒƒ์ด๋‹ค. ๋จผ์ € read
    ~cpp 
    istream& read(istream& is, Student_info& s)
    {
    	is >> s.name >> s.midterm >> s.final;
    	read_hw(is, s.homework);
    	return is;
    }
     
    • is >> ์„ ๋ณด๋ฉด, string์„ ์ฝ์—ˆ๋‹ค๊ฐ€ double์„ ์ฝ๊ธฐ๋„ ํ•œ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ ๋•Œ๋ฌธ์ด๋‹ค.
    • Student_infoํ˜• ๋ณ€์ˆ˜ s์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ๋กœ ๋„˜๊ฒจ์คฌ๋‹ค.
  • ๋‹ค์Œ์—” grade. ์˜›๋‚  ๋ฒ„์ ผ์€ ์ธ์ž๋กœ midterm, final, homework๋“ฑ์„ ๋ฐ›์•˜์ง€๋งŒ, ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ด์šฉํ•ด์„œ, Student_info ํ•˜๋‚˜๋งŒ์„ ๋ฐ›๋„๋ก ํ•ด๋ณด์ž.
    ~cpp 
    double grade(const Student_info& s)
    {
    	return grade(s.midterm, s.final, s.homework);
    }
     
  • ๋งˆ์ง€๋ง‰์œผ๋กœ sort. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์—ˆ๋‹ค.
    ~cpp 
    sort(vec.begin(), vec.end());
     
    • ์ € vec์€ doubleํ˜• ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ์—ˆ๊ธฐ 떄๋ฌธ์—, ์ˆœ์„œ๋Œ€๋กœ sortํ•˜๋ฉด ๋˜์—ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Student_info๋Š” ์–ด๋–ป๊ฒŒ sort๋ฅผ ํ• ๊นŒ?

  • ~cpp 
    sort(students.begin(), students.end());       // ๊ณผ์—ฐ? #!$%#@^#@$#
     
    • ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ sort๋ฅผ ํ• ๊ฒƒ์ธ๊ฐ€? ์ด๋ฆ„? midterm? final? ์•Œ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” predicate๋ผ๋Š” ๊ฒƒ์„ ์ •์˜ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    ~cpp 
    bool compare(const Student_info& x, const Student_info& y)
    {
    	return x.name < y.name;
    }
    
    sort(students.begin(), students.end(), compare);
     

    2.2.2. 4.2.3. Generating the report

  • max(๊ฐ™์€ ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ ๋‘๊ฐœ) : ๋ญ ํฐ๊ฐ’์„ ๋ฆฌํ„ดํ•ด ์ฃผ๊ฒ ์ง€
  • string(๊ธธ์ด,'๋ฌธ์ž') : ๊ธธ์ด๋งŒํผ์˜ '๋ฌธ์ž'๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • catch(domain_error e) ํ•œ ๋‹ค์Œ์— ๋ฌด์Šจ ์˜ˆ์™ธ ๋‚ฌ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด e.what()์„ ํ•ด์ค€๋‹ค.

  • 2.3. 4.3. Putting it all together

  • ๋ถ„๋ฆฌ ์ปดํŒŒ์ผ์ด๋ž‘ ํ—ค๋” ํŒŒ์ผ ์ด์•ผ๊ธฐ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์ž.
  • ํ—ค๋” ํŒŒ์ผ์—์„œ๋Š” using namespace ์ด๋Ÿฐ๊ฑฐ ์“ฐ์ง€ ๋ง๊ณ  ๊ทธ๋ƒฅ ํ’€ ๋„ค์ž„ ์จ์ฃผ์ž. std:vector ์ด๋ ‡๊ฒŒ...
  • ๋‘๋ฒˆ ์ด์ƒ ํฌํ•จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด, #ifndef, #define, #endif ์ด๋Ÿฐ๊ฑฐ ํ•ด์ฃผ์ž. ๊ทธ๋Ÿฌ๋ฉด์„œ ์ „์ฒ˜๋ฆฌ๊ธฐ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.
    ~cpp 
    #ifndef GURAD
    #define GUARD
    /* ...
       ...
       ... */
    #endif
     

  • 2.4. 4.4. Partitioning the grading program

  • ๊ทธ๋ƒฅ ์ชผ๊ฐœ๋Š” ๊ฑฐ๋‹ค.

  • 2.5. 4.5. The revised grading program

  • ๊ทธ๋ƒฅ ๋ณด๊ธฐ ์ข‹์•„์กŒ๋‹ค๋Š” ์–˜๊ธฐํ•˜๊ณ  ์žˆ๋‹ค.


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