长整数四则运算

山东理工大学计算机学院

课 程 设 计

(数据结构)

计科0503班 班 级

王新政 姓 名

0512105988 学 号

肖爱梅 张艳华 指导教师

二○○七 年 七 月十三日

课程设计任务书及成绩评定

课题名称 长整数四则运算

Ⅰ、题目的目的和要求:

设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密

的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。

通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

Ⅱ、设计进度及完成情况

Ⅲ、主要参考文献及资料

[1] 严蔚敏,吴伟民主编. 《数据结构》(C 语言版). 清华大学出版社. 2002 [2] 殷人昆等著. 《数据结构》(C++版). 清华大学出版社. 2001 [3] 金远平著. 《数据结构》(C++描述). 清华大学出版社. 2005 [4] Frank M.Carrano 等著. 《数据结构与C++高级教程》. 清华大学出版社. 2004

[5] 严蔚敏, 吴伟民主编. 《数据结构习题集》(C 语言版). 清华大学出版社. 2002

学科部主任___________(签字)

Ⅳ、成绩评定:

设计成绩: (教师填写)

指导老师: (签字)

二○○七 年 七 月十三日

目 录

第一章 概述………………………………………………………….1 第二章 系统分析…………………………………………………….2 第三章 概要设计…………………………………………………….3 第四章 详细设计与源程序………………………………………….4 第五章 调试过程中的问题及系统测试情况…………………….12 第六章 结束语………………………………………………………13 参考文献…………………………………………………………….14

第一章 概述

课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

本课程设计是利用栈的相关操作实现对任意长的整数进行加、减、乘、除四则运算。 程序运行可以实现任意长整数的四则运算。例如:

进行加法运算时:

输入-23456789;-76543211;输出-100000000。 输入-99999999;[1**********]00输出[1**********]1。

图1-1长整数四则运算加法

进行乘法运算时:

输入-123456;123456;输出-[1**********]。 输入789456;123456;输出[1**********]。

图1-2长整数四则运算乘法

第二章 系统分析

2.1设计思想

开始建立两个空的栈。一个用来存放长整数运算的运算符。另一个用来存放长整数数字字符。通过调整栈内元素的进出顺序来实现长整数的加、减、乘、除四则运算

2.2主要功能

系统通过建立两个空栈Stack(so)和Stack(sd)用来存放运算符和数据。建立一个函数

Getnumbersize()来获取数字字符的长度。用一个函数Transfer()来将数字字符转换成整数数据。然后利用if 和else 语句实现对从键盘采集来的字符利用栈的后进先出的性质进行判断和进出栈操作。从而实现任意长整数的四则运算。

第三章 概要设计

图3-3整数四则运算流程图

第四章 详细设计与源程序

1详细设计:

