本次介绍基于c语言的四则运算计算器实现,该程序可进行日常的加、减、乘、除运算。共有三种方案,第一种为简易逻辑下的代码实现,该程序较为繁琐,但容易理解;第二种为基于函数指针传参形式下的代码实现,较第一种方案进行了一定程度的优化,将四则运算进行了封装,通过指针进行调用;第三种为基于函数指针数组传参,较第二种方案进行了更加深度的优化,将四则运算封装成为了一个函数指针数组。
一、方案介绍及代码
方案一 简易逻辑下的代码实现
该方案最为简单,先放置菜单,供用户选择运算形式,随后读取用户输入的两个操作数,通过switch函数分别进行不同的运算。四则运算之间相对独立,彼此之间并无联系,逻辑简单,易于理解。代码实现如下:
#include<stdio.h>
void menu()
{
printf("1.加法 2.减法 3.乘法 4.除法 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;
}
int main()
{
int input = 0;
do
{
int x = 0;
int y = 0;
menu();
printf("请选择>");
scanf_s("%d", &input);
switch (input)
{
case 1:
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("%d\n",add(x, y));
break;
case 2:
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("%d\n", sub(x, y));
break;
case 3:
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("%d\n", mul(x, y));
break;
case 4:
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("%d\n", div(x, y));
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
}
} while (input);
}
方案二 基于函数指针传参形式下的代码实现
该方案较第一种简单了一些,具体操作为将主函数中的四则运算通过函数指针封装为了一个cal函数,由此在主函数中仅需要调用cal函数即可,具体运算由cal函数进行调用。
代码实现如下:
其中语句"int cal(int(*pf)(int x, int y))"表示cal函数调用了一个返回值为int型、其两个操作数均为int型的函数,且cal返回值为int型。
#include<stdio.h>
void menu()
{
printf("1.加法 2.减法 3.乘法 4.除法 0.退出游戏");
}
int cal(int(*pf)(int x, int y))//进行函数指针传参
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("结果是:%d\n", pf(x, y));
}
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 input = 0;
do
{
menu();
printf("请选择>");
scanf_s("%d", &input);
switch (input)
{
case 1:
cal(add);
break;
case 2:
cal(sub);
break;
case 3:
cal(mul);
break;
case 4:
cal(div);
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
}
} while (input);
}
方案三 基于函数指针数组传参
本方案是最为优化的代码实现,将四则运算封装成了一个函数指针数组,通过用户输入的值直接调用数组中对应的运算的地址,四则运算直接成为了一个统一的整体,不需要通过switch函数进行分类,对于用户使用或调试时较为容易。代码如下:
#include<stdio.h>
void menu()
{
printf("1.加法 2.减法 3.乘法 4.除法 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;
}
int main()
{
int (*pfarr[])(int, int) = { 0,add,sub,mul,div };
int input = 0;
do
{
menu();
printf("请选择>");
scanf_s("%d", &input);
if (input > 0 && input < 5)
{
int x = 0;
int y = 0;
printf("请输入两个操作数>");
scanf_s("%d %d", &x, &y);
printf("结果是:%d\n", pfarr[input](x, y));
}
else if(input==0)
{
printf("退出游戏\n");
break;
}
else
{
printf("输入错误\n");
}
} while (input);
}
二、 运行仿真
以上三种方案均能呈现同一种效果,只是实现方式不同而已。代码运行结果呈现如下: