본문 바로가기

C++ 프로그래밍 (1학년 2학기)

230921 C++ 프로그래밍 3주차

저번 주차 복습

 

1. 다음 코드들은 다 같은 내용이지만, 표현 방법이 다를 뿐이다.

#include <iostream>
int main()
{
    std::cout << "Hello World!\n";
    std::cout << "Hello World!1\n";
}
#include <iostream>
using namespace std;
int main()
{
    cout << "Hello World!\n";
    cout << "Hello World!1\n";
}
#include <iostream>
using std::cout;
int main()
{
    cout << "Hello World!\n";
    cout << "Hello World!1\n";
}

2.

  • cout << : 화면으로 출력하는 객체, printf()
  • cin >> : 키보드로부터 데이터를 입력 받는 객체, scanf()

3. 다음은 첫번째 C언어 소스를 두번째 C++ 소스로 바꾼 것이다.

#include <stdio.h>
int main(void)
{
	int num;
	printf("숫자 하나를 입력하세요=");
	scanf("%d",&num);
	printf("입력받은 수는 %d입니다.\n",num);
	return 0;
}
#include <iostream>  // C++에서는 C의 헤더 파일 대신 iostream을 사용합니다.
using namespace std; // std 네임스페이스를 사용하여 표준 라이브러리의 요소들을 간단하게 사용합니다.

int main() // main 함수의 반환 타입은 int입니다.
{
    int num;
    cout << "숫자 하나를 입력하세요=";
    cin >> num; // C++에서는 scanf 대신 cin을 사용하여 입력을 받습니다.
    cout << "입력받은 수는 " << num << "입니다." << endl; // C++에서는 printf 대신 cout을 사용하여 출력합니다.
    return 0;
}

4. 연산자의 우선순위와 결합성

  • 비트 AND/OR 연산자가 논리 AND/OR 연산자보다 우선순위가 높다.
우선순위 결합성 연산자
1 ( ), [ ], ., ->, ++(후치), --(후치)
2 (자료형), sizeof, *(참조), &, ++(전치), --(전치), +(부호), -(부호),~(보수), !(not)
3 *(곱셈), /, %(나머지) 
4 +, -
5 <<(2배씩), >>(1/2배씩) (bitwise shift)
6 <, <=, >, >= 
7 ==, != 
8 & (비트 AND)
9 ^ (비트 XOR)
10 | (비트 OR)
11 && (논리 AND)
12 || (논리 OR)
13 ? : (삼항, 조건 연산자)
14 =, +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|= 
15 ,(콤마)

5. sizeof 연산자를 쓰는 언어

  • C, C++, C#, Java, Python, Rust, Swift, Kotlin

6. 관계 연산자 : ==, !=

  • 같은지를 비교하는 ==연산자, 같지 않은지를 비교하는 !=연산자

3주차 주제 : 제어문

 

1. 입출력 스트림 객체 cout, cin

  • iostream 파일을 프로그램에 포함하면 자동으로 열리는 자동 스트림(stream) 객체
  • #include <iostream>
  • cout<< // 화면으로 출력하는 객체, printf()
  • cin >> // 키보드로부터 데이터를 입력 받는 객체, scanf()

시프트연산자이지만, cin과 cout을 만나면 입출력 스트림 객체로 바뀌는 >>와 <<의 예

2. 쓰이는 제어문의 순위

  • 조건문 (if/else), 반복문 (for/while/do-while), 스위치문 (switch/case), 반복 제어문 (break/continue) 등등

3. C, C++, Javascript, C#, JAVA 언어의 제어문을 비교한 표 (chatGPT 이용)

4. 아래는 주어진 첫번째 C 소스 코드를 두번째 C++ 소스 코드로 변환한 것

#define _CRT_SECURE_NO_WARNINGS //Visual Studio에서만 사용
#include <stdio.h>
int main(void)
{
	int score;
	printf("당신의 점수를 입력하고 Enter를 누르세요=");
	scanf("%d", &score);
	if (score < 60) printf("60점 미만이므로 재수강해야 합니다.\n");
	//if문 4가지 방법으로 만들어보기
	return 0;
}
#include <iostream>
using namespace std;

int main()
{
    int score;
    cout << "당신의 점수를 입력하고 Enter를 누르세요=";
    cin >> score;

    // 1. 기본적인 if 문
    if (score < 60)
        cout << "60점 미만이므로 재수강해야 합니다." << endl;

    // 2. if-else 문
    if (score < 60)
        cout << "60점 미만이므로 재수강해야 합니다." << endl;
    else
        cout << "60점 이상입니다." << endl;

    // 3. 삼항 연산자를 이용한 if 문
    cout << (score < 60 ? "60점 미만이므로 재수강해야 합니다." : "") << endl;

    // 4. switch 문을 사용한 if 문
    switch (score < 60)
    {
    case true:
        cout << "60점 미만이므로 재수강해야 합니다." << endl;
        break;
    default:
        break;
    }

    return 0;
}
// 4가지 다른 if문을 포함하였다.
// 가장 많이 사용하는 방법을 적은 소스
#define _CRT_SECURE_NO_WARNINGS //Visual Studio에서만 사용
#include <stdio.h>
int main(void)
{
	int score;
	printf("당신의 점수를 입력하고 Enter를 누르세요=");
	scanf("%d", &score);

	if (score < 60) {
		printf("60점 미만이므로 재수강해야 합니다.\n");
	}
	else {
		printf("60점 이상이므로 pass 입니다\n");
	}
	return 0;
}

