[초보] c언어 함수포인터 사칙연산 질문
include
#include "2.h"
int main() {
int(*pf[4])(int, int) = { add, sub, mul, div };
int choice = 0;
int x = 0, y = 0;
int result = 0;
while (1) {
menu();
printf("메뉴를 선택하세요 : ");
scanf(" %d", &choice);
if (choice < 0 || choice >= 4) {
printf("종료 \n");
break;
}
printf("두개의 정수를 입력하세요 : ");
scanf("%d %d", &x, &y);
if (choice == 3) {
result = pf[choice](&x,&y);
printf("연산결과 : %lf \n", (double)result);
}
else {
result = pf[choice](x, y);
printf("연산결과 : %d \n", result);
}
}
return 0;
}
int div(int x, int y) {
return (double)x / (double) y;
}
그 여기서 덧셈 뺄셈 곱셈은 문제가 없는데 나눗셈을 소수점 까지 하는게 안되네요;
예를들면 5 / 2 하면 2.5 가 나와야하는데 자꾸 2.00000 이 나와서 생각을 해도 나오지가않습니다.
형님들 도와주세요 ㅠ
div 의 반환형이 int 니까 반환하는 시점에 2
div 의 반환형이 int 니까 반환하는 시점에 2.5가 2가 되어 버립니다.
그걸 고치려면 pf 포인터의 타입도 고쳐져야 겠고 result 도 고쳐져야겠네요.
좋은 하루 되세요!
궁금한게 있습니다.
음... 그러면 pf 포인터 타입을 void로 바꿔야 하나요!!?
https://ycswarm.tistory.com
https://ycswarm.tistory.com/130
이 문제는 직접적으로는 div의 반환형이 int이기
이 문제는 직접적으로는 div의 반환형이 int이기 때문에 발생한 문제입니다.
하지만 div의 반환형을 double 등으로 바꾸고 나면 int를 반환하는 add, sub, mul 등과 타입이 달라지기 때문에 같은 함수 포인터 배열에 넣을 수 없게 되지요.
가장 쉽게 해결하는 방법은 add, sub, mul도 죄다 double을 반환하게 만들어서 통일시키는 겁니다. 하지만 어떻게든 add, sub, mul은 int를, div만 double을 반환하게 만들고 싶으시다면, 좀 번거로운 일을 해야 합니다.
(1) 어떻게든 서로 다른 두 타입을 동시에 나타낼 수 있는 타입을 써야 합니다. 취향껏 void *이나 union을 쓰세요.
(2) 그런 타입으로부터 원래의 타입으로 되돌려놓기 위한 정보, 즉 add~mul은 int를 반환하지만 div는 double을 반환한다는 정보를 코드로든 데이터로든 프로그램에 포함시켜야 합니다. 그래야 적절히 캐스팅을 해서 쓸 수 있겠죠.
솔직히 이런 종류의 코딩은 정말 귀찮고 멋 없어요. C++를 쓰고 boost library를 이용할 수 있다면 Boost.Variant를 쓰면 됩니다. 뭐, 사실 문제를 없앴다기보다는 번거로운 일을 부스트한테 맡겼을 뿐이긴 하지만요:
https://www.boost.org/doc/libs/1_69_0/doc/html/variant.html
댓글 달기