본문 바로가기
책./C언어 콘서트

6장(반복문) Programming #C언어 콘서트

by 낭람._. 2022. 7. 31.
반응형

1. 간단한 카운트 다운 프로그램을 작성하여 보자. 60초부터 0초까지 숫자를 출력하고 0초가 되면 "발사"를 출력한다.
60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 
발사
#include<stdio.h>
int main() {
    for(int i=60; i>0; i--) {
        printf("%d ",i);
    }
    printf("\n발사\n");
    return 0;
}

 

2. 사용자로부터 반복 횟수를 받아서 그 수만큼 "안녕하세요"를 출력하는 프로그램을 작성해보자.
몇 번이나 반복할까요?: 3
안녕하세요?
안녕하세요?
안녕하세요?
#include<stdio.h>
int main(){
    int i;

    printf("몇 번이나 반복할까요?: ");
    scanf("%d", &i);

    for(;i>0;i--) {
        printf("안녕하세요?\n");
    }
    return 0;
}

 

3. 아스키 코드 표를 출력하는 프로그램을 작성해보자.
...
65: A
66: B
67: C
68: D
69: E
70: F
71: G
72: H
73: I
...
#include<stdio.h>
int main() {
    for(int i = 0; i<128; i++) {
        printf("%d: %c\n", i, i);
    }
    return 0;
}

 

4. 사용자로부터 정수를 입력받아서 계속 더하는 프로그램을 작성해보자. 사용자가 0을 입력하면 지금까지 입력된 모든 정수의 합계를 출력하고 종료한다.
정수를 입력하시오: 10
정수를 입력하시오: 20
정수를 입력하시오: 30
정수를 입력하시오: 0
합계= 60
#include<stdio.h>
int main() {
    int x, sum = 0;
    do {
        printf("정수를 입력하시오: ");
        scanf("%d", &x);
        if(x == 0)
            break;
        else 
            sum += x;
    }while(1);
    printf("합계= %d\n",sum);
    
    return 0;
}

 

5. 다음과 같은 출력을 생성하는 프로그램을 작성하여 보자.
1******
12*****
123****
1234***
12345**
123456*
1234567
#include<stdio.h>
int main() {
    for(int i=1; i<8; i++) {
        for(int j=1; j<8; j++) {
            if(j <= i) 
                printf("%d", j);
            else
                printf("*");
        }
        printf("\n");
    }
    return 0;
}

 

6. 1부터 100까지의 자연수 중에서 3의 배수를 출력하여 보자.
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
#include<stdio.h>
int main() {
    for(int i=1; i<=100; i++) {
        if(i % 3 == 0) 
            printf("%d ", i);
    }
    return 0;
}

 

7. 1부터 100까지의 자연수 중에서 3의 배수이면서 동시에 5의 배수인 숫자를 출력하여 보자.
15 30 45 60 75 90
#include<stdio.h>
int main() {
    for(int i=1; i<=100; i++) {
        if(i%3==0 && i%5==0) 
            printf("%d ", i);
    }
    return 0;
}

 

8. 사용자로부터 정수 x, y를 입력받아서 x에서 y까지의 합을 구하는 프로그램을 작성하라.
시작정수: 1
종료정수: 10
Sum of 1 to 10 = 55
#include<stdio.h>
int main() {
    int x, y, sum = 0;
    printf("시작정수: ");
    scanf("%d", &x);
    printf("종료정수: ");
    scanf("%d", &y);

    if(y < x) {
        int tmp = y;
        y = x;
        x = tmp;
    }

    for(int i = x; i<=y; i++) {
        sum += i;
    }
    
    printf("Sum of %d to %d = %d\n", x, y, sum);

    return 0;
}

 

9. 사용자가 입력한 정수의 모든 약수를 화면에 출력하는 프로그램을 작성한다.
정수를 입력하시오: 60
1 2 3 4 5 6 10 12 15 20 30 60
#include<stdio.h>
int main() {
    int x;
    printf("정수를 입력하시오: ");
    scanf("%d", &x);

    for(int i=1; i<=x; i++) {
        if(x % i == 0)
            printf("%d ", i);
    }

    return 0;
}

 

