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

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

by 2den 2021. 1. 7.
728x90

<Lab 11 문제 유형 요약>

 

  • Program 1 : 함수 포인터, void 함수 포인터
  • Program 2 : 가변인자 함수, 자료형
  • Program 3 : 가변인자 함수, 문자열 연결
  • Program 4 : 가변인자 함수, 자료형
  • Program 5 : 함수 포인터, 사칙연산, 0으로 나눌 때, 연산자 오류
  • Program 6 : void 포인터 배열

 


 

Program 1

 

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

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

#include <stdio.h>

void myprint(int x);

 

int main()

{

         void (*p)(int);

         p = myprint();

 

         p(2);

         (*p)(4);

 

         return 0;

}

 

void myprint(int x)

{

         printf("%d\n", x);

}

#include <stdio.h>
void myprint(int x);

int main()
{
	void (*p)(int);
	p = &myprint;

	p(2);
	(*p)(4);

	return 0;
}

void myprint(int x)
{
	printf("%d\n", x);
}

 

#include <stdio.h>

 

int subtract(int, int);

int add(int, int);

 

int main(void)

{

         int(*pa[])(int, int) = { add, subtract };

 

         printf(": %d\n", (*pa(0))(10, 2));

         printf(": %d\n", (*pa(1))(10, 2));

 

         return 0;

}

 

int subtract(int x, int y) {

         return x - y;

}

int add(int x, int y) {

         return x + y;

}

#include <stdio.h>

int subtract(int, int);
int add(int, int);

int main(void)
{
	int(*pa[])(int, int) = { add, subtract };

	printf("합: %d\n", (*pa[0])(10, 2));
	printf("차: %d\n", (*pa[1])(10, 2));

	return 0;
}

int subtract(int x, int y) {
	return x - y;
}
int add(int x, int y) {
	return x + y;
}

 

#include <stdio.h>

 

int main(void)

{

         int a = 100;

         double b = 32.83;

 

         void *ptr = &a;

         printf("%d ", (int*) ptr); //값 출력

         ptr = &b;

         printf("%.2f\n", (double*) ptr); //값 출력

 

         return 0;

}

 

#include <stdio.h>

int main(void)
{
	int a = 100;
	double b = 32.83;

	void *ptr = &a; 
	printf("%d \n", *(int*)ptr); //값 출력
	ptr = &b;
	printf("%.2lf\n", *(double*)ptr); //값 출력

	return 0;
}

 

 

Program 2

 

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

  • double vafunc(char *type, int count, ...);   //int count 이후는 가변인자 ...
  • 함수원형에서 첫 인자는 처리유형으로 문자 d이면 int가 가변인자의 자료형, 문자 f이면 double이 가변인자의 자료형
  • 두번째 인자는 가변인자의 개수를 지정하며, 가변인자의 평균을 반환하는 함수이다.
  • 함수 main()에서 다음을 호출하여 출력되도록 한다.

vafunc("d", 5, 172, 21, 36, 43, 58);

vafunc("f", 5, 5.8, 17.3, 2.8, 31.8, 45.9, 5.9);

 

#include <stdio.h>
#include <string.h>

double vafunc(char *type, int count, ...)
{
  double sum = 0.0;

  va_list ap;
  va_start(ap, count);

  if (strcmp("d", type) == 0) 
  {
    for (int i=0; i<count; i++) 
    {
      int arg = va_arg(ap, int);              
      sum += arg;           
    } 
  }
  else if (strcmp("f", type) == 0)
  {
    for (int i = 0; i < count; i++) {
      double arg = va_arg(ap, double);              
      sum += arg;           
    }
  }

  return sum/count;
}

int main()
{
	printf("평균 %.2lf\n",vafunc("d", 5, 172, 21, 36, 43, 58));
	printf("평균 %.2lf\n", vafunc("f", 5, 5.8, 17.3, 2.8, 31.8, 45.9, 5.9));

	return 0;
}

 

 

Program 3

 

아래 가변인자 함수 vstrcat()의 함수 원형을 참고하여 임의의 개수의 문자열을 연결 시키는 vstrcat() 함수를 만들어 보시오.

 

void vstrcat(char *str, ...) ;  // 가변인자를 가지는 문자열  연결 함수

char str[50]={NULL};

char *words[] = {"C", " programming", " course", " in", " Garden", " of", " Eden"};

 

  • 아래 실행 결과는 vastrcat()을 한번 호출할 때마다 연결된 문자열을 출력한 결과이다.
  • vastrcat() 4번 호출

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

