ch03 - 조건문과...
Transcript of ch03 - 조건문과...
3. 조건문과 반복문
2015-1 Programming Language
March 7, 2015
Prof. Young-Tak KimAdvanced Networking Technology Lab. (YU-ANTL)
Dept. of Information & Comm. Eng, College of Engineering, Yeungnam University, KOREA
(Tel : +82-53-810-2497; Fax : +82-53-810-4742http://antl.yu.ac.kr/; E-mail : [email protected])
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 2
Outline
제어문, 조건문이란 ? if, if – else, 다중 if 문예: 이차방정식, 산술계산기switch, break, continuegoto
반복문이란 ? while, do – while, for중첩 반복문 (nested loop) break, continue
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 3
조건문의 예만약 비가 오지 않으면 테니스를 친다.만약 결석이 1/3이상이면 F학점을 받는다.만약 시간이 없는 경우에는 택시를 탄다.만약 날씨가 좋고 공휴일이면 공원에 산책을 간다.점수가 60점 이상이면 합격이고 그렇지 않으면
불합격이다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 4
if문
조건에 따라서 결정을 내리는 경우에 사용
if( 조건식 )문장;
조건식이 참으로 계산되면
문장이 실행된다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 5
// if 문을 사용하여 절대값을 구하는 프로그램
#include <stdio.h>
int main(void){
int number;
printf("정수를 입력하시오:"); scanf("%d", &number);
if( number < 0 ) number = -number;
printf("절대값은 %d 입니다.₩n", number);
return 0; }
예제
정수를 입력하시오.-5절대값은 5 입니다.
만약사용자가 -5를입력하였다면
-5 < 0이므로해당 조건문
실행
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 6
if-else 문
날씨가 ?날씨가 좋은가?
테니스를 친다.참
거짓
공부를 한다.
if( 조건식 )문장1;
else 문장2;
조건식이 참이면 실행된다.
조건식이 거짓이면 실행된다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 7
if-else 문
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 8
if-else 문if ( score >= 60 )
printf("합격입니다.\n");else
printf("불합격입니다.\n");
score가 60이상이면 실행
score가 60미만이면 실행
if ( score >= 60 ) {
printf("합격입니다.\n"); printf("장학금도 받을 수 있습니다.\n");
} else{
printf("불합격입니다.\n"); printf("더욱 열심히 공부하세요.\n");
}
score가 60이상이면 실행
score가 60미만이면 실행
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 9
복잡한 조건식도 가능
학점 결정 코드
if( score >= 80 && score < 90 )grade = 'B';
공백 문자들의 개수를 세는 코드
if( ch == ‘ ‘ || ch == ‘₩n’ || ch == ‘₩t’ )white_space++;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 10
// 윤년 판단 프로그램
#include <stdio.h>
int main(void){
int year;
printf("연도를 입력하시오: "); scanf("%d", &year);
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf("%d년은 윤년입니다.\n", year);
elseprintf("%d년은 윤년이 아닙니다.\n", year);
return 0; }
예제연도를 입력하시오:2005년은 윤년이 아닙니다.
2005
PASS
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 11
중첩 if
if( score >= 80 ) if( score >= 90 )
printf("당신의 학점은 A입니다.\n");
if( score >= 80 ) if( score >= 90 )
printf("당신의 학점은 A입니다.\n");else
printf("당신의 학점은 B입니다.\n");
If 문안의 문장자리에 if문이들어간 경우
If 문안의 문장자리에 if-else 문이 들어간 경우
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 12
if와 else의 매칭 문제
if(score > 80)if( score >= 90)
printf(“당신의 학점은 A입니다₩n”);else
printf(“당신의 학점은 B입니다₩n”)X
O
else 절은 가장 가까운 if절과 매치된다.
만약 다른 if절과 else 절을 매치시키려면 중괄호를 사용하여 블록
으로 묶는다.
if( score >= 80 ) {if( score >= 90 )
printf("당신의 학점은 A입니다.\n"); } elseprintf("당신의 학점은 A나 B가 아닙니다.\n");
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 13
정수 3개중의 최소값 찾기
정수 3개를 입력하시오:10 20 30제일 작은 수는 10입니다.
10 < 20 이고 10 < 30 이므로 실행
#include <stdio.h>int main(void){
int n1, n2, n3, min;
printf("정수 3개를입력하시오:");scanf("%d %d %d", &n1, &n2, &n3);
if( n1 < n2 )if( n1 < n3 )
min = n1;else
min = n3;else
if( n2 < n3 )min = n2;
elsemin = n3;
printf("제일작은수는 %d입니다\n", min);return 0;
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 14
연속적인 if
if( 조건식1 ) 문장1;
else if( 조건식2 ) 문장2;
else if( 조건식3 ) 문장3;
else문장4;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 15
// 문자들을 분류하는 프로그램
#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);
elseprintf("%c는 기타문자입니다.\n", ch);
return 0; }
문자 분류 예제
문자를 입력하시오: c는 소문자입니다.
cPASS
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 16
#include <stdio.h>int main(void){
char op;int x, y, result;
printf("수식을 입력하시오");printf("(예: 2 + 5) ");printf(">>");scanf("%d %c %d", &x, &op, &y);
if( op == '+' )result = x + y;
else if( op == '-' )result = x - y;
else if( op == '*' )result = x * y;
else if( op == '/' )result = x / y;
else if( op == '%' )result = x % y;
elseprintf("지원되지 않는 연산자입니다. ");
printf("%d %c %d = %d ", x, op, y, result);return 0;
}
간단한 수식 계산
수식을 입력하시오(예: 2 + 5)>>2 + 52 + 5 = 7
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 17
여러가지 경우 중에서 하나를 선택하는데 사용
switch 문
switch(조건식) {
case c1: 문장1; break;
case c2: 문장2; break;
...
... case cn:
문장n; break;
default: 문장d; break;
}
제어식의 값이 c1이면 실행된다.
제어식의 값이 c2이면 실행된다.
일치하는 값이 없으면 실행된다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 18
switch 문의 실행 순서
break는 문장의실행을 끝내고
switch 문을 탈출하는데 사용합니
다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 19
예제int main(void){
int number;
printf("정수를 입력하시오:"); scanf("%d", &number); switch(number) {
case 0: printf("없음₩n"); break ;
case 1: printf("하나₩n"); break ;
case 2: printf("둘₩n"); break ;
default: printf("많음₩n"); break;
} }
정수를 입력하시오: 하나
1
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 20
break가 생략되는 경우
break를 만날 때까지 계속 문장을 실행합니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 21
의도적인 break생략switch(number)
{ case 0:
printf("없음₩n"); break;
case 1: printf("하나₩n"); break;
case 2: case 3:
printf("두서너개₩n"); break;
default: printf("많음₩n"); break;
}
2개의 경우를 하나로 묶어서 처리하기위하여 이러한 기법
을 사용
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 22
default 문
어떤 case문과도 일치되지 않는 경우에 선택
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 23
switch 문과 if-else 문
int main(void) { int number; scanf("%d", &number);
if( number == 0 ) printf("없음\n");
else if( number == 1 ) printf("하나\n");
else if( number == 2 ) printf("둘\n");
elseprintf("많음\n");
}
switch(number) {
case 0: printf("없음\n"); break;
case 1: printf("하나\n"); break;
case 2: printf(“둘\n"); break;
default: printf("많음\n"); break;
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 24
switch 문에서 주의할 점
switch(number){
case x: // 변수는 사용할 수 없다. printf("x와 일치합니다. ");break;
case (x+2): // 변수가 들어간 수식은 사용할 수 없다. printf("수식과 일치합니다. ");break;
case 0.001: // 실수는 사용할 수 없다. printf("실수");break;
case “001”: // 문자열은 사용할 수 없다. printf("문자열");break;
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 25
예제// 달의 일수를 계산하는 프로그램#include <stdio.h>
int main(void){
int month, days;
printf("달을 입력하시오: "); scanf("%d", &month);
switch(month) {
case 2: days = 28; break;
case 4: case 6: case 9: case 11:
days = 30; break;
default: days = 31; break;
} printf("%d월의 일수는 %d입니다.₩n", month, days); return 0;
}
달을 입력하시오: 1212월의 일수는 31입니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 26
실습: 산술 계산기#include <stdio.h>
int main(void){
char op;int x, y, result;
printf("수식을 입력하시오");printf("(예: 2 + 5) ");printf(">>");scanf("%d %c %d", &x, &op, &y);switch(op){
case '+':result = x + y;break;
case '-':result = x - y;break;
…default:
printf("지원되지 않는 연산자입니다. ");break;
}printf("%d %c %d = %d ", x, op, y, result);return 0;
}
수식을 입력하시오(예: 2 + 5)>>2 + 52 + 5 = 7
10 % 3
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 27
Goto문
조건없이 어떤 위치로 점프사용하지 않는 것이 좋음
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 28
예제// 구구단출력프로그램#include <stdio.h>
int main(void){
int i = 1;
loop: printf("%d * %d = %d ₩n", 3, i, 3 * i); i++; if( i == 10 ) goto end; goto loop;
end: return 0;
}
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27
I == 10까지 반복
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 29
반복문
Q) 반복 구조는 왜 필요한가?
A) 같은 처리 과정을 되풀이하는 것이 필요하기 때문이다. 학생 30명의 평균 성적을 구하려면 같은 과정을 30번 반복하여야 한다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 30
반복문의 종류
반복문
while
for
10kg이 빠질때까지 반복
하세요
100번 반복하세요.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 31
while 문
주어진 조건이 만족되는 동안 문장들을 반복 실행한다.
while( 조건식 )문장;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 32
#include <stdio.h>
int main(void){
int meter=0; int i = 0;
while(i < 3) {
meter = i * 1609; printf("%d 마일은 %d 미터입니다\n", i, meter); i++; // i = i+1 과 동일
} return 0;
}
예제
01 < 3
01609
2
3218meter
3i
*1609
=
i 값이 3으로 증가하였지만 조건에 만족 하지 않아출력하지 못하고 프로그램을 종료한다.
0마일은 0미터 입니다.
1마일은 1609미터 입니다.2마일은 1609미터 입니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 33
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 34
// 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++; // i = i+1 과 동일
}
return 0; }
예제
1
출력하고 싶은 단: 2
2n *
23
2*1=22*2=42*3=62*4=82*5=10
2*9=18
45
.
..
9i
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 35
// while 문을 이용한 제곱값 출력 프로그램
#include <stdio.h>
int main(void){
int n;
printf("====================\n");printf(" n n의 제곱 \n");printf("====================\n");
n = 1; while (n <= 10) {
printf("%5d %5d\n", n, n*n); n++; // n= n+1 과 동일
}
return 0; }
예제
==================== n n의 제곱
====================
1
1 12 43 94 165 25
10 100
.
..
234510n
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 36
센티널(sentinel, 보초) 의 이용
센티널: 입력되는 데이터의 끝을 알리는 특수한 값
100, 200, 300, 400, 500, -1
센티널
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 37
// while 문을 이용한 성적의 평균 구하기 프로그램
#include <stdio.h>
int main(void){
int grade, n; float sum, average;
// 필요한 변수들을 초기화한다.n = 0; sum = 0; grade = 0;
printf("종료 시 음수 입력\n");
센티넬 예제 1/2
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 38
// 성적을 입력 받아서 합계를 구하고 학생 수를 센다. while (grade >= 0) {
printf("성적을 입력하시오: "); scanf("%d", &grade);
sum += grade; n++;
}
sum = sum - grade; // 마지막 데이터를 제거한다. n--; // 마지막 데이터를 제거한다. // 평균을 계산하고 화면에 출력한다.average = sum / n; printf("성적의 평균은 %f입니다.\n", average);
return 0; }
센티넬 예제 2/2
0
0 0
종료 시 음수 입력성적을 입력하시오 : 30성적을 입력하시오 : 50성적을 입력하시오 : 70
3030
1
5080
2
70150
3
성적을 입력하시오 : -1
-1grade
149
4
150sum
3n 50
average
성적의 평균은 50.000000입니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 39
예제: 최대값
#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){
if( number < min_value )min_value = number;
}printf("최소값은 %d“, min_value);return 0;
}
정수를 입력하시오종료는 Ctrl+z1020305^Z최소값은 5
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 40
if 문과 while 문의 비교
if( 조건 ){......}
while( 조건 ){......
}
조건이 만족되면 한번만 실행
된다.
조건이 만족되면여러 번 반복 실
행된다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 41
while 문에서 주의할 점int i = 1;while(i < 10){
printf("반복중입니다\n"): i--;
}
int i = 0;while(i < 3)
printf("반복중입니다\n"): i++; .
int i = 0;while(i < 3) ;{
printf("반복중입니다\n"): i++; .
}
변수가 증가 아니라 감소
반복 루프에 포함되어 있지않다.
조건뒤에 ;이 있음
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 42
do...while문
반복 조건을 루프의 끝에서 검사
do문장
while(조건)
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 43
do-while 문
적어도 한번은 반복문장을 실행한다.
문장
조건
참
거짓
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 44
// do..while 문을 이용한 메뉴
#include <stdio.h>
int main(void){
int i = 0; do{
printf("1---새로 만들기\n"); printf("2---파일 열기\n"); printf("3---파일 닫기\n"); printf("하나를 선택 하시오:\n"); scanf("%d", &i);
} while(i < 1 || i > 3);
printf("선택된 메뉴=%d\n",i); return 0;
}
예제
1---새로 만들기2---파일 열기
3---파일 닫기
하나를 선택 하시오:1
01i
선택된 메뉴=1
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 45
for 루프정해진 횟수만큼 반복하는 구조
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 46
for 문의 구조for ( 초기식; 조건식; 증감식)
문장;
① 초기식을 실행한다. ② 반복 조건을 나타내는 조건식을 계산한다. ③ 수식의 값이 거짓이면 for 문의 실행이 종
료된다. ④ 수식의 값이 참이면 문장이 실행된다. ⑤ 증감식을 실행하고 ②로 돌아간다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 47
for 문의 구조
int i;for(i = 0; i < 10; i++)
printf("Hello World!\n");
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 48
for문의 실행과정
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 49
for문의 실행과정
반복횟수 i의 값 i<10 반복여부
1번째 반복 0 참 반복
2번째 반복 1 참 반복
3번째 반복 2 참 반복
4번째 반복 3 참 반복
5번째 반복 4 참 반복
6번째 반복 5 참 반복
7번째 반복 6 참 반복
8번째 반복 7 참 반복
9번째 반복 8 참 반복
10번째 반복 9 참 반복
11번째 반복 10 거짓 중지
int i;for(i = 0; i < 10; i++)
printf("Hello World!\n");
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 50
// 반복을 이용한 정수합 프로그램
#include <stdio.h>
int main(void){
int i, sum;
sum = 0;for(i = 1;i <= 10; i++)
sum += i; // sum = sum + i;와 같음
printf("1부터 10까지 정수의 합= %d\n",sum);
return 0; }
예제시작
i=1 , sum=0
i <= 10
sum = sum + i
i++
Sum출력
NO
YES
i가 10보다 작거나 같은 때까지 10번 반복
1부터 10까지 정수의 합 = 55
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 51
// 반복을 이용한 세제곱값구하기
#include <stdio.h>
int main(void){
int i, n;
printf("정수를 입력하시오:"); scanf("%d", &n);
printf("====================\n"); printf(" i i의 세제곱\n"); printf("====================\n"); for(i = 1;i <= n; i++)
printf("%5d %5d\n", i, i*i*i);
return 0; }
예제
1 3n
==================== i i의 세제곱
==================== 1 12 83 27
정수를 입력하시오:3
23i
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 52
예제
// 반복을 이용한 네모 그리기#include <stdio.h>
int main(void){
int i;printf("**********");
for(i = 0;i < 5; i++)printf("* *");
printf("**********");
return 0;}
*********** ** ** ** ** ***********
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 53
while 루프와 for 루프와의 관계
{
초기식
while ( 조건식 )
}
장문장1 ;
장문장2 ;
증감증감식 ;
for ( 초기식 ;조건식 ;증감증감식 )
{
}
장문장1 ;
장문장2 ;...
...
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 54
팩토리얼 계산 예제(while 버전)
// 반복을 이용한 팩토리얼 구하기#include <stdio.h>
int main(void){
long fact = 1;int i = 1, n;printf("정수를 입력하시요: ");scanf("%d", &n);while (i <= n){
fact = fact * i;i++;
}printf("%d!은 %d입니다.", n, fact);return 0;
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 55
다양한 증감수식의 형태
for (i = 10; i > 0; i-- )printf("Hello World!\n");
for (i = 0; i < 10; i += 2 )printf("Hello World!\n");
for (i = 1; i < 10; i *= 2 )printf("Hello World!\n");
for (i = 0; i < 100; i = (i * i) + 2 )printf("Hello World!\n");
뺄셈 사용
2씩 증가
2를 곱한다.
어떤 수식이라도 가능
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 56
디양한 for 루프
for ( ; i<100; i++ )printf("Hello World!\n");
for (i = 0, k = 0; i < 100; i++ )printf("Hello World!\n");
for (printf("반복시작”), i = 0; i < 100; i++ )printf("Hello World!\n");
한부분이 없을 수도 있다.
2개 이상의 변수 초기화
어떤 수식도 가능
for ( ; ; )printf("Hello World!\n");
무한 반복 루프
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 57
중첩 반복문중첩 반복문(nested loop): 반복문 안에 다른 반복문이 위치
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 58
// 중첩 for 문을 이용하여 *기호를 사각형
// 모양으로 출력하는 프로그램
#include <stdio.h>
int main(void){
int x, y;
for(y = 0;y < 5; y++) {
for(x = 0;x < 10; x++) printf("*");
printf("\n"); }
return 0; }
예제
*
102014
1201
*
2
*
9x
0부터 9까지 10번 반복
*******
y
\n
0부터 4까지 5번 반복
********** \n********** \n********** \n********** \n
①
②
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 59
// break를 이용하여 무한루프를 탈출한다. #include <stdio.h>#include <math.h>
int main(void){
double v;
while(1) {
printf("실수 값을 입력하시오: "); scanf("%lf", &v); if( v < 0.0 )
break;printf("%f의 제곱근은 %f\n", v, sqrt(v));
}
return 0; }
예제
실수 값을 입력하시오: 9.0
9.0
9.000000의 제곱근은 3.000000입니다. 실수 값을 입력하시오: 12.0
12.0
12.000000의 제곱근은 3.464102입니다.
실수 값을 입력하시오: -1
-1v
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 60
// break를 이용하여 무한루프를 탈출한다. #include <stdio.h>
int main(void){
float grade, sum = 0.0, average; int count = 0;
while(1) {
printf("학생 성적을 입력하시오: "); scanf("%f", &grade);
if( grade < 0.0 ) break;
count++; sum += grade;
} average = sum / count; printf("학생들의 평균은 %f입니다.\n", average); return 0;
}
예제
grade < 0.0
count ++
sum += grade
break
YES
NO음수 입력 시while문을 나옴
학생 성적을 입력하시오: 90 학생 성적을 입력하시오: 90 학생 성적을 입력하시오: 80 학생 성적을 입력하시오: 70 학생 성적을 입력하시오: -1 학생들의 성적의 평균은 82.500000입니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 61
예제
#include <stdio.h>int main(void){
int x, y;
for(y = 1; y <= 5; y++){
for(x = 0; x < y; x++)printf("*");
printf(“\n"); // 내부 반복문이 종료될 때마다 실행}return 0;
}
***************
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 62
break 문break 문은 반복 루프를 빠져 나오는데 사용된다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 63
예제
#include <stdio.h>#define SEED_MONEY 1000000
int main(void){
int year=0, money=SEED_MONEY;while(1){
year++;money += money*0.30;if( money > 10*SEED_MONEY )
break;}printf("%d", year);return 0;
}
원금의 10배가 되면
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 64
예제
// break를 이용하여 무한루프를 탈출한다.#include <stdio.h>#include <math.h>
int main(void){
double v;while(1){
printf("실수값을 입력하시오: ");scanf("%lf", &v);if( v < 0.0 )
break;printf("%f의 제곱근은 %f입니다.", v, sqrt(v));
return 0;}
음수이면 빠져나간다
실수값을 입력하시오: 9.09.000000의 제곱근은
3.000000입니다.실수값을 입력하시오: 25.0
25.000000의 제곱근은5.000000입니다.
실수값을 입력하시오: -1
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 65
goto문의 사용#include <stdio.h>
int main(void){
int x, y;
for(y = 1; y < 10000; y++) {
for(x = 1; x < 50; x++) {
if( _kbhit() ) goto OUT; printf("*");
} printf("\n");
} OUT:
return 0; }
OUT 으로 goto
*************************************************
*************************************************
***********
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 66
현재의 반복을 중단하고 다음 반복을 시작하게 한다.
continue 문
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 67
#include <stdio.h>int main(void){
int i;for(i=0 ; i<10 ; i++)
if( i%3 == 0 )continue;
printf("%d ", i);
return 0;}
예제
1 2 4 5 7 8
3의 배수 는 건너뛴다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 68
// 소문자를 대문자로 변경한다. #include <stdio.h>
int main(void){
char letter;
while(1) {
printf("소문자를 입력하시오: "); scanf(" %c", &letter);
if( letter == 'Q' ) break ;
if( letter < 'a' || letter > 'z' ) continue ;
letter -= 32; printf("변환된 대문자는 %c입니다.\n", letter);
}
return 0; }
예제
소문자를 입력하시오 : a
aA
변환된 대문자는 A입니다.. 소문자를 입력하시오 : b
bB
변환된 대문자는 B입니다. 소문자를 입력하시오 : Q
Qletter
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 69
#include <stdio.h>#define START_DAY 3 // 첫번째 날이 수요일#define DAYS_OF_MONTH 31 // 달의 일수
int main(void){
int day, date; printf("=====================\n"); printf("일 월 화 수 목 금 토\n"); printf("=====================\n"); // 월요일부터 수요일까지for(day = 0; day < START_DAY ; day++)
printf(" "); // 공백 출력for(date = 1; date <= DAYS_OF_MONTH ; date++) {
if( day == 7 ) {
day = 0; // 일요일이면 줄바꿈을 출력printf("\n");
} day++; printf("%2d ", date); // 날을 출력한다.
} printf("\n=====================\n"); return 0;
}
예제
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 70
2-Dimentional Array (2차원 배열)
2차원 배열의 초기화
행의 개수를 지정하지 않을 경우에 컴파일러가 자동으로 행의개수를 결정
int s[3][5] = {{0, 1, 2, 3, 4}, // 첫 번째 행의 원소들의 초기값{10, 11, 12, 13, 14}, // 두 번째 행의 원소들의 초기값{20, 21, 22, 23, 24} // 세 번째 행의 원소들의 초기값
};
혹은,
int s[][5] = {{0, 1, 2, 3, 4}, // 첫 번째 행의 원소들의 초기값{10, 11, 12, 13, 14}, // 두 번째 행의 원소들의 초기값{20, 21, 22, 23, 24} // 세 번째 행의 원소들의 초기값
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 71
Matrix multiplication
Calculation of each element
=
a00 a01 a02
a10 a11 a12
a20 a21 a22
X
b00 b01 b02
b10 b11 b12
b20 b21 b22
a00b00+ a01b10+ a02b20
a00b01+ a01b11+ a02b21
a00b02+ a01b12+ a02b22
a10b00+ a11b10+ a12b20
a10b01+ a11b11+ a12b21
a10b02+ a11b12+ a12b22
a20b00+ a21b10+ a22b20
a20b01+ a21b11+ a22b21
a20b02+ a21b12+ a22b22
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 72
printMtrx()Procedure printMtrx(int mA[][SIZE], int num_rows, int num_cols){
for (int i = 0; i< num_rows; i++) {
for (int j = 0; j< num_cols; j++){
if (첫번째 행(row), 첫번째 열 (col))‘’ 출력 후 해당 데이터 출력;
else if (첫번째 행, 마지막 열)데이터 출력 후, ‘’ 출력;
else if (첫번째 행과 마지막 행이 아니며, 첫번째 열)‘’ 출력 후, 데이터 출력;
else if (첫번째 행과 마지막 행이 아니며, 마지막 열)데이터 출력 후, ‘’ 출력;
else if (마지막 행, 첫번째 열)‘’ 출력 후, 데이터 출력
else if (마지막 행, 마지막 열)데이터 출력 후, ‘’ 출력;
else데이터 출력;
}printf("₩n");
}}
출력결과
확장 완성형코드
사용 방법
─ 0xa6, 0xa1 printf(“ %c%c”, 0xa6, 0xa1)
│ 0xa6, 0xa2 printf(“ %c%c”, 0xa6, 0xa2)
┌ 0xa6, 0xa3 printf(“ %c%c”, 0xa6, 0xa3)
┐ 0xa6, 0xa4 printf(“ %c%c”, 0xa6, 0xa4)
┘ 0xa6, 0xa5 printf(“ %c%c”, 0xa6, 0xa5)
└ 0xa6, 0xa6 printf(“ %c%c”, 0xa6, 0xa6)
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 73
multiplication of 2 matricesProcedure multiplyMtrx(A[][SIZE], B[][SIZE], C[][SIZE], int SIZE)1. // A[][] and B[][] are delivered as arguments.2. // C[][] = A[][] x B[][]3. // i, j and k are index of three-level nested for-loop4. for(i=0; i<SIZE; i++)5. for(j=0; j<SIZE; j++)6. C[i][j] = 0; // initialize7. for(k=0; k<SIZE; k++)8. C[i][j] += A[i][k] * B[k][j]9. end for10. end for11. end for12. End Algorithm
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 74
Homework 3
3.1 표준입력장치 (키보드)에서 문자 1개를 입력 받은 후, 이 문자가대문자, 소문자, 모음, 자음, 숫자, 기호인지 구분하고, 그 결과를출력하는 알고리즘을 pseudo code로 작성하고, 이에 대한 C 프로그램을 작성하라. (ASCII 표를 참조할 것.)
3.2 2015년의 1월 ~ 12월 달력을 월별로 출력하는 알고리즘의pseudo code를 작성하라. 2015년 1월 1일은 목요일이며, 윤년인가를 확인하여, 이에 따라 정확한 2월 출력이 될 수 있게 할 것. 각달의 달력에서는 요일이 표시되어야 하며, 1 주일단위로 줄바꿈이표시되어야 한다. 이 알고리즘을 C 프로그램으로 작성하고, 주석문이 포함된 소스코드와 함께 그 실행결과 화면을 캡쳐하여제출하라.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim3 - 75
Homework 3
3.3 중첩 반복문을 사용하여 구구단 표를 출력하는 알고리즘의 pseudo code를 작성하라. 이 프로그램은 다음과 같은 형식으로 구구단 표를출력하여야 한다. 출력되는 값은 4자리씩을 가지며, 오른쪽 맞춤으로printf()의 출력 포멧을 설정할 것. 이 알고리즘을 C 프로그램으로작성하고, 주석문이 포함된 소스코드와 함께 그 실행결과 화면을 캡쳐하여제출하라.
| 1 2 3 4 5 6 7 8 9 ==|===========================================1 | 1 2 3 4 5 6 7 8 92 | 2 4 6 8 10 12 14 16 183 | . . . . 4 | . 5 | 6 |7 |8 |9 | 9 18 27 36 45 54 63 72 81