计算器的实现
1、代码实现
#include <stdio.h>
void menu()//菜单打印
{
printf("***************************\n");
printf("***** 1> Add 2> Sub ****\n");
printf("***** 3> Mul 4> Del ****\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 Del(int x, int y)//实现除法
{
return x / y;
}
int main(void)
{
int input = 0;
int x = 0, y = 0;
int ret = 0;
do {
menu();
printf("请选择运算:>");
scanf("%d", &input);
switch (input)//选择函数
{
case 1:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Del(x, y);
printf("%d\n", ret);
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择:>");
break;
}
} while (input);
return 0;
}
结果如下:
可以发现这段代码只是实现了简单的加减乘除,而且还有需要改进的地方。就已经显得十分冗余了,下面进行几组优化。
2、优化1
要想进行优化,还需要了解一个函数数组指针。这里直接放放一个链接了
http://t.csdn.cn/cLzPi
下面看代码:
void menu()//菜单打印
{
printf("***************************\n");
printf("***** 1> Add 2> Sub ****\n");
printf("***** 3> Mul 4> Del ****\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 Del(int x, int y)//实现除法
{
return x / y;
}
int main(void)
{
int input = 0;
int x = 0, y = 0;
int ret = 0;
int (*p[5])(int x, int y) = { 0,Add,Sub,Mul,Del };//这里前面写0的目的,是指为了,直接对应
do {
menu();
printf("请选择运算:>");
scanf("%d", &input);
if ((input <= 4) && input >= 1) {//因为这里只是进行了加减乘除的四则运算
//如果要增加其他的运算,只需要再数组里增加函数的地址,并且相应的更改这里input的取值就可以了
printf("请输入操作数:>");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
printf("ret = %d\n", ret);
}
else if(input == 0){
printf("退出计算器\n");
}
else {
printf("输入错误,请重新输入:>");
}
} while (input);
return 0;
结果如下:
3、优化二
在了解优化二之前,要先明白一个概念,回调函数:回调函数,就是一个通过函数指针调用的函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用,用于对该事件或条件进行相应。
在第一段代码中:
case 1:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Del(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d\n", ret);
break;
各个case中只有被调函数不同,其余的都相同, 就显得输入输出冗余,因而进行了一段优化。
void menu()//菜单打印
{
printf("***************************\n");
printf("***** 1> Add 2> Sub ****\n");
printf("***** 3> Mul 4> Del ****\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 Del(int x, int y)//实现除法
{
return x / y;
}
void calc(int (*p)(int, int))
{
int x = 0, int y = 0;
int ret = 0;
printf("请输入操作数:>");
scanf("%d %d", &x, &y);
ret = p(x, y);
printf("ret = %d\n", ret);
}
int main(void)
{
int input = 0;
int x = 0, y = 0;
int ret = 0;
do {
menu();
printf("请选择运算:>");
scanf("%d", &input);
switch (input)//选择函数
{
case 1:
calc(Add);
break;
case 2:
calc(Sub);
break;
case 3:
calc(Mul);
break;
case 4:
calc(Del);
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择:>");
break;
}
} while (input);
return 0;
}
这样写的话就会使重复代码去掉很多,达到优化代码的作用。
4、优化三
优化三,是对代码的执行进行了优化,比如除数不能为0之类的。
void menu()//菜单打印
{
printf("***************************\n");
printf("***** 1> Add 2> Sub ****\n");
printf("***** 3> Mul 4> Del ****\n");
printf("***** 0> exit ****\n");
printf("***************************\n");
}
void Add(int x, int y)//实现加法
{
printf("%d + %d = %d\n", x, y, x + y);
}
void Sub(int x, int y)//实现减法
{
printf("%d - %d = %d\n", x, y, x - y);
}
void Mul(int x, int y)//实现乘法
{
printf("%d * %d = %d\n", x, y, x * y);
}
void Del(int x, int y)//实现除法,进行的一定的判断和求出了余数
{
if (y == 0)
{
printf("输入错误,除数不能为0,请重新输入除数:>");
scanf("%d", &y);
}
if (x % y == 0)
{
printf("%d / %d = %d\n", x, y, x / y);
}
else {
printf("%d / %d = %d,余数为:%d\n", x, y, x / y, x % y);
}
}
int main(void)
{
int input = 0;
int x = 0, y = 0;
void (*p[5])(int x, int y) = { 0,Add,Sub,Mul,Del };//这里前面写0的目的,是指为了,直接对应
do {
menu();
printf("请选择运算:>");
scanf("%d", &input);
if ((input <= 4) && input >= 1) {
printf("请输入操作数:>");
scanf("%d %d", &x, &y);
(*p[input])(x, y);
}
else if(input == 0){
printf("退出计算器\n");
}
else {
printf("输入错误,请重新输入:>");
}
} while (input);
return 0;
}
这样一个简单的计算器就实现了,写的不好,有错误的地方望多多指正。