2019-1 st 프로그래밍입문 (1) 5 장. 제어문 박종혁교수 서울과학기술대학교컴퓨터공학과 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr
목차 조건문 if switch 반복문 반복문의필요성 for while do while 무한루프 분기문 break continue goto return 2
제어문 프로그램의수행순서를제어하기위한목적의문장 3
if 문 int price = 35000; if (month >= 6 && month <= 8) // 성수기 (6~8 월 ) 이면 price = 70000; if (! scanf("%d", &num)) // scanf 함수의리턴값이 0 이면 printf(" 입력실패 "); // 입력실패시에러메시지출력 4
예제 : if 의사용예 5
복합문 { } 으로묶인문장, 블록 언제든지단일문대신사용할수있다 6
if else 문 score < 70 이거짓인경우에해당 if (score < 70) printf(" 재시!!!\n"); if (score >= 70) printf(" 통과!!!\n"); if (score < 70) printf(" 재시!!!\n"); else // 그렇지않으면 printf(" 통과!!!\n"); 조건연산자 int max = (x > y)? x : y; int max; if (x > y) // x가 y보다크면 max = x; else // 그렇지않으면 max = y; 7
예제 : if else 의사용예 8
예제 : 0 으로나누기검사 9
중첩된 if if 문안에포함된 if 문 8 세이상이면유료, 8 세미만은무료 int fee; if (age >= 8) { if (age >= 65 fee = 5000; else fee = 10000; } else { fee = 0; } 65 세이상은경로우대, 아니면정상요금 // 중첩된 if 10
예제 : 중첩된 if 의사용예 11
else if 문 (1/2) else 의블록안에다른문장없이또다른 if 문만들어있을때 여러가지조건을순서대로검사 if (age < 8) { fee = 0; } else { if (age >= 65) { fee = 5000; } else { fee = 10000; } } else 안에또다른 if 문만포함되어있는경우 if (age < 8) { fee = 0; } else if (age >= 65) { fee = 5000; } else { fee = 10000; } 여러가지조건을순서대로검사한다. 12
else if 문 (2/2) 13
예제 : else if 의사용예 14
다중 if 서로독립적인조건을여러개비교하는경우 각각의 if 문은 else if 로연결되지않는다 fee = 10000; if (age >= 65) fee -= 5000; if (is_local == 1) fee -= -1000; 65 세이상이면 5000 원할인 지역주민이면 1000 원할인 65 세이상과지역주민은서로독립적인조건 65 세이상이면서지역주민일수도있고아닐수도있다. 15
if 문의비교 16
else if 의활용 else if 문은선택적으로코드를수행하게만들때유용하게사용된다 텍스트기반의메뉴처리 17
예제 : else if 를이용한텍스트기반의메뉴처리 18
예제 : else if 를이용한사칙연산계산기 19
switch 문 정수식의값에따라서여러가지경우중하나로분기한다 20
예제 : switch 를이용한텍스트기반의메뉴처리 21
switch 의수행순서 22
예제 : switch 를이용한사칙연산계산기 23
else if vs. switch (1/2) 24
else if vs. switch (2/2) 25
switch 사용시주의사항 (1/3) switch 문에서 break 는생략할수있다 실수로 break 를빠뜨리면, break 를만나거나 switch 의끝을만날때까지나타나는모든문장들을수행한다 의도적으로특정 case 에대한 break 를생략할수도있다. 26
switch 사용시주의사항 (2/3) default 도생략할수있다 switch 문에일치하는 case 가없고 default 도없으면, 아무것도수행하지않고 switch 문을빠져나간다 default 는 switch 문의맨마지막에작성하며, default 에도 break 를써주는것이좋다 27
switch 사용시주의사항 (3/3) switch 의 ( ) 안에는정수식만사용할수있으며, 실수나문자열은사용할수없다 특정 case 에서만사용되는변수를선언하려면 { } 를쓰고그안에변수선언및필요한문장을적어준다 28
반복문 조건이만족하는동안주어진문장을반복해서수행 루프 (loop) 반복문을이용하면사용자가원하는만큼반복적으로수행 for while do while 29
for 문 30
예제 : for 의사용예 31
for 문의루프제어변수 일반적으로어떤문장을 N 번반복수행하는용도로사용된다 10 번반복한다. for 문의반복회차마다루프제어변수의값이변경되어, 특정시점에 for 의조건식이참이되어루프를탈출할수있으면된다 32
예제 : 입력된정수들의합계구하기 33
for 문의여러가지변형 for 문에서루프제어변수를여러개사용할수도있다 초기식, 조건식, 증감식과반복할문장은모두생략할수있다 34
널문장 처리할내용없이세미콜론 (;) 만으로이루어진문장 for 문의초기식, 조건식, 증감식에서필요한기능을모두수행해서반복할문장을따로지정할필요가없을경우에유용 35
예제 : 입력된문자로직사각형그리기 입력버퍼에남아있는공백문자 ('\n', ' ', '\t') 를무시한다. 36
#HW 2: For 문을이용피라미드를화면에출력하기 기한 : 1 주 (~4/7) 입력 : - 층수입력 (5) 출력예시 * ** *** **** ***** 37
while 문 38
예제 : while 의사용예 39
예제 : 입력된정수들의합계구하기 40
예제 : 반복수행되는사칙연산계산기 41
do while 문 42
예제 : do while 의사용예 43
for, while, do while 비교 반복문의끝부분에서반복문의탈출여부를결정해야하는프로그램에서는 while 보다는 do while 을사용하는것이자연스럽다 44
예제 : do while 을이용한사칙연산계산기 45
루프탈출위치 46
무한루프 for 에서는무한루프를만들기위해서조건식을생략한다 for ( ; ; ) while 에서는조건식을생략할수없는대신에항상참인값을조건식에써준다 while (1) 무한루프를수행중인프로그램은 Ctrl+C 로강제종료해야한다 무한루프를안전하게탈출하려면 break 를이용한다 47
예제 : 무한루프를이용한메뉴처리 48
분기문 문장의실행순서를변경 break continue goto return 49
break 문 switch 문안에사용하면제어의흐름이 switch 를탈출해서 switch 의다음문장으로이동한다 for, while, do while 등의반복문안에서사용하면반복문을빠져나가게된다 50
예제 : break 의사용예 51
break 의활용 무한루프와 break 를이용하면원하는위치에서루프탈출조건을검사해서루프를빠져나올수있다 while (1) { printf("1. 파일열기 \n"); printf("2. 재생 \n"); printf("3. 재생옵션 \n"); printf(" 선택 : "); scanf("%d, &menu); if (menu == 0) break; menu 를입력받은다음루프탈출조건을검사한다. } switch (menu) { case 1: printf(" 재생할파일이름? "); scanf("%s", filename); break;... } 52
예제 : 종료메뉴를가진메뉴처리프로그램 53
센터널값을이용한루프탈출 센티널 : 입력되는데이터의끝을나타내는특별한값 특정값을입력하면프로그램을종료하기로미리약속 while (1) { printf(" 수식? "); scanf("%d %c %d", &a, &op, &b); "0 0 0" 이입력되면무한루프를탈출한다. } if (a == 0 && && op == '0' && b == 0) break; switch (op) { case '+': printf("%d + %d = %d\n", a, b, a + b); break;... } 54
예제 : 센티널값을이용한사칙연산계산기 55
continue 문 루프의시작이나끝부분으로이동한다 56
예제 : continue 의사용예 57
continue 의수행순서 for 문안에서 continue 를 for 의시작부분으로이동해서루프를반복한다 58
goto 문 제어의흐름을프로그램의특정위치로이동 레이블 : 이동할문장을가리킨다 레이블이름과콜론사용 꼭필요한경우가아니면 goto 문을사용하지않는것이좋다 한꺼번에여러개의루프를탈출해야할때유용 59
예제 : goto 의사용예 60
return 문 프로그램수행중에 return 문을만나면함수를호출한곳으로되돌아간다 리턴값이있는함수에서는 return 다음에값을써주고, 리턴값이없는함수에서는 return 만써준다 61
예제 : return 의사용예 62
# 추가자료 63
비만도검사프로그램 if~else 구문사용 #include <stdio.h> /*BMI는체중을키의제곱으로나눈다 ( 체중은 kg, 키는 m) int main() BMI가 20미만 : 저체중, 20~24.9 : 표준체중, 25이상 : 과체중 */ { double weight, height; double bmi; printf( 몸무게를입력하세요 (kg) : ); scanf( %lf, &weight); printf( 키를입력하세요 (cm) : ); scanf( %lf, &height); height = height / 100; bmi= weight / (height * height); printf( 당신의BMI는 : %.1lf입니다.\n, bmi); if(bmi>=20.0 && bmi<25.0) printf( 표준체중입니다.\n ); else printf( 체중관리가필요합니다.\n ); return 0; } 64
학점계산프로그램 if~else 구문사용 #include <stdio.h> /* 평균점수는실수값으로입력된다 int main() 평균이 90점이상은 A, 90점미만 80점이상이면 B { 80점미만 70점이상이면 C, 그외는 F */ double avg; char grade; printf(" 평균점수를입력하세요 : "); scanf("%lf", &avg); if(avg>=90.0) grade='a ; else if(avg>=80.0) grade='b ; else if(avg>=70.0) grade='c ; else grade= F ; printf(" 학점은 %c 입니다.\n", grade); return 0; } 65
문자종류별로사용된문자의수를세는프로그램 #include <stdio.h> int main(void) { int blank_cnt = 0, c, digit_cnt = 0, letter_cnt = 0, nl_cnt = 0, other_cnt = 0; while ((c = getchar())!= EOF) /* braces not necessary */ if (c == ) ++blank_cnt; else if (c >= '0' && c <= 9 ) ++digit_cnt; else if (c >= 'a' && c <= 'z' l l c >= 'A' && c <= Z ) else if (c == '\n ) ++nl_cnt; else ++other_cnt; printf("%10s%10s%10s%10s%10s%10s\n\n", "blanks", "digits", "letters", "lines", "others", "total"); printf("%10d%10d%10d%10d%10d%10d\n\n", blank_cnt, digit_cnt, letter_cnt, nl_cnt, other_cnt, blank_cnt+ digit_cnt+ letter_cnt+ nl_cnt+ other_cnt); return 0; } ++letter_cnt; 66
구구단프로그램 While 구문사용 #include <stdio.h> int main(void) { int n; int i = 1; printf( 출력하고싶은단 : "); scanf("%d", &n); while(i <= 9) { printf("%d*%d = %d \n", n, i, n*i); i++; } } return 0; 출력결과출력하고싶은단 : 9 9*1=9 9*2=18 9*9=81 67
팩토리얼프로그램 for 구문사용 #include <stdio.h> int main(void) { long fact=1; int i, n; printf(" 정수를입력하시오 :"); scanf("%d", &n); for(i = 1;i <= n; i++) fact = fact * i; printf("%d! 은 %d입니다.\n", n, fact); return 0; 실행결과 정수를입력하시오 : 10 10! 은 3628800입니다. } 68
추첨프로그램 #include <stdio.h> int main() { int lot; printf(" 당첨번호를입력하세요 : "); scanf("%d", &lot); switch(lot){ case 1: printf(" 김서방 "); break; case 2: printf(" 홍가네 "); break; case 3: printf(" 안산댁 "); break; default: printf(" 당첨자가없습니다!"); break; } } return 0; 69
getchar() 와 putchar() 의사용 stdio.h 에정의된매크로 getchar() : 키보드에서문자를읽음 putchar() : 화면에문자를출력함 char 형은 1 바이트, int 형은 2 바이트나 4 바이트에저장됨 int 형은 char 형이저장할수있는모든값과그이상을저장할수있음 char 형을작은정수형으로생각할수있음 반대로 int 형을큰문자형으로볼수있음 70
예제 -1 #include <stdio.h> int main(void){ int c; while ((c = getchar())!= EOF) { /* #define EOF (-1) */ putchar(c); } return 0; } ( 주의 ) c가 char가아니라 int로선언되어있음 71
예제 -2 int main(){ char str[80]; int ch; int i; printf( 문자열을입력하세요 : ); for(i=0; i<4; i++){ ch=getchar(); str[i]=ch; } str[i]= \0 ; 다 printf( 입력된문자열 : ); i=0; while(str[i]= \0 ){ putchar(str[i]); i++; } return 0; // 문자열을저장할배열 // getchar함수의리턴값을저장할변수 // 반복제어변수 // i는 0부터 3까지변하면서 4번반복 // 키보드로부터문자를입력받아리턴한다 // 리턴된문자를배열에차례로저장 // 마지막에널문자를저장하여문자열을완성한 // 제어변수를다시 0으로초기화 // 배열요소가널문자가아닌동안반복 // 화면에문자출력 // 다음문자로이동 72
스트림버퍼 키보드에서입력되는데이터는일단버퍼에저장되고 getchar 함수는버퍼로부터데이터를가져오므로문자열은한번에입력한다 문자를하나씩입력하면새줄문자로입력되므로문제가발생한다 73
예제 -3 getchar 함수가새줄문자 ( \n ) 도하나의문자로입력하므로이문자를이용하여한줄을입력받을수있다 printf( 문자열을입력하세요 : ); while(1){ // 무한반복 ch=getchar(); // 퍼버로부터문자하나를입력한다. if(ch== \n ) break; } str[i]=ch; i++; str[i]= \0 ; // 그문자가새줄문자이면입력종료 // 배열요소에입력한문자를저장 // 다음배열요소로이동 // 마지막에널문자를넣어문자열을완성한다 74
75
참고문헌 천정아, Core C Programming, 연두에디션 (2019) C 가보이는그림책, ANK Co., Ltd., 성안당 (2018) Greg Perry, Dean Miller 어서와 C 언어는처음이지, 천인국옮김, 인피니티북스 (2015) KELLEY ( 역 : 김명호외 ), A Book on C, 홍릉과학출판사 (2003) 윤성우, 열혈 C 프로그래밍, 오렌지미디어 천인국, 쉽게풀어쓴 C 언어 Express, 생능출판사 서현우, 뇌를자극하는 C 프로그래밍, 한빛미디어 강성수, 쾌도난마 C 프로그래밍, 북스홀릭 고응남, C 프로그래밍기초와응용실습, 정익사 76