模拟计算器的三种方法-总结前面所学的案例
一,第一种方法(暴力方法)
switch结构
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void menu(void) { //提供菜单 printf("************请选择****************\n"); printf("******1.Add*********2.Sub*********\n"); printf("******3.Mul*********4.Div*********\n"); printf("************0.exit****************\n"); printf("**********************************\n"); } //写计算器要用的函数 int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int main() { //因为计算器可以反复使用,所以用循环来写 //至于用while还是do-while都是看自己喜好 do { //在循环中定义变量,每次循环开始时初始化数据,就不会影响后面的运算 int x, y, ret; x = y = ret = 0; int input=0; //输出菜单 menu(); //选择函数来运行程序,达到自己的目的 printf("请选择:>"); scanf("%d",&input); //因为选项很多,太过复杂。选择用switch结构 switch (input) { case 1: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); //调用函数 ret = Add(x, y); printf("ret=%d\n", ret); break; case 2: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Sub(x, y); printf("ret=%d\n", ret); break; case 3: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Mul(x, y); printf("ret=%d\n", ret); break; case 4: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Div(x, y); printf("ret=%d\n", ret); break; //如果输入为0,程序结束,直接跳出 case 0:printf("程序结束"); break; //如果输入的是其他数,给用户继续选择的机会。 default:printf("选择错误,请重新选择"); break; } } while (input); return 0; }
上面都有解释,可以多看看。
二,第二种方法(函数指针数组)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void menu(void) { printf("************请选择****************\n"); printf("******1.Add*********2.Sub*********\n"); printf("******3.Mul*********4.Div*********\n"); printf("************0.exit****************\n"); printf("**********************************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int main() { //这里并没有用switch结构,这里跟第一个程序不同,上一个程序中input定义在了switch外面,所以没啥问题 //但是在这里,函数的主体就只有一个循环,由于我们用的是do-while循环,最后while后面的input是在循环体外面的, //如果在里面定义input的话,作用域就到不了外面,故,我们把input定义在外面。 int input = 0; do { //这里我们采用函数指针数组的方法。 int (*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div }; int x, y, ret; x = y = ret = 0; //输出菜单 menu(); //选择方法 printf("请选择:>"); scanf("%d", &input); if (input >= 1 && input <= 4) { //初始化数据 printf("请输入2个操作数:"); scanf("%d%d", &x, &y); //用函数指针的方法,用指针调用函数 ret = (parr[input])(x, y); printf("ret =%d\n", ret); } else if (input == 0) printf("程序结束。"); else printf("选择错误,请重新选择\n"); } while (input); return 0; } /*首先我们来分析一下,计算器有五种选择,我们用目前所学的方法来解决这个问题,我这里写了三种办法 第一种方法就是switch结构(变态的循环),第二种我选择函数指针数组的方法,即用数组存放函数的地址 给予用户多种函数,主要是数组的便利性,可以提供多种选择,第三种方法我们对第一种方法进行改良,我们 习惯对重复的操作写成自定义函数。同时我们采取函数指针做参数的方法。返回值为调用完函数后得到的值*/
/*首先我们来分析一下,计算器有五种选择,我们用目前所学的方法来解决这个问题,我这里写了三种办法
第一种方法就是switch结构(变态的循环),第二种我选择函数指针数组的方法,即用数组存放函数的地址
给予用户多种函数,主要是数组的便利性,可以提供多种选择,第三种方法我们对第一种方法进行改良,我们
习惯对重复的操作写成自定义函数。同时我们采取函数指针做参数的方法。返回值为调用完函数后得到的值*/
三,第三种方法(回调函数)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void menu(void) { printf("************请选择****************\n"); printf("******1.Add*********2.Sub*********\n"); printf("******3.Mul*********4.Div*********\n"); printf("************0.exit****************\n"); printf("**********************************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int Calc(int(*pf)(int, int)) { int x, y; x = y = 0; printf("请输入两个操作数:"); scanf("%d%d",&x,&y); return pf(x, y); } int main() { int input=0; menu(); printf("请选择:>"); scanf("%d",&input); do { switch (input) { case 1: printf("ret=%d\n",Calc(Add)); case 2: printf("ret =%d\n",Calc(Sub)); case 3: printf("ret=%d\n", Calc(Mul)); case 4: printf("ret=%d\n", Calc(Div)); case 0: printf("退出程序"); default: printf("请重新选择:"); } } while (input); return 0; } /*其实这个地方就是一个回调函数的方法,首先,我们要清楚回调函数的作用和定义,回调函数就是在b函数调用a函数, 那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了, 回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、 这就是回调函数。*/
/*其实这个地方就是一个回调函数的方法,首先,我们要清楚回调函数的作用和定义,回调函数就是在b函数调用a函数,
那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了,
回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、
这就是回调函数。*/
上述就是模拟计算器的三种方法,静待各位大佬斧正和指教!!!