본문 바로가기
컴퓨터/코딩

(제3판)C언어 콘서트 CHAPTER 7. Programming 문제 개인풀이

by 혼란한물범 2022. 8. 1.
반응형

개정3판 7장 프로그래밍 문제

개인풀이이기 때문에 출제자가 의도한 정답과 다를 수 있다.

 

 

Visual Studio로 실행해보고 싶은 사람들은 아래 링크에서 해당 문제를 찾아 복사 - 붙여넣기 하자 (다운받지 않아도 된다)

https://mega.nz/file/8H1hWb4C#7kUCYjUmJa61r_Zc_-yub8_pOGcKQ6qPidZflaxmjUo

 

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

#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. 사용자로부터 n개의 정수값을 읽어서 배열에 저장하고, 다시 역순으로 출력하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int n;
int a[100];

printf("입력할 정수의 개수:");
scanf("%d", &n);

for (int i = 0; i < n; i++) {
printf("%d번째 요소를 입력하시오:", i);
scanf("%d", &a[i]);
}
for (int i = n - 1; i >= 0; i--)
printf("%d ", a[i]);

return 0;
}

 

 

3. 사용자로부터 n개의 정수값을 읽어서 배열에 저장하고, 배열의 모든 요소의 합을 계산하여 출력하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int n, sum;
int a[100];

printf("입력할 정수의 개수:");
scanf("%d", &n);
sum = 0;

for (int i = 0; i < n; i++) {
printf("%d번째 요소를 입력하시오:", i);
scanf("%d", &a[i]);
sum += a[i];
}

printf("합=%d", sum);

return 0;
}

 

 

4. 사용자로부터 5개의 정수를 입력받아서 1차원 배열에 저장한다. 1차월 배열에서 최대값과 최소값을 계산하여서 출력해보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int max, min;
int a[100];

for (int i = 0; i < 5; i++) {
printf("정수를 입력하시오: ");
scanf("%d", &a[i]);
}
max = a[0];
min = a[0];
for (int j = 1; j < 5; j++) {
if (max < a[j])
max = a[j];
if (min > a[j])
min = a[j];
}

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


return 0;
}

 

 

5. 학생들의 시험 점수를 통계 처리하는 프로그램을 작성하여 보라. 각 학생들은 3번의 시험을 치른다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int a[3][5];

for (int i = 0; i < 3; i++) {
printf("학번과 3번의 시험 점수를 함께 입력하시오(예: 1 10 20 30): ");
scanf("%d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3]);
}

for (int j = 0; j < 3; j++) {
a[j][4] = (a[j][1] + a[j][2] + a[j][3]) / 3;
printf("학번: %d, 평균 점수: %d\n", a[j][0], a[j][4]);
}

return 0;
}

 

 

6. 1단부터 9단까지의 구구단을 2차원 배열에 저장한다. 사용자로부터 구구단 중의 하나를 받아서 2차원 배열에서 찾는다. 찾은 결과를 화면에 출력하는 프로그램을 작성한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int x, y;
int a[10][10];

for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++)
a[i][j] = i * j;
}

printf("알고싶은 구구단을 입력하시오(예: 9 3): ");
scanf("%d %d", &x, &y);

if (x > 9 || y > 9) {
printf("1부터 9 사이의 수를 입력하세요.");
return 0;
}

printf("%dX%d=%d", x, y, a[x][y]);

return 0;
}

 

 

7. 두 개의 행렬을 곱하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int a[3][3];
int b[3][3];
int c[3][3];

printf("행 개수=3\n열 개수=3\n");

