课外拓展1.模拟计算器的三种方法

模拟计算器的三种方法-总结前面所学的案例

目录

一,第一种方法(暴力方法)

二,第二种方法(函数指针数组)

三,第三种方法(回调函数)


一,第一种方法(暴力方法)

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函数,
那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了,
回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、
这就是回调函数。*/

上述就是模拟计算器的三种方法,静待各位大佬斧正和指教!!!


版权声明:本文为m0_63309778原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。