<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 7(11, 12)

11. 2*3 행렬 A와 3 * 4 행렬 B를 곱한 결과인 2 * 4 행렬 C를 구하여 다음과 같이 출력하시오.

blob

#include <stdio.h>
#define M  2
#define N  3
#define O  4

int main()
{
    int a[M][N] = { {1,2,3}, {4,5,6} };
    int b[N][O] = { {3,4,5,6}, {1,2,4,3}, {4,2,6,1} };
    int c[M][O] = { 0 };
    int i, j, k;

    for (i = 0; i < M; i++) {
        for (j = 0; j < O; j++) {
            for (k = 0; k < N; k++) {
                c[i][j] += a[i][k] * b[k][i];
            }
        }
    }
    for (i = 0; i < M; i++) {
        printf("[");
        for (j = 0; j < O; j++) {
            printf(" %d", c[i][j]);
        }
        printf(" ]\n");
    }

    return 0;
}
c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]
c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]
c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]
c[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3]

배열 c[i][j]가 만들어지는 과정은 위와 같다. 곱한 값을 더하는 과정은 k를 제어변수로 하는 반복문에서 실행했다. 보이는대로 첨자를 넣어주면 된다.

12. 10개 문항이 있는 학생 10명의 시험 답안지로부터 채점을 한 후 결과를 다음과 같이 출력하시오. 학생 10명의 시험 답안지는 다음과 같이 2차원 배열을 선언하면서 초기화한다.

#include <stdio.h>
#define STUDENT 10
#define N 10
int main()
{
    int paper[STUDENT][N] = {
        {1,3,2,3,4,2,3,1,4,3}, {1,2,2,2,4,2,3,1,4,2},
        {4,3,2,3,4,2,3,1,4,2}, {1,3,2,2,4,3,3,4,4,2},
        {1,3,2,3,4,2,3,3,4,1}, {1,1,2,4,4,3,3,2,4,3},
        {1,3,2,3,4,2,3,1,4,2}, {1,3,2,3,3,2,3,1,4,2},
        {2,3,3,3,3,2,4,1,4,2}, {3,4,4,2,4,1,2,1,4,2}
    };

    int answer[N] = { 1,3,2,3,4,2,3,1,4,2 };
    int score[STUDENT] = { 0 };
    int rank[STUDENT];
    int i, j;
    int sum;

    printf("문항별 채점 결과\n\n");
    printf("==================================================\n");
    printf("문항 ");
    for (i = 1; i <= N; i++) {
        printf("%2d  ", i);
    }
    printf(" 점수\n");
    printf("==================================================\n");

    //정오표 출력
    for (i = 0; i < STUDENT; i++) {
        sum = 0;
        printf("%2d번  ", i + 1);
        for (j = 0; j < N; j++) {
            if (paper[i][j] == answer[j]) {
                printf("O   ");
                sum++;
            }
            else {
                printf("X   ");
            }
        }
        score[i] = sum;
        printf("%2d점\n", sum);
    }
    printf("==================================================\n\n");
    printf("정렬 및 석차 \n");
    printf("================\n");
    printf("번호  점수  석차\n");
    printf("================\n");

    //맞은 개수 내림차순으로 정렬
    int order[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int temp, index, index2;
    char swap;
    for (i = 1; i < N; i++) {
        swap = 'N';
        for (j = 0; j < N - i; j++) {
            index = order[j];
            index2 = order[j + 1];
            if (score[index] < score[index2]) {
                temp = order[j];
                order[j] = order[j + 1];
                order[j + 1] = temp;
                swap = 'Y';
            }
        }
        if (swap == 'N') break;
    }

    //순위 매겨서 석차 출력
    for (i = 0; i < STUDENT; i++) {
        rank[i] = 1;
        index = order[i];
        for (j = 0; j < STUDENT ; j++) {
            if (score[index] < score[j]) {
                rank[i]++;
            }
        }
        index = order[i];
        printf("%2d번  %2d점  %2d등\n", index + 1, score[index], rank[i]);
    }
    printf("================\n");

    return 0;
}

번호, 점수, 석차끼리 연결되어야 하므로 점수 정렬은 10번에서 사용한 알고리즘을 이용했다.