시작하기

예시로 알아보기

새로운 언어로 프로그래밍하는 방법을 배우는 가장 좋은 방법 중 하나는 수많은 예제 프로그램을 살펴보는 것입니다. 가장 좋은 방법은 아래의 각 프로그램을 복사하여 텍스트 파일에 붙여넣고 컴파일하는 것입니다. 그런 다음 실험을 실행합니다. 이러한 예제 프로그램을 확장하면 C++의 다양한 측면을 숙지할 수 있으며 프로그램을 처음부터 작성할 때 더 자신감을 갖게 됩니다.

예 1: 컴파일러가 작동하도록 만들기

아직 하지 않았다면 다음 기본 프로그램을 복사하여 텍스트 파일에 붙여넣고 컴파일합니다. 컴파일에 관한 안내는 여기에서 확인할 수 있습니다.

튜토리얼에서 이 프로그램의 세부정보를 확인했을 가능성이 높으므로 여기에서는 한 줄씩 설명하지 않습니다. 하지만 가독성과 관련하여 몇 가지 주목해야 할 사항이 있습니다. 이는 프로그램을 쉽게 읽고 이해하고 유지 관리할 수 있도록 도와주는 주석과 형식을 의미합니다.

  • Google에서 작성하는 모든 프로그램은 작성자 이름, 연락처 정보, 간단한 설명, 사용법(해당하는 경우)을 제공하는 헤더 주석으로 시작합니다. 모든 함수는 연산과 사용에 관한 주석으로 시작합니다.
  • 예를 들어 처리가 까다롭거나 명확하지 않거나 흥미롭거나 중요한 경우 코드 자체를 문서화하지 않을 때는 전체 문장을 사용하여 설명 주석을 추가합니다.
  • 설명이 포함된 이름을 항상 사용하세요. 변수는 my_variable에서와 같이 _로 구분된 소문자 단어입니다. 함수 이름은 MyExcitingFunction()에서와 같이 대문자를 사용하여 단어를 표시합니다. 상수는 'k'로 시작하고 kDaysInWeek와 같이 대문자를 사용하여 단어를 표시합니다.
  • 들여쓰기는 2의 배수입니다. 첫 번째 수준은 공백 2개입니다. 더 들여쓰기가 필요한 경우 공백 4개, 공백 6개 등을 사용합니다.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

시도해 볼 만한 실험:

  • 가장 중요한 것은 이 프로그램을 컴파일하고 실행할 수 있는지 확인하는 것입니다.
  • 위 프로그램을 수정하여 'Hello World!'를 출력합니다. 한 줄에 6번씩 총 4번 표시됩니다. 각 줄은 17개 공백 필드에 출력됩니다. 이렇게 하려면 for 루프를 사용하세요. cout을 사용한 출력 형식 지정에 관해 자세히 알아보려면 여기를 클릭하세요. 해결 방법을 보려면 여기를 클릭하세요.
  • 방금 완료한 프로그램을 사용하여 'Hello World!'를 공백 17개의 필드에서 왼쪽 정렬로 출력하는 방법을 알아봅니다 (기본값은 일반적으로 오른쪽 정렬). 해결 방법을 보려면 여기를 클릭하세요.

예시 2: 입력 가져오기

cin을 사용하면 C++에서 키보드에서 쉽게 입력할 수 있습니다. 예를 들면 다음과 같습니다.

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

실험:

  • 입력 오류가 발생하면 스트림이 '중단'되고 cin은 false를 반환하며 프로그램이 중지됩니다. 위 프로그램에서 한 것처럼 이러한 오류를 방지하는 것이 매우 중요합니다. 하지만 프로그램을 중지하는 대신 오류에서 복구하려면 어떻게 해야 할까요? 오류 복구에는 두 가지 단계가 있습니다.
    1. cin.clear()를 사용하여 오류를 삭제합니다.
    2. 스트림에서 잘못된 문자를 삭제합니다. 이를 위한 한 가지 방법은 cin.ignore()를 사용하는 것입니다.

이 두 단계를 사용하여 잘못된 입력에서 복구하는 프로그램을 작성하세요. Google에서 이러한 방법의 작동 방식을 검색해 보세요. 솔루션은 여기에서 확인할 수 있습니다.

예 3: 이 프로그램은 무엇을 출력하나요?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

예시 4: 분해를 통해 모든 작업이 더 쉬워집니다...

