要用c实现一个计算器,我的思路是模块化设计:
先把之后要用到的调用函数单独放出来,然后再以main()函数开始主函数,被调函数代码如下:
float plus(float g,float h)//加的被调函数
{
float s;
s=g+h;
return s;//为调用的函数返回参数值
}
float minus(float g,float h)//减的被调函数
{
float s;
s=g-h;
return s;
}
float times(float g,float h)//乘的被调函数
{
float s;
s=g*h;
return s;
}
float divide(float g,float h)//除的被调函数
{
float s;
s=g/h;
return s;
}
float sqrt(float g,float h)//二次方根的被调函数
{
float s;
s=sqrt(g+h);
return s;
}
然后我们开始主函数:
首先我们先打印一个运算符表
我们要定义的就是浮点型数字a和b,然后就是运算符(拿char字符形式定义m)
然后使用scanf输入a,然后紧接着就是一个for循环,首先让你输入一个运算符号,然后就是输入数字b,要运算的话,就是只有一种思路,那就是多分枝结构:switch-case语句
等到这个运算结束之后就在这第一个循环之中询问一下是否要继续运算,如果要继续运算,那就什么都不进行,之后直接进入下一个循环之内;如果不继续运算,那么就break退出循环终止程序
继续循环之后的想法是:使用上一个运算的结果来作为这一个运算的a,然后单单在循环之中输入一个b和运算符号,这样的话,就是必须要定义数组的了。我们在主函数之始继续定义一个数组,然后将第一个a视为第一位,将结果视为第二位数字a,将第二个循环的结果视为第三位数字a,……
这样的话,就可以统一运算方式,不会使实现过程繁杂
下面是我的源代码:
#include<stdio.h>
#include<math.h>
#define pai 3.1415926//圆周率
#define e 2.7182818//欧拉数
float plus(float g,float h)//加的被调函数
{
float s;
s=g+h;
return s;//为调用的函数返回参数值
}
float minus(float g,float h)//减的被调函数
{
float s;
s=g-h;
return s;
}
float times(float g,float h)//乘的被调函数
{
float s;
s=g*h;
return s;
}
float divide(float g,float h)//除的被调函数
{
float s;
s=g/h;
return s;
}
float sqrt(float g,float h)//二次方根的被调函数
{
float s;
s=sqrt(g+h);
return s;
}
int main()//主函数,c程序从这里开始执行 ,上面的只是被调函数
{
printf("\t运算符表:\n\t+加-减*乘/除\n\tq 和的平方根\n\ts 和的正弦\n\tc 和的余弦\n\tt 和的正切\n\tn 和的反正弦\n\to 和的反余弦\n\tj 和的绝对值\n\tf a占b的百分数\n\t^ a的b次幂\n");
float a,b;
int i;
float arr[1000]={};
char m;
printf("输入a\n");
scanf("%f", &arr[0]);
for(i=1;i<1000;i++)
{
printf("输入运算符\n");
scanf(" %c", &m);
printf("输入b\n");
scanf("%f", &b);
switch(m)
{
case'+':arr[i]=plus(arr[i-1],b);printf("%f",arr[i]);break;
case'-':arr[i]=minus(arr[i-1],b);printf("%f",arr[i]);break;
case'*':arr[i]=times(arr[i-1],b);printf("%f",arr[i]);break;
case'/':arr[i]=divide(arr[i-1],b);printf("%f",arr[i]);break;
case'q':arr[i]=sqrt(arr[i-1],b);printf("%f",arr[i]);break;
case's':arr[i]=sin(pai/180*(arr[i-1]+b));printf("%f",arr[i]);break;//默认弧度制,转为角度制
case'c':arr[i]=cos(pai/180*(arr[i-1]+b));printf("%f",arr[i]);break;
case't':arr[i]=tan(pai/180*(arr[i-1]+b));printf("%f",arr[i]);break;
case'n':asin(pai/180*(arr[i-1]+b));printf("%f",arr[i]);break;
case'o':acos(pai/180*(arr[i-1]+b));printf("%f",arr[i]);break;
case'j':if(arr[i-1]+b<0)arr[i]=-(arr[i-1]+b);else arr[i]=arr[i-1]+b;printf("%f",arr[i]);break;
case'f':float aa;aa=arr[i-1]/b*100;printf("百分之%f",aa);arr[i]=aa/100;break;
case'^':int ii,dd,bb,cc[100];
bb=b;
if(bb==0)//实现对a^b的运算
{
arr[i]=1;printf("%f",arr[i]);break;
}
else
{
if(bb==1)
{
arr[i]=arr[i-1];printf("%f",arr[i]);break;
}
else
{
if(bb>=2)
{
cc[0]=1;
cc[1]=arr[i-1];
for(ii=2;ii<=bb;ii++)
{
cc[ii]=cc[ii-1]*cc[1];
arr[i]=cc[ii];
}
printf("%f",arr[i]);break;
}
}
}
if(bb==-1)
{
arr[i]=1/arr[i-1];printf("%f",arr[i]);break;
}
else
{
if(bb<=-2)
{
cc[0]=1;
cc[1]=arr[i-1];
for(ii=2;ii<=-bb;ii++)
{
cc[ii]=cc[ii-1]*cc[1];
arr[i]=cc[ii];
}
printf("%f",1/arr[i]);break;
}
}
default:printf("错误的运算符");
}
int d;
printf("是否继续运算 0为是 其余整数为否\n");
scanf("%d",&d);
if(d==0)
;
else
break;
}
return 0;
}
在运算过程中有着很多别的运算,当碰到使用被调函数比较困难时就没有使用调运的方法,直接将运算过程写在了循环之中实现运算。
这其中有一个运算是我自认为比较好的,就是a^b的运算过程,本来是可以直接用的:
在math.h的头文件里所声明的pow(a,b)来求(^符号在c中是按位异或操作符,不用于求乘方)
因为计算器有两种形式:一种是用户输入一个自定义长度的连续四则运算或者别的功能;另外一种是用户先输入一个数字a和一个数字b还有运算符号,然后程序将这个结果呈现出来,然后再询问一次是否要继续运算,但是我目前想不到第一种究竟是如何进行的,所以我写的计算器是第二种形式,等再学学再想第一种方式
需要注意的是:我这个代码可能不怎么适合用于visual studio中的c++模块编译(虽然说那个的c++兼容c语言,但是其中还是有一些标准的严格程度不同),有些地方是不妥的,但是在dev c++中是没有问题的