/* 用跳转表实现简易计算器 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define NUM 10 double add(double a, double b) { return a+b; } double sub(double a, double b) { return a-b; } double mul(double a, double b) { return a*b; } double divide(double a, double b) { return a/b; } double compare_max(double a, double b) { return (a>b)?a:b; } double compare_min(double a, double b) { return (a<b)?a:b; } int search_keyword( char const * const desired_word, char const *keyword_table[]) { char const **kwp = NULL; /* 遍历指针数组,查找想要的操作符 */ for(kwp = keyword_table; *kwp != NULL; kwp++) { /* 找到操作符后,返回它在指针数组中的位置 */ if(strcmp(desired_word, *kwp) == 0) return (kwp - keyword_table); } return -1; } /* 定义指针数组,用作存储关键字的表。在表的末尾加上NULL指针,则查找时无需知道表的长度。 */ char const *oper_sequence[] = {"add", "sub", "mul", "divide", "compare_max", "compare_min", NULL}; /* oper_func是个数组,其中元素的类型是函数指针,函数返回值是double类型 */ double (*oper_func[])(double, double) = {add, sub, mul, divide, compare_max, compare_min}; int main() { char oper[NUM] = {0}; int seq = 0; double data1 = 0; double data2 = 0; double result = 0; printf("Operator:"); /* 将输入的操作符存入oper数组 */ scanf("%s", oper); seq = search_keyword(oper, oper_sequence); /* 没有找到对应的操作符时的错误处理 */ if(seq < 0) { printf("Operator not found. "); return -1; } printf("请输入参数data1,data2:"); scanf("%lf,%lf", &data1, &data2); result = oper_func[seq](data1,data2); printf("result is: %f ", result); return 0; }