10. 반복문을 이용하여 화씨 온도 0도부터 100까지의 구간에 대하여 10도 간격으로 섭씨 온도로 환산하는 표를 작성하라.
======================
화씨온도       섭씨온도
======================
0              -17
10              -12
20              -6
30              -1
40              4
50              10
60              15
70              21
80              26
90              32
100              37
#include<stdio.h>
int main() {
    printf("======================\n");
    printf("화씨온도       섭씨온도\n");
    printf("======================\n");

    for(int i=0;i<=100; i+=10) {
        printf("%d              %d\n", i, (i-32)*5/9);
    }

    return 0;
}

 

11. 중첩 반복문을 사용하여서 다음과 같이 출력하는 프로그램을 작성하여 보자.
정수를 입력하시오: 5
 1
 1 2
 1 2 3
 1 2 3 4
 1 2 3 4 5
#include<stdio.h>
int main() {
    int x;
    printf("정수를 입력하시오: ");
    scanf("%d", &x);

    for(int i=1; i<=x; i++) {
        for(int j=1; j<=i; j++) {
            printf(" %d", j);
        }
        printf("\n");
    }

    return 0;
}

 

12. 컴퓨터는 막대 그래프를 그리는 데도 사용된다. 사용자로부터 1부터 50사이의 숫자 10개를 입력받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 막대는 가로로 그려지게 된다.
데이터를 입력하시오:5
*****
데이터를 입력하시오:10
**********
데이터를 입력하시오:20
********************
데이터를 입력하시오:
#include<stdio.h>
int main() {
    int x;
    while(1) {
        printf("데이터를 입력하시오:");
        scanf("%d", &x);

        if(x<1 || x>50)
            break;

        for(int i=0; i<x; i++)
            printf("*");

        printf("\n");
    }

    return 0;
}

 

13. 피타고라스의 정리는 직각 삼각형에서 직각을 낀 두 변의 길이를 a, b라고 하고, 빗변의 길이를 c라고 하면 a^2 + b^2 = c^2의 수식이 성립한다는 것이다. 각 변의 길이가 100보다 작은 삼각형 중에서 피타고라스의 정리가 성립하는 직각 삼각형은 몇 개나 있을까? 3중 반복문을 이용하여 피타고라스의 정리를 만족하는 3개의 정수를 찾도록 한다.
3 4 5
4 3 5
5 12 13
6 8 10
7 24 25
8 6 10
8 15 17
#include<stdio.h>
int main() {
    for(int i=1; i<100; i++) {
        for(int j=1; j<100; j++) {
            for(int k=1; k<100; k++) {
                if((i*i)+(j*j) == (k*k))
                    printf("%d %d %d\n", i, j, k);
            }
        }
    }

    return 0;
}

 

14. 1^2+2^2+3^2+...+n^2의 값을 계산하여 출력하여 보자.
n의 값을 입력하시오: 10
계산값은 385입니다.
#include<stdio.h>
int main() {
    int n, sum = 0;
    printf("n의 값을 입력하시오: ");
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        sum += (i*i);
    printf("계산값은 %d입니다.\n", sum);

    return 0;
}

 

15. 반복적으로 사용자에게서 문자를 받아서 'a'가 나오면 카운터를 하나씩 증가한다. 사용자가 '.'을 입력하면 반복을 종료하고 입력한 'a'의 총 개수를 출력한다. 문자를 입력 받을 때는 getchar() 함수를 사용한다.
문자를 입력하시오: a
문자를 입력하시오: (종료 .)b
문자를 입력하시오: (종료 .)c
문자를 입력하시오: (종료 .)d
문자를 입력하시오: (종료 .)e
문자를 입력하시오: (종료 .).
a의 개수=1 (종료 .)
#include<stdio.h>
int main(){
    int cnt = 0;
    char x;

    printf("문자를 입력하시오: ");
    x = getchar();
    getchar();
    if(x == 'a')
        cnt++;

    while(x != '.') {
        printf("문자를 입력하시오: (종료 .)");
        x = getchar();
        getchar();
        if(x == 'a')
            cnt++;
    }

    printf("a의 개수=%d (종료 .)\n", cnt);

    return 0;
}