系统建立两个空栈Stack(so)和Stack(sd)用前一个存放运算符“+”、“-”、“*”、“/”且程序规定“(”为1,“+”为2,“-”为3,“*”为4,“/”为5,“”为。后一个存放将要进行运算的操作数。当系统运行开始时输出“提示:若有负数输入请用括号括起来”和“Please input formula(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 #define M 40 /*定义堆栈*/ typedef struct{ double data[M]; int top; }Stack;

/*初始化堆栈*/ InitStack(Stack *s) {

s->top=0; }

/*判断栈是否为空*/ int StEmpty(Stack *s)

{if(s->top==0) {

return 1; } else

{

return 0; } }

/*入栈操作*/

StPush(Stack *s,double x) {

if(s->top==M) {

printf("The stack is overflow!");

//此处应该用malloc 函数分配一定的空间给栈 } else {

s->top=s->top+1; s->data[s->top]=x; } }

/*出栈操作*/

double StPop(Stack *s) {

double t;

if(!StEmpty(s)) {

t=s->data[s->top]; s->top=s->top-1; } else {

printf("StPop:The stack is empty!"); t=NULL; }

return t; }

/*获取栈顶元素*/

double StGetTop(Stack *s) {

double t;

if(!StEmpty(s)) {

t=s->data[s->top]; } else

{

printf("StGeTop:The stack is empty!");

t=NULL;

}

return t;

}

/*将数字字符转换成整形*/

int ChrTransferint(char c)

{

int n;

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;

}

return n;

}

/*获取两个操作符之间数字字符的个数, 返回的是最后一个数字字符的位置*/

int GetNumsize(char str[],int n1)

{

int n2=n1;

while(isdigit(str[n2])||(str[n2])==46)/*isdigit()判断是否数字字符*/

{

n2=n2+1; //为何要加1???

}

return n2; //数据长度加1

}

/*判断上个函数中获得的数字字符串中是否包含小数点,并返回它的位置,不包含,返回-1*/

int IsIncludepoint(char str[],int n1,int n2) //n1初始值是0

{

int n3=-1; //不包含小数点

int i;

for(i=n1;i

{

if(str[i]=='.')

{

n3=i;

break;

}

}

return n3;

}

/*将数字字符转换成数值*/

double Transfer(char str[],int n1,int n2,int n3)

{

double data=0;

int i,ct;

if(n3

{

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

{

ct=ChrTransferint(str[i]);

data=data+ct*pow(0.1,i-n3);/*pow(x,y)计算x 的y 次方的值*/

}

} //含有小数点的数字字符转换成数字完成

return data;

}

/*主程序*/

main()

{

char str[M],c;

char a;

int n,p1,p2,p3; /*n为字符串长度,p1,p2,p3分别为数字字符起始位置,结束位置,和小数点位置*/

double data; /*存放转换后的数值*/

int i=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("Please input formula(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++;

}

else if(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;

}

else if(c=='+')

{

StPush(so,2); /*c若是'+'直接入栈so,i++*/

i++;

}

else if(c=='-')

{

StPush(so,3); /*c若是'-' 直接入栈so,i++*/

i++;

else if(c=='*')

{

if(str[i+1]=='(') /*c若是'*'它后面的字符是否为'(',若是直接将'*'压栈so ,*/ {

StPush(so,4);

i++;

}

else

{

double t1,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;

}

}

else if(c=='/')

{

if(str[i+1]=='(')

{

StPush(so,5);

i++;

}

else

{

double t1,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;

}

}

else if(c==')')

double t1,t2,t3;

int p;

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);

}

else if(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);

}

else if(StGetTop(so)==5)

{

StPop(so);

t1=StPop(sd); /*为'/'出栈so, 出栈 sd 获得2个操作数,进行除法操作*/

t2=StPop(sd);

t3=t2/t1;

StPush(sd,t3);

}

i++;

}

else if(c=='=')

{

double t1,t2,t3; /*c若是'=',这是so 内只有加减号,出栈so 到p ,sd 到t1,t2*/ int p;

while(!StEmpty(so))

{

t1=StPop(sd);

t2=StPop(sd);

p=StPop(so);

if(p==2)

{

t3=t2+t1; /*p=='+',加法运算,并将结果t3压栈sd*/ StPush(sd,t3);

}

else if(p==3)

{

t3=t2-t1;

StPush(sd,t3); /*p=='-',减法运算,并将结果t3压栈sd*/

}

}

i++;

}

}

if(!StEmpty(so)||StEmpty(sd))

{

printf("Input error,Back!\n"); /*若so 不为空,或者sd 为空,且sd 中只有一个元素, 则输入的式子不对*/

}

else