char str[50]={ };
char *words[] = {"C", " programming", " course", " in", " Garden", " of", " Eden"};

void vstrcat(int num, ...)
{
  va_list ap;
  va_start(ap,num);

  for (int i=0; i<num; i++)
  {
    strcat(str, va_arg(ap, char*));
  }

  printf("%s\n", str);
  str[0] = '\0';
}

int main()
{
  vstrcat(1, words[0]);
  vstrcat(3, words[0], words[1], words[2]);
  vstrcat(4, words[0], words[1], words[2], words[3]); 
  vstrcat(6, words[0], words[1], words[2], words[3], words[4], words[5]);

  return 0;
}

 

 

Program 4

 

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

  • 가변인자를 처리하는 함수 vasum()의 첫 인자는 처리유형을 나타내는 문자열 포인터로 문자 d이면 int가 가변인자의 자료형이며, 문자 f이면 double이 가변인자의 자료형
  • 가변인자의 수는 문자열의 수만큼으로 처리하며, 가변인자의 합을 반환하는 함수  double vasum(char *, ...);
  • 함수 main()에서 아래와 같이 가번인자 함수를 호출한다vasum("dfdf", 3, 20.75, 51, 21.91);

#include <stdio.h>
#include <string.h>

double vasum(char* args, ...)
{
  double sum = 0;
  
  va_list ap;
  va_start(ap, args);

  for (int i=0; i<strlen(args); i++)
  {
    if(args[i]=='d')
    {
      sum += (double)va_arg(ap, int);
    }
    else
    {
      sum += (double)va_arg(ap, double);
    }
  }

  return sum;
}

int main()
{
  printf("정수와 실수의 모든 데이터 합 : %.2lf\n", vasum("dfdf", 3, 20.75, 51, 21.91));

  return 0;
}

 

 

Program 5

 

사칙연산의 함수를 함수 포인터 배열에 저장하여 사칙연산을 호출하는 프로그램을 쓰시오.

  • 두개의 실수를 포함한 연산식을 입력 받아 덧셈, 뺄셈, 곱하기, 또는 나누기를 수행하여 결과를 출력하도록 한다.
  • 예외처리는 0으로 나눌 때와 연산자 오류에 대해서만 아래 예시와 같이 처리한다.
  • 사칙연산을 수행하는 함수는 아래와 같은 함수원형으로 정의된다

double add(double, double);

double subtract( double, double);

double multiply(double, double);

double devide( double, double);

 

#include <stdio.h>

double add(double a , double b)
{
    return a + b;
}

double subtract( double a , double b)
{
    return a - b;
}

double multiply(double a, double b)
{
    return a * b;
}

double devide( double a, double b)
{
    return a / b;
}

int main()
{
  double a, b, result;
  char c;
  double (*fp[4])(double, double);
  fp[0] = add;
  fp[1] = subtract;
  fp[2] = multiply;
  fp[3] = devide;

  while (1)
  {
    printf("수식 입력 : ");
    scanf("%lf %c %lf", &a, &c, &b);

    switch(c)
    {
    case '+':
      result = fp[0](a,b);
      break;
    case '-':
      result = fp[1](a,b);
      break;
    case '*':
      result = fp[2](a,b);
      break;
    case '/':
      if (b == 0.0)
      {
        printf("계산불가\n");
        continue;
      }
      result = fp[3](a,b);
      break;
    default:
      printf("연산자오류\n");
      continue;
    }
    printf("%.2lf %c %.2lf = %.2lf\n", a, c, b, result);
  }

  return 0;
}

 

 

Program 6

 

다음을 참고하여 void 포인터(void *) 배열을 선언하고, void 포인터 배열에 다양한 자료형과 함수를 저장하고 저장된 값을 출력하거나 함수 호출하는 프로그램을 쓰시오.

 

int a = 100;   double b = 32.83;  char *s = "string";

void *ptr[4];  // void 포인터 배열 선언

void printstr() {

           printf("software\n");

}

 

#include <stdio.h>

int a = 100;
double b = 32.83;
char *s = "string";

void *ptr[4];  // void 포인터 배열 선언
void printstr() {
   printf("software\n");
}

int main()
{
  ptr[0] = &a;
  ptr[1] = &b;
  ptr[2] = s;
  ptr[3] = printstr;

  printf("%d\n", *(int*)ptr[0]);
  printf("%.2f\n", *(double*)ptr[1]);
  printf("%s\n", (char*)ptr[2]);
  ((void(*)(void))ptr[3])();

  return 0;
}

 

728x90

댓글