C언어(자기주도C언어프로그래밍)/Chapter10. 배열2

자기주도C언어프로그래밍 Chapter10. 배열2 - 형성평가

사상 2023. 3. 18. 22:17

1. 가람이는 주사위 놀이를 하다가 주사위를 10번 던져서 각 숫자가 몇 번씩 나왔는지 알아보려고 한다. 한번 던질 때마다 나온 주사위의 숫자를 입력받아서 각 숫자가 몇 번씩 나왔는지 출력하는 프로그램을 작성하시오.
입력 예
5 6 3 4 5 5 2 2 4 6
출력 예
1 : 0
2 : 2
3 : 1
4 : 2
5 : 3
6 : 2
 
#include <stdio.h>
int main(){
    int i, num, count[7]={0};

    for(i=0;i<10;i++){
        scanf("%d", &num);
        count[num]++;
    }

    for(i=1;i<=6;i++){
        printf("%d : %d\n", i, count[i]);
    }

    return 0;
}
 
※ 교재 P.194에 있는 연습문제1과 매우 유사한 문제입니다. count[7]로 선언한 이유는 1~6까지를 출력해야 하는데 count[6]으로 만들면 6을 출력할 수 없기 때문에 하나 더 크게 만든 것입니다.
 
2. 학생들의 점수를 입력을 받다가 0이 입력되면 그 때까지 입력받은 점수를 10점 단위로 구분하여 점수대별 학생 수를 출력하는 프로그램을 작성하시오. (1명도 없는 점수는 출력하지 않는다.).
입력 예 
63 80 95 100 46 64 88 0
출력 예
100 : 1 person
90 : 1 person
80 : 2 person
60 : 2 person
40 : 1 person
 
#include <stdio.h>
int main(){
    int i, score, student[11]={0};

    while(1){
        scanf("%d", &score);
        if(score == 0)
            break;
        score /= 10;
        student[score]++;
    }

    for(i=10;i>=0;i--){
        if(student[i]>0)
            printf("%d : %d person\n", i*10, student[i]);
    }
    return 0;
}
 
3. 10 미만의 자연수 두 개를 입력받아서 첫 번째 항과 두 번째 항을 입력받은 수로 초기화 시킨 후 세 번째 항부터는 전전항과 전항의 합을 구하여 그 합의 1의 자리로 채워서 차례로 10개를 출력하는 프로그램을 작성하시오.
입력 예
3 5
출력 예
3 5 8 3 1 4 5 9 4 3
 
#include <stdio.h>
int main(){
    int a, b, i, count=0, num[100];
    scanf("%d %d", &num[0], &num[1]);
    
    for(i=0;i<10;i++){
        printf("%d ", num[i]);
        num[i+2] = (num[i] + num[i+1]) % 10;
    }
    return 0;
}
 
4. 4행 3열의 배열을 선언하고 아래의 값으로 초기화 한 후 차례대로 출력한 후 배열의 모든 값을 더한 결과를 출력하는 프로그램을 작성하시오.
3, 5, 9, 
2, 11, 5,
8, 30, 10, 
22, 5, 1
 
출력 예
3 5 9
2 11 5
8 30 10
22 5 1
111
 
