코딩해요/C++

[코드업/C++] 기초-조건/선택실행구조[1065 ~ 1071]

yenas0 2024. 1. 30. 21:39
반응형

#1065번_정수 3개 입력받아 짝수만 출력하기

문제
세 정수 a, b, c가 입력되었을 때, 짝수만 출력해보자.


참고
if(조건)
{ //조건이 참일 때에만 실행되는 구역(코드블록의 시작)
  실행1;
  실행2;
  ...
} //코드블록의 끝

의 조건/선택 실행 구조는
주어진 “조건”을 검사해 그 결과가 참인 경우에만 코드블록 안에 작성된 내용들을 순서대로 실행한다.


예시
if(a%2==0)
{
  printf(“%d”, a);
}

if(b%2==0)
{
  printf(“%d”, b);
}

if(c%2==0)
{
  printf(“%d”, c);
}

** a%2==0 은 a%2가 먼저 수행되고 그 결과를 0과 비교한 참/거짓 값을 계산한다.

a%2==0의 의미는 a를 2로 나눈 나머지를 0과 비교한 결과 값(참/거짓)이다.
따라서, if(a%2 == 0) 는 “a가 짝수라면?” 이라는 의미로 해석할 수 있다.
풀이
 간단하게 정수 3개에 대해 판별문을 작성하여 코드를 실행시켰다.

for문으로 반복을 시키는 방법도 가능할 것 같다.
#include <iostream> 
using namespace std;

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	if (a % 2 == 0)
		cout << a << endl;
	if (b % 2 == 0)
		cout << b << endl;
	if (c % 2 == 0)
		cout << c << endl;

}

#1066번_정수 3개 입력받아 짝/홀 출력하기

문제
세 정수 a, b, c가 입력되었을 때, 짝(even)/홀(odd)을 출력해보자.


참고
if(조건)
{ //코드블록1 시작
  ... 실행...;
  ...
}
else
{ //코드블록2 시작
  ... 다른실행...;
  ...
}
의 조건/선택 실행구조는 주어진 “조건”을 검사해 참인 경우에는 코드블록1을 실행하고,
거짓인 경우에는 코드블록2를 실행한다.

예시
if(a%2==0)
{
  printf(“even”);
}
else
{
  printf(“odd”);
}

** else는 if 없이 혼자 사용되지 않는다. 또한, else 다음에 조건이 없는 이유는?
참이 아니면 거짓이고, 거짓이 아니면 참이기 때문에...
즉 if문의 조건식의 판별 결과는 2가지 경우(참 또는 거짓)로 계산되는데,
else 부분은 if문의 조건식의 결과가 거짓인 경우에 해당하기 때문이다.

** 실행해야 할 명령들이 여러 개일 때 코드블록 기호 { }로 묶어 주는데,
코드블록의 내용이 논리적으로 1개 단위라면 코드블록 기호를 생략할 수 있다.

if(a%2==0) printf("even");
else printf("odd");
풀이
 위에 문제랑 비슷한 문제인데 코드를 간소화하기 위해 변수를 배열에 저장한 뒤 for문을 통해 코드를 줄여보았다.
#include <iostream> 
using namespace std;

int main() {
	int a[3];
	for (int i = 0; i < 3; i++) {
		cin >> a[i];
	}

	for (int i = 0; i < 3; i++) {
		if (a[i] % 2 == 0)
			cout << "even" << endl;
		else
			cout << "odd" << endl;
	}

}

#1067번_정수 1개 입력받아 분석하기

문제
정수 1개가 입력되었을 때, 음(minus)/양(plus)과 짝(even)/홀(odd)을 출력해보자.


참고
조건/선택 실행 구조의 안에 조건/선택 실행 구조를 다시 "중첩"할 수 있다.
이는 "중첩(nested)"의 원리가 적용되는 내용으로 아래와 같은 구조가 가능하다.

if(조건1)
{
  if(조건2) //조건문의 중첩
  {
    ...
  }
  else
  {
    ...
  }
}
else
{
  if(조건2)
  {
    ...
  }
  else
  {
    ...
  }
}

위와 같은 조건/선택 실행구조는 조건/선택 실행구조를 중첩해
서로 다른 4가지(2가지*2가지)의 경우에 대해 다른 실행을 할 수 있도록 해준다.

