c课程设计四则运算Word格式文档下载.docx
- 文档编号:22631394
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:41.42KB
c课程设计四则运算Word格式文档下载.docx
《c课程设计四则运算Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c课程设计四则运算Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
全都合法返回1.
数字字符串转换成数字:
用类中定义的val函数实现,扩充到浮点数的运算范围。
定义char类型的source指针指向字符串,用charinstr函数寻找字符串中小数点位置,以此判断整数还是浮点数,如果整数即用10的相应位数的乘方来乘以相应字符位置字符的数字,并进行累加,最后返回result;
如果是浮点数,则分为整数与小数部分依次进行计算,整数同上,小数部分则用相应字符位置字符所代表的数字除以10的相应位数的乘方,并进行累加,最后将整数小数部分的和返回result。
字符串的连接,通过类中定义的left、right、midstr、addstrings函数配合实现。
通过left、right、midstr三个函数进行字符串的提取,addstrtings函数进行三个指针的遍历实现两个字符串的合并。
数字的字符串化,通过类中定义的str函数实现。
类比val函数一样区分整数与浮点数,将数字的每一个数字单个提取出来通过与字符‘0’的比较转化为相应字符复制给递增的指针。
算式的计算,通过类中定义的calculate函数实现。
依次按照^*/+-的顺序用charinstr函数寻找运算符号,并用相应函数进行字符串与数字之间的转换,以及新的字符串的合并,返回计算结果。
友元函数的定义,定义输入输出友元函数,重载赋值运算符等,实现字符串之间的加法。
五、程序调试的过程
出现问题:
开始编写完整个程序,出现许多编写错误,一个个改正;
在实现浮点数的扩充过程中的小数部分,以及输入合法性的判断过程漏掉情况,指针的误用等;
有时单独的一个函数不能搞懂或错误不能改正,就单独在编写一个类似程序,多次调试运行,来弄懂并加以改正;
解决办法:
查阅书籍,上网搜索,独立思考,询问同学老师,多次上机调试等;
六、输入输出数据
开始界面:
非法输入判断:
非法字母:
运算符紧挨:
左括号前或右括号后为数字:
括号为中文符号:
清理空格:
运算第一个输入字符串算式结果:
退出判断:
继续运算:
退出运算:
浮点数的加入:
七、课程设计总结
经过这次庞大复杂的课程设计过程,是我对c++知识有了更加深刻的理解,引起了我对c++语言世界的无限好奇心和探索欲,感慨到了世界的神奇与微妙,程序控制的无限用途以及自身的渺小;
在其中编写判断括号前后是否合法语句时,指针遍历不易实现,于是经过多次调试后重新定义了一个字符串数组来实现,这给了我很大的启示,只要努力并不断尝试新的东西一定会成功;
还有程序中友元函数与运算符重载部分,由于知识掌握不够牢固,反复调试查阅书籍,最终得到了解决,也使得我对这方面的知识获得了更为深刻的理解与认知;
浮点数的加入要进行小数点数位的取舍,函数中设定为小数点儿后六位,因此浮点数运算过程中每次都会出现六位小数的现象,使得结果有0.000001的误差,通过单独编写类似函数多次调试,使得我对c++语言中对double型向int型变量转化的规律的理解获得了更深层次的理解;
通过编写过程,体会到了细节的厉害,有时一个微小的错误就能使整个程序而不能正确运行;
八、源程序注解
#include<
iostream.h>
string.h>
stdlib.h>
charpause;
intlen(char*source)//算出字符串的长素
{intretval=0;
while(*(source+retval++)!
=0){}
return--retval;
}
classCStr//定义字符串类
{
private:
intnlen;
//字符串长度
char*pstr;
//字符串首地址
public:
CStr(){};
CStr(char*str){nlen=len(str);
pstr=str;
}
intGetlen(){returnnlen;
}//返回字符串长度
char*Getstr(){returnpstr;
}//返回字符串首地址
CStr(CStr&
str){nlen=str.Getlen();
pstr=str.Getstr();
}//拷贝构造函数
char*Getpstr(){returnpstr;
voidmidstr(CStr&
str1,intstart,intlength);
/*返回指定字符串类中从nStart序号开始nLength长度的字符*/
voidleft(CStr&
str1,intlength);
/*返回指定字符串中从左边开始nLength个字符*/
voidright(CStr&
/*返回指定字符串中从右边开始nLength个字符*/
calculate();
//计算该字符串所代表的四则运算的值(内无括号)
friendintcharinstr(char);
//友元函数,判断字符是否在字符串中
doubleval();
//求字符串代表的数字字符的数值
str(doubleval);
//将数值表示成字符串的形式
friendistream&
operator>
>
(istream&
CStr&
);
//重载输入运算符
intJudge();
//判断输入是否合法,滤除空格
};
voidCStr:
:
left(CStr&
str1,intlength)//从参数指向的地址左边取Length个字符赋给目的字符串
{char*destination=pstr;
char*source=str1.Getstr();
*(destination+--length+1)=0;
//目的字符串以0结尾
while(length>
=0)//赋值Length个字符
{*(destination+length)=*(source+length--);
}
midstr(CStr&
str1,intstart,intlength)//从参数指向的地址处从start位置开始取length个字符赋给目的字符串
{char*source=str1.Getstr();
source+=start-1;
//开始赋值处的地址
char*destination=pstr;
//目的字符串以0结尾
right(CStr&
str1,intlength)//从参数指向的地址右边取Length个字符赋给目的字符串
while(*source!
=0){source++;
}//移至字符串尾部
source-=length;
//跳至欲赋值的首地址
//目的字符串以0结尾
intcharinstr(char*destination,charchar_to_find)//判断字符串char_to_find是否在目的字符串中,若在,返回其所在位置,若不再返回0
{intpos=0;
while(*(destination+pos)!
=0)//循环查找
{if(char_to_find==*(destination+pos++))
{returnpos;
}//找到,返回其位置
return0;
CStr:
str(doublevalue)//将value的值转换为字符串的形式返回,加入浮点数
{char*tempdest=pstr;
inta=0;
intb=(int)value;
doublec=value-b;
intmultiplier=1000000000;
for(multiplier=1000000000;
multiplier!
=0;
multiplier/=10)
{*tempdest='
0'
+(char)(b/multiplier);
b-=(b/multiplier)*multiplier;
if((*tempdest!
='
)||(a))
{a++;
tempdest++;
}
if(c==0)//如果value为整数
{*tempdest=0;
else//如果value为浮点数
{*tempdest++='
.'
;
for(a=1;
a<
=6;
a++)
{c*=10;
intd=(int)c;
if(d!
=0&
&
=6)
{*tempdest++='
+d;
c-=d;
}
*tempdest=0;
//赋值字符串最后一位为0
char*addstrings(char*destination,char*source1,char*source2)//两个字符串合并,结果在第一个参数中
{char*tempdest=destination;
while(*source1!
=0){*(tempdest++)=*(source1++);
while(*source2!
=0){*(tempdest++)=*(source2++);
*tempdest=0;
//NULL
returndestination;
doublepwr(doublea,doubleb)//计算a的b次方
{doubleresult=1;
for(intc=1;
c<
=b;
c++){result*=a;
returnresult;
doubleCStr:
val()//将数字字符串转换成数值(包括浮点数)
{char*source=pstr;
doubleresult=0;
CStrnstr(source);
intz=charinstr(source,'
//从source字符串中找到小数点
if(z==0)//如果为整数
{intmultiplier=(int)pwr(10,len(source)-1);
while(*source!
=0)//依次遍历每一个字符
{result+=(*(source++)-'
)*multiplier;
multiplier/=10;
}//将相应字符转化为对应位数的整数,并依次累加获得所需整数数
returnresult;
else//如果为小数,此时指针指向小数点的位置
{chara1[50];
CStrA1(a1);
A1.left(nstr,z-1);
//返回此时nstr指向的地址左边的z-1个字符,即所需浮点数的整数部分
char*nint=A1.Getstr();
//将A1的内容赋值给nint指针
intmultiplier=(int)pwr(10,len(nint)-1);
//定义multiplier等于10的整数位数的乘方
while(*nint!
=0)
{result+=(double)(*(nint++)-'
}//将浮点数整数部分字符串转换为数值
chara3[50];
CStrA3(a3);
A3.midstr(nstr,z+1,len(source)-z);
//返回从nstr指向地址的z+1位置开始的(len(source)-z)个字符,即所需浮点数的小数部分
char*ndouble=A3.Getstr();
//将A3的内容赋值给ndouble指针
for(multiplier=10;
*ndouble!
ndouble++)//依次遍历ndouble指向的每一个字符
{result+=((double)(*(ndouble)-'
))/(double)multiplier;
multiplier*=10;
//将相应字符除以对应数位的10的乘方获得该位的小数并依次相加
char*assignstr(char*source,char*destination)//字符串赋值
while(source!
=0){*(tempdest++)=*(source++);
calculate()
//计算数字算式形式的字符串,将其转换为数字形式并计算出来,然后再将结果转换为字符串的形式,此算式没有括号,遵循的原则是先乘除后加减
{char*string=pstr;
CStrnstr(string);
charbuf1[50],buf2[50],buf3[50],buf4[50],buf5[50];
CStrcuf1(buf1),cuf2(buf2),cuf3(buf3),cuf4(buf4),cuf5(buf5);
charopstr[6]="
^/*+-"
doubleleftnr;
doublerightnr;
intoppos;
intz;
doubleresult;
for(intpos_in_opstr=0;
pos_in_opstr<
=4;
pos_in_opstr++)//先找优先级高的运算符,直至将算式中所有的运算符都找出来
{while(charinstr(string,opstr[pos_in_opstr]))
{oppos=charinstr(string,opstr[pos_in_opstr]);
//找到后,将运算符左边的数字字符取出转换为数字
for(z=oppos-2;
z>
z--)
{if((*(string+z)=='
+'
)||(*(string+z)=='
/'
-'
*'
^'
))
{cuf1.midstr(nstr,z+2,oppos-z-2);
leftnr=cuf1.val();
z=-1;
elseif(z==0)
{cuf1.left(nstr,oppos-1);
}
for(z=oppos;
z<
len(string);
z++)//再将运算符右边的数字字符取出转换为数字
{if((*(string+z)=='
{cuf2.midstr(nstr,oppos+1,z-oppos);
rightnr=cuf2.val();
z=len(string);
elseif(z==len(string)-1)
{cuf2.right(nstr,len(string)-oppos);
//对这两个数字进行计算,结果在result中
if(opstr[pos_in_opstr]=='
)
{result=leftnr+rightnr;
elseif(opstr[pos_in_opstr]=='
{result=leftnr-rightnr;
{result=leftnr/rightnr;
{result=leftnr*rightnr;
{result=pwr(leftnr,rightnr);
//计算后,将结果转换为字符串,然后将左右未运算过的字符串与其连接起来
cuf4.left(nstr,oppos-len(&
buf1[0])-1);
cuf5.str(result);
addstrings(&
buf3[0],cuf4.pstr,cuf5.pstr);
cuf5.right(nstr,len(string)-oppos-len(&
buf2[0]));
addstrings(string,cuf3.pstr,cuf5.pstr);
}
cout<
<
"
运行的结果是"
pstr<
endl;
//输出这个字符
istream&
operator>
(istream&
is,CStr&
ss)
{chara[50];
char*x=a;
char*y=ss.pstr;
cin.getline(x,50);
while(*x!
=0){*(y++)=*(x++);
*y=0;
returnis;
intCStr:
Judge()//新增程序判断功能
{//三个指针依次遍历字符串,去除空格
char*p,*s,*r,*source=pstr;
p=source;
s=p+1;
while(*p!
{r=p;
if(*p=='
'
{while(*s!
=0){*p=*s;
p++;
s++;
*p=0;
p=r;
continue;
p=r+1;
//找到除基本运算符和数字外的非法输入
char*destination=source;
while(*destination!
{if('
('
=*destination&
*destination<
||'
9'
||*destination=='
{destination++;
else{return0;
}//找到非法输入,返回0
//找到非法逻辑
destination=pstr;
if(*destination=='
)//一开始为运算符
{return0;
intpos_in_opstr;
intpos;
intz;
for(pos_in_opstr=0;
pos_in_opstr++)
{while(charinstr(source,opstr[pos_in_opstr]))
{pos=charinstr(source,opstr[pos_in_opstr]);
z=pos;
if(*(source+z)=='
||*(source+z)=='
||*(source+z)==0)
{return0;
}//运算符后紧接着又是运算符,返回0
z-=2;
||*(source+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 四则运算