5. if문 뒤 조건문의 시작과 끝에 괄호를 반드시 써야 하는 언어 : C++, JAVA, C#, 등등

6.  첫번째 다중 if~else 문을 두번째 switch~case 문으로 바꾼 것

#define _CRT_SECURE_NO_WARNINGS //Visual Studio에서만 사용
#include <stdio.h>
int main(void)
{
	int value;
	printf("1~3까지의 수를 입력하세요:");
	scanf("%d", &value);
	if (value == 1) printf("1을 입력하셨습니다.\n");
	else if (value == 2) printf("2를 입력하셨습니다.\n");
	else if (value == 3) printf("3을 입력하셨습니다.\n");
	else printf("잘못 입력하셨습니다.\n");
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS //Visual Studio에서만 사용
#include <stdio.h>
int main(void)
{
	int value;
	printf("1~3까지의 수를 입력하세요:");
	scanf("%d", &value);
	switch (value) {
	case 1:
		printf("1을 입력하셨습니다.\n");
		break;
	case 2: 
		printf("2를 입력하셨습니다.\n");
		break;
	case 3: 
		printf("3을 입력하셨습니다.\n");
		break;
	default : 
		printf("잘못 입력하셨습니다.\n");
		break;
	}
	return 0;
}

7. switch~case 문을 사용하는 언어 : C, C++, JAVA, C#, Python, JavaScript

8. 첫번째 소스를 C++ 스타일로 바꿔서 질의응답 (lms)로 바꾸기

#define _CRT_SECURE_NO_WARNINGS //Visual Studio에서만 사용
#include <stdio.h>
int main(void)
{
	char op; // 연산자 저장 변수
	int num1, num2; // 피연산자 저장 변수
	printf("덧셈과 뺄셈만 가능합니다\n");
	printf("계산하려는 수식(예:10+20)을 입력하세요:");
	scanf("%d%c%d", &num1, &op, &num2); //10+20
	switch (op) {
	case '+':
		printf("덧셈 결과는 %d입니다.\n", num1 + num2);
		break;
	case '-':
		printf("뺄셈 결과는 %d입니다.\n", num1 - num2);
		break;
	default:
		printf("다시 입력하세요\n");
		break;
}
return 0;
}
#include <iostream>
using namespace std;

int main() {
    char op; // 연산자 저장 변수
    double num1, num2; // 피연산자 저장 변수 (double로 변경하여 소수점까지 출력 가능하게 함)
    
    cout << "덧셈, 뺄셈, 곱셈, 나눗셈이 가능합니다" << endl;
    cout << "계산하려는 수식(예: 10+20)을 입력하세요:";
    cin >> num1 >> op >> num2; // 예: 10+20 입력
    
    switch (op) {
        case '+':
            cout << "덧셈 결과는 " << num1 + num2 << "입니다." << endl;
            break;
        case '-':
            cout << "뺄셈 결과는 " << num1 - num2 << "입니다." << endl;
            break;
        case '*': // 곱셈을 추가
            cout << "곱셈 결과는 " << num1 * num2 << "입니다." << endl;
            break;
        case '/': // 나눗셈을 추가 (0으로 나누는 경우는 처리하지 않음)
            if (num2 != 0)
            cout << "나눗셈 결과는 " << num1 / num2 << "입니다." << endl;
            break;
        default:
            cout << "지원하지 않는 연산자입니다." << endl;
            break;
    }

    return 0;
}

9. 아래의 두 소스는 자리수 정렬을 하는 각기 다른 방법이 담겨있는 소스이다.

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	for (int i = 1; i <= 10; i++) {
		cout << setw(2) << i << "소프트 \n";
	}
	return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	for (int i = 1; i <= 10; i++) {
		cout.width(2); //다음에 출력되는 하나(i)를 두칸에 출력
		cout << i << " : Hello\n";
	}
	return 0;
}

10.  8번의 2번째 소스를 무한루프 문으로 만든 후 무한루프문을 빠져나올 수 있는 소스를 작성

#include <iostream>
using namespace std;

