C语言实现计算器

1.传统计算器写法

传统计算器的写法需要在主函数里对逐个函数实现和调用,可以看到代码过于冗长,有没有一种更加简短的代码来实现呢,答案是肯定的

#include<stdio.h>
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()
{
	int x, y = 0;
	int ret = 0;
	int input = 1;
	do
	{
		printf("************************\n");
		printf(" 请输入你将要进行的运算:\n");
		printf("** 1:add ****** 2:sub **\n");
		printf("** 3:mul ****** 4:div **\n");
		printf("************************\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x , y);
			printf("ret=%d\n", ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret=%d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret=%d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret=%d\n", ret);
			break;
		case 0:
			printf("退出计算器");
			break;
		default:
			printf("输入错误,请重新输入!");
			break;
		}
	} while (input);
	
	return 0;
}

2.函数指针数组实现计算器

2.1函数指针数组

首先需要了解一下什么是函数指针数组?
数组是一个存放相同类型数据的储存空间,而指针数组则是,全部存放的指针类型的数组。
例如:

int* arr[10];
//数组的每个元素是int*

把函数的地址存放到一个数组中,这个数组就叫做函数指针数组
函数指针数组的定义:

int (* parr1 [3] )();

parr1 先和 [ ] 结合,说明 parr1是数组,数组的内容是什么呢?
是 int (*)() 类型的函数指针。
这里的函数指针数组便称作转移表

2.2计算器

#include<stdio.h>
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("************************\n");
	printf(" 请输入你将要进行的运算:\n");
	printf("*** 1:add       2:sub **\n");
	printf("*** 3:mul       4:div **\n");
	printf("*** 0:exit      ********\n");
	printf("************************\n");
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	//函数指针数组
	//转移表
	int(*p[])(int x, int y) = { 0,add,sub,mul,div };
	do
	{
		menu();
		scanf("%d", &input);
		if ((input >=1 && input <= 4))
		{
			printf("请输入2个操作数:>");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);//通过数组下标锁定函数
			printf("ret=%d\n", ret);
		}
		else if (input == 0)
			printf("退出计算器");
		else
			printf("输入错误,请重新输入");

	} while (input);
	
	return 0;
}