[C언어 express 개정4판] 10장 연습문제

hnyoojin·2024년 10월 18일
0

🤓 C언어 정복하기

목록 보기
20/23
post-thumbnail

1번

배열 days[]를 아래와 같이 초기화하고 배열 요소의 값을 다음과 같이 출력하는 프로그램을 작성하시오.

// 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) 
{
    int days[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    for (int i = 0; i < 12; i++) {
        printf("%d월은 %d일까지 있습니다.\n", i+1, days[i]);
    }

    return 0;
}

2번

크기가 10인 1차원 배열에 난수를 저장한 후에, 최대값과 최소값을 출력하는 프로그램을 작성하시오. 난수는 rand() 함수를 호출하여 생성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int get_max(int randNums[]);
int get_min(int randNums[]);

int main(void)
{
    srand(time(NULL));

    int randNums[10] = { 0 };
    int max = 0, min = 0;

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

    printf("최대값은 %d\n", get_max(randNums));
    printf("최소값은 %d\n", get_min(randNums));

    return 0;
}

int get_max(int randNums[]) {
    int max = randNums[0];
    for (int i = 0; i < 10; i++) {
        if (randNums[i] > max)
            max = randNums[i];
    }
    return max;
}

int get_min(int randNums[]) {
    int min = randNums[0];
    for (int i = 0; i < 10; i++) {
        if (randNums[i] < min)
            min = randNums[i];
    }
    return min;
}

3번

2개의 정수 배열 a, b를 받아서 대응되는 배열 요소가 같은지를 검사하는 함수 array_equal(int a[], int b[], int size)를 작성하고 테스트하라. 이 함수는 a[0]와 b[0], a[1]과 b[1], ..., a[size-1]와 b[size-1]가 같은지를 검사한다. 만약 전체 요소가 같다면 1을 반환하고, 그렇지 않으면 0을 반환한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int size = 10;
    int a[10] = { 0 };
    int b[10] = { 0 };

    for (int i = 0; i < size; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < size; i++) {
        scanf("%d", &b[i]);
    }

    if (array_equal(a, b, size) == 1)
        printf("2개의 배열은 같음\n");
    else printf("2개의 배열은 다름\n");
    
    return 0;
}

int array_equal(int a[], int b[], int size) {
    int i = 0;
    while(i < size) {
        if (a[i] != b[i])
            return 0;
        i++;
    }
    return 1;
}

4번

2개의 정수 배열 a, b를 받아서 배열 a의 요소를 배열 b로 복사하는 함수 array_copy(int a[], int b[], int size)를 작성하고 테스트하라. a <- b. 이 함수의 반환값은 없다.

#define _CRT_SECURE_NO_WARNINGS
#define SIZE 10

#include <stdio.h>

void array_copy(int a[], int b[], int size);

int main(void)
{
    int a[SIZE] = { 0 };
    int b[SIZE] = { 0 };

    for (int i = 0; i < SIZE; i++) {
        scanf("%d", &a[i]);
    }

    array_copy(a, b, SIZE);

    return 0;
}

void array_copy(int a[], int b[], int size) {
    for (int i = 0; i < SIZE; i++) {
        b[i] = a[i];
    }
    for (int i = 0; i < SIZE; i++) { printf("%d ", b[i]); }

    printf("\n\n배열이 복사되었음\n");
}

5번

0부터 9까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하시오.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand(time(NULL));

    int max = 0, max_num = 0;
    int random[10] = { 0 };

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

    for (int i = 0; i < 10; i++) {
        if (random[i] > max) {
            max = random[i];
            max_num = i;
        }
    }

    printf("가장 많이 나온 수 = %d\n", max_num);

    return 0;
}

6번

로또 번호를 생성하는 프로그램은 8장에서 다루어보았다. 다만 8장에서는 숫자들이 중복하여 나오는 문제를 해결하지 못했다. 배열을 이용하여서 숫자들이 중복되면 다시 난수를 발생하도록 코드를 수정하여보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int get_random_num();

int main(void)
{
    srand(time(NULL));

    int check[45] = { 0 };
    int count = 0;

    printf("로또 번호는 다음과 같습니다.\n");

    while (count <= 6) {
        int num = get_random_num();
        if (check[num] != 1) {
            count++;
            check[num] = 1;
            printf("%d ", num + 1);
        }
    }

    return 0;
}

int get_random_num() {
    return rand() % 45;
}

7번

다음과 같은 2차원 표를 배열로 생성하고, 각 열의 합계를 구하여 출력하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int chart[3][5] = {
        {12,56,32,16,98},
        {99,56,34,41,3},
        {65,3,87,78,21}
    };

    for (int i = 0; i < 3; i++) {
        int sum = 0;
        for (int j = 0; j < 5; j++) {
            sum += chart[i][j];
        }
        printf("%d행의 합계 : %d\n", i, sum);
    }
    for (int i = 0; i < 5; i++) {
        int sum = 0;
        for (int j = 0; j < 3; j++) {
            sum += chart[j][i];
        }
        printf("%d열의 합계 : %d\n", i, sum);
    }

    return 0;
}

