Trivia
6강.반복문 본문
6.1 반복의 개념 이해
▶반복문
Q. 반복구조는 왜 필요한가?
A. 같은 처리 과정을 되풀이하는 것이 필요하기 때문
(ex.학생 30명의 평균 성적을 구하려면 같은 과정을 30번 반복)
▶프로그램의 흐름을 제어하는 방법
①순차 구조: 차례대로 실행
②선택 구조: 조건을 검사하여 여러 개의 실행 경로 중에서 하나를 선택
③반복 구조: 조건이 만족될 때까지 반복
▶반복문의 종류
①while: 미리 반복 횟수를 알 수 없는 경우에 사용
②for: 정해진 횟수 만큼 반복하는 경우에 사용
※중간 점검※
Q1. 프로그램에 반복 구조가 필요한 이유는 무엇인가?
A1. 같은 처리 과정을 되풀이하는 것이 필요하기 때문
Q2. 반복문에는 ____________, ____________문이 있다.
A2. while, for
6.2 while
▶while문: "주어진 조건이 만족되는 동안" 문장들을 반복 실행 (조건제어반복)
while( 조건식 )
{
문장(들); //반복 문장이 하나면 중괄호 생략 가능
}
ex) 예제 프로그램: while문을 이용한 구구단 출력
//while문을 이용한 구구단 출력 프로그램
#include <stdio.h>
int main()
{
int n;
int i = 1;
printf("구구단 중에서 출력하고 싶은 단을 입력하시오: ");
scanf("%d", &n);
while(i <= 9)
{
printf("%d * %d = %d \n", n, i, n * i);
i++;
}
return 0;
}
구구단 중에서 출력하고 싶은 단을 입력하시오: 3
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
ex) 예제 프로그램: while문을 이용한 합 계산 예제
//while문을 이용하여 1부터 100까지의 합을 계산하는 프로그램
#include <stdio.h>
int main()
{
int i, sum;
i = 1;
sum = 0;
while(i <= 100)
{
sum += i;
i++;
}
printf("1부터 100까지의 합은 %d입니다.", sum);
return 0;
}
1부터 100까지의 합은 5050입니다.
ex) 예제 프로그램: while문을 이용한 최대 공약수 구하기 (유클리드 알고리즘)
//while 문을 이용하여 두 수의 최대 공약수 구하는 프로그램
#include <stdio.h>
int main()
{
int x, y, r;
printf("두 개의 정수를 입력하시오(큰 수, 작은 수): ");
scanf("%d %d", &x, &y);
while(y != 0)
{
r = x % y;
x = y;
y = r;
}
printf("최대 공약수는 %d입니다.\n", x);
return 0;
}
두 개의 정수를 입력하시오(큰 수, 작은 수): 7 3
최대 공약수는 1입니다.
두 개의 정수를 입력하시오(큰 수, 작은 수): 12 3
최대 공약수는 3입니다.
※중간 점검※
Q1. if문과 while문을 비교하여 보라. 똑같은 조건이라면 어떻게 동작하는가?
A1. if문은 조건 만족 시 한번만 실행
while문은 조건 만족 시 여러 번 반복 실행
Q2. while루프를 이용하여 무한 루프를 만들어 보라.
A2. while(1)
Q3. 다음 코드의 출력을 쓰시오.
int n = 10;
while (n > 0)
{
printf("%d\n", n);
n = n - 3;
}
A3. 10
7
4
1
▶sentinel(보초값의 이용): 입력되는 데이터의 끝을 알리는 특수한 값
ex) 예제 프로그램: while문을 이용한 성적의 평균 구하기
//while 문을 이용하여 성적의 평균을 구하는 프로그램
#include <stdio.h>
int main()
{
int grade, n; //grade: 각 학생의 성적, n: 총 학생 수
float sum, average; //sum: 모든 성적의 합, average: 성적의 평균
n = 0; //필요한 변수들 초기화
sum = 0;
grade = 0;
printf("성적 입력을 종료하려면 음수를 입력하세요\n");
printf("----------------------------------------------\n");
while(grade >= 0) //성적을 입력받아서 합계를 구하고 학생 수를 계산
{
printf("성적을 입력하세요: ");
scanf("%d", &grade);
sum += grade;
n++;
}
sum = sum - grade; //-1 데이터를 제거 (합계 조정)
n--; //마지막 데이터 제거 (개수 조정)
average = sum / n; //평균 계산
printf("성적의 평균은 %f입니다.\n", average);
return 0;
}
성적 입력을 종료하려면 음수를 입력하세요
----------------------------------------------
성적을 입력하세요: 10
성적을 입력하세요: 20
성적을 입력하세요: 30
성적을 입력하세요: 40
성적을 입력하세요: 50
성적을 입력하세요: -1
성적의 평균은 30.000000입니다.
▶if문과 while문의 비교
①if문은 조건이 만족되면 한번만 실행
②while문은 조건이 만족되면 여러 번 반복 실행
③if문은 while문으로 while문으로 if문으로 변경 가능
▶while문에서 주의할 점
①예시1: 변수 증가가 아닌 감소인 경우
int i = 1;
while(i < 10)
{
printf("반복중입니다.\n");
i--;
}
②예시2: 반복 루프에 포함되어 있지 않은 경우 (무한루핑)
int i = 0;
while(i < 3)
printf("반복중입니다.\n");
i++;
③예시3: 조건 뒤에 ;이 있는 경우
int i = 0;
while(i < 3);
{
printf("반복중입니다.\n");
i++;
}
6.3 do-while
▶do...while문: 일단 문장을 실행한 후에 조건을 검사하여 반복 여부를 결정
do
문장;
while ( 조건식 );
ex) 예제 프로그램: do...while문을 이용하여 메뉴 만들기
//do...while문을 이용한 메뉴
#include <stdio.h>
int main()
{
int n = 0;
do
{
printf("하나를 선택하세요.\n");
printf("1.파일 새로만들기\n");
printf("2.파일 열기\n");
scanf("%d", &n);
} while(n < 1 || n >2);
printf("선택된 메뉴 = %d\n", n);
return 0;
}
하나를 선택하세요.
1. 파일 새로만들기
2.파일 열기
1
선택된 메뉴 = 1
ex) 예제 프로그램: do...while문을 이용한 숫자 게임 예제
//do...while문을 이용한 숫자 게임
#include <stdio.h>
int main()
{
int answer = 39; //정답
int guess;
int tries = 0; //시도 횟수
do
{
printf("정답을 추측해보세요(정수): ");
scanf("%d", &guess);
tries++;
if(guess > answer) //사용자가 입력한 정수가 정답보다 높을 시
printf("제시한 정수가 정답보다 높습니다.\n");
if(guess < answer) //사용자가 입력한 정수가 정답보다 낮을 시
printf("제시한 정수가 정답보다 낮습니다.\n");
} while(guess != answer);
printf("정답입니다.\n시도횟수 = %d\n", tries);
return 0;
}
정답을 추측해보세요(정수): 10
제시한 정수가 정답보다 낮습니다.
정답을 추측해보세요(정수): 30
제시한 정수가 정답보다 낮습니다.
정답을 추측해보세요(정수): 40
제시한 정수가 정답보다 높습니다.
정답을 추측해보세요(정수): 39
정답입니다.
시도횟수 = 4
※중간 점검※
Q. 다음 코드의 출력을 쓰시오.
int n = 0;
do
{
printf("%d\n", n);
n = n + 3;
} while(n < 10);
A. 0
3
6
9
6.4 for
▶for 루프: 정해진 횟수만큼 반복하는 구조 (횟수 제어 반복)
▶for문의 구조
for( 초기식; 조건식; 증감식 )
문장들;
int i;
for(i = 0; i < 10; i++)
printf("Hello World!\n");
ex) 예제 프로그램: for문을 이용한 정수의 합 구하기
//for문을 이용하여 정수의 합을 구하는 프로그램
#include <stdio.h>
int main()
{
int i, sum=0;
for(i = 0; i < 10; i++)
sum += i; //sum = sum + i;
printf("1부터 10까지의 정수의 합은 %d입니다.\n", sum);
return 0;
}
1부터 10까지의 정수의 합은 55
ex) 예제 프로그램: for문을 이용한 네모 그리기
//for문을 이용한 네모 그리기
#include <stdio.h>
int main()
{
int i;
printf("********\n");
for(i = 0; i < 5; i++)
printf("* *\n");
printf("********\n");
return 0;
}
********
* *
* *
* *
* *
* *
********
ex) 예제 프로그램: for문을 이용한 팩토리얼 구하기
//for문을 이용하여 팩토리얼 구하는 프로그램
#include <stdio.h>
int main()
{
int i, n, fact=1;
printf("정수를 입력하세요: ");
scanf("%d", &n);
for(i = 0; i <=n; i++)
fact = fact * i;
printf("%d!은 %d입니다.\n", n, fact);
return 0;
}
정수를 입력하세요: 5
5!은 120입니다.
▶다양한 증감수식의 형태
①뺄셈을 사용하는 형태
for(i = 10; i > 0; i--)
printf("Hello World!\n");
②2씩 증가하는 형태
for(i = 0; i < 10; i += 2)
printf("Hello World!\n");
③2를 곱하는 형태
for(i = 1; i < 10; i *= 2)
printf("Hello World!\n");
④어떤 수식이라도 가능
for(i = 0; i < 100; i = (i * i) + 2)
printf("Hello World!\n");
⑤한부분이 없을 수도 있음
for( ; i < 100; i++)
printf("Hello World!\n");
⑥2개 이상의 변수 초기화
for(i = 0, k = 0; i < 100; i++)
printf("Hello World!\n");
⑦어떤 수식도 가능2
for(printf("반복시작"), i = 0; i < 100; i++)
printf("Hello World!\n");
※중간 점검※
Q1. 다음 코드의 출력을 쓰시오.
for(i = 1; i < 5; i++)
printf("%d ", 2 * i);
A1. 2 4 6 8
Q2. 다음 코드의 출력을 쓰시오.
for(i = 10; i > 0; i = i - 2)
printf("Student%d\n", i);
A2. Student10
Student8
Student6
Student4
Student2
▶중첩 반복문: 반복문 안에 다른 반복문이 위치
ex) 예제 프로그램: 중첩 for문을 이용하여 *기호를 사각형 모양으로 출력하기
//중첩 for문을 이용하여 사각형 모양 출력하는 프로그램
#include <stdio.h>
int main()
{
int x, y;
for(y = 0; y < 3; y++)
{
for(x = 0; x < 8; x++)
printf("*");
printf("\n");
}
return 0;
}
********
********
********
********
ex) 예제 프로그램: 중첩 for문을 이용하여 *기호를 직각삼각형 모양으로 출력하기
//중첩 for문을 이용하여 사각형 모양 출력하는 프로그램
#include <stdio.h>
int main()
{
int x, y;
for(y = 1; y <= 5; y++)
{
for(x = 0; x < y; x++)
printf("*");
printf("\n");
}
return 0;
}
*
**
***
****
*****
※중간 점검※
Q. 다음 코드의 출력을 쓰시오.
for(i = 1; i < 6; i++)
for(j = 5; j >= 1; j--)
printf("%d * %d는 %d\n", i, j, i*j);
A. 1 * 5 = 5
1 * 4 = 4
1 * 3 = 3
1 * 2 = 2
1 * 1 = 1
2 * 5 = 10
2 * 4 = 8
...
5 * 3 = 15
5 * 2 = 10
5 * 1 = 5
6.5 Break와 continue문
▶break문: 반복 루프를 빠져 나오는데 사용
int i;
for(i = 1; i < 100; i++)
{
printf("%d\n", i);
if(i == 5)
break; //i가 5가 되면 반복 루프를 빠져나옴
}
return 0; //1~5까지만 출력되고 프로그램 종료
ex) 예제 프로그램: break문을 이용한 무한루프 탈출 예제
//break문을 이용하여 무한루프를 탈출하는 예제
#include <stdio.h>
int main()
{
double grade, sum = 0.0, average; //성적, 성적의 합, 평균
int n = 0; //학생 수
while(1) //무한루프
{
printf("성적을 입력하세요: ");
scanf("%lf", &grade);
if(grade < 0.0) //성적이 음수일 시 무한루프 탈출
break;
n++;
sum += grade;
}
average = sum / n;
printf("학생들의 성적의 평균은 %lf입니다.\n", average);
return 0;
}
학생 성적을 입력하세요: 95
학생 성적을 입력하세요: 80
학생 성적을 입력하세요: 75
학생 성적을 입력하세요: 70
학생 성적을 입력하세요: -1
학생들의 성적의 평균은 80.000000입니다.
▶중첩 반복의 경우에는 goto로 탈출
▶continue문: 현재의 반복을 중단하고 다음 반복을 시작하게 함
while(i < 10)
{
if(i % 2 == 1)
{
i++;
continue;
}
i++;
}
ex) 예제 프로그램: continue문을 이용하여 대문자 변환하기
//continue문을 이용하여 소문자를 대문자로 변환하는 프로그램
#include <stdio.h>
int main()
{
char letter;
while(1)
{
printf("소문자를 입력하세요: ");
scanf("%c", &letter);
if(letter >= 'A' || letter <= 'Z') //입력한 값이 대문자일 시 무한 루프 탈출
break;
if(letter < 'a' || letter > 'z') //입력한 값이 소문자 이외에 문자일 시 다음 반복 시작
continue;
letter -= 32;
printf("변환된 대문자는 %c입니다.\n", letter);
}
return 0;
}
소문자를 입력하세요: j
변환된 대문자는 J입니다.
소문자를 입력하세요: K
소문자를 입력하세요: s
변환된 대문자는 S입니다.
소문자를 입력하세요: G
※중간 점검※
Q1. ________문이 반복문에서 실행되면 현재의 반복을 중단하고 다음번 반복 처리가 시작된다.
A1. continue
Q2. ________문이 반복문에서 실행되면 반복문을 빠져 나온다.
A2. break
Q3. 다음 코드의 출력을 쓰시오.
int i;
for(i = 1; i < 10; i++)
{
if(i % 3 == 0)
break;
printf("%d\n", i);
}
A3. 1
2
'C언어 > C프로그래밍 기초(1학기)' 카테고리의 다른 글
7강.배열 (0) | 2019.01.29 |
---|---|
5강.조건문 (0) | 2019.01.23 |
4강.수식과 연산자 (0) | 2019.01.15 |
3강.변수와 자료형 (0) | 2019.01.14 |
2강.C언어 기초(2) (0) | 2019.01.14 |