问题描述
- 求各位大神来看一道简单的C++题,
-
这里是题目,后面附上我码的程序
设计一个简单计算器。用户输入四则运算表达式,程序输出正确结果。当表达式中数据格式或运算符输入错误,程序给出错误信息。要求:(1)表达式的左、右操作数可以为整数或实数。
(2)运算符限制为+,-,*,/
(3)输入表达式允许有前导空格,允许在运算符前后嵌入空格。
检测表达式由以下函数完成:
void check(char *input, int &a, double &y, int &op, char * &err);
其中参数意义如下:
input 输入表达式的字符串。x 返回表达式的左操作数转换结果数值。此题为简单起见,把数据统一转换成double类型。
y 返回表达式的右操作数转换结果数值。
op 返回对运算式的判断结果。若输入表达式左、右操作数和运算符都正确,则返回值为1、2、3、4,分别表示做+、-、*、/运算。若返回-1,表示左操作数错;若返回-2,表示右操作数错;若返回-3,表示操作符错。
err 返回显示错误信息的字符串。
例如,
用户输入: 1.2*3 程序输出为: =3.6 用户输入: 56#45 程序输出为: 运算符错误,请重新输入!
解决方案
#include "iostream"
#include "string"
using namespace std;
void check(char *input, double &x, double &y, int &op, char * &err);
double chage(char *ch);
int main()
{
double x,y;
int op;
char input[40],*err;
double result;
gets(input);
check(input,x,y,op,err);
if(op<0)
{cout<<err<<endl; return 0;}
switch(op)
{
case 1: result=x+y; break;
case 2: result=x-y; break;
case 3: result=x*y; break;
case 4: result=x/y; break;
}
cout<<input<<"="<<result<<endl;
return 0;
}
void check(char * input, double &x, double &y, int &op, char * &err)
{
int i=0,j=0,k;
int point=0;
char leftx[20],righty[20];
while(input[i]==' ') i++;
j=i;
if(input[j]=='0'&&(input[j+1]>='0'&&input[j+1]<='9'))
{err="左操作数错误!"; op=-1; return;}
while((input[j]>='0'&&input[j]<='9')||input[j]=='.')
{
if(input[j]=='.') point++;
if(point>1) {err="左操作数错误!"; op=-1; return;}
j++;
}
k=0;
while(i<j) leftx[k++]=input[i++];
leftx[k]='';
x=chage(leftx);
while(input[i]==' ') i++;
switch(input[i])
{
case '+': op=1; i++; break;
case '-': op=2; i++; break;
case '*': op=3; i++; break;
case '/': op=4; i++; break;
default: op=-3;
err="运算符错误!";
return;
}
while(input[i]==' ') i++;
j=i;
point=0;
if(input[j]=='0'&&(input[j+1]>='0'&&input[j+1]<='9'))
{err="右操作数错误!"; op=-2; return;}
while((input[j]>='0'&&input[j]<='9')||input[j]=='.')
{
if(input[j]=='.') point++;
if(point>1) {err="右操作数错误!"; op=-2; return;}
j++;
}
k=0;
while(i<j) righty[k++]=input[i++];
righty[k]='';
y=chage(righty);
if(op==4&&y==0)
{err="除数不能为0"; op=-2; return;}
}
double chage(char *ch)
{
int i=0,j,f=-1;
double result=0,wre;
while(ch[i])
{
if(ch[i]=='.') break;
i++;
}
f=i;
for(i=f-1;i>=0;i--)
{
wre=1;
j=0;
while(j<f-i-1) {wre*=10; j++;}
result+=(ch[i]-'0')*wre;
}
for(i=f+1;ch[f]&&ch[i];i++)
{
wre=1;
j=0;
while(j<i-f) {wre*=0.1; j++;}
result+=(ch[i]-'0')*wre;
}
return result;
}
解决方案二:
#include
#include
#include
#include
using namespace std;
bool IsNumber(char str)//判断输入的x,y是不是符合要求的数
{
int nLen = strlen(str);
int k = 0;
int nCount = 0;//记录小数点个数
for (int i = 0; i
{
if ((str[i] > 47 && str[i] < 58) || str[i] == '.')
{
if (str[i] > 47 && str[i] < 58)
{
k = k + 1;
}
if (str[i] == '.'&&nCount == 0)
{
k = k + 1;
nCount++;
}
}
}
if (k == nLen)
{
return true;
}
else
{
return false;
}
}
void check(char input, double&x, double&y, int&op, char&err)//输出等式
{
if (input == '+')
op = 1;
if (input == '-')
op = 2;
if (input == '*')
op = 3;
if (input == '/')
op = 4;
if (input != '+'&input != '-'&input != '*'&input != '/')
op = -3;
switch (op)
{
case 1:
cout << x + y << endl;
break;
case 2:
cout << x - y << endl;
break;
case 3:
cout << x*y << endl;
break;
case 4:
cout << x / y << endl;
break;
case -3:
cout << err << endl;
}
}
int main()
{
double x, y;
int c, d,op;
char input;
char*err;
err = "操作符错误";
cin >> x;
cin >> input;
cin >> y;
char str1[100], str2[100];
sprintf(str1, "%d", x);//将x,y转化为字符串,输入检查数组
sprintf(str2, "%d", y);
c = IsNumber(str1);
cout << c << endl;
d = IsNumber(str2);
cout << d << endl;
if (c != 1 && d == 1)
{
cout << "左操作数错误" << endl;
}
if (c == 1 && d != 1)
{
cout << "右操作数错误" << endl;
}
if (c == 0 && d == 0)
{
cout << "左右操作数都错误" << endl;
}
if (c == 1 && d == 1)
{
check(input, x, y, op, err);
}
system("pause");
}
解决方案三:
#include
#include
#include
#include
using namespace std;
bool IsNumber(char str)//判断输入的x,y是不是符合要求的数
{
int nLen = strlen(str);
int k = 0;
int nCount = 0;//记录小数点个数
for (int i = 0; i
{
if ((str[i] > 47 && str[i] < 58) || str[i] == '.')
{
if (str[i] > 47 && str[i] < 58)
{
k = k + 1;
}
if (str[i] == '.'&&nCount == 0)
{
k = k + 1;
nCount++;
}
}
}
if (k == nLen)
{
return true;
}
else
{
return false;
}
}
void check(char input, double&x, double&y, int&op, char&err)//输出等式
{
if (input == '+')
op = 1;
if (input == '-')
op = 2;
if (input == '*')
op = 3;
if (input == '/')
op = 4;
if (input != '+'&input != '-'&input != '*'&input != '/')
op = -3;
switch (op)
{
case 1:
cout << x + y << endl;
break;
case 2:
cout << x - y << endl;
break;
case 3:
cout << x*y << endl;
break;
case 4:
cout << x / y << endl;
break;
case -3:
cout << err << endl;
}
}
int main()
{
double x, y;
int c, d,op;
char input;
char*err;
err = "操作符错误";
cin >> x;
cin >> input;
cin >> y;
char str1[100], str2[100];
sprintf(str1, "%d", x);//将x,y转化为字符串,输入检查数组
sprintf(str2, "%d", y);
c = IsNumber(str1);
cout << c << endl;
d = IsNumber(str2);
cout << d << endl;
if (c != 1 && d == 1)
{
cout << "左操作数错误" << endl;
}
if (c == 1 && d != 1)
{
cout << "右操作数错误" << endl;
}
if (c == 0 && d == 0)
{
cout << "左右操作数都错误" << endl;
}
if (c == 1 && d == 1)
{
check(input, x, y, op, err);
}
system("pause");
}
解决方案四:
然后在运行的时候发现判断输入的字符串是否是数字的那个程序出现问题,可是在单独测试这个函数的时候又没有问题。还有就是题目要求输入的左右操作符是double,可是如果我一开始cin的就是double型那么输入x,y的时候就无法判断出是那个操作数出现错误。例如输入x为&……%&,y为86;程序会把x,y都判断为输入错误,如果cin的xy是字符串,则没有办法判断出你输入的x到哪里是停止的,因为你要输入一个操作符例如+,可是由于是字符串,输入可能把它也当成是x的一部分,则没办法正确输入x。求解!!!