Ch.5 선택문
(1) if 문
조건에 따라 실행문이 실행되지 않아야 할 때 사용하는 제어문 중 하나.
조건에 부합하면 중괄호 안의 실행문을 실행하고, 부합하지 않으면 실행되지 않고 지나감.
[종류]
- if ~ else문
조건에 부합하면 if 아래의 실행문이, 부합하지 않으면 else 아래의 실행문이 실행됨.
실행 조건 1가지
- if ~ else if ~ else문
if 조건에 부합하면 if 아래의 실행문이, else if 조건에 부합하면 else if 아래의 실행문이, 둘 다 부합하지 않으면 else 아래의 실행문이 실행됨.
실행 조건 원하는 만큼 추가할 수 있음
if 아래에 else if를 계속 추가하면 됨!!
* 조건문을 작성할 때, if, else if, else의 조건에 부합하는 경우에만 실행되도록 제어해야 하므로, 해당 실행문의 코드를 중괄호({})로 묶어 구분하는 게 편리함.
(2) if 활용과 switch ~ case문
- if 활용 : 중첩
선행 조건이 필요한 경우, if문 안에 if문을 넣어서 사용함.
선행 조건이 있으면 반복해서 확인해야 하는 조건을 하나로 단축할 수 있음.
* 분할 정복 기법(divide - conquer)
: 가장 기본적으로 사용되는 효율적인 코드 작성법. 전체를 다 점검해야 할때 공통되는 일부를 묶어서 점검해서 총 횟수를 줄임.
** C언어는 컴파일러가 들여쓰기를 인식하지 못하기 때문에, 조건문을 작성할 때 중괄호로 묶어서 구분해줘야 인식할 수 있음!
- switch ~ case문
한 가지 변수에 대해서, 여러 조건을 두고 다른 케이스로 구분해야 하는 경우 사용.
(예시 : 만약 a 가 1이면 A, 2면 B, 3이면 C ... )
int a;
char m;
switch(a){
case 1:
m = A;
break;
case 2:
m = B;
break;
case 3:
m = C;
break;
default:
m = F;
break;
}
변수 a의 값이 case에 해당하는 경우, 그 case 아래의 실행문을 실행하는 제어문 형식
case에 해당하는 경우, 그 아래의 실행문 만 ! 실행되어야 하기 때문에, case는 break;를 포함해야 한다. break;는 해당 블록을 탈출하는 데 사용되는데, 블록의 기준은 중괄호로 묶이는 부분이다. (해당하는 경우 전부 실행되어야 하면 break를 생략하기도 함)
아래의 case에 해당되지 않는 경우, default가 실행된다.
* if문과 switch~ case문은 동일한 기능을 하기 때문에, 실행 결과가 같은 경우 둘 중 어떤 구문을 사용할지 선택할 수 있다. 더 적합한 구문을 선택하기 위해서, 보통 if문은 값의 범위를 검사하는 경우에, switch~ case문은 값에 따라 실행 문장을 선택하는 경우에 좋은 구문이다.
<코드>
(1) if의 기본 형식
#include <stdio.h>
int main(){
int a = 20;
int b = 0;
if(a > 10){
b = a;
}
printf("a : %d, b : %d\n", a, b);
return 0;
}
(2) if ~ else문
#include <stdio.h>
int main(){
int a = 10;
if(a >= 0){
a = 1;
}
else{
a = -1;
}
printf("a : %d\n", a);
return 0;
}
(3) if ~ else if ~ else문
#include <stdio.h>
int main(){
int a = 0, b = 0;
if(a > 0){
b = 1;
}
else if(a == 0){
b = 2;
}
else{
b = 3;
}
printf("b : %d\n", b);
}
(확인문제)
#include <stdio.h>
int main(){
float height = 179.5;
float weight = 75.0;
if(height >= 187.5 && weight < 80){
printf("ok\n");
}
else{
printf("cancel\n");
}
return 0;
}
(4) 중첩된 if문
#include <stdio.h>
int main(){
int a = 20, b = 10;
if(a > 10){
if(b >= 0){
b = 1;
}
else {
b = -1;
}
}
printf("a : %d, b : %d\n", a, b);
}
(5) 중괄호
#include <stdio.h>
int main()
{
int a = 10, b = 20;
if(a < 0)
//{
if(b > 0)
{
printf("ok");
}
//} /*중괄호를 생략하는 경우, else를 가장 가까운 if와 연결하기 때문에 아무것도 출력되지 않음.*/
else
{
printf("ok");
}
return 0;
}
(확인문제)
/*입력한 정수가 3의 배수이면 거짓을, 아니면 참을 출력하는 코드*/
#include <stdio.h>
int main(){
int n;
printf("정수 입력 : ");
scanf("%d", &n);
switch(n % 3){
case 0 :
printf("거짓");
break;
default:
printf("참");
break;
}
}
(숙제 코드) 크리스마스 소개팅 코드
#include <stdio.h>
int main(){
printf("[크리스마스 소개팅]\n");
printf("오늘 날짜를 입력해주세요 (1월 1일이면 1 1 형태로 입력): ");
int m, d;
int love;
scanf("%d %d", &m, &d);
if(m == 12 && d >= 25){
printf("애인이 생겼나요? (생겼으면 0, 아니면 1을 입력해주세요): ");
scanf("%d", &love);
if(love == 1){
printf("소개팅을 주선해 드리겠습니다\n");
}
else{
printf("축하합니다! 좋은 사랑 하세요~\n");
}
}
else{
printf("아직 크리스마스가 아닙니다.\n");
}
}
(확인 문제 확장)
날짜는 1~12월, 달에 따라 30, 31, 28일까지 있는데, 이를 잘못 입력하는 경우 "날짜가 잘못 입력되었습니다" 라고 출력하는 코드 짜기
#include <stdio.h>
int main(){
printf("[크리스마스 소개팅]\n");
printf("오늘 날짜를 입력해주세요 (1월 1일이면 1 1 형태로 입력): ");
int m, d;
int love;
scanf("%d %d", &m, &d);
if(m == 12 && d >= 25 && d <= 31){
printf("애인이 생겼나요? (생겼으면 0, 아니면 1을 입력해주세요): ");
scanf("%d", &love);
if(love == 1){
printf("소개팅을 주선해 드리겠습니다\n");
}
else{
printf("축하합니다! 좋은 사랑 하세요~\n");
}
}
else if(m > 0){
switch(m){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(d > 31){
printf("날짜가 잘못 입력되었습니다\n");
}
else{
printf("아직 크리스마스가 아닙니다.\n");
}
break;
case 4: case 6: case 9: case 11:
if(d > 30){
printf("날짜가 잘못 입력되었습니다\n");
}
else{
printf("아직 크리스마스가 아닙니다.\n");
}
break;
case 2:
if(d > 29){
printf("날짜가 잘못 입력되었습니다\n");
}
else{
printf("아직 크리스마스가 아닙니다.\n");
}
break;
default:
printf("날짜가 잘못 입력되었습니다\n");
}
}
else{
printf("아직 크리스마스가 아닙니다.\n");
}
}
(도전 실전 예제)
#include <stdio.h>
int main(){
printf("[계산기]\n");
printf("사칙 연산 입력 (정수) : ");
int a, b;
char op;
scanf("%d%c%d", &a, &op, &b);
switch(op){
case '+':
printf("%d%c%d = %d", a, op, b, a+b);
break;
case '-':
printf("%d%c%d = %d", a, op, b, a-b);
break;
case '*':
printf("%d%c%d = %d", a, op, b, a*b);
break;
case '/':
printf("%d%c%d = %d", a, op, b, a/b);
default:
printf("입력 오류\n");
}
}
Ch 6. 반복문
(1) while문, for문, do~ while문
-whlie문
조건식을 검사하고, 조건식이 참인 동안 실행문을 반복하는 제어문.
반복을 진행해야 하는 '사건' 이 명확함.
- for문
실행문을 원하는 횟수만큼 반복할 수 있는 제어문.
반복을 진행해야 하는 '횟수' 가 명확함.
-do while문
일단 실행문을 한 번 실행한 후에 반복 조건을 검사하여 이후 반복을 진행할지를 결정하는 제어문.
(2) 반복문 활용
- 중첩 반복문
반복문 아래의 실행문 위치에, 반복문이 포함된 형태. 반복문의 조건을 검사할 때 변수를 사용해서 조건식을 작성하는데, 중첩 반복문을 사용할 경우 두 반복문에 사용하는 변수를 다르게 해서 작성해야 오류가 발생하지 않음. 제어 변수가 동일할 경우 반복문을 실행하는 도중 의도와 다르게 변수의 값이 변하게 되므로 주의해야 함!!
- break, continue 분기문
반복문 안에서 해당 블록을 탈출하면서 반복을 즉시 끝낼 때 사용하는 break;
반복문 안에서 반복문의 일부를 건너뛰는, 즉 실행 중인 반복 단계를 곧바로 끝내고 다음 반복으로 넘어갈 대 사용하는 continue;
두 분기문을 사용하여 반복문의 실행 방식을 바꿀 수 있음!
< 코드 >
(1) while
#include <stdio.h>
int main(){
int a = 1;
while(a < 10){
a = a * 2;
}
printf("a : %d\n", a);
}
/결과 a : 16
(2) for
#include <stdio.h>
int main(){
int a = 1;
int i;
for(i = 0; i < 3; i++){
a = a * 2;
}
printf("a : %d\n", a);
}
/결과 a : 8
/3번 반복
(3) do ~ while
#include <stdio.h>
int main(){
int a = 1;
do
{
a = a*2;
}while(a < 10);
printf("a : %d\n", a);
}
/결과 a : 16
/한 번 실행한 후 반복 진행
(확인문제)
#include <stdio.h>
int main(){
int i;
for(i = 0; i < 10; i++){
printf("$");
}
}
(4) 중첩 반복문
#include <stdio.h>
int main(){
int i, j;
for(i = 0; i < 3; i++){
for(j = 0; j < 5; j++){
printf("*");
}
printf("\n");
}
}
(5) break
#include <stdio.h>
int main(){
int i;
int sum = 0;
for(i = 1; i <= 10; i++){
sum += i;
if(sum > 30) break;
}
printf("누적한 값: %d\n", sum);
printf("마지막으로 더한 값: %d\n", i);
}
(확인 문제)
#include <stdio.h>
int main(){
int n;
printf("양의 정수를 입력하세요 : ");
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i == j || i + j == n-1){
printf("*");
}
else{
printf(" ");
}
}
printf("\n");
}
}
(도전 실전 예제)
#include <stdio.h>
int main(){
printf("2부터 n까지의 소수 출력 프로그램\n");
printf("2이상의 정수를 입력하세요 : ");
int n;
scanf("%d", &n);
for(int i = 2; i <= n; i++){
int isprime = 1;
for(int j = 2; j < i; j++){
if(isprime == 1 && i % j == 0){
isprime = 0;
break;
}
}
if(isprime == 1){
printf("%d ", i);
}
}
}
*혼공 용어 노트 활용
(추가 확장)
- 별 찍기