printf("첫 번째 행렬 입력=\n");
scanf("%d %d %d\n%d %d %d\n%d %d %d",&a[0][0], &a[0][1], &a[0][2], &a[1][0], &a[1][1], &a[1][2], &a[2][0], &a[2][1], &a[2][2]);
printf("두 번째 행렬 입력=\n");
scanf("%d %d %d\n%d %d %d\n%d %d %d", &b[0][0], &b[0][1], &b[0][2], &b[1][0], &b[1][1], &b[1][2], &b[2][0], &b[2][1], &b[2][2]);

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
c[i][j] = (a[i][0] * b[0][i]) + (a[i][1] * b[1][i] + (a[i][2] * b[2][i]));
}

printf("\n%d %d %d\n%d %d %d\n%d %d %d", c[0][0], c[0][1], c[0][2], c[1][0], c[1][1], c[1][2], c[2][0], c[2][1], c[2][2]);

return 0;
}

 

 

8. 주어진 행렬의 전치 행렬을 꼐산하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int a[3][3];
int b[3][3];

printf("행 개수=3\n열 개수=3\n");

printf("행렬 입력=\n");
scanf("%d %d %d\n%d %d %d\n%d %d %d",&a[0][0], &a[0][1], &a[0][2], &a[1][0], &a[1][1], &a[1][2], &a[2][0], &a[2][1], &a[2][2]);

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

printf("\n%d %d %d\n%d %d %d\n%d %d %d", b[0][0], b[0][1], b[0][2], b[1][0], b[1][1], b[1][2], b[2][0], b[2][1], b[2][2]);

return 0;
}

 

 

9. 0부터 9까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하시오. 난수는 rand() 함수를 사용하여 생성하라. 배열을 사용해보자.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a[10] = { 0 };
int num, most;

most = a[0];

for (int i = 0; i < 100; i++) {
num = rand() % 10;
a[num] += 1;
}
for (int j = 1; j < 10; j++) {
if (most < a[j]) {
most = a[j];
num = j;
}
}

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

return 0;
}

 

 

10. 주사위를 60000번 던져서 그 결과를 배열로 요약하여 보자. 잘 만들어진 주사위라면 하나의 면이 나올 확률은 약 1/6이 되어야 한다. 컴퓨터에서 주사위 던지기는 난수 발생 함수  rand()를 통하여 구현하라.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a[6] = { 0 };
    int num;

    printf("============================\n");
    printf("주사위면              빈도 \n");
    printf("============================\n");

    for (int i = 0; i < 60000; i++) {
        num = rand() % 6;
        a[num] += 1;
    }
    
    for (int j = 0; j < 6; j++)
        printf("  %d                   %d\n", j + 1, a[j]);

    return 0;
}

 

 

11. 1차원 배열에서 각 요소의 빈도를 계산하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100000

int main(void)
{
    int a[N] = { 0 };
    int n, num;

    printf("입력할 정수의 개수(100개 이내로):");
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        printf("%d번째 요소를 입력하시오:", i);
        scanf("%d", &num);
        a[num] += 1;
    }
    for (int j = 0; j < N; j++) {
        if (a[j] > 0)
            printf("%d 값은 %d번 등장\n", j, a[j]);
    }

    return 0;
}

 

 

12. 배열에서 사용자가 원하는 위치에 있는 요소를 삭제하는 프로그램을 작성하라. 요소를 삭제한 후에, 뒤에 있는 요소들을 한 칸씩 앞으로 이동하여야 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int a[100] = { 0 };
    int n, del;

    printf("입력할 정수의 개수(100개 이내로):");
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        printf("%d번째 요소를 입력하시오:", i);
        scanf("%d", &a[i]);
    }

    printf("\n삭제할 위치: ");
    scanf("%d", &del);

    for (int j = del; j < n + 1; j++)
        a[j] = a[(j + 1)];
    
    printf("새로운 배열: ");

    for (int k = 0; k < n - 1; k++)
        printf("%d ", a[k]);

    return 0;
}

 

 

13. 배열을 이용하여 간단한 극장 예약 시스템을 작성하여 보자. 아주 작은 극장이라서 좌석이 10개밖에 안 된다. 사용자가 예약을 하려고 하면 먼저 좌석 배치표를 보여준다. 즉 예약이 끝난 좌석은 1로, 예약이 안 된 좌석은 0으로 나타낸다.

