17074188 赵文轩 计算与软件工程作业二

简易四则运算

像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。 可以使用C,C++,或者C#等语言实现。

作业要求

分别能够实现小学一、二、三、四、五年级的四则运算要求, 逐步实现各个年级的难度
要求能够通过输入来选择不同年级,每个年级还得区分难,中,易三个等级
对于三、四、五年级需要支持括号与多个运算符
程序支持判断对错及累计得分与时间
一次可以出100道题目,而且不能重复(比如2+3 与 3+2 算重复的)
充分发挥想象增加满足小学生数学检测需要的功能


运行截图

遇到的困难与感受

1.自己所学所掌握的知识有限,程序代码只会基础的加减乘除运算,其中的逻辑关联借助网上才得以运算成功
2.在官网安装git老是安装不成功,要借助第三方网站才能够成功下载
3.git最后一步推送老是发生错误,一步一步按照教程都没错最后git push总是错误

代码

.#include<iostream.h>
.#include<stdlib.h>//atof函数的头文件
.#include<stdio.h>//sprintf函数的头文件
.#define MAX 255//宏定义常量
.#include<string.h>
double cmjia(char x[],char y[]);//声明函数
double cmjian(char x[],char y[]);
double cmcheng(char x[],char y[]);
double cmchu(char x[],char y[]);
double compute(char pstr[]);
double xsd(char x[]);
//主函数
void main()
{
do
{
double t;//存储运算结果
char a[]="0";
char linshi[MAX];//计算临时用的
char biaodashi[MAX];//用来存放表达式
for(;😉//输入表达式
{
cout<<"请输入一个正确的数学表达式,形如7+86,按回车结束"<<endl;//输入表达式
cin>>biaodashi;
if(biaodashi[0]=='
'||biaodashi[0]'/')
cout<<"您输入的表达式有误,请重新输入"<<endl;//判断首字符是否为*/,如果是提示错误别返回重新输入
else break;
}
if(biaodashi[0]
'-'||biaodashi[0]=='+')//判断首字符是否为+-,如果是给字符前加字符0
{
strcat(a,biaodashi);
strcpy(biaodashi,a);
}
strcpy(linshi,biaodashi);
t=compute(linshi);//计算
cout<<"运算结果是:"<<biaodashi<<'='<<t<<endl;//输出结果
}while(1);//计算完返回,接着输入

}
//自定义函数
double xsd(char x[])//判断是否有小数点,并把字符型转化为浮点型
{
for(int i=0;i<strlen(x);i++)
if(x[i]'.')
{
double num = 0.0;
sscanf(x, "%f", &num);//
return num;
}
else
return atof(x);
}
double cmjia(char x[],char y[])//计算两字符加法,并返回double型值
{
double a,b;
a=xsd(x);
b=xsd(y);
double c=a+b;
return c;
}
double cmjian(char x[],char y[])//计算两字符减法,并返回double型值
{
double a,b;
a=xsd(x);
b=xsd(y);
double c=a-b;
return c;
}
double cmcheng(char x[],char y[])//计算两字符乘法,并返回double型值
{
double a,b;
a=xsd(x);
b=xsd(y);
double c=a*b;
return c;
}
double cmchu(char x[],char y[])//计算两字符除法,并返回double型值
{
double a,b;
a=xsd(x);
b=xsd(y);
double c=a/b;
return c;
}
double compute(char pstr[])//
{
char strleft[MAX],strright[MAX],coml[MAX],comr[MAX],com[MAX],ysf;//ysf代表运算符
double comzhi,zhi;//comzhi代表中途计算的值,com代表comzhi所对应的字符型
int n=0;
//先算乘除
for(int i=0;i<strlen(pstr);i++)
{
if(pstr[i]
''||pstr[i]'/')
{
ysf=pstr[i];
// 获取左边要计算的数据coml和该数据前的字符串strleft
for(int j=i-1;j>=0;j--)
{
if(pstr[j]
'-'||pstr[j]'+')
{
for(int k=0;k<=j;k++) strleft[k]=pstr[k];
strleft[k]='\0';//获取左边要计算数据前的字符串strleft
for(k=j+1,n=0;k<i;k++,n++) coml[n]=pstr[k];
coml[n]='\0';//获取左边要计算的数据coml
break;
}
else
for(int k=0;k<i;k++)
{
coml[k]=pstr[k];
strleft[0]='\0';
}
}
//获取右边要计算的数据comr和该数据后的字符串 strright
for(j=i+1;j<=strlen(pstr);j++)
{
if(pstr[j]
'-'||pstr[j]'+'||pstr[j]'
'||pstr[j]'/'||pstr[j]'\0')
{
for(int k=0,n=j;k<strlen(pstr)-i-1;k++,n++) strright[k]=pstr[n];
strright[k]='\0';
for(k=i+1,n=0;k<j;k++,n++) comr[n]=pstr[k];
comr[n]='\0';
break;
}
}
if(ysf'')//如果是
{
comzhi=cmcheng(coml,comr);
sprintf(com,"%.3f",comzhi);
}
else//如果是/
{
comzhi=cmchu(coml,comr);
sprintf(com,"%.3f",comzhi);
}
strcat(strleft,com);//把数据前的字符和运算后的字符连接
strcat(strleft,strright);//把数据后的字符和运算后的字符连接
strcpy(pstr,strleft);//替换pstr
}//重新找操作符
}
//再找加减
for(i=0;i<strlen(pstr);i++)
{
if(pstr[i]
'+'||pstr[i]'-')
{
ysf=pstr[i];
// 获取左边要计算的数据coml
for(int k=0;k<i;k++) coml[k]=pstr[k];
coml[k]='\0';
//获取右边要计算的数据和该数据后的字符串 strright
for(int j=i+1;j<=strlen(pstr);j++)
{
if(pstr[j]
'-'||pstr[j]'+'||pstr[j]'\0')
{
for(int k=0,n=j;k<=strlen(pstr)-j;k++,n++) strright[k]=pstr[n];
strright[k]='\0';
for(k=i+1,n=0;k<j;k++,n++) comr[n]=pstr[k];
comr[n]='\0';
break;
}
}
if(ysf=='+')
{
comzhi=cmjia(coml,comr);
sprintf(com,"%.3f",comzhi);
}
else
{
comzhi=cmjian(coml,comr);
sprintf(com,"%.3f",comzhi);
}
strcat(com,strright);
strcpy(pstr,com);
}
}

//没找到,说明全部+-都计算完了
zhi=atof(pstr);
return zhi;
}

链接

https://gitee.com/zhao_wen__hung/learngit)

posted @ 2020-02-29 20:26  赵文轩  阅读(194)  评论(2编辑  收藏  举报