이제 컴퓨터 게임을 만들어 볼까요? 첫 번째 단계는 약간 간단하지만 이제 시작입니다 우리의 임무는 추측 게임을 구현하는 프로그램을 작성하는 것입니다. 프로그램에서는 0과 100 사이의 랜덤 숫자를 생성합니다. 플레이어는 비밀 번호를 추측해야 합니다. 이 프로그램은 플레이어가 최종적으로 비밀번호를 추측할 때까지 '너무 높음' 또는 '너무 낮음'과 같은 힌트를 제공합니다.

이 게임은 3단계로 진행할 예정입니다. 

  1. 주어진 값 범위 내에서 랜덤 숫자를 생성하는 방법 파악
  2. 플레이어의 추측 한 가지를 처리하고 힌트를 제공하는 기본 함수를 만듭니다.
  3. 플레이어가 숫자를 추측할 때까지 다중 추측에 필요한 항목을 추가합니다.

이러한 개발 프로세스를 분해라고 합니다. 즉, 작업을 하위 태스크로 분할하는 것을 의미합니다. 하위 태스크는 각각 쉽게 할 수 있습니다.

1단계부터 Google 검색을 통해 C++를 사용하여 랜덤 숫자를 생성하는 방법을 확인합니다. 'rand C++'에서 검색해 보세요. 해결 방법은 여기를 참조하세요. 

2단계에서는 플레이어로부터 정수 입력 (cin에서 적절한 오류 확인 포함)을 받아 비밀번호와 대조해야 합니다. 솔루션을 확인하기 전에 게임의 이 부분을 직접 만들어 보세요.

마지막으로 비밀 번호를 추측할 때까지 플레이어의 추측을 계속 수집하는 루프를 추가해야 합니다. 프로그램의 이 부분을 완료한 후 솔루션을 확인할 수 있습니다.

분해는 프로그래머가 배워야 하는 가장 중요한 기술 중 하나입니다. 프로젝트의 규모와 관계없이 작업을 관리 가능한 조각으로 분류한 다음 한 번에 하나씩 완료하는 것이 중요합니다. 다음은 분해를 연습할 수 있는 다른 기회입니다.

  • 많은 일상 업무에서 분해 기술을 쌓을 기회를 제공합니다. 정신이 이런 식으로 작동한다는 것을 알게 되면 놀랄 것입니다.

    예를 들어, 정말 지저분한 주방을 정리해야 하는 경우 (아마 어떤 어린 아이들이 방금 케이크를 구워 먹었는지), 작업을 세분화하여 계획을 세우고 나중에 다시 할 일이 없도록 합니다. 조리대에 청소할 물건이 있으면 먼저 바닥을 씻고 싶지 않습니다. 나중에 바닥을 다시 닦아야 할 것 같아요. 그래서 먼저 모든 재료를 치우고, 모든 설거지를 세면대로 옮기고, 카운터를 치우고, 설거지를 하고, 마지막으로 바닥을 청소할 수 있습니다. 이 작업을 수행하는 다른 방법도 있지만 먼저 생각해 보면 재작업이 필요하지 않은 계획을 정의하는 데 도움이 됩니다.

    일상적인 작업을 분해 기술을 개발하기 위한 예로 사용하세요. 집 안에서 효율을 높여줄 수도 있겠죠.

  • 두 정수의 최대 공약수는 두 정수를 균등하게 나눈 가장 큰 수입니다. 예: gcd(12, 18) = 6, gcd(−4, 14) = 2 gcd를 계산하는 가장 효율적인 방법은 유클리드 알고리즘을 사용하는 것입니다. 두 정수의 gcd를 계산하는 함수를 사용하여 프로그램을 작성합니다. 먼저 재귀 없이 함수를 실행해 보세요. 알고리즘의 작동 방식을 이해하는 데 도움이 됩니다.

    하위 작업을 명시적으로 정의합니다. 예를 들어 유클리드 알고리즘용 코드를 찾거나 알고리즘의 비재귀 함수를 만드는 등의 작업을 수행할 수 있습니다. 해결 방법은 여기를 확인하세요.

예 5: 수학 퍼즐

컴퓨팅의 장점 중 하나는 무차별 대입 검색을 통해 문제에 대한 해결책을 찾는 것입니다. 일부 문제에서는 시행착오를 사용해도 무방합니다. 실제로 컴퓨터는 이러한 문제에 특히 능숙할 수 있습니다. 다음 사항을 고려해 보세요.

말은 10달러, 돼지는 3달러, 토끼는 50달러에 불과합니다. 농부가 100달러에 동물 100마리를 팔았는데, 그가 구매한 동물은 몇 마리였을까요? 

