본문 바로가기
책./C언어 콘서트

9장(포인터) Programming #C언어 콘서트

by 낭람._. 2022. 8. 12.
반응형
1. 1차원 배열을 받아서 요소들의 합을 계산하는 함수 int get_array_sum(int *A. int size)을 구현하고 int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};을 가지고 테스트하라.
print_array()
1 2 3 4 5 6 7 8 9 0 
배열 요소의 합 = 45
#include<stdio.h>

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() {
    int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    printf("print_array()\n");
    for(int i=0; i<10; i++) {
        printf("%d ", data[i]);
    }
    printf("\n배열 요소의 합 = %d\n",get_array_sum(data, 10));
    return 0;
}

 

2. 포인터를 이용하여서 크기가 5인 1차원 정수 배열에 저장된 값을 역순으로 출력해보자.
5개의 정수를 입력하시오:1 2 3 4 5
역순: 5 4 3 2 1
#include<stdio.h>

int main() {
    int arr[5];

    printf("5개의 정수를 입력하시오:");
    for(int i=0; i<5; i++) {
        scanf("%d", &arr[i]);
    }

    printf("역순: ");
    for(int i=4; i>=0; i--) {
        printf("%d ",*(arr+i));
    }
    
    return 0;
}

 

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

void quadratic(int a, int b, int c, double *xplus, double *xminus) {
    *xplus = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
    *xminus = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
}
첫번째 실근: -1.000000
두번째 실근: -3.000000​
#include<stdio.h>
#include<math.h>

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

int main() {
    double xplus, xminus;
    int a=1, b=4, c=3;
    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개 이상의 값을 반환할 수 있다.
정수부=3
소수부=0.140000
#include<stdio.h>

void get(double value, int *i_part, double *f_part) {
    *i_part = (int)value;
    *f_part = value - (int)value;
}

int main() {
    int i_part;
    double f_part, value = 3.140000 ;

    get(value, &i_part, &f_part);
    printf("정수부=%d\n", i_part);
    printf("소수부=%lf\n", f_part);

    return 0;
}

 

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

###################

1 5 0 1 7 3 6 2 6 0
6 0 5 0 1 5 8 4 2 1
7 3 5 0 4 1 7 6 6 6
1 6 8 3 4 3 7 3 5 4
2 8 8 6 2 5 8 0 4 1
3 0 7 3 0 5 8 2 7 2
3 4 8 8 3 5 6 3 6 1
1 7 8 0 0 7 2 6 6 1
4 1 6 0 7 8 0 6 1 2
2 7 0 2 8 1 0 3 3 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define HEIGHT 10
#define WIDTH 10


void brighten_image(char *p, int n) {
    for(int i=0; i<n; i++) {
        if(*(p+i) > 0)
            *(p+i) -= 1;
    }
}

int main() {
    char image[HEIGHT * WIDTH];
    srand(time(NULL));

    for(int i=0; i<HEIGHT*WIDTH; i++) {
        image[i] = rand()%10;
        printf("%d ", image[i]);
        if(i % WIDTH == WIDTH-1 ) {
            printf("\n");
        }
    }

    printf("\n###################\n\n");

    brighten_image(image, WIDTH*HEIGHT);

    for(int i=0; i<HEIGHT*WIDTH; i++) {
        printf("%d ", image[i]);
        if(i % WIDTH == WIDTH-1 ) {
            printf("\n");
        }
    }

    return 0;
}

 

반응형

댓글