4. Computation

4.1. Computation

프로그램은 입력 인자를 받아 계산을 수행한 뒤 출력 결과를 내놓는다. 입력을 다루기 위해, 프로그램은 자료를 보관헐 자료 구조나 그 상태를 관리해야 한다.

4.2. Objectives and tools

프로그래머의 의무는 연산을 정확하게 / 간단하게 / 효율적으로 하는 것이다. 이 우선 순위를 잊지 말라. 프로그래밍 전에 큰 문제를 작은 부분 문제로 쪼개는 것은 중요하다.

라인이 많아질수록 에러의 수는 기하급수적으로 증가하므로, 간단명료하게 프로그래밍하자.

4.3. Expressions

프로그램의 가장 기본적 요소는 표현식이다. 표현식은 여러 연산자로부터 값을 계산한다. 표현식을 쓸 때 연산 우선순위에 따른 괄호 매기기에 유의하고, 쓸데없이 복잡한 표현식을 쓰지 말라. 명확한 이름을 쓰라.

4.3.1. Constant expressions

상수를 표현할 때는 constexpr을 쓴다. 매직 넘버를 피하라. constexpr이 붙은 이름 있는 상수를 쓰라. const는 상수가 아니라 읽기 전용을 뜻한다. 이를 혼동하지 말라.

4.3.2. Operators

a < b < c 같은 식을 쓰지 말라. 이 표현식은 (a < b) < c => true < c 또는 false < c로서 평가된다. 이는 틀림없이 오류이다.

증가 연산자는 a++, ++a, a+=1 모두 기본 자료형에 대해서는 같은 성능을 보인다. 취향껏 쓰면 된다.

4.3.3. Conversions

서로 다른 타입을 섞어 쓰면 한쪽의 타입이 승격된다.

5 / 2 = 2 (not 2.5)
2.5 / 2 = 2.5 / double(2) = 1.25
'a' + 1 = int {'a'} + 1

이 때 type(value)나 type{value}는 type형 변수를 value값으로 초기화한 것처럼 생성하라는 의미이다. ()과 {}의 차이는 {}는 좁혀지는 형변환을 허용하지 않는다는 차이가 있다.

4.4. Statements

다른 언어들과 마찬가지로, C++에서는 명령문으로 프로그램에 동작을 지시한다. 세미콜론으로 각각의 명령문을 끝맺는다.

if (x == 5);
{ y = 3; }

이 코드는 틀림없이 오류이다. 문법적으로는 문제가 없기 때문에 더 문제가 된다. 세미콜론에 유의하라.

4.4.1. Selection

4.4.1.1. if-statements

if문은 조건이 참인지를 검사해 참이면 첫번째 명령문을 실행하고 거짓이면 else 아래의 명령문을 실행한다.

프로그래머는 항상 나쁜 입력에 대해 받을 수 있어야 한다.

#include <iostream>

int main() {
    constexpr double cm_per_inch = 2.54;
    double length = 1;
    char unit = ' ';
    std::cout << "Please enter a length a followed by a unit (c or i):\n";
    std::cin >> length >> unit;
    if (unit == 'i') {
        std::cout << length << "in == " << cm_per_inch * length << "cm\n";
    } else if (unit == 'c') {
        std::cout << length << "cm == " << length / cm_per_inch << "in\n";
    } else {
        std::cout << "Sorry, I don't know a unit called '" << unit << "'\n";
    }
}

코드를 쓸데없이 복잡하게 쓰려고 하지 마라. 같은 일을 할 수 있다면 단순하고 간결한 것이 최고다.

4.4.1.2. switch-statements

switch-case문은 switch 내의 변수를 case 조건과 비교해서 실행시킨다.

4.4.1.3. Switch technicalities

switch 비교값은 정수형 상수 표현식이어야 한다. 각각의 case는 break문에 의해 종료되어야 한다. 그렇지 않다면 fall-through를 붙이자. case에 맞지 않는 경우에는 default 라벨로 점프한다.

4.4.2. Iteration

4.4.2.1. while-statements

while문은 조건문 안을 만족하는 한 계속 실행된다. 무한루프에 유의하라.

4.4.2.2. Blocks

while이나 if문은 {}로 보호되는 제어 블록을 실행한다.

4.4.2.3. for-statements

for문은 루프 변수 초기화 – 루프 실행 조건 – 루프 변수 업데이트의 3가지 부분으로 이루어진다. while문보다는 for문을 써라. for문 내에서 절대로 루프 변수를 변경하지 마라.

4.5. Functions

함수를 맞게 정의하고 사용하는 것은 프로그래머의 몫이다.

4.5.1. Why bother with functions?

함수는 연산을 논리적으로 분리시키고 가독성을 개선한다. 모듈화와 테스팅을 쉽게 한다.

4.5.2. Function declarations

함수 호출에는 함수 구현부가 아니라 함수 선언부만 보여도 충분하다.

4.6. vector

std::vector는 인덱스로 항목에 접근할 수 있는 원소의 배열이다.

4.6.1. Traversing a vector

range-for문으로 vector를 순회할 수 있다.

4.6.2. Growing a vector

push_back()으로 원소를 뒤에 추가한다. 이 때 vector의 크기는 동적으로 조정된다.

4.6.3. A numeric example

다음의 코드는 온도를 입력받아 평균과 중앙값을 출력한다.

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<double> temps;
    for (double temp; std::cin >> temp) {
        temps.push_back(temp);
    }
    double sum = 0;
    for (double x : temps) sum += x;
    std::cout << "Average temperature: " << sum / temps.size() << '\n';
    std::sort(temps.begin(), temps.end());
    std::cout << "Median temperature: " << temps[temps.size() / 2] << '\n';
}

4.6.4. A text example

다음 프로그램은 문자열을 입력받아 정렬해 중복을 제거하고 출력한다.

#include <algorithm>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> words;
    for (std::string temp; std::cin >> temp) {
        words.push_back(temp);
    }
    std::cout << "Number of words: " << words.size() << '\n';
    std::sort(words.begin(), words.end());
    for (int i = 0; i < words.size(); i++) {
        if (i == 0 || words[i - 1] != words[i]) {
            std::cout << words[i] << '\n';
        }
    }
}

4.7. Language features

모든 프로그래밍 언어는 기본적인 아이디어를 구현하는 데 도움을 주기 위해 만들어진다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중