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

7장(배열) Programming #C언어 콘서트

by 낭람._. 2022. 8. 2.
반응형

1. 배열 days[]를 아래와 같이 초기화 하고 배열 원소의 값을 다음과 같이 출력하는 프로그램을 작성하시오.
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1월은 31월까지 있습니다.
2월은 29월까지 있습니다.
3월은 31월까지 있습니다.
4월은 30월까지 있습니다.
5월은 31월까지 있습니다.
6월은 30월까지 있습니다.
7월은 31월까지 있습니다.
8월은 31월까지 있습니다.
9월은 30월까지 있습니다.
10월은 31월까지 있습니다.
11월은 30월까지 있습니다.
12월은 31월까지 있습니다.
#include<stdio.h>
int main() {
    int days[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for(int i=1; i<13; i++) {
        printf("%d월은 %d월까지 있습니다.\n", i, days[i-1]);
    }
    return 0;
}

 

2. 사용자로부터 5개의 정수를 입력받아서 1차원 배열에 저장한다. 1차원 배열에서 최댓값과 최솟값을 계산해서 출력해보자.
hint : 배열의 요소로 입력받을 때는 scanf("%d", &a[1])과 같은 문장을 사용한다.
정수를 입력하시오: 10
정수를 입력하시오: 20
정수를 입력하시오: 30
정수를 입력하시오: 40
정수를 입력하시오: 50
최대값=50 최소값=10
#include<stdio.h>
int main() {
    int arr[5];
    for(int i=0; i<5; i++) {
        printf("정수를 입력하시오: ");
        scanf("%d", &arr[i]);
    }

    int min = arr[0], max = arr[0];
    for(int i=1; i<5; i++) {
        if(max < arr[i])
            max = arr[i];
        if(min > arr[i])
            min = arr[i];
    }

    printf("최대값=%d 최소값=%d\n", max, min);

    return 0;
}

 

3. 학생들의 시험 점수를 통계 처리하는 프로그램을 작성하여 보라. 각 학생들은 3번의 시험을 치른다.
학번 시험#1 시험#2 시험#3
1 30 10 11
2 40 90 32
3 70 65 56
(a) 위의 표를 2차원 배열에 저장하라.
(b) 각 학생마다 평균 점수를 출력하도록 하라.
1번 평균 : 17.00
2번 평균 : 54.00
3번 평균 : 63.67
#include<stdio.h>
int main() {
    int student[3][3] = {
        {30, 10, 11},
        {40, 90, 32},
        {70, 65, 56}
    };
    double student_avg[3];

    for(int i=0; i<3; i++) {
        int sum=0;
        for(int j=0; j<3; j++) {
            sum += student[i][j];
        }
        student_avg[i] = (double)sum/3;
    }

    for(int i=1; i<4; i++) {
        printf("%d번 평균 : %0.2lf\n", i, student_avg[i-1]);
    }
    
    return 0;
}

 

4. 1단부터 9단까지의 구구단을 2차원 배열에 저장한다. 사용자로부터 구구단 중의 하나를 받아서 2차원 배열에서 찾는다. 찾은 결과를 화면에 출력하는 프로그램을 작성한다.
hint : 1단부터 9단까지의 구구단을 저장하려면 배열의 크기를 10 x 10으로 하는 것이 좋다.
알고싶은 구구단을 입력하시오(예: 9 3): 9 3
9X3=27
#include<stdio.h>
int main() {
    int mul_table[10][10];
    int row, col;

    for(int i=1; i<10; i++){
        for(int j=1; j<10; j++) {
            mul_table[i-1][j-1] = i*j;
        }
    }
    
    printf("알고싶은 구구단을 입력하시오(예: 9 3): ");
    scanf("%d %d", &row, &col);
    printf("%dX%d=%d\n",row, col, mul_table[row-1][col-1]);
    
    return 0;
}

 

5. 0부터 9까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하시오. 난수는 rand() 함수를 사용하여 생성하라. 배열을 사용해보자.
가장 많이 생성된 수=2
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
    srand(time(NULL));
    int num_table[10] = {0,};

    for(int i=0; i<100; i++) {
        num_table[rand()%10]++;
    }

    int idx = 0;
    int num = num_table[0];
    
    for(int i=0; i<10; i++) {
        if(num < num_table[i]){
            num = num_table[i];
            idx = i;
        }
    }

    printf("가장 많이 생성된 수=%d\n",idx);

    return 0;
}

 

6. 주사위를 60000번 던져서 그 결과를 배열로 요약해보자. 잘 만들어진 주사위라면 하나의 면이 나올 확률은 약 1/6이 되어야 한다. 컴퓨터에서 주사위 던지기는 난수 발생 함수 rand()를 통하여 구현하라.
====================
면            빈도
====================
0             9804
1             10008
2             10012
3             10140
4             10088
5             9948
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
    srand(time(NULL));
    int dice[6] = {0, };

    for(int i=0; i<60000; i++) {
        dice[rand()%6]++;
    }

    printf("====================\n");
    printf("면            빈도\n");
    printf("====================\n");
    for(int i=0; i<6; i++) {
        printf("%d             %d\n", i, dice[i]);
    }

    return 0;
}

 

7. 배열을 이용하여 간단한 극장 예약 시스템을 작성해보자. 아주 작은 극장이라서 좌석이 10개밖에 안 된다. 사용자가 예약을 하려고 하면 먼저 좌석 배치표를 보여준다. 즉 예약이 끝난 좌석은 1로, 예약이 안 된 좌석은 0으로 나타낸다.
좌석을 예약하시겠습니까?(y 또는n)y
-------------------------------
 1 2 3 4 5 6 7 8 9 10