* Getchar를 두 번 사용하는 이유

 

16. 자동차의 연료 탱크 프로그램을 시뮬레이션하여 보자. 초기값이 1000리터이고 사용자가 주행을 하면 연료가 줄어든다. 반복문을 사용하여서 사용자로부터 충전 또는 사용한 연료를 입력받아서 연료 탱크에 남아 있는 연료가 10% 미만이면 경고를 출력한다.
초기 연료량: 500
연료 충전은 +, 소모는 -로 입력해주세요: +200
현재 남아있는 양은 700.000000입니다.
연료 충전은 +, 소모는 -로 입력해주세요: -700
현재 남아있는 양은 0.000000입니다.

(경고) 연료가 100 이하입니다.
#include<stdio.h>
int main() {
    double fuel=1000, left, tmp;
    printf("초기 연료량: ");
    scanf("%lf", &left);

    while(left >= fuel*0.1) {
        printf("연료 충전은 +, 소모는 -로 입력해주세요: ");
        scanf("%lf", &tmp);
        left += tmp;
        printf("현재 남아있는 양은 %lf입니다.\n", left);
    }
    printf("\n(경고) 연료가 %0.0lf 이하입니다.\n", fuel*0.1);

    return 0;
}

 

17. 사용자가 입력한 수가 소수인지 아닌지를 출력하는 프로그램을 작성하라. 소수는 1과 자기 자신이외에는 약수를 가지지 않아야 한다. 약수는 % 연산자를 이용하여서 검사 할 수 있다. 즉 i가 5의 약수라면 i%5가 0이 된다.
정수를 입력하시오: 93
93은 소수가 아닙니다.
#include<stdio.h>
int main() {
    int n, cnt=0;
    
    printf("정수를 입력하시오: ");
    scanf("%d", &n);

    for(int i=1; i<=n; i++){
        if(n % i == 0) 
            cnt++;
    }
    
    if(cnt > 2)
        printf("%d은 소수가 아닙니다.\n", n);
    else
        printf("%d은 소수입니다.\n", n);

    return 0;
}

 

18. 라스베가스에서 50달러를 가지고 도박을 하는 사람이 있다. 한 번의 도박에 1달러를 건다고 가정하자. 돈을 따거나 잃을 확률은 0.5로 동일하다고 가정하자. 도박사는 가진 돈을 다 잃거나 목표 금액인 250달러에 도달하면 도박을 중지한다. 도박사가 목표금액에 도달하는 확률이 얼마나 되는지를 계산해보자.
hint : bets++; // 배팅 횟수 증가
       if ((double)rand()/RAND_MAX < 0.5) cash++; // $1을 딴다.
       else cash--; // $1을 잃는다.
초기 금액 $50
목표 금액 $250
1000중의 212번 승리
이긴 확률=21.200000
평균 베팅 횟수 = 10475.208000
#include<stdio.h>
#include<stdlib.h> //rand 함수 이용
int main() {
    int win=0, bets=0;
    
    printf("초기 금액 $50\n");
    printf("목표 금액 $250\n");
    for(int i=0; i<1000; i++) {
        int cash=50;
        while(cash>0 && cash<250) {
            bets++;
            if((double)rand()/RAND_MAX < 0.5) {
                cash++;
            }
            else
                cash--;
        }
        if(cash > 100)
            win++;
    }
    printf("1000중의 %d번 승리\n",win);
    printf("이긴 확률=%lf\n",(double)win/1000*100);
    printf("평균 베팅 횟수 = %lf\n", (double)bets/1000);

    return 0;
}

 

19. 피보나치 수열을 계산하는 프로그램을 작성해보자. 피보나치 수열은 0과 1부터 시작하며 앞의 두 수를 더하여 뒷 수를 만든다.
몇번째 항까지 구할까요? 10
0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
#include<stdio.h>
int main() {
    int n, x=0, y=1, tmp;
    printf("몇번째 항까지 구할까요? ");
    scanf("%d", &n);

    for(int i=0; i<n; i++) {
        printf("%d, ", x);
        tmp = y;
        y += x;
        x = tmp;
        
    }

    return 0;
}
반응형

댓글