长整数四则运算.docx
- 文档编号:8507704
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:111.51KB
长整数四则运算.docx
《长整数四则运算.docx》由会员分享,可在线阅读,更多相关《长整数四则运算.docx(20页珍藏版)》请在冰豆网上搜索。
长整数四则运算
山东理工大学计算机学院
课程设计
(数据结构)
班级
计科0503班
姓名
王新政
学号
0512105988
指导教师
肖爱梅张艳华
二○○七年七月十三日
课程设计任务书及成绩评定
课题名称
长整数四则运算
Ⅰ、题目的目的和要求:
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
Ⅱ、设计进度及完成情况
日期
内容
7.2-7.4
熟悉设计任务,查阅有关文献资料,确定所采用的数据结构,初步制定解决问题的方法,完成课程设计说明书内容1-3部分
7.5~7.10
选择合适的存储结构,明确解决问题的算法,上机编写并调试源程序
7.11~7.12
整体调试程序并记录调试中的问题,完成课程设计说明书第4---6部分。
7.13
演示设计成果,考核成绩。
整理课程设计报告。
Ⅲ、主要参考文献及资料
[1]严蔚敏,吴伟民主编.《数据结构》(C语言版).清华大学出版社.2002
[2]殷人昆等著.《数据结构》(C++版).清华大学出版社.2001
[3]金远平著.《数据结构》(C++描述).清华大学出版社.2005
[4]FrankM.Carrano等著.《数据结构与C++高级教程》.清华大学出版社.2004
[5]严蔚敏,吴伟民主编.《数据结构习题集》(C语言版).清华大学出版社.2002
学科部主任___________(签字)
Ⅳ、成绩评定:
设计成绩:
(教师填写)
指导老师:
(签字)
二○○七年七月十三日
目录
第一章概述………………………………………………………….1
第二章系统分析…………………………………………………….2
第三章概要设计…………………………………………………….3
第四章详细设计与源程序………………………………………….4
第五章调试过程中的问题及系统测试情况…………………….12
第六章结束语………………………………………………………13
参考文献…………………………………………………………….14
第一章概述
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
本课程设计是利用栈的相关操作实现对任意长的整数进行加、减、乘、除四则运算。
程序运行可以实现任意长整数的四则运算。
例如:
进行加法运算时:
输入-23456789;-76543211;输出-100000000。
输入-99999999;1000000000000输出999900000001。
图1-1长整数四则运算加法
进行乘法运算时:
输入-123456;123456;输出-152********。
输入789456;123456;输出97463079936。
图1-2长整数四则运算乘法
第二章系统分析
2.1设计思想
开始建立两个空的栈。
一个用来存放长整数运算的运算符。
另一个用来存放长整数数字字符。
通过调整栈内元素的进出顺序来实现长整数的加、减、乘、除四则运算
2.2主要功能
系统通过建立两个空栈Stack(so)和Stack(sd)用来存放运算符和数据。
建立一个函数Getnumbersize()来获取数字字符的长度。
用一个函数Transfer()来将数字字符转换成整数数据。
然后利用if和else语句实现对从键盘采集来的字符利用栈的后进先出的性质进行判断和进出栈操作。
从而实现任意长整数的四则运算。
第三章概要设计
本设计利用栈的操作在VC++平台上实现长整数的四则运算。
结构流程图见右图
图3-3整数四则运算流程图
第四章详细设计与源程序
1详细设计:
系统建立两个空栈Stack(so)和Stack(sd)用前一个存放运算符“+”、“-”、“*”、“/”且程序规定“(”为1,“+”为2,“-”为3,“*”为4,“/”为5,“”为。
后一个存放将要进行运算的操作数。
当系统运行开始时输出“提示:
若有负数输入请用括号括起来”和“Pleaseinputformula(format:
(1+2)*1.2/4=):
”。
用户输入一连串的字符,开始进行键盘采集。
当采集完毕时,系统开始判断运算的优先级,若为“(”则将“(”的代码1直接入到栈Stack(so)中,然后将后面的数字字符转换成整数数据入到栈Stack(sd)中。
当入栈完毕再次判断数字字符后面的运算符,若是“+”、“-”则直接将2,3入栈到Stack(so)中。
如果是“*”或“/”则进行优先级判断,看“*”(“/”)后面是不是有“(”如果有则将4(5)入到栈Stack(so)中。
如果没有则将前面的整数数据出栈与“*”(“/”)后的数字字符转换成的整数数据进行运算将结果存入定义的变量t3中然后将t3入到栈Stack(sd)中。
等到读入的数据出现“=”时确定入栈完毕。
然后按照栈的“后进先出”规则进行出栈逐步进行运算得最后结果。
2源程序如下:
#include
#include
#include
#include
#include
#defineM40
/*定义堆栈*/
typedefstruct{
doubledata[M];
inttop;
}Stack;
/*初始化堆栈*/
InitStack(Stack*s)
{
s->top=0;
}
/*判断栈是否为空*/
intStEmpty(Stack*s)
{if(s->top==0)
{
return1;
}
else
{
return0;
}
}
/*入栈操作*/
StPush(Stack*s,doublex)
{
if(s->top==M)
{
printf("Thestackisoverflow!
");
//此处应该用malloc函数分配一定的空间给栈
}
else
{
s->top=s->top+1;
s->data[s->top]=x;
}
}
/*出栈操作*/
doubleStPop(Stack*s)
{
doublet;
if(!
StEmpty(s))
{
t=s->data[s->top];
s->top=s->top-1;
}
else
{
printf("StPop:
Thestackisempty!
");
t=NULL;
}
returnt;
}
/*获取栈顶元素*/
doubleStGetTop(Stack*s)
{
doublet;
if(!
StEmpty(s))
{
t=s->data[s->top];
}
else
{
printf("StGeTop:
Thestackisempty!
");
t=NULL;
}
returnt;
}
/*将数字字符转换成整形*/
intChrTransferint(charc)
{
intn;
switch(c)
{
case'0':
n=0;break;
case'1':
n=1;break;
case'2':
n=2;break;
case'3':
n=3;break;
case'4':
n=4;break;
case'5':
n=5;break;
case'6':
n=6;break;
case'7':
n=7;break;
case'8':
n=8;break;
case'9':
n=9;break;
}
returnn;
}
/*获取两个操作符之间数字字符的个数,返回的是最后一个数字字符的位置*/
intGetNumsize(charstr[],intn1)
{
intn2=n1;
while(isdigit(str[n2])||(str[n2])==46)/*isdigit()判断是否数字字符*/
{
n2=n2+1;//为何要加1?
?
?
}
returnn2;//数据长度加1
}
/*判断上个函数中获得的数字字符串中是否包含小数点,并返回它的位置,不包含,返回-1*/
intIsIncludepoint(charstr[],intn1,intn2)//n1初始值是0
{
intn3=-1;//不包含小数点
inti;
for(i=n1;i<=n2;i++)//n2=n2+1是该数字字符的长度
{
if(str[i]=='.')
{
n3=i;
break;
}
}
returnn3;
}
/*将数字字符转换成数值*/
doubleTransfer(charstr[],intn1,intn2,intn3)
{
doubledata=0;
inti,ct;
if(n3<0)//不含有小数点
{
for(i=n2;i>=n1;i--)
{
ct=ChrTransferint(str[i]);
data=data+ct*pow(10,n2-i);/*pow(x,y)计算x的y次方的值*/
}
}
//含有小数点
else
{
for(i=n3-1;i>=n1;i--)
{
ct=ChrTransferint(str[i]);
data=data+ct*pow(10,n3-1-i);/*pow(x,y)计算x的y次方的值*/
}
for(i=n3+1;i<=n2;i++)
{
ct=ChrTransferint(str[i]);
data=data+ct*pow(0.1,i-n3);/*pow(x,y)计算x的y次方的值*/
}
}//含有小数点的数字字符转换成数字完成
returndata;
}
/*主程序*/
main()
{
charstr[M],c;
chara;
intn,p1,p2,p3;/*n为字符串长度,p1,p2,p3分别为数字字符起始位置,结束位置,和小数点位置*/
doubledata;/*存放转换后的数值*/
inti=0;
Stack*so=(Stack*)malloc(sizeof(Stack));/*存储操作符'(':
1,'+':
2,'-':
3,'*':
4,'/':
5字符'),='不压栈*/
Stack*sd=(Stack*)malloc(sizeof(Stack));/*存储操作数*/
InitStack(so);
InitStack(sd);//该栈存放数据
printf("提示:
若有负数输入请用括号括起来\n");
printf("Pleaseinputformula(format:
(1+2)*1.2/4=):
\n");
n=0;
while((a=getchar())!
='\n')//用a开始记录输入的数据包括加减运算符。
{
str[n]=a;
n++;
}
while(i { c=str[i]; if(c=='(') {/*c若是'('直接入栈so,i++*/ StPush(so,1); i++; } elseif(isdigit(c)) { p1=i;/*c若是数字字符,一并将后面的连续数字字符转换为数值并压栈到sd,并把i设为后面的*/ p2=GetNumsize(str,p1); p3=IsIncludepoint(str,p1,p2-1);/*仅仅是用来找到第一个非数字字符的位置*/ data=Transfer(str,p1,p2-1,p3); StPush(sd,data); i=p2; } elseif(c=='+') { StPush(so,2);/*c若是'+'直接入栈so,i++*/ i++; } elseif(c=='-') { StPush(so,3);/*c若是'-'直接入栈so,i++*/ i++; } elseif(c=='*') { if(str[i+1]=='(')/*c若是'*'它后面的字符是否为'(',若是直接将'*'压栈so,*/ { StPush(so,4); i++; } else { doublet1,t2,t3;/*若不是,为数字字符,将后面的连续数字字符一并转换成数值t2,sd出栈给t1,将t3=t2*t1压栈到sd*/ t1=StPop(sd);/*操作符'*'不压栈so*/ p1=i+1;//原先p1已经等于第一个数字字符的长度,p1+1则是下一个连续数字字符的开始。 p2=GetNumsize(str,p1); p3=IsIncludepoint(str,p1,p2-1); t2=Transfer(str,p1,p2-1,p3); t3=t1*t2; StPush(sd,t3); i=p2; } } elseif(c=='/') { if(str[i+1]=='(') { StPush(so,5); i++; } else { doublet1,t2,t3; t1=StPop(sd);/*c是'/'同'*'*/ p1=i+1; p2=GetNumsize(str,p1); p3=IsIncludepoint(str,p1,p2-1); t2=Transfer(str,p1,p2-1,p3); t3=t1/t2; StPush(sd,t3); i=p2; } } elseif(c==')') { doublet1,t2,t3; intp; while((p=StPop(so))! =1&&! StEmpty(so))/*c若是')',出栈so,判断是'+'或'-',出栈sd两个操作数,进行加减运算*/ {/*直到StPop=='('*/ t1=StPop(sd); t2=StPop(sd); if(p==2) { t3=t2+t1; StPush(sd,t3); } elseif(p==3) { t3=t2-t1; StPush(sd,t3); } } if(StGetTop(so)==4)/*然后判断so栈顶是否为'*'或者'/'*/ { StPop(so); t1=StPop(sd);/*为'*'出栈so,出栈sd获得2个操作数,进行乘法操作*/ t2=StPop(sd); t3=t2*t1; StPush(sd,t3); } elseif(StGetTop(so)==5) { StPop(so); t1=StPop(sd);/*为'/'出栈so,出栈sd获得2个操作数,进行除法操作*/ t2=StPop(sd); t3=t2/t1; StPush(sd,t3); } i++; } elseif(c=='=') { doublet1,t2,t3;/*c若是'=',这是so内只有加减号,出栈so到p,sd到t1,t2*/ intp; while(! StEmpty(so)) { t1=StPop(sd); t2=StPop(sd); p=StPop(so); if(p==2) { t3=t2+t1;/*p=='+',加法运算,并将结果t3压栈sd*/ StPush(sd,t3); } elseif(p==3) { t3=t2-t1; StPush(sd,t3);/*p=='-',减法运算,并将结果t3压栈sd*/ } } i++; } } if(! StEmpty(so)||StEmpty(sd)) { printf("Inputerror,Back! \n");/*若so不为空,或者sd为空,且sd中只有一个元素,则输入的式子不对*/ } else { doubleend; inti;/*否则,sd中的那个数据就是最后计算结果,打印输出*/ end=StGetTop(sd); printf("Thevalueofthisformula: \n"); for(i=0;i { printf("%c",str[i]); } printf("%f\n",end); } } 第五章调试过程中的问题及系统测试情况 1编译时出现的问题: ①出现的错误一般是由粗心造成的,例如: 因多重大括号而导致的大括号丢失或过多。 偶尔掉落“;”等导致系统调试时出现错误。 经系统提示都可找到错误出处并修改成功。 ②当输入数据进行测试时。 出现过比较重大的错误。 如果输入的数为负数非常容易出现数据溢出现象,得不到正确结果,例如: -12+4按照原先的结果应该是-8。 结果当运行时结果却是-16。 如果输入12-4结果和预期的一样。 但是如果第一个数是负数不论后面是什么样的数据和运算符总是得不到预期的结果。 经过反复的数据测试最后经过思考决定在输入负数时用括号括起来这样就解决了上面所述问题。 当再次输入(-12)+4时能够得到-8。 输入35+(-20)也可以得到应得数据15。 即使是象-99999999这样很大的整数进行相应的四则运算也可以实现准确无误。 本以为问题已经全部解决。 但当输入数据48-(-18)时却又出现了问题。 本应该是66,结果却是-30。 即使将-18用括号括起来也无济于事。 尝试另外一表达式123-(-123)结果却是0。 限于现在所学和掌握知识状况暂时无法解释此问题。 图5-1数据溢出实例 2系统测试情况: 系统经过多组数据的测试基本可以实现课程设计要求。 例如: 如果输入100010001-100010001= 系统输出0。 如果输入(-99999999)+1000000000000= 系统输出999900000001。 如果输入(-12)*123456= 系统输出-1481472。 图5-2长整数乘法运算 第六章结束语 经过长整数四则运算的分析、设计,提高了我的分析问题、解决问题的能力。 另外通过大量的查阅资料,我拓宽了自己的知识的深度和广度,把自己所学的知识融会贯通到了实际当中去,锻炼了自己的动手能力。 同时在程序设计中我也发现了自己的不足,比如: 基本功不扎实、想问题的思路有待拓宽、解决实际问题的能力有待提高等缺点。 我会以此次课程设计为契机在老师和同学的帮助下改正不足、提高能力。 通过这次的课程设计对我以后的学习、工作将有很大帮助! 在两周的课程设计工作中,我不仅得到了肖老师和张老师的指导还得到了同学们的帮助,在课程设计完成之际我向你们道谢。 谢谢老师和同学们给我的帮助。 参考文献 [1]严蔚敏,吴伟民主编.《数据结构》(C语言版).清华大学出版社.2002 [2]殷人昆等著.《数据结构》(C++版).清华大学出版社.2001 [3]金远平著.《数据结构》(C++描述).清华大学出版社.2005 [4]许卓群等著.《数据结构与算法》.高等教育出版社.2004 [5]FrankM.Carrano等著.《数据结构与C++高级教程》.清华大学出版社.2004 [6]严蔚敏,吴伟民主编.《数据结构习题集》(C语言版).清华大学出版社.2002 [7]吕军等著.《visualC++与面向对象程序设计教程》.高等教育出版社.2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整数 四则运算