** 어떤 조건들이 맞았을 때에는 해당부분의 코드블록 내용만 실행되고,
전체 조건/선택 실행구조를 빠져나간다. 즉, 다른 부분들은 실행되지 않는다.

** 소스코드의 들여쓰기는 사람이 보고 이해하기 쉽도록 하는 것으로써
들여쓰기나 줄바꿈을 하지 않더라도 동일하게 컴파일된다.
풀이
 먼저 입력받은 수가 음수 인지 양수 인지를 판단 한 후 내부에서 홀짝을 판별하였다.
#include <iostream> 
using namespace std;

int main() {
	int a;
	cin >> a;

	if (a < 0)
	{
		cout << "minus" << endl;

		if (a % 2 == 0)
			cout << "even";
		else
			cout << "odd";
	}
	else {
		cout << "plus" << endl;

		if (a % 2 == 0)
			cout << "even";
		else
			cout << "odd";

	}
		

}

#1068번_정수 1개 입력받아 평가 출력하기

문제
점수(정수, 0 ~ 100)를 입력받아 평가를 출력해보자.


평가 기준
점수 범위 : 평가
 90 ~ 100 : A
 70 ~   89 : B
 40 ~   69 : C
   0 ~   39 : D
로 평가되어야 한다.

참고
여러 조건들을 순서대로 비교하면서 처리하기 위해서 조건문을 중첩할 수 있다.
만약, 순서대로 검사하고 실행하기 위해 아래와 같이 중첩 시킨다면,

if(조건1)
{
  ...
}
else
{
  if(조건2)
  {
    ...
  }
  else
  {
    ...
  }
}

중첩된 구조는 논리적으로 1단위이기 때문에 코드블록 기호를 생략하면
아래와 같은 구조로 다시 표현될 수 있다.

if(조건1) { ... ; }
else if(조건2) { ... ; }
else { ...; }

이와 같이 조건을 계속 붙여나가면..

if(조건1) { ... ; }
else if(조건2) { ... ; }
else if(조건3) { ... ; }
else if(조건4) { ... ; }
else if(조건5) { ... ; }
else if(조건6) { ... ; }
else if(조건...) { ... ; }
else { ... ; }

위와 같은 구조를 만들어 순서대로 조건을 검사할 수 있다.
어떤 조건이 참이면, 그 부분의 내용을 실행하고 조건/선택 구조를 빠져나간다.

이렇게 조건들을 순서대로 검사할 때에는
중간에 범위가 빠지지 않았는지 꼼꼼하게 생각하고 조건들을 만드는 것이 중요하다.
이는 마치 수학에서 빠진 범위 없이 부등식을 만드는 것과 유사하다.
풀이
 내부에서 이중, 삼중으로 if를 사용하는 방법도 가능할 것 같으나 코드가 지저분해질 것 같아 else if를 사용하여 판별식을 작성하였다.
#include <iostream> 
using namespace std;

int main() {
	int a;
	cin >> a;

	if (a >= 90)
		cout << "A";
	else if (a >= 70)
		cout << "B";
	else if (a >= 40)
		cout << "C";
	else
		cout << "D";

}

#1069번_평가 입력받아 다르게 출력하기

문제
평가를 문자(A, B, C, D, ...)로 입력받아 내용을 다르게 출력해보자.

평가 내용
평가 : 내용
A : best!!!
B : good!!
C : run!
D : slowly~
나머지 문자들 : what?


참고
조건/선택문을 복합적으로 구성해 출력할 수도 있지만,

switch(정수값)
{
  case 'A': //문자 'A'가 정수값 65('A'의 아스키 값)로 저장되기 때문에 가능하다.
    ...;
    break;
  case 'B':
    ...;
    break;
  case 'C':
    ...;
    break;
  default:
    ...;
}

위와 같은 switch( ) ... case... break; 제어문을 사용할 수 있다.

** break; 를 사용하지 않으면 이후의 명령들도 계속 실행된다.
default: 는 제시된 case 를 제외한 나머지 모든 경우에 실행된다.
switch( ) 에 주어지는 값은 “정수"값만 가능하며,
문자도 아스키코드 정수값이기 때문에 가능하다.
풀이
 switch문은 괄호안에 들어가는 변수의 값에따라 다른 출력을 하는 제어문이다. 해당 제어문을 통해 정수값에 따른 메시지를 출력시켰다.