8번

2차원 배열을 이용하여 세제곱근을 찾는 프로그램을 작성해보자. 먼저 10x2 크기의 2차원 배열을 만들고 첫 번째 열에는 정수를, 두 번째 열에는 세제곱값을 저장하라. 사용자에게 세제곱값을 입력하도록 하고 이 세제곱값을 배열에서 찾아서 첫 번째 열에 있는 값을 출력하도록 하여 보라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int array[10][2] = {
        {1,1},{2,8},{3,27},{4,64},{5,125},
        {6,216},{7,343},{8,512},{9,729},{10,1000}
    };

    int num = 0;
    printf("정수를 입력하시오 : ");
    scanf("%d", &num);
    
    int i = 0;
    while (i < 10) {
        if (array[i][1] == num) {
            printf("%d의 세제곱근은 %d\n", num, array[i][0]);
            break;
        }
        else i++;
    }
    
    return 0;
}

9번

사용자가 입력하는 10개의 실수 자료의 평균과 표준 편차를 계산하는 프로그램을 작성하라. 평균은 n개의 실수가 주어져 있을 때, 다음과 같이 계산된다. 표준 편차는 다음과 같이 계산된다. 표준 편차는 자료가 평균값 주위에 어느 정도의 넒이로 분포하고 있는가를 나타내는 하나의 척도이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

double get_avg(int nums[]);
double get_sd(int nums[], double avg);

int main(void)
{
    int nums[10] = { 0 };
    double AVG = 0, SD = 0;

    for (int i = 0; i < 10; i++) {
        printf("데이터를 입력하시오: ");
        scanf("%d", &nums[i]);
    }

    AVG = get_avg(nums);
    SD = get_sd(nums, AVG);

    printf("평균값은 %lf\n", AVG);
    printf("표준편차값은 %lf\n", SD);

    return 0;
}

double get_avg(int nums[]) {
    int sum = 0;
    double avg = 0;

    for (int i = 0; i < 10; i++) {
        sum += nums[i];
    }
    avg = sum / 10;
    return avg;
};

double get_sd(int nums[], double avg) {
    int sum = 0;
    double sd = 0;

    for (int i = 0; i < 10; i++) {
        sum += (nums[i] - avg) * (nums[i] - avg);
    }
    sd = pow((sum / 10), 0.5);

    return sd;
}

10번

학생들의 시험 점수를 통계 처리하는 프로그램을 작성하여 보라. 한 학급은 최대 5명까지의 학생들로 이루어진다. 각 학생들은 3번의 시험을 치른다. 학생들의 성적는 난수를 생성하여서 얻는다. 각 시험에 대하여 최대점수, 최저점수를 계산하여 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand(time(NULL));

    int student[3][5] = { 0 };
    int max = 0, min = 0;

    for (int i = 0; i < 3; i++) {
        min = 100, max = 0;
        for (int j = 0; j < 5; j++) {
            student[i][j] = rand() % 101;
            if (student[i][j] < min) min = student[i][j];
            if (student[i][j] > max) max = student[i][j];
        }
        printf("시험 #%d의 최대 점수 = %d\n", i, max);
        printf("시험 #%d의 최저 점수 = %d\n", i, min);
    }
    return 0;
}

11번

벡터에 대한 연산을 배열을 이용하여서 작성하여보자.

// a) 2개의 벡터를 더하는 연산은 다음과 같이 정의된다. 2개의 벡터를 더하는 함수인 vector_add()를 작성하라. 이 함수를 테스트하기 위한 코드도 작성하라.
// b) 벡터의 내적을 계산하는 함수인 vector_dot_prod()를 작성하라. 이 함수를 테스트하기 위한 코드도 작성하라. 벡터의 내적은 다음과 같이 정의된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void vector_add(double X[], double Y[], double Z[]);
double vector_dot_prod(int X[], int Y[]);

int main(void)
{
    double X[3] = { 1.00,2.00,3.00 };
    double Y[3] = { 1.00,2.00,3.00 };
    double Z[3] = { 0 };
    
    vector_add(X, Y, Z);
    double prod = vector_dot_prod(X, Y);

    printf("[ %.2lf %.2lf %.2lf ] + [ %.2lf %.2lf %.2lf ] = [ %.2lf %.2lf %.2lf ]\n",
        X[0], X[1], X[2], Y[0], Y[1], Y[2], Z[0], Z[1], Z[2]);

    printf("[ %.2lf %.2lf %.2lf ] * [ %.2lf %.2lf %.2lf ] = %.2lf\n",
        X[0], X[1], X[2], Y[0], Y[1], Y[2], prod);

    return 0;
}