int main() {
    char op; // 연산자 저장 변수
    double num1, num2; // 피연산자 저장 변수 (double로 변경하여 소수점까지 출력 가능하게 함)
    for (;;) { // 무한루프문, for(;;)을 while(1)로 바꿔도 작동함
        cout << "덧셈, 뺄셈, 곱셈, 나눗셈이 가능합니다." << endl;
        cout << "계산하려는 수식(예: 10+20)을 입력하세요 : ";
        cout << "끝내려면 0+0 을 입력하세요. ";
        cin >> num1 >> op >> num2; // 예: 10+20 입력
        if (num1 == 0 && num2 == 0) break; // 무한루프를 빠져나오는 소스
        switch (op) {
        case '+':
            cout << "덧셈 결과는 " << num1 + num2 << "입니다." << endl;
            break;
        case '-':
            cout << "뺄셈 결과는 " << num1 - num2 << "입니다." << endl;
            break;
        case '*': // 곱셈을 추가
            cout << "곱셈 결과는 " << num1 * num2 << "입니다." << endl;
            break;
        case '/': // 나눗셈을 추가 (0으로 나누는 경우는 처리하지 않음)
            if (num2 != 0)
                cout << "나눗셈 결과는 " << num1 / num2 << "입니다." << endl;
            break;
        default:
            cout << "지원하지 않는 연산자입니다." << endl;
            break;
        }
    }
    return 0;
}

11. 아래의 C언어 소스를 2번째의 C++ 소스로 변환하였다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
    int menu;
    do {
        // 메뉴 출력
        printf("\n메뉴\n");
        printf("1: 추가\n");
        printf("2: 삭제\n");
        printf("3: 저장\n");
        printf("4: 수정\n");
        printf("원하는 작업을 선택하세요 -> ");
        scanf("%d", &menu);
    } while (!(menu >= 1 && menu <= 4)); // 1부터 4까지의 유효한 입력을 받을 때까지 반복
    printf("%d를 선택했습니다.\n", menu);
    return 0;
}
#include <iostream>
using std::cout;
using std::cin;
int main() {
	int menu;
	do {
		cout << "\n메뉴\n";
		cout << "1:추가\n";
		cout << "2:삭제\n";
		cout << "3:저장\n";
		cout << "4:수정\n";
		cout << "원하는 작업을 선택하세요 ->";
		cin >> menu;
	} while (!(menu >= 1 && menu <= 4));
	cout << menu << "를 선택했습니다.\n";
	return 0;
}

12. c언어에서 무한루프가 가능한 3가지 방법

#include <stdio.h>
int main(void)
{
	for (; ;) {
		printf("Hi ");
	}
	return 0;
}

#include <stdio.h>
int main(void)
{
	while (1) {
        printf("Hi ");
	}
	return 0;
}

#include <stdio.h>
int main(void)
{
	do {
		printf("Hi ");
	} while (1);
	return 0;
}

13. break 문 : 반복문(for, while, do~while)이나 switch~case문에서 안쪽 루프를 하나 벗어나는데 사용한다.

14. continue 문 : for, while, do~while문에서 루프의 조건식을 검사하는 부분으로 다시 되돌아는 문장이다.

15. c++을 이용하여 제어문을 잘 이해할 수 있는 간단한 게임소스

#include <iostream>
#include <cstdlib> // 난수 생성을 위한 헤더 파일
#include <ctime>   // 시간을 기반으로 난수 초기화를 위한 헤더 파일
using namespace std;
int main() {
    // 시드(seed)를 현재 시간으로 초기화하여 매번 다른 난수를 생성
    srand(time(0));
    // 1에서 100 사이의 난수 생성
    int randomNumber = rand() % 100 + 1;
    int guess;
    int attempts = 0;
    cout << "1부터 100 사이의 숫자를 맞춰보세요." << endl;
    while (true) {
        cout << "추측한 숫자를 입력하세요: ";
        cin >> guess;

        attempts++; // 시도 횟수 증가

        if (guess < randomNumber) {
            cout << "더 큰 숫자를 입력하세요." << endl;
        }
        else if (guess > randomNumber) {
            cout << "더 작은 숫자를 입력하세요." << endl;
        }
        else {
            cout << "축하합니다! 정답을 맞추셨습니다." << endl;
            cout << "시도 횟수: " << attempts << "회" << endl;
            break;
        }
    }
    return 0;
}

16. 위 소스를 리팩토링한(간결하게 만드는) 소스

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
    srand(time(0));
    const int maxNumber = 100;
    int randomNumber = rand() % maxNumber + 1;
    int guess;
    int attempts = 0;
    cout << "1부터 " << maxNumber << " 사이의 숫자를 맞춰보세요." << endl;
    while (true) {
        cout << "추측한 숫자를 입력하세요: ";
        cin >> guess;
        attempts++;
        if (guess < randomNumber) {
            cout << "더 큰 숫자를 입력하세요." << endl;
        }
        else if (guess > randomNumber) {
            cout << "더 작은 숫자를 입력하세요." << endl;
        }
        else {
            cout << "축하합니다! 정답을 맞추셨습니다." << endl;
            cout << "시도 횟수: " << attempts << "회" << endl;
            break;
        }
    }
    return 0;
}

 

참고자료 : 한성현 교수님 C++ 프로그래밍 수업자료

 

댓글