{

double end;

int i; /*否则,sd 中的那个数据就是最后计算结果,打印输出*/

end=StGetTop(sd);

printf("The value of this formula:\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)+[1**********]00=

系统输出[1**********]1。

如果输入(-12)*123456=

系统输出-1481472。

图5-2长整数乘法运算

第六章 结束语

经过长整数四则运算的分析、设计,提高了我的分析问题、解决问题的能力。另外通过大量的查阅资料,我拓宽了自己的知识的深度和广度,把自己所学的知识融会贯通到了实际当中去,锻炼了自己的动手能力。同时在程序设计中我也发现了自己的不足,比如:基本功不扎实、想问题的思路有待拓宽、解决实际问题的能力有待提高等缺点。我会以此次课程设计为契机在老师和同学的帮助下改正不足、提高能力。通过这次的课程设计对我以后的学习、工作将有很大帮助!

在两周的课程设计工作中,我不仅得到了肖老师和张老师的指导还得到了同学们的帮助,在课程设计完成之际我向你们道谢。谢谢老师和同学们给我的帮助。

参考文献

[1] 严蔚敏,吴伟民主编. 《数据结构》(C 语言版). 清华大学出版社. 2002

[2] 殷人昆等著. 《数据结构》(C++版). 清华大学出版社. 2001

[3] 金远平著. 《数据结构》(C++描述). 清华大学出版社. 2005

[4] 许卓群等著. 《数据结构与算法》. 高等教育出版社. 2004

[5] Frank M.Carrano 等著. 《数据结构与C++高级教程》. 清华大学出版社. 2004

[6] 严蔚敏, 吴伟民主编. 《数据结构习题集》(C 语言版). 清华大学出版社. 2002

[7] 吕军等著.

visualC++与面向对象程序设计教程》. 高等教育出版社.2006

山东理工大学计算机学院

课 程 设 计

(数据结构)

计科0503班 班 级

王新政 姓 名

0512105988 学 号

肖爱梅 张艳华 指导教师

二○○七 年 七 月十三日

课程设计任务书及成绩评定

课题名称 长整数四则运算

Ⅰ、题目的目的和要求:

设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密

的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。

通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

Ⅱ、设计进度及完成情况

Ⅲ、主要参考文献及资料

[1] 严蔚敏,吴伟民主编. 《数据结构》(C 语言版). 清华大学出版社. 2002 [2] 殷人昆等著. 《数据结构》(C++版). 清华大学出版社. 2001 [3] 金远平著. 《数据结构》(C++描述). 清华大学出版社. 2005 [4] Frank M.Carrano 等著. 《数据结构与C++高级教程》. 清华大学出版社. 2004

[5] 严蔚敏, 吴伟民主编. 《数据结构习题集》(C 语言版). 清华大学出版社. 2002

学科部主任___________(签字)

Ⅳ、成绩评定:

设计成绩: (教师填写)

指导老师: (签字)

二○○七 年 七 月十三日

目 录

第一章 概述………………………………………………………….1 第二章 系统分析…………………………………………………….2 第三章 概要设计…………………………………………………….3 第四章 详细设计与源程序………………………………………….4 第五章 调试过程中的问题及系统测试情况…………………….12 第六章 结束语………………………………………………………13 参考文献…………………………………………………………….14

第一章 概述

课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

本课程设计是利用栈的相关操作实现对任意长的整数进行加、减、乘、除四则运算。 程序运行可以实现任意长整数的四则运算。例如:

进行加法运算时:

输入-23456789;-76543211;输出-100000000。 输入-99999999;[1**********]00输出[1**********]1。

图1-1长整数四则运算加法

进行乘法运算时:

输入-123456;123456;输出-[1**********]。 输入789456;123456;输出[1**********]。

图1-2长整数四则运算乘法

第二章 系统分析

2.1设计思想

开始建立两个空的栈。一个用来存放长整数运算的运算符。另一个用来存放长整数数字字符。通过调整栈内元素的进出顺序来实现长整数的加、减、乘、除四则运算

2.2主要功能

系统通过建立两个空栈Stack(so)和Stack(sd)用来存放运算符和数据。建立一个函数

Getnumbersize()来获取数字字符的长度。用一个函数Transfer()来将数字字符转换成整数数据。然后利用if 和else 语句实现对从键盘采集来的字符利用栈的后进先出的性质进行判断和进出栈操作。从而实现任意长整数的四则运算。

第三章 概要设计

图3-3整数四则运算流程图

第四章 详细设计与源程序

1详细设计:

系统建立两个空栈Stack(so)和Stack(sd)用前一个存放运算符“+”、“-”、“*”、“/”且程序规定“(”为1,“+”为2,“-”为3,“*”为4,“/”为5,“”为。后一个存放将要进行运算的操作数。当系统运行开始时输出“提示:若有负数输入请用括号括起来”和“Please input formula(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 #define M 40 /*定义堆栈*/ typedef struct{ double data[M]; int top; }Stack;

/*初始化堆栈*/ InitStack(Stack *s) {

s->top=0; }

/*判断栈是否为空*/ int StEmpty(Stack *s)

{if(s->top==0) {

return 1; } else

{

return 0; } }

/*入栈操作*/

StPush(Stack *s,double x) {

if(s->top==M) {

printf("The stack is overflow!");

//此处应该用malloc 函数分配一定的空间给栈 } else {

s->top=s->top+1; s->data[s->top]=x; } }

/*出栈操作*/

double StPop(Stack *s) {

double t;

if(!StEmpty(s)) {

t=s->data[s->top]; s->top=s->top-1; } else {

printf("StPop:The stack is empty!"); t=NULL; }

return t; }

/*获取栈顶元素*/

double StGetTop(Stack *s) {

double t;

if(!StEmpty(s)) {

t=s->data[s->top]; } else

{

printf("StGeTop:The stack is empty!");

t=NULL;

}

return t;

}

/*将数字字符转换成整形*/

int ChrTransferint(char c)

{

int n;

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;

}

return n;

}

/*获取两个操作符之间数字字符的个数, 返回的是最后一个数字字符的位置*/

int GetNumsize(char str[],int n1)

{

int n2=n1;

while(isdigit(str[n2])||(str[n2])==46)/*isdigit()判断是否数字字符*/

{

n2=n2+1; //为何要加1???

}

return n2; //数据长度加1

}

/*判断上个函数中获得的数字字符串中是否包含小数点,并返回它的位置,不包含,返回-1*/

int IsIncludepoint(char str[],int n1,int n2) //n1初始值是0

{

int n3=-1; //不包含小数点

int i;

for(i=n1;i

{

if(str[i]=='.')

{

n3=i;

break;

}

}

return n3;

}

/*将数字字符转换成数值*/

double Transfer(char str[],int n1,int n2,int n3)

{

double data=0;

int i,ct;

if(n3

{

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

{

ct=ChrTransferint(str[i]);

data=data+ct*pow(0.1,i-n3);/*pow(x,y)计算x 的y 次方的值*/

}

} //含有小数点的数字字符转换成数字完成

return data;

}

/*主程序*/

main()

{

char str[M],c;

char a;

int n,p1,p2,p3; /*n为字符串长度,p1,p2,p3分别为数字字符起始位置,结束位置,和小数点位置*/

double data; /*存放转换后的数值*/

int i=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("Please input formula(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++;

}

else if(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;

}

else if(c=='+')

{

StPush(so,2); /*c若是'+'直接入栈so,i++*/

i++;

}

else if(c=='-')

{

StPush(so,3); /*c若是'-' 直接入栈so,i++*/

i++;

else if(c=='*')

{

if(str[i+1]=='(') /*c若是'*'它后面的字符是否为'(',若是直接将'*'压栈so ,*/ {

StPush(so,4);

i++;

}

else

{

double t1,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;

}

}

else if(c=='/')

{

if(str[i+1]=='(')

{

StPush(so,5);

i++;

}

else

{

double t1,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;

}

}

else if(c==')')

double t1,t2,t3;

int p;

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);

}

else if(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);

}

else if(StGetTop(so)==5)

{

StPop(so);

t1=StPop(sd); /*为'/'出栈so, 出栈 sd 获得2个操作数,进行除法操作*/

t2=StPop(sd);

t3=t2/t1;

StPush(sd,t3);

}

i++;

}

else if(c=='=')

{

double t1,t2,t3; /*c若是'=',这是so 内只有加减号,出栈so 到p ,sd 到t1,t2*/ int p;

while(!StEmpty(so))

{

t1=StPop(sd);

t2=StPop(sd);

p=StPop(so);

if(p==2)

{

t3=t2+t1; /*p=='+',加法运算,并将结果t3压栈sd*/ StPush(sd,t3);

}

else if(p==3)

{

t3=t2-t1;

StPush(sd,t3); /*p=='-',减法运算,并将结果t3压栈sd*/

}

}

i++;

}

}

if(!StEmpty(so)||StEmpty(sd))

{

printf("Input error,Back!\n"); /*若so 不为空,或者sd 为空,且sd 中只有一个元素, 则输入的式子不对*/

}

else

{

double end;

int i; /*否则,sd 中的那个数据就是最后计算结果,打印输出*/

end=StGetTop(sd);

printf("The value of this formula:\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)+[1**********]00=

系统输出[1**********]1。

如果输入(-12)*123456=

系统输出-1481472。

图5-2长整数乘法运算

第六章 结束语

经过长整数四则运算的分析、设计,提高了我的分析问题、解决问题的能力。另外通过大量的查阅资料,我拓宽了自己的知识的深度和广度,把自己所学的知识融会贯通到了实际当中去,锻炼了自己的动手能力。同时在程序设计中我也发现了自己的不足,比如:基本功不扎实、想问题的思路有待拓宽、解决实际问题的能力有待提高等缺点。我会以此次课程设计为契机在老师和同学的帮助下改正不足、提高能力。通过这次的课程设计对我以后的学习、工作将有很大帮助!

在两周的课程设计工作中,我不仅得到了肖老师和张老师的指导还得到了同学们的帮助,在课程设计完成之际我向你们道谢。谢谢老师和同学们给我的帮助。

参考文献

[1] 严蔚敏,吴伟民主编. 《数据结构》(C 语言版). 清华大学出版社. 2002

[2] 殷人昆等著. 《数据结构》(C++版). 清华大学出版社. 2001

[3] 金远平著. 《数据结构》(C++描述). 清华大学出版社. 2005

[4] 许卓群等著. 《数据结构与算法》. 高等教育出版社. 2004

[5] Frank M.Carrano 等著. 《数据结构与C++高级教程》. 清华大学出版社. 2004

[6] 严蔚敏, 吴伟民主编. 《数据结构习题集》(C 语言版). 清华大学出版社. 2002

[7] 吕军等著.

visualC++与面向对象程序设计教程》. 高等教育出版社.2006


相关文章

  • 六年级数学毕业复习_数的运算知识点
  • 数的运算知识点 ※运算的意义 (一)整数四则运算 1整数加法:(把两个数合并成一个数) 的运算叫做加法. 在加法里,相加的数叫做加数,加得的数叫做和.加数是部分数,和是总数. 加数+加数=和 一个加数=(和-另一个加数) 2整数减法:已知( ...查看


  • 小学六年级数学集体备课记录表
  • 小学集体备课记录表 分数四则混合运算(初议稿) 六年级 试教:XXX [教材简析] 分数四则混合运算的学习基础是:整数.小数四则混合运算.分数加.减.乘.除计算.以及整数小数四则运算中运算律的使用.由于有了大量的知识基础,教材安排了一个具体 ...查看


  • 六年级数学上册教学设计:整数乘法运算法则
  • 六年级数学上册教案:整数乘法运算法则教学目标:1.理解整数的运算定律对于分数乘法同样适应.2.能灵活掌握分数简便计算的方法.3.能正确计算. 单元知识结构图分数乘以整数(求几个几是多少)分数意义一个数乘以分数(求一个数的几分之几是多少)分数 ...查看


  • 小学计算题分类
  • 一.小学计算题的分类: 1.按算理分,有加.减.乘.除,四则混合运算(包括有大.中.小括号的运算) . 2.按算法分,有口算(含估算) .笔算(含竖式计算.脱式计算.简便计算等) . 3.按数的性质分,有整数运算.分数运算.小数运算.百分数 ...查看


  • [小数加减法的简便运算]说课稿
  • <小数加减法的简便运算>说课稿 一.教学分析 1.说教材 小数加法的简便运算是小学六年制数学,人教版第八册课本104页例4以及相应的习题,主要学习的是整数加法运算定律推广到小数.小数加减法简便算法是在学生已经学习过了整数的运算定 ...查看


  • 整数乘法运算定律推广到分数乘法教案
  • 课题2.1.4分数乘法 整数乘法运算定律推广到分数乘法 课时第 4 节 共 4节 授课时间月 日 教学 目标1. 知道整数乘法的运算定律对分数乘法同样适用. 2. 能运用运算定律计算有关的分数乘法. 3. 培养学生灵活应用运算定律进行计算技 ...查看


  • 整数运算律的推广
  • 整数运算律的推广 教学内容:青岛版六年级上册第六单元信息窗1第2个红点内容 教学目标: 1.掌握分数应用题的数量关系,学会解答分数乘法的两步应用题,发展思维,培养分析问题的能力. 2.通过创设自主探究.尝试迁移.合作交流的学习情境,理解整数 ...查看


  • 小学数学运算法则
  • 一.运算法则 1. 整数加法计算法则: 相同数位对齐,从低位加起,哪一位上的数相加满十,就向前一位进一. 2. 整数减法计算法则: 相同数位对齐,从低位减起,哪一位上的数不够减,就从它的前一位退一作十,和本位上的数合并在一起,再减. 3. ...查看


  • 小学四年级下册
  • 北师大版小学数学四年级(下册)知识点 一 小数的认识和加减法 [知识要点] 小数的意义 1.小数的意义: 用来表示十分之几.百分之几.千分之几--的数,叫小 2.体会十进分数与小数的关系,并能互相转. 3.表示十分之几的小数是一位小数,百分 ...查看


  • 小数加减法重难点突破
  • 北京市东城区府学胡同小学 王 虹 小数四则运算能力是小学生应该掌握和形成的基础知识和基本能力.通过前面的学习,学生已经掌握了计算简单的一位小数的加减法的方法,如小数点对齐,相同数位也就对齐了:计算时相同数位上的数相加减,从最低位算起,&qu ...查看


热门内容