/*풀이는 책의 예시 기준이며, 문제에서 요구하는 것처럼 좌석 배치표를 먼저 보여주려면

printf("-----------------------\n");
            printf(" 1 2 3 4 5 6 7 8 9 10\n");
            printf("-----------------------\n");
            for (int i = 1; i < 11; i++)
                printf(" %d", a[i]);
            printf("\n");

부분을 앞으로 옮기면 된다.*/

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int a[11] = { 0 };
    int num, ch = 0;
    char rep;

    while (1) {
        printf("좌석을 예약하시겠습니까?(y또는 n): ");
        scanf("%c", &rep);
        getchar();

        if (rep == 'y' || rep == 'Y') {
            printf("몇번째 좌석을 예약하시겠습니까? ");
            scanf("%d", &num);
            getchar();

            if (a[num] == 1)
                printf("이미 예약된 좌석입니다.\n\n");
            else {
                a[num] = 1;
                printf("예약되었습니다.\n");
            }

            printf("-----------------------\n");
            printf(" 1 2 3 4 5 6 7 8 9 10\n");
            printf("-----------------------\n");
            for (int i = 1; i < 11; i++)
                printf(" %d", a[i]);
            printf("\n");
        }
        else if (rep == 'n' || rep == 'N') {
            printf("예약을 취소합니다.\n");
            break;
        }
        else
            printf("잘못된 입력입니다.\n");
    }

    return 0;
}

 

 

14. 사용자로부터 5개의 실수 자료를 읽어서 평균과 표준 편차를 계산하는 프로그램을 작성하라. 사용자로부터 받은 자료들은 배열에 저장하라. 평균이란 n개의 실수가 주어져 있을 때, 다음과 같이 계산된다. 표준 편차는 분산의 양의 제곱근으로 분산은 다음과 같이 계산된다. 표준 편차는 자료가 평균값 주위에 어느 정도의 넓이로 분포하고 있는가를 나타내는 하나의 척도이다.

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

int main() {

double a[5];
double sum, avg, std_dev, std_sum;

for (int i = 0; i < 5; i++) {
printf("실수를 입력하시오: ");
scanf("%lf", &a[i]);
}

sum = 0;
std_sum = 0;

for (int j = 0; j < 5; j++)
sum += a[j];

avg = sum / 5;
printf("평균:%lf\n", avg);

for (int k = 0; k < 5; k++)
std_sum += (a[k] - avg) * (a[k] - avg);

std_dev = sqrt(std_sum / 5);
printf("표준편차:%.6lf\n", std_dev);

return 0;
}

 

 

15. 수학에서의 "random walk"라 불리는 문제를 배열을 이용하여 프로그래밍하여 보자. 문제는 다음과 같다. 술에 취한 딱정벌레가 10개의 1차원 타일 위를 걸어다닌다. 딱정벌레는 랜덤한 방향으로 이동한다. 현재의 위치에서 좌우의 2개 타일로 걸어가는 확률은 동일하다고 가정하자. 딱정벌레가 지나간 길을 표시하는 프로그램을 작성하여 보자.

#include <stdio.h>
#include <stdlib.h>

int main() {

char tile[10] = { '_' };
int direction, move;

srand(time(NULL));
move = 4;

while (1) {
direction = rand() % 2;

if (direction == 0) {
move -= 1;
if (move < 0)
break;
}
else {
move += 1;
if (move > 9) {
printf("_ _ _ _ _ _ _ _ _ _\n");
break;
}
}

for (int j = 0; j < 10; j++)
tile[j] = '_';
tile[move] = '*';

for (int k = 0; k < 10; k++)
printf("%c ", tile[k]);
printf("\n");

_getch();
}

printf("딱정벌레가 멀리 날아가버렸습니다.");

return 0;
}

반응형

댓글