#include <stdio.h>
int main(){
    int i, j, sum=0, array[4][3] = {{3, 5, 9}, {2, 11, 5}, {8, 30, 10}, {22, 5, 1}};

    for(i=0;i<4;i++){
        for(j=0;j<3;j++){
            sum += array[i][j];
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    printf("%d", sum);
    return 0;
}
 
※ for중첩문에서 array배열의 값을 더해 sum이라는 변수에 저장하면서 해당 위치에 있는 값들을 출력하였습니다.
그리고 마지막에 sum을 따로 출력하였으므로 맨 마지막에 print를 한번 더 썼습니다.
 
5. 호석이네 학교는 6학년이 네 반이 있는데 각 반의 대표를 세 명씩 선발하여 제기차기 시합을 하였다. 반별로 세 명이 제기를 찬 개수를 입력받아 각 반별로 제기를 찬 개수의 합계를 출력하는 프로그램을 작성하시오. (반드시 배열을 이용하고 입력후에 출력하는 방식으로 하세요.)
입력 예
1class? 15 2 35
2class? 33 1 6
3class? 5 10 19
4class? 1 8 55
출력 예
1class : 52
2class : 40
3class : 34
4class : 64
 
#include <stdio.h>
int main(){
    int i, sum=0, array[4][4] = {0};

    for(i=0;i<4;i++){
        printf("%dclass? ", i+1);
        scanf("%d %d %d", &array[i][0], &array[i][1], &array[i][2]);
        array[i][3] = array[i][0] + array[i][1] + array[i][2];
    }
    for(i=0;i<4;i++){
        printf("%dclass : %d\n", i+1, array[i][3]);
    }
    return 0;
}
 
※ 입력을 직접 위치를 지정해주지않고 반복으로 받을 수도 있어보이는데 입력 예에서 15 2 35 처럼 나와있갤래 전 이렇게 하는게 먼저 보여서 이렇게 작성했습니다...
 
6. 예제를 보고 적당한 배열을 선언한 후 1행의 1열과 3열 5열을 각각 1로 초기화하고 나머지는 모두 0으로 초기화 한 후 2행부터는 바로 위행의 왼쪽과 오른쪽의 값을 더하여 채운 후 출력하는 프로그램을 작성하시오.
출력 예
1 0 1 0 1
0 2 0 2 0
2 0 4 0 2
0 6 0 6 0
6 0 12 0 6
 
#include <stdio.h>
int main(){
    int i, j, array[5][5] = {{1, 0, 1, 0, 1}};

    for(i=1;i<5;i++){
        for(j=0;j<5;j++){
            if(j==0){
                array[i][j] = array[i-1][j+1];
            }
            else if(j==4){
                array[i][j] = array[i-1][j-1];
            }
            else{
                array[i][j] = array[i-1][j-1] + array[i-1][j+1];
            }
        }
    }

    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}
 
※ 맨 왼쪽의 경우 한줄 위 오른쪽 값만 더하고 맨 오른쪽 일 경우 한줄 위 왼쪽 값만 더햇습니다. 그리고 그 나머지의 경우에는 한줄 위 왼쪽값+오른쪽 값을 계산하였습니다.
 
7. 2행 3열 배열을 두 개 선언하여 각각의 값을 입력 받은 후 두 배열의 같은 위치끼리 곱하여 새로운 배열에 저장한 후 출력하는 프로그램을 작성하시오.
입력 예
first array
3 6 9
8 5 2
second array
9 8 7
6 5 4
출력 예
27 48 63
48 25 8
 
#include <stdio.h>
int main(){
    int i, j, array1[2][3], array2[2][3], result[2][3];

    printf("first array\n");
    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            scanf("%d", &array1[i][j]);
        }
    }
    printf("second array\n");
    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            scanf("%d", &array2[i][j]);
        }
    }

    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            result[i][j] = array1[i][j] * array2[i][j];
        }
    }
    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            printf("%d ", result[i][j]);
        }
    printf("\n");
    }
    return 0;
}
 
8. 4행 2열의 배열을 입력받아 가로평균과 세로평균 그리고 전체평균을 출력하는 프로그램을 작성하시오. (소수점 이하는 버림 한다.)
입력 예
16 27
39 100
19 88
61 20
출력 예
21 69 53 40
33 58
46
 
