当前位置:文档之家› 一元多项式计算器

一元多项式计算器

一元多项式计算器目录摘要 (1)1绪论 (1)2系统分析 (1)2.1功能需求 (1)2.2数据需求 (1)2.3性能需求 (1)3总体设计 (2)3.1系统设计方案 (2)3.2功能模块设计 (2)4详细设计 (3)4.1建立多项式 (4)4.2多项式相加 (4)4.3多项式相减 (5)4.4多项式相乘 (5)4.5计算器主函数 (6)5调试与测试 (7)5.1调试 (7)5.2测试 (8)6结论 (9)结束语 (9)参考文献 (9)附录1-用户手册 (10)附录2-源程序 (12)摘要随着生活水平的提高,现代科技也日益发达。

日常生活中多位计算再所难免,因此设计一个简单计算器可解决许多不必要的麻烦。

开发这样一个程序主要运用了C的结点,链表等方面知识。

系统主要实现了多项式的建立,多项式的输入输出,以及多项式加减乘等运算。

报告主要从计算器的程序段,对输入输出数据的要求,计算器的性能,以及总体的设计来介绍此计算器程序的实现过程。

关键词:多项式;链表;结点1绪论随着日益发达的科技,计算器已应用于各行各业。

设计一个计算器需要运用C中多方面知识,更是以多项式的建立,输入输出,以及结点,链表为主。

(扩充)任务书。

2系统分析2.1 功能需求多项式的建立多项式输入输出多项式加减乘等运算2.2数据需求在输入过程中,首先要确定输入的数据,数据不能是字母,只能是数字。

不能连续输入数据,必须按要求配以空格输入要计算的数据。

(1) 链节节点数字(2) 数字2.3 性能需求系统必须安全可靠,不会出现无故死机状态,速度不宜过慢。

3总体设计3.1系统设计方案采用菜单设计,选择你需要的功能,用单链表储存你输入的数据。

(1) 菜单菜单包括计算器加减乘等功能的选择(2) 文件保存方式运用带头节点的单链表储存多项式(3) 抽象数据类型定义主要定义多项式的系数和指数。

系数项用浮点类型定义,指数项用整型定义(4) 存储结构采用链式结构,建立链表储存输入的多项式(5) 算法设计运用链表知识,建立链表,给链表分配一定量的存储空间,查找链表,插入链表和链表的连接3.2功能模块设计图1功能模块图(1)建立多项式模块该模块分为①建立多项式②输入多项式(2)多项式相加模块该模块是将输入的多项式实现相加功能。

(3)多项式相减模块该模块是将输入的多项式实现相减功能。

(4)多项式相乘模块该模块是将输入的多项式实现相乘功能。

4详细设计一元多项式计算器主要分为4大部分,多项式建立,多项式加法,多项式减法和多项式乘法。

多项式的建立主要需要建立新链表,并分配给这个新链表一定量的存储空间,分配的存储空间内进行运算;多项式加减乘等运算主要运用了链表的建立,链表存储空间分配,链表的查找,插入与连接进行计算。

4.1 建立多项式此阶段是多项式的建立,可以对计算器进行输入,输出等功能。

主要运用链表方面的知识如图2所示。

N图2多项式建立4.2多项式相加此阶段是计算器的加法运用功能,对你输入的多项式进行相加计算,主要运用了链表,及链表的插入等知识,如图3所示。

图3多项式相加4.3多项式相减此阶段是计算器的减法运用功能,对你输入的多项式进行相减计算,主要运用了链表,链表查询,及链表的插入等知识,如图4所示。

图4多项式相减4.4多项式相乘此阶段是计算器的乘法运用功能,对你输入的多项式进行相乘计算,主要运用了链表,链表查询,及链表的插入等知识,如图5所示。

图5多项式相乘4.5计算器主函数此阶段是计算器的功能选择,对你要进行的操作选择相应的程序,主要运用了链表,链表查询,链表连接及链表的插入等知识,如图6所示。

图6计算器主函数5调试与测试5.1 调试调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。

本系统调试过程中遇到的主要问题、原因和解决方法如下面介绍。

(1)系统提示的错误error C2065: 'addPLOY' : undeclared identifieraddPLOY没有被明确的定义。

到程序段里仔细寻找addPLOY,并将其定义。

(2)cannot open Debug/Cpp1.exe for writing执行窗口没关闭就修改程序段关闭只胸窗口后从新执行程序。

5.2 测试软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。

或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。

过度测试则会浪费许多宝贵的资源。

到测试后期,即使找到了错误,然而付出了过高的代价。

测试数据过程如下。

(1)输入功能测试输入数据1:2 3 0 0预期结果:2.000000x^3运行结果: 2.000000x^3说明:符合输入的要求输入数据2:a b 0 0预期结果:a.000000x^b运行结果:死循环说明:不符合输入要求(2)运算功能测试输入数据1:2 3 0 0 3 4 0 0预期结果:2.000000x^3+3.000000x^4运行结果:2.000000x^3+3.000000x^4说明:符合计算的要求输入数据2:a b 0 0 c d 0 0预期结果:a.000000x^b+c.000000x^d运行结果:死循环6结论经过一段时间的设计,我的程序大体完成,基本上能实现任务书中的要求,但程序还存在一些缺点。

例如,无法输入字母计算,无法进行多项连续计算。

结束语经过两周的课程设计,我深刻的体会到了数据结构的重要性。

例如,生活中常常需要多位计算,而编一个简易的计算器会帮你节省许多时间。

因此,学好数据结构练好编程,会帮你解决许多生活实际问题。

