C 언어 기초#5 제어문 - if, switch, goto, while, for, continue
*제어문(control statement)
조건문(if, switch, goto)과 반복문(while, for, continue)이 있다.
*if문
참인 경우 실행됨. if(조건식)
예제) 문자를 입력받고 대문자, 소문자, 그 외 문자로 분류.
#define _CRT_SECURE_NO_WARNINGS //scanf 사용하기 위한 정의.
#include<stdio.h>
int main(void)
{
char ch;
printf("문제를 입력하시오:");
scanf("%c", &ch);
if (ch >= 'A' && ch <= 'Z')
printf("%c는 대문자입니다.\n", ch);
else if (ch >= 'a' && ch <= 'z')
printf("%c는 소문자입니다.\n", ch);
else if (ch >= '0' && ch <= '9')
printf("\"%c\"는 숫자입니다.\n", ch); // 큰다옴표 출력시 \(이스케이프) 이용.
else
printf("\"%c\"는 기타문자입니다.\n", ch);
return 0;
}
char 타입 변수에 들어간 입력받은 것을 정수로 해석하여 사용할 수도 있고 아니면 이것을 아스키 코드로 간주하여 문자로 사용할 수도 있다.
* switch 문
- if 문에서 가능한 실행 경로는 두 개인데, 실행 경로가 여러 개인 경우에는 switch 문을 사용하는 것이 좋다.
- default 문은 어떤 case 문과도 일치되지 않는 경우에 선택되어 실행된다. 만약 default 문이 없고 일치하는 case 문도 없다면
아무 것도 실행되지 않는다. (가급적 default 문 포함 시키는 것이 좋음)
- case절에 실수나 변수, 수식, 문자열을 사용하는 것은 컴파일 오류이다.
- break;가 없으면 해당 케이스를 실행 후 그 다음 케이스를 조건 일치 불일치와 상관없이 실행한다.
예제) 입력 받은 달이 몇 일까지 있는지 알려주는 프로그램
#define _CRT_SECURE_NO_WARNINGS //scanf 사용하기 위한 정의.
#include<stdio.h>
int main(void)
{
int month, days;
printf("달을 입력하시오:");
scanf("%d", &month);
switch (month)
{
case 2:
days = 28;
break;
case 4:
case 6: # break;가 없기 때문에 case 11의 days = 30;까지 실행된다.
case 9:
case 11:
days = 30;
break;
default:
days = 31;
break;
}
printf("%d월은 %d일입니다.\n", month, days);
return 0;
}
cf. 숫자 외 입력을 받으면 오류가 뜸. 나중 포스팅에 숫자 외 입력을 처리하는 방법에 대해 논할 것임.
* goto 문
- goto문은 프로그램을 아주 복잡하게 만들기 때문에 유지보수에 어려움. goto문 사용하지 않는 것이 좋음.
- goto문은 원하는 위치(레이블)로 조건 없이 점프하게 하는 기능. (레이블은 점프를 원하는 위치에 이름을 붙인 것)
- 함수를 점프할 수는 없음.
goto error;
...
...
...
error:
printf("오류발생\n");
*EOF
End Of File 이며, 파일의 끝을 표현하기 위해 정의해 놓은 상수이다(-1 값을 가지고 있다).
함수 호출의 실패나, 윈도우에서 ctrl + z , 리눅스에서 ctrl + d를 입력 했을 경우 EOF를 반환한다.
*while문
while(조건) 형식으로, 조건이 참이면 반복.
예제) 입력 받은 값 중에 최솟값을 출력한다.
#define _CRT_SECURE_NO_WARNINGS //scanf 사용하기 위한 정의.
#include<stdio.h>
#include<limits.h> // 최대값에 대한 정의를 포함한 헤더파일을 불러온다.
int main(void)
{
int number, min_value = INT_MAX; // 일단 정수의 최댓값을 대입해둔다.
printf("정수를 입력하시오\n 종료는 Ctrl+z\n");
while (scanf("%d", &number) != EOF) //입력 받은 값이 EOF이면 while을 실행하지 않는다.
{
if (number < min_value) // 입력 받은 값이 이전 입력값보다 작으면 최솟값으로 입력받는다.
min_value = number;
}
printf("최솟값은 %d\n", min_value);
return 0;
*continue
-> 조건문에 따른 continue의 동작 방식.
예제) 알파벳 소문자를 입력 받아 대문자로 바꿔주는 프로그램
#define _CRT_SECURE_NO_WARNINGS //scanf 사용하기 위한 정의.
#include<stdio.h>
int main(void)
{
char letter;
printf("프로그램을 종료하려면 Q를 입력하시오.\n");
while (1)
{
printf("소문자를 입력하시오: ");
scanf(" %c", &letter); //공백 문자 제외
if (letter == 'Q') // Q를 입력하면 프로그램 종료.
break; // 반복문 탈출
if (letter < 'a' || letter > 'z')
continue; // 반복문을 다시 실행한다.
letter -= 32; // 아스키코드에서 소문자와 대문자는 32만큼 차이난다
printf("변환된 대문자는 %c입니다.\n", letter);
}
return 0;
*for 문
for(초기식 ; 조건식 ; 증감식)
초기식(initialization)은 반복 루프 전 한번만 실행. 변수 값 초기화.
조건식(expression)은 반복을 계속할 것인지 말 것인지 결정하는 수식. 관계식이나 논리식이어야 함.
증감식(increment)은 루프를 제어하는 변수를 증가시키거나 감소시킨다.
다양한 for 루프
1. for( ; ; ) -> 무한 루프
2. for( ; i<10 ; i++) -> 초기식이나 조건식, 증감식이 없을 수 있다.
3. for(i = 0, sum=0 ; i<100 ; i++) -> 초기화 수식에 콤마 연산자를 사용하여 2개 이상의 변수를 초기화시킬 수도 있다.
4. for(printf("반복시작), i=0 ; i<100; i++) -> 초기화 자리에 다른 문장도 들어갈 수 있다.
예제) 복리 이자 계산기
#define _CRT_SECURE_NO_WARNINGS //scanf 사용하기 위한 정의.
#include<stdio.h>
int main(void)
{
int i, years;
double total, rate, investment;
printf("원금:");
scanf("%lf", &investment);
printf("이율(%%): "); // %가 형식지정자로 쓰이므로 출력하려면 %앞에 %를 붙여줘야한다.
scanf("%lf", &rate);
printf("기간(년):");
scanf("%d", &years);
printf("==================\n");
printf("연도 원리금\n");
printf("==================\n");
total = investment;
rate /= 100.0; // 복합대입연산자/=는 rate= rate / 100.0 을 의미
for (i = 0; i < years; i++)
{
total = total * (1 + rate); // 복합대입연산자 *=로 써도 됨.
printf("%2d %10.1f\n", i + 1, total); // &10.1f은 소수점 이하 1자리까지 표시
}
return 0;
}
출처 : 쉽게 풀어쓴 C언어 Express