01-2 반복
반복(repetition) 구조 : 어떤 조건이 성립하는 동안 처리를 반복하여 실행하는 것. loop라고 부름.
(처리 : 프로그램 명령문 또는 명령어의 집합)
1부터 n까지의 합을 구하는 알고리즘
while문 반복 // 실행 전에 반복할지를 판단
while(제어식) 명령문 제어식의 평가값이 0(거짓)이 아니면 반복된다
명령문 -> 루프 본문이라고 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include
int main(void)
{
int n, i;
int sum = 0;
printf("1부터 n까지의 합을 구합니다.\n");
printf("n 입력 : ");
scanf_s("%d", &n);
i = 1;
while (i <= n) //i=n+1이 되면 반복이 중단됨
{
sum += i;
i++;
}
printf("반복 중단 후 i의 값=%d\n", i); //i=n+1로 출력됨
printf("1부터 %d까지의 합은 %d 입니다. \n", n, sum);
return 0;
}
|
cs |
for문 반복 *하나의 변수를 사용한다면 for문을 사용하는 것이 좋다.
for(식1; 식2; 식3) 명령문
식1은 반복에 앞서 한 번만 실행됨, 식2는 제어식으로 평가값이 0이 아니면 반복, 그 다음에 식3이 평가,실행됨
식2는 생략했을때 1(참)로 간주됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include
int main(void)
{
int n, i;
int sum = 0;
printf("1부터 n까지의 합을 구합니다.\n");
printf("n 입력 : ");
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
sum += i;
}
printf("1부터 %d까지의 합은 %d 입니다. \n", n, sum);
return 0;
}
|
cs |
for문과 같은 프로그램을 작성했을 때 while문은 다음과 같이 작성됨
식1;
while(식2)
{
루프 본문
식;
}
Q7
1부터 n까지의 합을 구합니다.
n 입력 : 6
1 + 2 + 3 + 4 + 5 + 6 = 21
와 같이 출력하는 프로그램
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//n에서 +기호가 나오지 않는 것을 어떻게 작성할 것인가-
#include
int main(void)
{
int n, i;
int sum = 0;
printf("1부터 n까지의 합을 구합니다.\n");
printf("n 입력 : ");
scanf_s("%d", &n);
for (i = 1; i < n; i++) //i=1~n-1까지 반복되는 규칙
{
sum += i;
printf("%d + ", i);
}
//for문이 끝난 뒤에 i=n이 되므로
sum += i;
printf("%d = %d", i, sum);
return 0;
}
|
cs |
제공되는 소스
1
2
3
4
5
6
7
|
for (i = 1; i <= n; i++) { /* i = 1, 2, ..., n */
sum += i; /* sum에 i를 더합니다. */
}
for (i = 1; i < n; i++)
printf("%d + ", i);
printf("%d = %d\n", n, sum);
|
cs |
//반복을 또 하는 것이 의아하다
Q8
1부터 n까지의 합 = (1+n)*n/2 임을 이용하여 1부터 n까지의 합을 구하는 프로그램 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include
int main(void)
{
int n;
int sum = 0;
printf("1부터 n까지의 합을 구합니다.\n");
printf("n 입력 : ");
scanf_s("%d", &n);
sum = (1 + n)*n / 2;
printf("1부터 %d까지의 합은 %d입니다.\n", n, sum);
return 0;
}
|
cs |
제공되는 소스
sum = (n + 1) * (n / 2) + (n % 2 == 1 ? (n + 1) / 2 : 0);
//n이 홀수이면 (n+1)/2를 더함
//n이 홀수일 경우 n/2가 값이 잘리기 때문인 것 같다. 그러나 (1+n)*n를 2로 나눠주도록 작성한다면 1+n과 n 중 하나가 무조건 짝수이기 때문에 값이 잘리지 않을 것이다.
Q9
정수 a,b를 포함하여 그 사이의 모든 정수의 합을 구하는 아래 함수를 작성하세요
int sumof(int a, int b);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int sumof(int a, int b)
{
int i, sum = 0;
if (a < b)
{
for (i = a; i <= b; i++)
{
sum += i;
}
}
else
for (i = b; i <= a; i++)
{
sum += i;
}
return sum;
}
|
cs |
제공되는 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
int sumof(int a, int b)
{
int i, min, max;
int sum = 0;
if (a < b) {
min = a;
max = b;
}
else {
min = b;
max = a;
}
for (i = min; i <= max; i++)
sum += i;
return sum;
}
|
cs |
do-while문
*사후 판단 반복문 - 반드시 한 번 실행된다.
형식 do문 while(제어식);
Q10 두 변수 a,b에 정수를 입력받고 b-a를 출력하는 프로그램 (b를 a보다 큰 값으로만 받음)
b값이 a보다 작을 경우 "a보다 큰 값을 입력하세요!!"라는 문구를 출력해야 한다.
do-while을 사용할 수도 있지만 그렇게 하면 문구를 출력하기 위해 if문또한 삽입하게 돼 a>=b를 두 번 판단하게 된다.
적게 판단하기 위해 입력을 받은 뒤에 오류가 난 후부터 반복문을 사용했다.
Q11 양의 정수의 자릿수를 출력하는 프로그램
2자리 수는 10으로 나눴을때 몫이 0이 아니다 -> 10으로 나눠주면서 몫이 0인지를 확인
n번 나눠졌을때 자릿수는 n+1이며 최소 자릿수는 1이므로 num=1로 초기화한 후 누적시킴
구조적 프로그래밍
: 하나의 입구와 하나의 출구를 가진 구성 요소만을 계층적으로 배치하여 프로그램을 구성하는 방법,
순차,선택,반복이라는 제어 흐름을 사용한다.
논리 연산자
논리합 ||
((조건1) || (조건2))
조건1과 조건2 중 하나라도 참(1)일 경우 전체 식은 1로 평가된다.
논리 곱 &&
((조건1)&&(조건2))
조건1과 조건2 모두 참(1)일 때 전체 식이 1로 평가된다.
단축 평가
예) 제어식 (no<10||no>99)에서 no<10을 만족하면 no>99를 평가하지 않고 제어식이 바로 1로 평가된다.
예) 제어식 (no>10&&no<99)에서 no>10을 만족하지 않을경우 no<99를 평가하지 않고 제어식이 바로 0으로 평가된다.
드모르간 법칙
부정 연산자 !를 사용할 경우
!(no<10||no>99) 는 (no>=10&&no<=99)와 같다.
즉 !(x||y)는 (!x&&!y)와 같다. 또한 !(x&&y)는 (!x||!y)와 같다.
조건 a가 참일 때 반복을 종료시키고 싶다면
do{
}while(!a);
조건 a가 거짓일 때 반복을 종료시키고 싶다면
do{
}while(a);
다중 루프
Q12 곱셈표 만들기
Q14 정사각형 출력
Q15 높이와 너비를 입력받아서 직사각형 출력
직각 이등변 삼각형 출력
Q16 직각 이등변 삼각형을 출력하는 함수 작성
void triangleLB(int n);
왼쪽 위를 직각으로
오른쪽 위를 직각으로
오른쪽 아래를 직각으로
Q17 n단의 피라미드를 출력하는 함수
Q18 숫자 피라미드 출력