这两周的课设生活更坚定了我学好数据结构的决心。

参考文献[1] 谭浩强.C语言程序设计(第三版).清华大学出版社,2007[2] 姜灵芝,余健.C语言课程设计案例精编.清华大学出版社,2008[3] 网上相关资料[4]严蔚敏,吴伟民。

数据结构(C语言版)[5]李健学,余健。

数据结构课程设计案例精编,2007附录1-用户手册点击运行,首先出现的是功能选择界面,选择你需要的功能,输入正确的编号即可,如图7所示。

图7功能选择界面输入1,进入多项式相加界面,如图8所示。

图8多项式相加界面在此界面按照系数指数的顺序输入多项式实现多项式的相加,并以0 0结束。

输入2,进入多项式相乘界面,如图9所示。

图9多项式相乘界面在此界面按照系数指数的顺序输入多项式实现多项式的相乘,并以0 0结束。

输入3,进入多项式相减界面,如图10所示。

图10多项式相减界面在此界面按照系数指数的顺序输入多项式实现多项式的相减,并以0 0结束。

附录2-源程序#include<stdio.h>#include<malloc.h>typedef struct node{float coef;int expn;struct node * next;}PLOY;void start()//用户选择界面{printf("************************************\n");printf(" 两个一元多项式的相加/相减/相乘\n");printf("************************************\n");printf("请选择操作:\n");printf("0.退出\n");printf("1.两个一元多项式相加\n");printf("2.两个一元多项式相乘\n");printf("3.两个一元多项式相减\n");}void insert(PLOY *head,PLOY *inpt){PLOY *pre,*now;int signal=0;pre=head;if(pre->next==NULL) {pre->next=inpt;}else {now=pre->next;while(signal==0){if(inpt->expn<now->expn){if(now->next==NULL){now->next=inpt;signal=1;}else{pre=now;now=pre->next;}}elseif(inpt->expn>now->expn){inpt->next=now;pre->next=inpt;signal=1;}else{now->coef=now->coef+inpt->coef;signal=1;free(inpt);if(now->coef==0){pre->next=now->next;free(now);}}}}}PLOY *creat(char ch){PLOY *head,*inpt;float x;int y;head=(PLOY *)malloc(sizeof(PLOY));head->next=NULL;printf("请输入一元多项式%c:(格式是:系数指数;以0 0 结束!)\n",ch);scanf("%f %d",&x,&y);while(x!=0){inpt=(PLOY *)malloc(sizeof(PLOY));inpt->coef=x;inpt->expn=y;inpt->next=NULL;insert(head,inpt);printf("请输入一元多项式%c的下一项:(以0 0 结束!)\n",ch);scanf("%f %d",&x,&y);}return head;}PLOY *addPLOY(PLOY *head,PLOY *pre){PLOY *inpt;int flag=0;while(flag==0){if(pre->next==NULL)flag=1;else{pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY)); inpt->coef=pre->coef;inpt->expn=pre->expn;inpt->next=NULL;insert(head,inpt);}}return head;}PLOY *minusPLOY(PLOY *head,PLOY *pre) {PLOY *inpt;int flag=0;while(flag==0){if(pre->next==NULL)flag=1; else{pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY)); inpt->coef=0-pre->coef;inpt->expn=pre->expn;inpt->next=NULL;insert(head,inpt);}}return head;}PLOY *byPLOY(PLOY *head1,PLOY *head2) {PLOY *inpt,*res,*pre;int flag=0;res=(PLOY *)malloc(sizeof(PLOY));res->next=NULL;head1=head1->next;pre=head2;while(flag==0){if(pre->next==NULL){pre=head2;head1=head1->next;continue;}if(head1==NULL){flag=1;continue;}pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY));inpt->coef=pre->coef*head1->coef;inpt->expn=pre->expn+head1->expn;inpt->next=NULL;insert(res,inpt);}return res;}void print(PLOY *fun){PLOY *printing;int flag=0;printing=fun->next;if(fun->next==NULL){printf("0\n");return;}while(flag==0){if(printing->coef>0&&fun->next!=printing)printf("+");if(printing->coef==1);else if(printing->coef==-1)printf("-");elseprintf("%f",printing->coef);if(printing->expn!=0) printf("x^%d",printing->expn); else if((printing->coef==1)||(printing->coef==-1)) printf("1");if(printing->next==NULL)flag=1;elseprinting=printing->next;}printf("\n");}void main(){PLOY *f,*g;int sign=-1;start();while(sign!=0){scanf("%d",&sign);switch(sign){case 0:break;case 1:{printf("你选择的操作是多项式相加:\n"); f=creat('f');printf("f(x)=");print(f);g=creat('g');printf("g(x)=");print(g);printf("F(x)=f(x)+g(x)=");f=addPLOY(f,g);print(f);sign=-1;start();break;}case 2:{printf("你选择的操作是多项式相乘:\n"); f=creat('f');printf("f(x)=");print(f);g=creat('g');printf("g(x)=");print(g);printf("F(x)=f(x)*g(x)=");f=byPLOY(f,g);print(f);sign=-1;start();break;}case 3:{printf("你选择的操作是多项式相减:\n"); f=creat('f');printf("f(x)=");print(f);g=creat('g');printf("g(x)=");print(g);printf("F(x)=f(x)-g(x)=");f=minusPLOY(f,g);print(f);sign=-1;start();break;}case 4:{sign=-1;start();break;}default:{printf("输入有误!请重新选择操作!\n"); start();break;}}}printf("谢谢使用!\n");完成日期:****年**月**日。

相关主题