43四则表达式计算.docx
《43四则表达式计算.docx》由会员分享,可在线阅读,更多相关《43四则表达式计算.docx(12页珍藏版)》请在冰豆网上搜索。
![43四则表达式计算.docx](https://file1.bdocx.com/fileroot1/2023-1/9/f8ed8aed-5c98-41f9-a096-5ef8ef9ff04c/f8ed8aed-5c98-41f9-a096-5ef8ef9ff04c1.gif)
43四则表达式计算
河北工业大学计算机软件技术基础(VC)2014年课程设计报告
学院班级姓名学号成绩____
一、题目:
四则表达式计算(43)
二、设计思路
1、总体设计
1)分析程序的功能
程序可以计算用户输入的简单四则表达式(只包括加减乘除符号且不带括号)。
2)系统总体结构:
系统主要用来计算简单的四则表达式,当用户输入需要计算的表达式后,系统会给出一个正确答案(除了括号)。
系统主要分为4大部分,主函数,运算表达式的存储,数和字符数组之间的转化,计算逻辑。
模块
函数名称
主函数
main
运算表达式的存储
string
数和字符数组之间的转化
splitprem
计算逻辑
combine
通过提示我们输入需要计算的四则表达式,然后得到正确的结果(除了括号)。
2、各函数的功能和模块的设计:
1)声明函数
声明函数主要是对所用函数的声明,主要起对所调用的函数的说明作用。
代码参见函数。
2)主函数
主函数部分是函数的核心部分,主要的作用是对函数的运算的执行。
和对运算的控制。
代码参见函数
3)运算表达式的储存
储存主要定义字符数组来储存,由于在运算过程中会出现小数,而小数会加长表达式,所以在定义字符数组的时候定义的足够长。
代码参见函数
4)数和字符数组之间的转化
计算前需要将字符序列转化为浮点数来运算,同样的,运算结果要替换表达中的字符序列也需要也需要先转化车字符串,这可以使用string.h定义下的函数。
代码参见函数
5)计算逻辑
计算逻辑主要是对你输入的四则表达式的计算,它主要运用if和for语句。
代码参见函数
3、你所设计的程序最终完成的功能
1)说明你编制的程序能完成的功能
能够计算简单的四则表达式(除了括号)。
当你输入一个四则运算是,程序会输出相应的结果。
2)准备的测试数据及运行结果
以下是输入的四则表达式
5*8/6+7=13.67
程序的主界面如下:
三、程序清单
1)函数声明
voidSplitPrem(char*str);
floatCombine();
charstr[200],str1[200],str2[50][30],operate_c[50],sub_str[30];
intoperate_2str[50];
intstrnum=0,operatenum=0;/*子字符串个数,操作符个数*/
inti,j,k,flag;
floatf=0.0,str_f[50];
2)主函数
intmain()
{
intlen;
floattemp;
cout<<"请输入要计算的表达式:
"<cin>>str;
//cout<len=strlen(str);
if(str[len-1]=='=')str[len-1]=0;//有等号去除,没等号就计算
strcpy(str1,str);
SplitPrem(str1);
temp=Combine();
cout<<"运算结果为:
"<cout<//system("pause");
return0;
}
/*此函数的作用是分解为子字符串和操作符*/
//如123+321
//就分解为'123''+''321'
voidSplitPrem(char*str1)
{
j=strlen(str1);
sub_str[0]=str1[0];
k=1;
for(i=1;i{
if(str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-')
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
operate_c[operatenum]=str1[i];
operate_2str[operatenum]=strnum;
strnum++;
operatenum++;
k=0;
}
else
{
sub_str[k]=str1[i];
k++;
}
}
if(k>0)
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
strnum++;
}
for(i=0;istr_f[i]=atof(str2[i]);/*字符串转化为浮点数*/
}
3)计算
/*此函数的作用先计算乘除,后计算加减,每计算一次,子字符串和操作符向前移动,即删除已经计算过的,将后面的字符串和操作符向前移动进行计算*/
floatCombine()
{
while
(1)
{
flag=0;
for(i=0;i{
if(operate_c[i]=='*'||operate_c[i]=='/')
{
if(operate_c[i]=='*')//定义乘法
{
f=str_f[operate_2str[i]]*str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else//定义除法
{
f=str_f[operate_2str[i]]/str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
while
(1)
{
flag=0;
for(i=0;i{
if(operate_c[i]=='+'||operate_c[i]=='-')
{
if(operate_c[i]=='+')//定义加法
{
f=str_f[operate_2str[i]]+str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else//定义减法
{
f=str_f[operate_2str[i]]-str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
returnf;//返回最后的函数值给主函数即计算结果
}
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
在进行程序设计的过程中,虽然能够运用一些设计步骤,但发现自己仍然对许多方面的内容理解不够透彻,在设计程序时,通过大量的资料查询才使程序得以完善。
在进行实际设计这一方面仍然缺乏经验,需要在今后的学习中加大课程设计方面的练习让自己的编程能力逐步提升。
2、对课题提出更完善的方案
本课题是计算简单的四则计算,应该在计算时加上括号和函数,这样会使程序更加完美。
五、收获及心得体会
在进行此次课题设计的过程中,不仅使我加深了对所用函数的理解,更加了解了程序在运行中的结构特点,让我对所用的函数更加的理解和能够熟练的应用自己掌握的函数。
通过此次课程设计,发现自己在编程方面仍然有许多不足之处,许多步骤需要通过借助资料及同学的指点才能顺利运行。
虽然在设计程序过程中遇到了许多问题,但在解决这些问题的过程中受益匪浅,使自己更好的理解了程序的意义,希望在今后通过更多的实践机会使得自己提高此方面的能力。
2014年6月19日
程序:
#include
#include
#include
usingnamespacestd;
/*函数声明*/
voidSplitPrem(char*str);//解析操作数和操作符
floatCombine();//定义计算的具体方法
charstr[200],str1[200],str2[50][30],operate_c[50],sub_str[30];
intoperate_2str[50];
intstrnum=0,operatenum=0;/*子字符串个数,操作符个数*/
inti,j,k,flag;
floatf=0.0,str_f[50];
/*主函数*/
intmain()
{
intlen;
floattemp;
cout<<"请输入要计算的表达式:
"<cin>>str;
//cout<len=strlen(str);
if(str[len-1]=='=')str[len-1]=0;//有等号去除,没等号就计算
strcpy(str1,str);
SplitPrem(str1);
temp=Combine();
cout<<"运算结果为:
"<cout<//system("pause");
return0;
}
/*此函数的作用是分解为子字符串和操作符*/
//如123+321
//就分解为'123''+''321'
voidSplitPrem(char*str1)
{
j=strlen(str1);
sub_str[0]=str1[0];
k=1;
for(i=1;i{
if(str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-')
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
operate_c[operatenum]=str1[i];
operate_2str[operatenum]=strnum;
strnum++;
operatenum++;
k=0;
}
else
{
sub_str[k]=str1[i];
k++;
}
}
if(k>0)
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
strnum++;
}
for(i=0;istr_f[i]=atof(str2[i]);/*字符串转化为浮点数*/
}
/*此函数的作用先计算乘除,后计算加减,每计算一次,子字符串和操作符向前移动,即删除已经计算过的,将后面的字符串和操作符向前移动进行计算*/
floatCombine()
{
while
(1)
{
flag=0;
for(i=0;i{
if(operate_c[i]=='*'||operate_c[i]=='/')
{
if(operate_c[i]=='*')//定义乘法
{
f=str_f[operate_2str[i]]*str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else//定义除法
{
f=str_f[operate_2str[i]]/str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
while
(1)
{
flag=0;
for(i=0;i{
if(operate_c[i]=='+'||operate_c[i]=='-')
{
if(operate_c[i]=='+')//定义加法
{
f=str_f[operate_2str[i]]+str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else//定义减法
{
f=str_f[operate_2str[i]]-str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for(j=i;j{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for(j=operate_2str[i]+1;jstr_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
returnf;//返回最后的函数值给主函数即计算结果
}