이 문제에 대한 아주 간단한 솔루션이 있습니다. Google 리소스를 살펴보기 전에 찾을 수 있는지 확인하세요.

다른 책도 확인해 보세요.
책 6권을 선반에 왼쪽에서 오른쪽으로 얼마나 많이 배열할 수 있나요?

이번에는 솔루션을 제공하고 프로그램을 작성하겠습니다. 720.

예시 6: 고려할 문자열

다음 프로그램은 무엇을 출력하나요?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

도움이 필요하면 여기를 클릭하세요.

예 7: 분해가 포함된 다음 단계 - 업무 첫날

ExerShoe 회사의 영업 사원으로 일하면서 한 켤레당 약 225달러의 고급 운동화를 전문적으로 판매하게 되었습니다. 상사가 제공하는 세 가지 보상 옵션은 첫날을 시작하기 전에 선택해야 합니다.

  1. 주당 $600의 연봉이 지급됩니다.
  2. 시간당 $7.00의 급여 및 10% 의 판매 수수료
  3. 월급은 없지만, 판매된 신발 한 켤레에 대해 수수료 20% 및 20달러

전문 C++ 프로그래머인 여러분은 최선의 보상 선택을 결정하는 데 도움이 되는 프로그램을 작성할 수 있다고 생각합니다.

더 큰 프로그램의 분해를 수행하는 일반적인 접근 방식은 문제 해결을 위한 개요처럼 읽는 기본 함수를 만드는 것입니다. 그런 다음 각 작업을 실행하는 함수를 작성합니다.

다음은 메인 프로그램의 첫 번째 통과입니다.

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

솔루션을 살펴보기 전에 각 함수를 구현할 수 있는지 확인하세요.

예시 8: 어디에서 무엇을 사용할 수 있나요?

다음 프로그램의 출력은 무엇인가요?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

답을 파악했으면 여기에서 주석 처리된 버전의 코드를 확인하세요.

예 9: 파일 처리

C++의 파일 처리는 fstream을 사용하여 수행됩니다. 파일에 저장하려면 ofstream을 선언하고 'out' 모드를 사용하여 파일을 엽니다. 다음 예에서 확인해 보세요.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • 방금 만든 파일을 열고 데이터를 표시하는 방법을 알아보세요.해결 방법은 여기에서 확인하실 수 있습니다.
  • 이제 사용자가 루프를 사용하여 많은 데이터 레코드를 입력할 수 있도록 이 프로그램을 수정할 수 있는지 확인합니다. 또한 모든 데이터를 한 번에 레코드 하나씩 다시 읽으려고 합니다.해결 방법은 여기에서 확인하실 수 있습니다.

이제 몇 가지 연습 및 프로젝트를 직접 시도해 볼 준비가 되었습니다.

Google의 소프트웨어 엔지니어 경험

이 웹사이트에서 Google의 근무 환경을 알아보세요.

연습 및 프로젝트

