c++-求各位大神来看一道简单的C++题,

问题描述

求各位大神来看一道简单的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。求解!!!

时间: 2024-10-04 03:12:40

c++-求各位大神来看一道简单的C++题,的相关文章

问下关于rest的方式转页面的问题,求各位大神来看下~~谢谢

问题描述 @GET@Path("/pay")@Consumes("application/json;charset=UTF-8")@Produces("application/json;charset=UTF-8")publicvoidservice(final@ContextHttpServletResponseresponse){ 然后使用responseresponse.getWriter().write(html);这个方法画界面跳转,为

c语言-求大神来看看我的算法有没有可行性,最好能给点建议

问题描述 求大神来看看我的算法有没有可行性,最好能给点建议 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10^100. 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格. 输入样例: 1234567890987654321123456789 输出样例:yi san w 我的代码如下: #include<stdio.h> #include&l

求各位大神看下这个json问题,为什么只打印了list集合其中一个对象的一个属性

问题描述 求各位大神看下这个json问题,为什么只打印了list集合其中一个对象的一个属性 解决方案 解决方案二: 是不是有父类和子类,属性在不同类中 解决方案三: 看着好像没什么错,建议逐个打印一下集合的长度,还有这个menu如果是自定义的是否有getter setter方法

求C#大神来。

问题描述 为什么我用C#添加应用程序后,就显示不出来主页了呢? 解决方案 解决方案二:求大神,来指点一二.解决方案三:publicvoidADD(stringVirtualName="/wrd",stringFilePath=@"D:XuNi"){constStringconstIISWebSiteRoot="IIS://localhost/W3SVC/1/ROOT";if(!Directory.Exists(FilePath)){Directo

大神来看下这个正则表达式如何转义呢

问题描述 正则表达式href=["'](http://|./|/)?w+(.w+)*(/w+(.w+)?)*(/|?w*=w*(&w*=w*)*)?["']如何转义呢stringstrRegex="href=["'](http://|./|/)?w+(.w+)*(/w+(.w+)?)*(/|?w*=w*(&w*=w*)*)?["']";//这样直接赋出错"Unrecognizedescapesequence"前

有没有qt大神来看下-Qt 怎么设置qscrollbar滑槽透明,滑块不透明

问题描述 Qt 怎么设置qscrollbar滑槽透明,滑块不透明 qt自绘scrollbar, 窗口放置scrollbar总出现黑色背景条,想去掉他 由于自绘给的滑块图片两边是透明的,总能看到下面的黑条 解决方案 t自绘scrollbar, 窗口放置scrollbar总出现黑色背景条,想去掉

Repeater中的单选框问题 求各位大神来救救我!!!

问题描述 我在repeater中放了radiobutton控件为何在页面上就变成全选中了?我加了groupname属性!求解代码: 解决方案 本帖最后由 qq_23942293 于 2014-12-01 16:02:26 编辑解决方案二:来个人啊!!解决方案三:来个人啊....解决方案四:有人吗?别沉了啊!!!!!解决方案五:单选框的远离是什么在一个范围内只能选中一个你把他们的name全部改成一样的试试解决方案六:引用4楼qq_19920727的回复: 单选框的远离是什么在一个范围内只能选中一个

select-求各位大神看一下,运行时查询结果只显示一行

问题描述 求各位大神看一下,运行时查询结果只显示一行 protected void wbtn_find_Click(object sender, EventArgs e) { string where = ""; string text = Textname.Text; for (int i = 0; i < text.Length; i++) { string ss = text.Substring(0, 1); where += "(District_Name LI

c#-求大神来帮助C#,一个简单学生类

问题描述 求大神来帮助C#,一个简单学生类 定义枚举类型 Public enum SexType {男, 女, 未知}: Public enum ProTitle (助教,讲师,副教授.教授.未知) Public enum StuTitle {班长,副班长,学委,学员} 定义下面类 Person类(抽象类) 包含的字段:姓名Name(字符串型).身高Height(单精度型,单位:米).体重Weight(单精度,单位:kg).性别Sex(枚举类型SexType) 包含的属性:身份证号ID(字符串型