카테고리 없음

01-2 반복

홍콩판다 2019. 3. 29. 21:20

반복(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)*/ 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(제어식);

실습 1-6/1부터 n까지의 합 구하기/양의 정수만을 받도록 함


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 정사각형 출력

i와 j 모두 n번 증가 

Q15 높이와 너비를 입력받아서 직사각형 출력


직각 이등변 삼각형 출력

n번째 행에서 n개 출력된다는 점 


Q16 직각 이등변 삼각형을 출력하는 함수 작성

void triangleLB(int n);

왼쪽 위를 직각으로

각 행의 * 개수가 1씩 줄어든다 & i는 1씩 증가하는 것을 이용

오른쪽 위를 직각으로

별의 개수(n-i)는 같지만 전체 길이에서 별의 길이를 뺀만큼(i) 공백이 앞서 출력된다

오른쪽 아래를 직각으로

위의 문제에서 *과 공백의 출력이 서로 뒤바뀐 형태

Q17 n단의 피라미드를 출력하는 함수

공백 출력은 직각삼각형 출력과 같고, *출력은 2i+1개

 

Q18 숫자 피라미드 출력