#include <iostream> 
using namespace std;

int main() {
	char a;
	cin >> a;

	switch (a) {
	case'A':
		cout << "best!!!";
		break;
	case 'B':
		cout << "good!!";
		break;
	case 'C':
		cout << "run!";
		break;
	case 'D':
		cout << "slowly~";
		break;
	default:
		cout << "what?";
		break;

	}

}

#1070번_월 입력받아 계절 출력하기

문제
월이 입력될 때 계절 이름이 출력되도록 해보자.


월 : 계절 이름
12, 1, 2 : winter
  3, 4, 5 : spring
  6, 7, 8 : summer
  9, 10, 11 : fall

참고
swtich( ).. case ... break; 제어문에서
break;를 제거하면 멈추지 않고 다음 명령이 실행되는 특성을 이용할 수 있다.

switch(a)
{
  ...
  case 3:
  case 4:
  case 5:
    printf("spring");
  break;
  ...
}
로 작성하면, 3, 4, 5가 입력되었을 때 모두 "spring"이 출력된다.

** 12, 1, 2 는 어떻게 처리해야 할지 여러 가지로 생각해 보아야 한다.
풀이
 앞선 문제에서 나온 설명처럼 switch문은 break를 하지 않을 시 다음 명령으로 넘어가게 된다. 이를 사용하여 12월 1월 2월 을 하나로 묶어 winter로 출력한 뒤 break로 멈추었다. 다른 계절도 동일하게 코드를 작성하였다.
#include <iostream> 
using namespace std;

int main() {
	int a;
	cin >> a;

	switch (a) {
	case 12:
	case 1:
	case 2:
		cout << "winter";
		break;

	case 3:
	case 4:
	case 5:
		cout << "spring";
		break;

	case 6:
	case 7:
	case 8:
		cout << "summer";
		break;

	case 9:
	case 10:
	case 11:
		cout << "fall";
		break;

	}

}

#1071번_0 입력될 때까지 무한 출력하기1

문제
정수가 순서대로 입력된다.
-2147483648 ~ +2147483647, 단 개수는 알 수 없다.

0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.
while( ), for( ), do~while( ) 등의 반복문을 사용할 수 없다.


참고
goto 명령문을 사용하면 간단한 반복 실행을 만들 수 있다.
반복 실행 부분을 빠져나오기 위해(즉 무한 반복을 방지하기 위해)
반복 실행 되는 도중에 조건을 검사해야 한다.

goto 이름:
이 명령은 이름: 이 작성된 곳으로 프로그램의 실행 흐름을 바꾸어 준다.

"이름:" 과 같이 콜론(:)이 붙어있는 부분을 이름표(label, 레이블)라고 한다.
레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다.
레이블은 한 단어처럼 공백없이 모두 붙여 써야 한다.

switch( ) ... case ... : ... break; 에서
case ... : 도 일종의 레이블이라고 생각할 수 있다.

goto 레이블:
명령을 사용하면 반복되는 부분을 여러 개 자유롭게 만들 수 있다.

goto 명령은 반복 실행을 만들어낼 수 있는 가장 간단한 명령이지만,
복잡하게(스파게티 코드) 사용하는 경우, 이해가 어렵고 오류가 생기기 쉽다.


예시
  int n;
reload: //레이블은 콜론(:)으로 끝내고, 일반적으로 들여쓰기를 하지 않는다.
  scanf("%d", &n);
  printf("%d", n);
  if(n!=0) goto reload; //reload라고 적혀있는 레이블로 실행 이동
풀이
 goto를 사용해본적이 없어서 switch로 해보려했는데 생각보다 복잡해서 그냥.. goto를 쓰는게 나을 것 같다.

문제의 예시에서 나온 것과 같이 goto 명령은 (레이블 명): 으로 시작하고 원하는 명령을 작성한 후 goto (레이블 명)을 작성하면  레이블 명으로 실행을 이동한다.
#include <iostream> 
using namespace std;

int main() {
	int a;

replay:
	cin >> a;

	if (a != 0) {
		cout << a << endl;
		goto replay;
	}
}
반응형