-------------------------------
 0 0 0 0 0 0 0 0 0 0
몇번째 좌석을 예약하시겠습니까 3
예약되었습니다.
좌석을 예약하시겠습니까?(y 또는n)y
-------------------------------
 1 2 3 4 5 6 7 8 9 10
-------------------------------
 0 0 1 0 0 0 0 0 0 0
몇번째 좌석을 예약하시겠습니까
#include<stdio.h>
int main() {
    char ans = 'y';
    int seat[10] = {0, };
    int seat_ans;
    while(1) {
        printf("좌석을 예약하시겠습니까?(y 또는n)");
        scanf("%c", &ans);
        getchar();

        if(ans == 'n') 
            break;

        printf("-------------------------------\n");
        for(int i=0; i<10; i++) 
            printf(" %d", i+1);
        printf("\n-------------------------------\n");
        for(int i=0; i<10; i++)
            printf(" %d", seat[i]);
        
        printf("\n몇번째 좌석을 예약하시겠습니까 ");
        scanf("%d", &seat_ans);
        
        if(seat[seat_ans-1] == 0) {
            printf("예약되었습니다.\n");
            seat[seat_ans-1]++;
        } 
        else {
            printf("예약되어 있습니다.\n");
            continue;
        }
    
    }

    return 0;
}

 

8. 사용자로부터 5개의 실수 자료를 읽어서 평균과 표준 편차를 계산하는 프로그램을 작성하라. 사용자로부터 받은 자료들은 배열에 저장하라. 평균이란 n개의 실수가 주어져 있을 때, 다음과 같이 계산된다.

표준 편차는 분산의 양의 제곱근으로 분산은 다음과 같이 계산된다. 표준 편차는 자료가 평균값 주위에 어느 정도의 넓이로 분포하고 있는가를 나타내는 하나의 척도이다.

실수를 입력하시오: 1.0
실수를 입력하시오: 2.0
실수를 입력하시오: 3.0
실수를 입력하시오: 4.0
실수를 입력하시오: 5.0
평균:3.000000
표준편차:1.414214
#include<stdio.h>
#include<math.h>
int main() {
    double arr[5];
    for(int i=0; i<5; i++) {
        printf("실수를 입력하시오: ");
        scanf("%lf", &arr[i]);
    }
    
    double avg=0;
    for(int i=0; i<5; i++) {
        avg += arr[i];
    }
    avg /= 5;
    printf("평균:%lf\n",avg);

    double sd=0;
    for(int i=0; i<5; i++) {
        sd += (arr[i]-avg) * (arr[i]-avg);
    }
    printf("표준편차:%lf\n",sqrt(sd/5));
    
    return 0;
}
 
9. 수학에서의 "random walk"라 불리는 문제를 배열을 이용하여 프로그래밍해보자. 문제는 다음과 같다. 술에 취한 딱정벌레가 10개의 1차원 타일 위를 걸어다닌다. 딱정 벌레는 랜덤한 방향으로 이동한다. 현재의 위치에서 좌우의 2개의 타일로 걸어가는 확률은 동일하다고 가정하자. 딱정벌레가 지나간 길을 표시하는 프로그램을 작성해보자.
hint : 방 전체를 1차원 배열 tile[10]로 모델리을 하고 처음에는 딱정벌레가 배열의 중앙에 있다고 가정하라. title[]의 초깃값은 '_'이다. 딱정벌레가 타일을 지나갈 때마다 배열 요소의 값을 '*'로 만들어서 딱정벌레가 지나갔음을 나타낸다. 0부터 1사이의 랜덤한 숫자를 생성하여 다음과 같이 움직인다. 즉 0이면 왼쪽으로 이동하고 1이면 오른쪽으로 이동한다. 0부터 1사이의 랜덤한 숫자는 다음과 같이 생성할 수 있다.
int direction = rand()%2;
getch()함수를 사용하면 사용자가 어떤 키를 누를 때까지 프로그램을 정지시킬 수 있다.
_ _ _ _ _ * _ _ _ _ 
_ _ _ _ * _ _ _ _ _ 
_ _ _ * _ _ _ _ _ _ 
_ _ * _ _ _ _ _ _ _ 
_ * _ _ _ _ _ _ _ _ 
_ _ * _ _ _ _ _ _ _ 
_ _ _ * _ _ _ _ _ _ 
_ _ _ _ * _ _ _ _ _ 
_ _ _ * _ _ _ _ _ _ 
_ _ _ _ * _ _ _ _ _ 
_ _ _ _ _ * _ _ _ _ 
_ _ _ _ _ _ * _ _ _ 
_ _ _ _ _ _ _ * _ _
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
int main() {
    srand(time(NULL));
    char tile[10];
    for(int i=0; i<10; i++) {
        tile[i] = '_';
    }
    tile[5] = '*';
    int location = 5;
    while(1) {
        for(int i=0; i<10; i++) {
            printf("%c ", tile[i]);
        }
        printf("\n");
        getch();
        int direction = rand()%2;
        if(direction == 0) {
            if(location == 0)
                continue;
            else {
                tile[location] = '_';
                location--;
                tile[location] = '*';
            }
        }
        else {
            if(location == 9)
                continue;
            else {
                tile[location] = '_';
                location++;
                tile[location] = '*';
            }
        }
    }

    return 0;
}

 

반응형

댓글