다음 연습에서는 기본 C++를 더 많이 연습할 수 있습니다. 이 과정에서는 다른 수강생과 함께 작업하기를 바라므로 이러한 연습과 프로젝트에 대한 솔루션을 제공하지 않습니다.

  1. 일반 경기장 크리켓은 현재 온도에 정비례하여 윙윙거립니다. 귀뚜라미가 1분 동안 우는 횟수에 40을 더한 다음 이 값을 4로 나누어 온도를 구합니다. 1분 동안 우는 횟수를 입력하여 현재 온도를 출력하는 프로그램을 작성합니다. 예를 들면 다음과 같습니다.
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. 수강 중인 프로그래밍 과정의 최종 성적을 계산하는 프로그램을 작성합니다. 평가 방식은 다음과 같습니다.
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    프로그램에서 사용자에게 4가지 과제 점수, 중간, 최종 성적, 섹션 성적을 물어봐야 합니다. 그런 다음 최종 점수가 계산되고 출력됩니다. 계산하려면 4개의 할당 점수에 평균을 낸 다음 0.4 (40%)를 곱합니다. 그런 다음 중간 점수에 0.15를 곱하고, 최종 점수에 0.35를, 참여 등급에 0.1을 곱합니다. 그런 다음 이러한 곱셈의 모든 결과를 더합니다.

    이 프로그램에서 가능한 한 함수를 사용하세요. 설명 코드에 표시할 문자열을 매개변수로 전달하여 입력을 가져올 함수를 만들 수 있습니다. 다음은 실행 예입니다.

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. 전자 스톱워치가 점점 더 저렴해지고 정확해짐에 따라 불가능할 정도로 정확한 시간 측정에 사로잡히게 될 것입니다. 초 단위로 주어진 기간을 입력으로 받고 해당 기간이 나타내는 시간, 분, 초를 출력하는 프로그램을 작성합니다. 예를 들면 다음과 같습니다.
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. 다음에서는 프로그램을 작성하기 전에 분해합니다. 가능한 경우 함수를 사용하여 잘 구조화된 프로그램을 만드세요.

  5. 다음을 위한 배너를 출력한다고 가정해 보겠습니다.

    "얼어붙은 바람이 세 개의 나무를 얼리다"

    이것은 배너이므로 글자가 꽤 커졌으면 합니다.

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    

    훌륭한 문제 분해자라면 모든 cout을 main 함수에 넣는 것보다 함수에 넣는 것이 훨씬 더 효율적이라는 것을 알 수 있습니다. 따라서 'printE' 함수와 'printZ' 함수 등이 있을 수 있습니다.

    반복되는 문자가 있는 단어나 구문으로 된 배너를 만드는 함수가 포함된 프로그램을 작성합니다. 가능한 작업은 다음과 같습니다.

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. 다음은 '매직 번호' 문제입니다. 사용자에게 첫 번째 자리가 마지막 자리보다 큰 세 자리 숫자를 입력하도록 요청합니다. 프로그램에서 숫자를 반대로 하고 원래 숫자에서 반전 숫자를 뺍니다. 마지막으로 곱셈을 반대로 하여 반전되지 않는 형태로 더합니다. 최종 결과를 출력합니다. 사용자가 입력하는 원래 숫자는 정수 유형 (3자 아님)이어야 합니다. 정수를 입력으로 사용하고 그 숫자의 역을 반환하는 함수를 작성하는 방법을 생각해 보세요. 예:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. 이 법규에 따르면 식품 제조업체는 제품에 만료일을 명시해야 하지만, 법규에는 허점이 있습니다. 즉, 만료일이 특정 형식으로 명시되어서는 안 됩니다. 따라서 스와힐리어로 작성되어도 합법적입니다.

    랄프 네이더의 세 번째 사촌인 나딘은 자칭 음식 품질 스파이입니다. 많은 식품 제조업체에서 고객이 제품 만료일을 알 수 없도록 제품 만료일을 인코딩하기 시작했다는 사실을 알게 되었습니다.

    하지만 어떤 이유로든 식료품점이 만료일을 원하는 경우 인코딩을 통해 파악할 수 있습니다.

    널리 사용되는 인코딩 방법은 다음과 같습니다.

    • 1월부터 12월까지의 월을 'A'~ 'L'로 인코딩
    • 날짜의 각 자리를 'Q' ~ 'Z'로 인코딩
    • 연도를 1에서 26을 의미하는 'A'에서 'Z'까지 인코딩한 다음 1995에 더합니다.

    나딘은 이 날짜에 문제가 된 빵을 찾았습니다. ARZM입니다. 날짜를 결정하는 프로그램을 작성합니다.

  8. 이는 유명한 카드 트릭과 숫자에 비유합니다. 사용자에게 3자리 숫자를 입력하도록 요청합니다. 숫자를 ABC라고 생각하세요 (여기서 A, B, C는 숫자의 세 자리임). 이제 ABC, BCA, CAB로 나눈 숫자의 나머지를 11로 나누어 구합니다. 나머지를 X, Y, Z라고 하겠습니다. X+Y, Y+Z, Z+X로 더하세요. 합계가 홀수이면 11씩 늘리거나 줄입니다 (어떤 연산으로 인해 20보다 작은 양수가 발생하는 경우, 합계가 9인 경우 이를 보고하고 프로세스를 중지합니다). 마지막으로 각 합계를 반으로 나눕니다. 결과로 나오는 숫자는 A, B, C입니다. 이 알고리즘을 구현하는 프로그램을 작성합니다.

애플리케이션: 애니메이션으로 음악 시각화

소프트웨어 엔지니어는 다양하면서도 흥미롭고 혁신적인 애플리케이션을 만듭니다. 이 과정의 각 모듈에서는 엔지니어가 설계하고 구현한 다양한 애플리케이션을 소개하여 엔지니어가 작업하는 다양한 영역을 모두 이해할 수 있도록 합니다.

여기에 음악을 시각화하기 위해 빌드한 흥미로운 애플리케이션이 있습니다.