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()
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++ 프로그래밍 수업자료