void vector_add(double X[], double Y[], double Z[]) {
    for (int i = 0; i < 3; i++) {
        Z[i] = X[i] + Y[i];
    }
    return Z;
}

double vector_dot_prod(double X[], double Y[]) {
    double result = 0;
    for (int i = 0; i < 3; i++) {
        result += X[i] * Y[i];
    }
    return result;
}

12번

아주 간단한 재고 관리 시스템을 만들어보자. 상품마다 상품 번호가 붙어 있고 상품 번호를 사용자가 입력하면 물품이 어디 있는지를 알려주는 번호를 출력한다. 상품 번호는 1부터 10까지로 하고 장소를 나타내는 번호는 1부터 100까지라고 가정한다. 1차원 배열을 사용하여 미리 상품 번호마다 장소를 저장해놓고 사용자로부터 상품 번호를 받아서 장소를 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int product_list[11] = { 0,32,98,33,11,22,34,9,8,4,2 };
    int product_num = 0, shelf_num = 0;
    
    printf("상품 번호를 입력하시오 : ");
    scanf("%d", &product_num);

    shelf_num = product_list[product_num];
    printf("상품 %d번은 선반 %d에 있습니다.\n", product_num, shelf_num);

    return 0;
}

13번

2차원 행렬에 대한 다음과 같은 함수를 작성하고 테스트하여 보라. 행렬의 크기는 3X3으로 가정하라.

// a) scalar_mult(int a[][3], int scalar)
// b) transpose(int a[][3], int b[][3])

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void scalar_mult(int a[][3], int scalar);
void transpose(int a[][3], int b[][3]);
void print_matrix(int a[][3]);

int main(void)
{
    int a[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    int b[3][3] = { 0 };

    scalar_mult(a, 2);
    transpose(a, b);
    
    printf("scalar transpose : \n");
    print_matrix(b);

    return 0;
}

void scalar_mult(int a[][3], int scalar) {
    int temp[3][3] = { 0 };
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            temp[i][j] = a[i][j] * 2;
        }
    }
    printf("scalar mult : \n");
    print_matrix(temp);
}

void transpose(int a[][3], int b[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            b[i][j] = a[j][i];
        }
    }
    return b;
}

void print_matrix(int a[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

14번

어떤 석유 회사가 있다. 회사가 채굴하려고 하는 영역은 6행, 6열로 이뤄진 36개의 셀로 분할된다. 회사는 시추 기술을 사용하여 각 셀의 잠재적 석유 매장량을 확인했다. 우리는 석유 매장량을 난수로 생성한다. 이 회사는 전체 영역 중에서 3X3 구역만 빌리고자 한다. 가장 매장량이 많은 3X3 구역을 선정하고, 그 구역의 매장량을 출력하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand(time(NULL));

    int max = 0;
    int total_area[6][6] = { 0 };
    int rent_area[4][4] = { 0 };

    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 6; j++) {
            total_area[i][j] = rand() % 10;
        }
    }

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            rent_area[i][j] =
                total_area[i][j] + total_area[i + 1][j] + total_area[i + 2][j] +
                total_area[i][j + 1] + total_area[i + 1][j + 1] + total_area[i + 2][j + 1] +
                total_area[i][j + 2] + total_area[i + 1][j + 2] + total_area[i + 2][j + 2];
            if (rent_area[i][j] > max)
                max = rent_area[i][j];
        }
    }

    printf("가장 매장량이 많은 구역의 매장량은 %d입니다\n", max);

    return 0;
}

15번

수학에서의 "random walk"라 불리우는 문제를 프로그래밍하여보자. 술에 취한 딱정벌레사 10X10 크기의 타일 위에 있다. 딱정벌레는 임의의 (랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 현재의 위치에서 인접한 8개의 타일로 걸어가는 확률은 동일하다고 가정하자. 딱정벌레가 이동하는 경로를 다음과 같이 표시하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void print_tile(int tile[][10]);

int main(void)
{
    srand(time(NULL));

    int n = 5, m = 5;
    int route = 0;

    int tile[10][10] = { 0 };
    tile[n][m] = 1;
    
    
    for (int i = 0; i < 8; i++) {

        print_tile(tile);
        Sleep(1000);

        route = rand() % 8;

        switch (route) {
            case 0:
                tile[n][m++] = 1;
                break;
            case 1:
                tile[n++][m++] = 1;
                break;
            case 2:
                tile[n++][m] = 1;
                break;
            case 3:
                tile[n++][m--] = 1;
                break;
            case 4:
                tile[n][m--] = 1;
                break;
            case 5:
                tile[n--][m--] = 1;
                break;
            case 6:
                tile[n--][m] = 1;
                break;
            case 7:
                tile[n--][m++] = 1;
                break;
        }
        system("cls");
    }

    return 0;
}

void print_tile(int tile[][10]) {
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            if (tile[i][j] == 0)
                printf(". ");
            else printf("* ");
        }
        printf("\n");
    }
}

0개의 댓글