본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 함수와 포인터 활용 1 (Lab 10)

by 2den 2021. 1. 6.
728x90

<Lab 10 문제 유형 요약>

 

  • Program 1 : 이차원 배열(행렬) 출력, 더하기, 빼기 함수
  • Program 2 : 이차원 배열 포인터, 함수
  • Program 3 : 일차원 배열 최댓값, 최솟값 찾는 함수
  • Program 4 : 오름차순 정렬 배열 병합
  • Program 5 : 가변인자 함수
  • Program 6 : 가변인자 함수

 


 

Program 1

 

두 이차원 배열의 출력, 더하기, 빼기를 수행하는 함수를 만들고, 실행 예를 참고하여 배열의 연산 결과를 출력하는 프로그램을 작성하시오.

  • 아래 내용을 이용하여 함수를 정의 하고 실행

#define ROWS 2

#define COLS 3

typedef double matrixa[ROWS][COLS];

typedef double matrixb[ROWS][COLS];

typedef double resultc[ROWS][COLS];

void plus(resultc r, matrixa a, matrixb b, int rows, int cols);

void minus(resultc r, matrixa a, matrixb b, int rows, int col);

void display(resultc r, int rows, int cols);

 

#include<stdio.h>
#define ROWS 2
#define COLS 3

typedef double matrixa[ROWS][COLS];
typedef double matrixb[ROWS][COLS];
typedef double resultc[ROWS][COLS];

void plus(resultc r, matrixa a, matrixb b, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            r[i][j] = a[i][j] + b[i][j];
        }
    }
}

void minus(resultc r, matrixa a, matrixb b, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            r[i][j] = a[i][j] - b[i][j];
        }
    }
}

void display(resultc r, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%8.2f ", r[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    matrixa a = { {4.2, 4.3, 3.8}, {3.7, 1.5, 0.7} };
    matrixb b = { {5.2, 2.1, 1.8}, {3.2, 1.4, 2.9} };
    resultc c, d;

    plus(c, a, b, ROWS, COLS);
    minus(d, a, b, ROWS, COLS);

    display(a, ROWS, COLS);
    display(b, ROWS, COLS);
    display(c, ROWS, COLS);
    display(d, ROWS, COLS);

    return 0;
}

 

 

Program 2

 

아래와 같이 increase() 함수에서 배열 포인터를 이용하여 이차원 배열의 모든 원소의 값을 5씩 증가시키는 프로그램을 작성하시오.

 

