回调函数的简单应用

#include

//
//这段代码逻辑虽然正确,但出现了代码冗余的现象 
// 解决方案:将实现计算的代码:
// 
// 			ret = jiafa(x,y);
//			printf("%d", ret);
//			printf("请选择两个操作数");
//			scanf_s("%d %d", &x, &y);
// 
//			用一个函数(cacl)封装起来
// 

//int jiafa(int x,int y)
//{
//	return x + y;
//}
//
//int jianfa(int x, int y)
//{
//	return x - y;
//}
//
//int chengfa(int x, int y)
//{
//	return x * y;
//}
//
//int chufa(int x, int y)
//{
//	return x / y;
//}
//
//void menu()
//{
//	printf("*****1.jiafa***************\n");
//	printf("*****2.jianfa**************\n");
//	printf("*****3.chengfa*************\n");
//	printf("*****4.chufa***************\n");
//}
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		printf("请选择:>");
//		scanf_s("%d", &input);
//		//printf("请选择两个操作数");  //如果这两行这样放的时候,
//		//scanf_s("%d %d", &x, &y);  //那么输入1~4以外的数字仍然提示请选择两个操作数再退出
//
//		switch (input)
//		{
//		case 1:
//			ret = jiafa(x,y);
//			printf("%d", ret);
//
//			printf("请选择两个操作数");
//			scanf_s("%d %d", &x, &y);
//			break;
//		case 2:
//			ret = jianfa(x, y);
//			printf("%d", ret);
//
//			printf("请选择两个操作数");
//			scanf_s("%d %d", &x, &y);
//			break;
//		case 3:
//			ret = chengfa(x, y);
//			printf("%d", ret);
//
//			printf("请选择两个操作数");
//			scanf_s("%d %d", &x, &y);
//			break;
//		case 4:
//			ret = chufa(x, y);
//			printf("%d", ret);
//
//			printf("请选择两个操作数");
//			scanf_s("%d %d", &x, &y);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default :
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//
//	return 0;
//}

//回调函数优化代码

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;
}

void menu()
{
	printf("*****1.Add***************\n");
	printf("*****2.Sub***************\n");
	printf("*****3.Mul***************\n");
	printf("*****4.Div***************\n");
	printf("*****0.exit***************\n");

}

//封装 cacl 这个功能为计算的函数
void cacl(int (*pf)(int,int))  //函数地址放函数指针里边去,所以括号内要写成函数指针类型的形式
{
	int x = 0;
	int y = 0;
	int ret = 0;

	printf("请选择两个操作数");
	scanf_s("%d %d", &x, &y);
	ret = pf(x, y);//(继156行)输入的两个数传给 pf 指向的 Add 函数,
	printf("%d", ret);
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%d", &input);

		switch (input)
		{
		case 1:
			cacl(Add); //代码流程示例:选择1,加法函数地址传给122行 pf, pf指向的是Add函数
			break;
		case 2:
			cacl(Sub);
			break;
		case 3:
			cacl(Mul);
			break;
		case 4:
			cacl(Div);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default :
			printf("选择错误\n");
			break;
		}
	} while (input);

	return 0;
}

你可能感兴趣的:(c语言)