제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다. while 문에 대하여 학습한다. for 문에 대하여 학습한다. 배열에 대하여 학습한다.
이번 장에서 만들어볼 프로그램
제어구조
관계연산자
예제 #include <iostream> using namespace std; int main() { bool b; cout << std::boolalpha; cout << b << endl; return 0; }
논리연산자
if-else문
예제 하나의 예로 사용자로부터 받은 두 개의 정수 중에서 더 큰 수를 찾는 프로그램을 작성하여 보자.
예제 #include <iostream> using namespace std; int main() { int x, y; cout << "x값을 입력하시오: "; // 입력 안내 출력 cin >> x; cout << "y값을 입력하시오: "; // 입력 안내 출력 cin >> y; if (x > y) cout << "x가 y보다 큽니다. " << endl; else cout << "y가 x보다 큽니다. " << endl; return 0; }
중첩 if-else문
예제 변수 x의 값이 양수, 음수, 0인지를 검사하는 코드는 다음 과 같다. if (x > 0) cout << "x는 양수입니다." << endl; else if (x < 0) cout << "x는 음수입니다." << endl; else cout << "x는 0입니다." << endl;
예제 사용자로부터 나이를 받아서 어린이, 청소년, 성인을 구 분하는 프로그램을 작성하여 보자.
예제 #include <iostream> using namespace std; int main() { int age; // 나이 cout << "나이를 입력하시오: "; cin >> age; if (age <= 12) cout << "어린이입니다." << endl; else if (age <= 19) cout << "청소년입니다." << endl; else cout << "성인입니다." << endl; return 0; }
Lab: 비밀 코드 맞추기 컴퓨터가 숨기고 있는 비밀 코드를 추측하는 게임을 작성 해보자. 비밀 코드는 a부터 z 사이의 문자이다.
Solution #include <iostream> using namespace std; int main() { char secret_code = 'h'; cout << "비밀코드를 맞춰보세요: " ; char code; cin >> code; if (code < secret_code) cout << code << "뒤에 있음" << endl; else if (code > secret_code) cout << code << "앞에 있음" << endl; else cout << "맞추었습니다." << endl; return 0; }
Lab: 세 개의 정수 중에서 큰 수 찾기 사용자로부터 받은 3개의 정수 중에서 가장 큰 수를 찾는 프로그램을 작성해보자.
Solution #include <iostream> using namespace std; int main() { int a, b, c, largest; cout << "3개의 정수를 입력하시오: "; cin >> a >> b >> c; if (a > b && a > c) largest = a; else if (b > a && b > c) largest = b; else largest = c; cout << "가장 큰 정수는" << largest << endl; return 0; }
switch문 int number; cout << "숫자를 입력하시오:"; cin >> number; switch (number) { case 0: cout << "zero\n"; break; case 1: cout << "one\n"; case 2: cout << "two\n"; default: cout << "many\n"; }
while 루프
카운터 예제 카운트다운 예제를 만들어보자.
예제 #include <iostream> using namespace std; int main() { int n = 10; while (n > 0) { cout << n << " "; n--; } cout << "발사! \n";
구구단 예제 반복문을 사용하여서 구구단을 출력하여 보자.
예제 #include <iostream> using namespace std; int main() { int n; int i = 1; cout << "구구단 중에서 출력하고 싶은 단을 입력하시오: "; cin >> n; while (i <= 9) { cout << n << "*" << i << "=" << n * i << endl; i++; } return 0;
do-while루프
예제 사용자가 “종료”를 입력하기 전까지는 사용자의 입력을 그대로 화면에 출력하는 프로그램을 작성해 보자.
예제 #include <iostream> #include <string> using namespace std; int main() { string str; do { cout << "문자열을 입력하시오: "; getline(cin, str); cout << "사용자의 입력: " << str << '\n'; } while (str != "종료"); return 0; }
for루프
예제 1부터 10까지의 정수를 더하여 합을 구하는 프로그램을 살펴보자.
예제 #include <iostream> using namespace std; int main() { int sum = 0; for (int i = 1; i <= 10; i++) sum += i; cout << "1부터 10까지의 정수의 합 = " << sum << endl; return 0; }
예제 팩토리얼 값을 계산하여 보자.
예제 #include <iostream> using namespace std; int main() { long fact = 1; int n; cout << "정수를 입력하시요:"; cin >> n; for (int i = 1; i <= n; i++) fact = fact * i; cout << n << "!은 " << fact << "입니다.\n"; return 0; }
break 문장 예제 #include <iostream> using namespace std; int main() { for (int i = 1; i < 10; i++) cout << i << " "; if (i == 4) break; } return 0;
continue 문장 예제 #include <iostream> using namespace std; int main() { int i = 0; do { i++; cout << "continue 문장 전에 있는 문장" << endl; continue; cout << "continue 문장 후에 있는 문장" << endl; } while (i < 3); return 0; }
Lab: 자음과 모음 개수 세기 사용자로부터 영문자를 받아서 자음과 모음의 개수를 세 는 프로그램을 작성하여 보자.
Solution #include <iostream> using namespace std; int main() { int vowel = 0, consonant = 0; char ch; cout << "영문자를 입력하고 콘트롤-Z를 치세요" << endl; while (cin >> ch) { switch (ch) { case 'a': case 'i': case 'e': case 'o': case 'u': vowel++; break; default: consonant++; break; } cout << "모음: " << vowel << endl; cout << "자음: " << consonant << endl; return 0;
Lab: 숫자 맞추기 게임 프로그램은 1부터 100사이의 정수를 저장하고 있고 사용 자는 질문을 통하여 그 정수를 알아맞히려고 노력한다.
Solution // 반복을 이용한 게임 프로그램 #include <iostream> // 반복을 이용한 게임 프로그램 #include <iostream> #include <time.h> using namespace std; int main() { srand(time(NULL)); int answer = rand() %100; // 정답 int guess; int tries = 0; // 반복 구조
Solution do { cout << "정답을 추측하여 보시오: "; cin >> guess; tries++; if (guess >answer) cout << "제시한 정수가 높습니다.\n"; if (guess <answer) cout << "제시한 정수가 낮습니다.\n"; } while (guess != answer); cout << "축하합니다. 시도 횟수=" << tries << endl; return 0; }
Lab: 산수 문제 자동 출제 초등학교 학생들을 위한 산수 문제를 자동으로 출제하는 프로그램을 작성해보자.
Solution #include <iostream> #include <stdlib.h> using namespace std; int main() { int i, ans; cout << "산수 문제를 자동으로 출제합니다." << endl; while (true) { int x = rand() % 100; int y = rand() % 100; cout << x << "+" << y << "="; cin >> ans; if (x + y == ans) { cout << "맞았습니다." << endl; break; } else cout << "틀렸습니다." << endl; return 0; Solution
배열 배열(array)은 같은 종류의 데이터들이 순차적으로 메모 리에 저장되는 자료 구조이다
배열 선언
예제 학생들의 성적을 입력받아서 평균을 구하는 프로그램을 배열을 이용하여서 작성하여 보자.
예제 #include <iostream> using namespace std; int main() { const int STUDENTS = 10; int scores[STUDENTS]; int sum = 0; int i, average; for (i = 0; i < STUDENTS; i++) { cout << "학생들의 성적을 입력하시오: "; cin >> scores[i]; } for (i = 0; i < STUDENTS; i++) sum += scores[i]; average = sum / STUDENTS; cout << "성적 평균= " << average << endl; return 0;
배열의 초기화 int sales[5] = { 100, 200, 300, 400, 500 };
보편적 초기화 모든 초기화에 중괄호 { ... }을 사용한다. int scores[] { 10, 20, 30 }; int a{ 0 }; // int a=0;과 동일하다. string s{ "hello" }; // string s="hello"; vector<string> list{ "alpha", "beta", "gamma" }; // 벡터 생성시 초기화
범위-기반 for루프 이 형식은 배열 안에 들어 있는 모든 값에 대하여 반복할 때 사용된다.
예제 #include <iostream> #include <string> using namespace std; int main() { int list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i : list) { cout << i << " "; } cout << endl;
참조자 버전 for (int& i : list) { cout << i << " "; } for (auto& i : list) { cout << i << " "; }
배열 요소의 변경이 필요하다면 반드시 참조자를 사용하여야 한다. 예제 #include <iostream> #include <string> using namespace std; int main() { int list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int& i : list) { i = i*i; } for (int i : list) { cout << i << " "; 배열 요소의 변경이 필요하다면 반드시 참조자를 사용하여야 한다.
Lab: 배열에서 최대값 찾기 크기가 100인 배열을 1부터 100 사이의 난수로 채우고 배열 요소 중에서 최대값을 찾아보자
Solution #include <iostream> #include <stdlib.h> using namespace std; int main() { int list[10]; int max; for (int& elem : list) { elem = rand() % 100 + 1; cout << elem << " "; } cout << endl; max = list[0]; for (auto& elem : list) { if (elem > max) max = elem; cout << "최대값=" << max << endl; return 0;
2차원 배열 배열 요소들이 2차원으로 나열된 배열
2차원 배열의 선언 int s[3][5];
2차원 배열의 초기화 int s[3][5] = { { 1, 2, 3, 4, 5 }, // 첫 번째 행의 요소들의 초기값 { 1, 2, 3, 4, 5 }, // 첫 번째 행의 요소들의 초기값 { 2, 4, 6, 8, 10 }, // 두 번째 행의 요소들의 초기값 { 3, 6, 9, 12, 15 } // 세 번째 행의 요소들의 초기값 };
예제 구구단의 저장
예제 #include <iostream> using namespace std; #define WIDTH 9 #define HEIGHT 3 int main() { int table[HEIGHT][WIDTH]; int r, c; for (r = 0; r < HEIGHT; r++) for (c = 0; c < WIDTH; c++) table[r][c] = (r + 1)*(c + 1); for (r = 0; r < HEIGHT; r++) { for (c = 0; c < WIDTH; c++) { cout << table[r][c] << ", "; } cout << endl;
Lab: Tic-Tac-Toe 게임 Tic-Tac-Toe 게임은 2명의 경기자가 오른쪽과 같은 보드 를 이용하여서 번갈아가며 O와 X를 놓는 게임이다.
예제 #include <iostream> using namespace std; int main() { char board[3][3]; int x, y, k, i; // 보드를 초기화한다. for (x = 0; x < 3; x++) for (y = 0; y < 3; y++) board[x][y] = ' '; // 사용자로부터 위치를 받아서 보드에 표시한다. for (k = 0; k < 9; k++) { cout << "(x, y) 좌표: "; cin >> x >> y; board[x][y] = (k % 2 == 0) ? 'X' : 'O';
예제 // 보드를 화면에 그린다. for (i = 0; i < 3; i++) { cout << "---|---|---" << endl; cout << board[i][0] << " | " << board[i][1] << " | " << board[i][2] << endl; } return 0;
Q & A