関数ポインタとコマンドライン引数の組み合わせのプログラムについて(別件)
Posted: 2012年1月31日(火) 09:06
同じく下の条件で下のプログラムを書き換えたいのですが、うまくできません。
分かる方、お願いします。
<条件>
sin, cos, tan をそれぞれ指定するオプションとして、-s, -c, -t を与えるものとせよ。 これらは入力必須とせよ。また、これらのオプションの直後に、角度を表す実数値を受け取るものとせよ。
角度が度数 (degree) か、ラジアン単位 (radian) かを、それぞれオプション -d, -r で指定できるようにせよ。またこれらは省略可能とし、省略された場合はラジアン単位で角度が指定されたものとせよ。
オプションの順番は任意とせよ。つまり、(1) -s, -c, -t と角度、(2) -d, -r について、(1) と (2) の順番は入れ替えてもよいものとせよ。
オプションが指定されていない場合、および、オプションの指定に誤りがある場合、プログラムの使い方を表示せよ。
<プログラム>
#include <stdio.h>
#include<math.h>
char *sin_p(void){
return "sin(theta)";
}
char *cos_p(void){
return "cos(theta)";
}
char *tan_p(void){
return "tan(theta)";
}
int main (void)
{
double(*p[])(double num) = {sin, cos, tan};
char*(*q[])(void) = {sin_p, cos_p, tan_p};
int i;
double num;
printf("0: sin, 1: cos, 2: tan ? ");
scanf("%d", &i);
if((i>=0)&&(i<=2)){
printf("theta = ");
scanf("%lf", &num);
printf("%s = %f\n", q(), p(num));
}
return 0;
}
分かる方、お願いします。
<条件>
sin, cos, tan をそれぞれ指定するオプションとして、-s, -c, -t を与えるものとせよ。 これらは入力必須とせよ。また、これらのオプションの直後に、角度を表す実数値を受け取るものとせよ。
角度が度数 (degree) か、ラジアン単位 (radian) かを、それぞれオプション -d, -r で指定できるようにせよ。またこれらは省略可能とし、省略された場合はラジアン単位で角度が指定されたものとせよ。
オプションの順番は任意とせよ。つまり、(1) -s, -c, -t と角度、(2) -d, -r について、(1) と (2) の順番は入れ替えてもよいものとせよ。
オプションが指定されていない場合、および、オプションの指定に誤りがある場合、プログラムの使い方を表示せよ。
<プログラム>
#include <stdio.h>
#include<math.h>
char *sin_p(void){
return "sin(theta)";
}
char *cos_p(void){
return "cos(theta)";
}
char *tan_p(void){
return "tan(theta)";
}
int main (void)
{
double(*p[])(double num) = {sin, cos, tan};
char*(*q[])(void) = {sin_p, cos_p, tan_p};
int i;
double num;
printf("0: sin, 1: cos, 2: tan ? ");
scanf("%d", &i);
if((i>=0)&&(i<=2)){
printf("theta = ");
scanf("%lf", &num);
printf("%s = %f\n", q(), p(num));
}
return 0;
}