计算器的一个问题
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h> //字符操作函数 用于isdigit判断是否为数字
#define ESC 27 //定义esc
double num1=0,num2=0,result=0;
int opred=0,i=0,getnum=0,iserr=0,undoted=1,iseq=0;
char ch,opr=' ',newopr=' ',temp[30]="\0";
////////////////////////////////////////////////////////////////////////////////
int len(double d) //字符串长度
{
char str[105]={0};
int u;
sprintf(str,"%lf",d);
for(u=0;str[u]!='0'&&str[u]!='\0';++u);
return u;
}
////////////////////////////////////////////////////////////////////////////////
void clearline()
{
int k;
for (k=0;k<15;k++) {printf(" ");};
for (k=0;k<50;k++) {printf("\b \b");};
}
////////////////////////////////////////////////////////////////////////////////
void calc()
{
i=0;
clearline();
switch(opr) //根据运算符号计算
{
case '+':result=num1+num2; //做加法
if (len(result)>14)
{
clearline();
printf("E");
iserr=1;
break;
}
else {
clearline();
printf("%lf %c %lf = %lf\n",num1,opr,num2,result);
num1=result;
sprintf(temp, "%lf",result);
break;
}
case '-':result=num1-num2; //做减法
if (len(result)>14)
{
clearline();
printf("E");
iserr=1;
break;}
else {
clearline();
printf("%lf %c %lf = %lf\n",num1,opr,num2,result);
num1=result;
sprintf(temp, "%lf",result);
break;
}
case '*':result=num1*num2; //做乘法
if (len(result)>14)
{clearline();
printf("E");
iserr=1;
break;}
else {
clearline();
printf("%lf %c %lf = %lf\n",num1,opr,num2,result);
num1=result;
sprintf(temp, "%lf",result);
break;
}
case '/':if (num2!=0) //做除法
{
result=num1/num2;
clearline();
printf("%lf %c %lf = %lf\n",num1,opr,num2,result);
num1=result;
sprintf(temp, "%lf",result);
break;
}
else
{
clearline();
printf("E");
iserr=1;
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
int j=0;
printf("//////////////////////////////////////////////////\n");
printf("/////////////////////计算器///////////////////////\n");
printf("////////数字键输入 +-×/做运算=得到结果///////////\n");
printf("////////////////C归零D退格/////ESC退出////////////\n");
printf("0\b");
ch=getch();
while(ch!=ESC)
{
if (ch=='c')
{
system("cls");
printf("//////////////////////////////////////////////////\n");
printf("/////////////////////计算器///////////////////////\n");
printf("////////数字键输入 +-×/做运算=得到结果///////////\n");
printf("////////////////C归零D退格/////ESC退出////////////\n");
clearline();
i=0;
strcpy(temp,"0");
num1=0;
num2=0;
result=0;
undoted=1;
opred=0;
getnum=0;
iserr=0;
iseq=0;
opr=' ';
newopr=' ';
printf("\b0\b");
}
if((isdigit(ch))&&(i<14)&&(iserr==0)) //判断是否是数字
{
if (i==0)
{
strcpy(temp," ");
opred=0;
} //如重置,temp清空
if (!((temp[0]=='0')&&(ch=='0'))) //判断开始是否重复输入0
{
temp[i]=ch;
printf("%c",temp[i]);
i++;
}
if ((temp[0]=='0')&&(ch=='0')) printf("\b0\b");//输入0无反应
}
if ((ch=='.')&&(i<14)&&(iserr==0)) //判断是否是小数点
{
if ((i==0)&&(undoted==1))
{
strcpy(temp,"0");
temp[0]='0';
printf("0");
i=1;
} //判断开始是否输入.没有则补0
if ((i!=0)&&(undoted==1))
{
temp[i]='.';
printf("%c",temp[i]);
i++;
} //输入.头部自动+0
undoted=0; //输入一次. 改小数点标志值,下次不能再输入
}
if ((ch=='d')&&(i>0)&&(iserr==0))
{
if(temp[i-1]=='.')
undoted=1; //删除小数点后改小数点标志值
temp[i-1]='\0';
printf("\b \b");
i--;
if (i==0) printf("0\b");
} //退格
if ((ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
{
if (iserr==0)
{
newopr=ch;
iseq=1;
undoted=1;
i=0;
if (opred==0) getnum=getnum+1; //判断是否重复按操作符,只记一次
if (opred==1) printf("\b \b\b \b\b \b"); //如按过运算符号则回退修改运算符
if (getnum==2)
{
num2=atof(temp);
calc();
getnum=1;
opred=1; ///已有操作符标志置1
if (iserr==0) printf("%lf",num1);
if (iserr==0) printf(" %c ",newopr);
}
else {
printf(" %c ",newopr);
opred=1; //已有操作符标志置1
num1=atof(temp); //读入TEMP值到数字1
}
opr=newopr;
}
}
if ((ch=='=')&&(iserr==0))
{
if ((opr=='+')||(opr=='-')||(opr=='*')||(opr=='/'))
{
if (iseq==1)
num2=atof(temp);
calc();undoted=1;
getnum=0;
i=0;
iseq=0;
}
else {
num1=atof(temp);
num2=0;
result=0;
undoted=1;
getnum=0;
i=0;
iseq=0;
calc();
printf("%lf =%lf\n",num1,num1);
}
}
ch=getch();
}
}
连续等于之后我如果输入一个数再按等于如何实现得到这个数。。。比如输入1+2=3按等于连续等于3+2=5 再按1等于得到1=1求修改。我现在 按下的话还是连续等于 c 计算器 求帮助
[解决办法]
看到这么多的if else 我顿时迷茫了,if else太多了,可读性就低了 不过我还是觉得 应该是你的程序还少了一个if吧加入堆用户输入‘=’号前是否输入数字进行处理吧