<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;
}
'College Computer Science > C Language' 카테고리의 다른 글
[C 프로그래밍 실습] Report 04 (0) | 2021.01.08 |
---|---|
[C 프로그래밍 실습] 파일 처리 (Lab 12) (0) | 2021.01.07 |
[C 프로그래밍 실습] 3인 블랙잭 Blackjack 카드 게임 만들기 (Term Project) (1) | 2021.01.07 |
[C 프로그래밍 실습] 함수와 포인터 활용 1 (Lab 10) (0) | 2021.01.06 |
[C 프로그래밍 실습] Report 03 (0) | 2021.01.04 |
댓글