#include <stdio.h>
int main(){
    int array[4][2];
    int i, j, cal_array[4]={0}, row_array[2]={0};
    int sum=0;
    double avg;

    for(i=0;i<4;i++){
        for(j=0;j<2;j++){
            scanf("%d", &array[i][j]);
        }
    }

    for(i=0;i<4;i++){
        for(j=0;j<2;j++){
            cal_array[i] += array[i][j]; // 행의 합 구하기 
            sum += array[i][j]; // 전체 합 구하 
        }
        cal_array[i] /= 2;
    }
    for(j=0;j<2;j++){
        for(i=0;i<4;i++){
            row_array[j] += array[i][j]; // 열의 합 구하기 
        }
        row_array[j] /= 4;
    }
    avg = sum / 8.0; // 평균 구하기 

    for(i=0;i<4;i++)
        printf("%d ", cal_array[i]);
    printf("\n");
    for(i=0;i<2;i++){
        printf("%d ", row_array[i]);
    }
    printf("\n");
    printf("%d", (int)avg);
    return 0;
}
 
※ 개인적으로 좀 어려웠습니다. 각 문장에 주석을 달아서 어떤걸 구했는지 표시해 뒀습니다.
 
9. 행의 크기를 입력받아 파스칼 삼각형을 작성하여 마지막 행부터 첫 번째 행까지 차례로 출력하는 프로그램을 작성하시오. 행의 크기는 최대 10이다.
입력 예
6
출력 예
1 5 10 10 5 1
1 4 6 4 1
1 3 3 1
1 2 1
1 1
1
 
#include <stdio.h> 
int main(){
    int i, j, num, array[10][10]={0};
    scanf("%d", &num);
    //정방향 파스칼 삼각형 그리기 
    for(i=0;i<num;i++){
        for(j=0;j<=i;j++){
            if(i==j || j==0){
                array[i][j] = 1;
                //printf("%d ", array[i][j]); // 파스칼 삼각형 출력 확인용
            }
            else{
                array[i][j] = array[i-1][j] + array[i-1][j-1];
                //printf("%d ", array[i][j]); // 파스칼 삼각형 출력 확인용
            }
        }
        //printf("\n"); // 파스칼 삼각형 출력 확인용
    }
    //역방향 파스칼 삼각형 출력
    for(i=num-1;i>=0;i--){
        for(j=0;j<num;j++){
            if(array[i][j] != 0){
                printf("%d ", array[i][j]);
            }
       }
    printf("\n");
    }
   return 0;
}
 
※ 위쪽 for중첩문에서는 정방향으로 파스칼 삼각형을 그렸습니다.
※ 아래쪽 for중첩문에서는 역방향으로 파스칼 삼각형을 출력하면서 0인 부분은 출력하지 않기 위해 if문을 사용했습니다.
 
10. 3행 5열의 2차원 문자배열 형태의 대문자들을 입력 받은 후 소문자로 바꾸어서 출력하는 프로그램을 작성하시오.
입력 예
A B C D E
F G H I J
K L M N O
출력 예
a b c d e
f g h i j
k l m n o
 
#include <stdio.h>
int main(){
    char alpha, array[3][5];
    int i, j;

    for(i=0;i<3;i++){
        for(j=0;j<5;j++){
            scanf(" %c", &array[i][j]); 
        }
    }

    for(i=0;i<3;i++){
        for(j=0;j<5;j++){
            array[i][j] += 32;
            printf("%c ", array[i][j]);
        }
    printf("\n");
    }
    return 0;
}
 
※ 아스키 코드에서 대문자 A는 65이며 소문자 a는 97입니다. 즉 대문자와 소문자는 32만큼 차이납니다.
 
원래는 문제를 교재를 보고 적접 타이핑했는데 길어지니까 직접 치기 귀찮아서.. 사이트에 있는 문제를 복붙하고 교재와 다른 부분이 있나 보는 식으로 변경했습니다...  어색한 부분이 있다면 알려주세요!
 
평일에 업로드를 하려했는데 쉽지 않아서 어쩔 수 없이 주말에 하게 되었네요...ㅠ
최대한 계획한 대로 하도록 시간 계획을 세워보겠습니다...
 
그리고 혹시라도 왜 이걸 이렇게 짰는지 궁금하신 부분이 있으면 댓글 남겨주세요. 확인하는대로 답변 드리겠습니다.