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

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

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

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

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

 

 

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

https://mega.nz/file/MXNkXBKL#rXGoXG-PeGwlGCpT2E9aUm_0vWymswe8BtZp6k5Punw

 

1. 1차원 배열을 받아서 배열 요소들의 합을 계산하는 함수 int get_array_sum(int *A, int size)을 구현하고 int data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };을 가지고 테스트하라.

#include <stdio.h>
#define SIZE 10

void print_array(int* A, int size) {
printf("print_array()\n");
for (int i = 0; i < size; i++)
printf("%d ", A[i]);
}

int get_array_sum(int* A, int size) {

int sum = 0;

for (int i = 0; i < size; i++)
sum += *(A + i);

return sum;
}


int main(void) {

int data[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int* a = data;

print_array(a, 10);

printf("\n배열 요소의 합=%d\n", get_array_sum(a, 10));

return 0;
}

 

 

2. 포인터를 이용하여서 크기가 5인 1차원 정수 배열에 저장된 값을 역순으로 출력하여 보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5

void reverse(int* p, int size) {

printf("역순: ");

for (int i = size - 1; i >= 0; i--)
printf("%d ", *(p + i));
}

int main(void) {

int data[SIZE];
int* p = data;

printf("%d개의 정수를 입력하시오: ", SIZE);
scanf("%d %d %d %d %d", p, p + 1, p + 2, p + 3, p + 4);

reverse(data, SIZE);

return 0;
}

 

 

3. 2차 방정식의 근을 계산하는 함수를 작성하고 이 함수를 호출하여서 2차 방정식의 근을 출력하는 프로그램을 작성하여 보자. 매개 변수로 포인터를 사용하면 함수가 2개 이상의 값을 반환할 수 있다. 다음과 같이 두개의 근을 모두 포인터를 이용하여서 반환하도록 한다.

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

void quadratic(int a, int b, int c, double* xplus, double* xminus) {
*xminus = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
*xplus = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
}

int main(void) {
int a = 10, b = 40, c = 30;
double xminus, xplus;

quadratic(a, b, c, &xplus, &xminus);

printf("첫번째 실근: %lf\n", xplus);
printf("두번째 실근: %lf\n", xminus);

return 0;
}

 

 

4. 실수 3.14를 보내면 정수부 3과 소수부 0.14를 나누어서 보내주는 함수 void get(double value, int *i_part, double *f_part)을 구현해보자. 매개 변수로 포인터를 사용하면 함수가 2개 이상의 값을 반환할 수 있다.

#include <stdio.h>

void get(double value, int* i_part, double* f_part) {
printf("전달받은 실수=%lf\n", value);

*i_part = (int)value;
*f_part = value - *i_part;
}

int main(void) {
double f;
int i;

get(3.14, &i, &f);

printf("정수부=%d\n", i);
printf("소수부=%f", f);

return 0;
}

 

 

5. 간단한 영상 처리 프로그램을 작성하여 보자. 디지털 영상은 미세한 점들로 이루어져 있다. 이러한 점을 픽셀(pixel)이라고 한다. 픽셀의 밝기 정보는 숫자로 표현된다. 예를 들어서 크기가 10X10인 디지털 영상의 한 예이다. 각 픽셀의 밝기는 0부터 9까지 변화할 수 있다고 가정하고 디지털 영상을 1차원 배열 char image[HEIGHT * WIDTH]; 로 표현하고 각 픽셀의 밝기를 1씩 줄이는 프로그램을 작성하여 보자. 포인터에 대한 이해를 높이기 위하여 영상의 밝기를 줄이는 함수 void brighten_image(char *p, int w, int h)를 작성하고 영상을 담고 있는 1차원 배열을 매개 변수로 전달하도록 하라.

#include <stdio.h>
#define HEIGHT 10
#define WIDTH 10

void brighten_image (char *p, int w, int h) {
for (int i = 0; i < w * h; i++) {
p[i]--;
if (p[i] < 0)
p[i]++;
}
}

int main(void) {
char image[HEIGHT * WIDTH] = {
0,0,0,0,9,0,0,0,0,0,
0,0,0,9,9,0,0,0,0,0,
0,0,9,0,9,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,0,0,7,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,6,6,9,7,7,0,0,0 };
char* p = image;
int count = 0;

brighten_image(p, WIDTH, HEIGHT);

return 0;
}

 

 

6. 5번 문제에서 영상의 밝기를 증가시키는 함수 void darken_image(char *p, int n)를 작성하고 영상을 담고 있는 1차원 배열을 매개 변수로 전달하도록 하라. darken_image()가 올바르게 동작하는지 테스트하라. 영상을 화면으로 출력하는 printf_image(char *p, int w, int h)도 작성하여 사용하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#define HEIGHT 10
#define WIDTH 10

void brighten_image(char *p, int w, int h) {
for (int i = 0; i < w * h; i++) {
p[i]--;
if (p[i] < 0)
p[i]++;
}
}
void darken_image(char* p, int n) {
for (int i = 0; i < n; i++) {
p[i]++;
if (p[i] > 9)
p[i]--;
}
}
void print_image(char* p, int w, int h) {
int count = 0;

for (int i = 0; i < w * h; i++) {
printf("%d ", p[i]);
count++;
if (count == 10) {
printf("\n");
count = 0;
}
}
}

int main(void) {
char image[HEIGHT * WIDTH] = {
0,0,0,0,9,0,0,0,0,0,
0,0,0,9,9,0,0,0,0,0,
0,0,9,0,9,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,0,0,7,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,0,0,9,0,0,0,0,0,
0,0,6,6,9,7,7,0,0,0 };
char* p = image;
int select = 0;

while (1) {
printf("화면을 조정해주세요(밝게=1, 어둡게=2, 종료=3): ");
scanf("%d", &select);

if (select == 1) {
darken_image(p, HEIGHT * WIDTH);
system("cls");
print_image(p, WIDTH, HEIGHT);
printf("밝기가 증가했습니다.\n\n");
}
else if (select == 2) {
brighten_image(p, WIDTH, HEIGHT);
system("cls");
print_image(p, WIDTH, HEIGHT);
printf("밝기가 감소했습니다.\n\n");
}
else if (select == 3)
break;
else {
system("cls");
printf("잘못된 입력입니다.\n");
}
}

printf("프로그램을 종료합니다.");

return 0;
}

반응형

댓글