int x[][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

#define COL 5

void print(int x[][COL], int rsize, int csize);

void increase(int (*ptr)[COL], int rsize, int csize, int num);

 

#include<stdio.h>
#define COL 5

void print(int x[][COL], int rsize, int csize)
{
    for (int i = 0; i < rsize; i++)
    {
        for (int j = 0; j < csize; j++)
        {
            printf("%2d ", x[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void increase(int(*ptr)[COL], int rsize, int csize, int num)
{
    for (int i = 0; i < rsize; i++)
    {
        for (int j = 0; j < csize; j++)
        {
            *((ptr[i]) + j) += num;
        }
    }
}

int main()
{
    int x[][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    print(x, 2, COL);
    increase(x, 2, COL, 5);
    print(x, 2, COL);

    return 0;
}

 

 

Program 3

 

자료 유형 double 1차원 배열에서 가장 큰 값을 찾는 함수, 가장 작은 값을 찾는 함수, 그 값의 차이를 반환하는 함수를 각각 만들어 결과를 알아보는 프로그램을 작성하시오.

 

double a[5] = {3.12, 5.14, 7.25, 7.48, 5.91};

void print(double *x, int size);

double findmin(double *a, int size);

double findmax(double *a, int size);

double diffminmax(double *a, int size);

 

#include<stdio.h>
#define COL 5

void print(double* x, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%.2f ", *(x + i));
    }
    printf("\n");
}
double findmin(double* a, int size)
{
    double min = *a;
    for (int i = 0; i < size; i++)
    {
        if (min > * (a + i)) min = *(a + i);
    }
    return min;
}

double findmax(double* a, int size)
{
    double max = *a;
    for (int i = 0; i < size; i++)
    {
        if (max < *(a + i)) max = *(a + i);
    }
    return max;
}

double diffminmax(double* a, int size)
{
    return findmax(a, 5) - findmin(a, 5);
}

int main()
{
    double a[5] = { 3.12, 5.14, 7.25, 7.48, 5.91 };
    print(a, 5);
    printf("최댓값 %.2f와 최솟값 %.2f의 차이는 %.2f\n", findmax(a, 5), findmin(a, 5), diffminmax(a, 5));

    return 0;
}

 

 

Program 4

 

다음을 참고로 두 일차원 배열의 병합을 구하여 출력하는 프로그램을 작성하시오.

  • 이미 오름차순으로 정렬되어 있는 두 배열 a, b의 병합 결과 c
  • 배열 a, b의 병합 결과를 배열c에 저장하는 함수

int a[] = {1, 2, 5, 7, 9, 14};

int b[] = {2, 3, 6, 8, 13};

int c[20];

void arraymerge(int *a, int asize, int *b, int bsize, int *c)

 

#include <stdio.h>

void print(int* x, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", *(x + i));
    }
    printf("\n");
}

void arraymerge(int* a, int asize, int* b, int bsize, int* c)
{
    int i = 0, j = 0, k = 0;
    for (i = 0; i < asize && j < bsize;)
    {
        if (*(a + i) < *(b + j))
        {
            *(c + k) = *(a + i);
            k++; i++;
        }
        else
        {
            *(c + k) = *(b + j);
            k++; j++;
        }
    }
    while (i < asize)
    {
        *(c + k) = *(a + i);
        k++; i++;
    }
    while (j < bsize)
    {
        *(c + k) = *(b + j);
        k++; j++;
    }
}

int main(void) {
    int a[] = { 1, 2, 5, 7, 9, 14 };
    int b[] = { 2, 3, 6, 8, 13 };
    int c[20];

    arraymerge(a, 6, b, 5, c);
    print(a, 6);
    print(b, 5);
    print(c, 11);

    return 0;
}

 

 

Program 5

 

다음 프로그램에서 문법오류 및 실행오류를 찾아 수정하시오.

  • 아래 코드를 눈으로 분석해 보고, 어떤 부분에서 문제가 있는지 확인후, 코드를 IDE에 복사하여 잘못된 부분 수정하고 컴파일하고 실행해 본다.
#include <stdio.h>

double sum(int count, ...); //int count 이후는 가변인자 ...

int main(void)
{
printf("합 %.1f\n", sum(5, 1.2, 2.1, 3.8, 4.3, 5.9, 8.6));

return 0;
}
double sum(int numagrs, ...)
{
va_list argp; //가변인자 변수 선언

//numargs 이후의 가변인자 처리 시작 
va_start(argp);

double total = 0; //합이 저장될 변수
for (int i = 0; i < numagrs; i++)
//지정하는 double 형으로 가변인자 하나 하나를 반환
total += va_arg(argp);

va_end(argp); //가변인자 처리 종료

return total;
}
#include <stdio.h>

double sum(int count, ...); //int count 이후는 가변인자 ...

int main(void)
{
	printf("합 %.1f\n", sum(5, 1.2, 2.1, 3.8, 4.3, 5.9, 8.6));

	return 0;
}
double sum(int numagrs, ...)
{
	va_list argp; //가변인자 변수 선언

	//numargs 이후의 가변인자 처리 시작 
	va_start(argp, numagrs);

	double total = 0; //합이 저장될 변수
	for (int i = 0; i < numagrs; i++)
		//지정하는 double 형으로 가변인자 하나 하나를 반환
		total += va_arg(argp, double);

	va_end(argp); //가변인자 처리 종료

	return total;
}

 

 

Program 6

 

다음과 조건을 만족하도록 가변인자 함수를 처리하는 프로그램을 작성하시오.

  • double vcountsum (int count, ...);  //int count 이후는 가변인자 ...
  • 함수 원형에서 첫 인자는 가변인자의 개수를 지정
  • 함수는 가변인자의 합을 계산하여 반환
  • 함수 main()에서 다음을 호출하여 출력되도록

vcountsum(3, 12.3, 23.67, 10.5);

vcountsum(5, 20.75, 51.3, 21.9, 5.56, 12.34);

 

#include <stdio.h>

double vcountsum(int numagrs, ...)
{
	va_list argp; //가변인자 변수 선언

	//numargs 이후의 가변인자 처리 시작 
	va_start(argp, numagrs);

	double total = 0; //합이 저장될 변수
	for (int i = 0; i < numagrs; i++)
		//지정하는 double 형으로 가변인자 하나 하나를 반환
		total += va_arg(argp, double);

	va_end(argp); //가변인자 처리 종료

	return total;
}

int main()
{
	printf("12.30 23.67 10.50\n");
	printf("%.2f\n", vcountsum(4, 12.30, 23.67, 10.50));
	printf("20.75 51.30 21.90 5.56 12.34\n");
	printf("%.2f\n", vcountsum(5, 20.75, 51.3, 21.9, 5.56, 12.34));

	return 0;
}

 

728x90

댓글