用C语言实现多项式简单计算器的设计 - 范文中心

用C语言实现多项式简单计算器的设计

03/31

武汉理工大学华夏学院 课程设计报告书

课程名称:

数据结构

题 目:用C 语言实现多项式简单计算器的设计

系 名: 信息工程系

专业班级: 软件工程1121班

姓 名: 邓 燕 蓉 指导教师: 王 绪 梅

2013 年 6月 28日

课程设计任务书

学生姓名: 邓燕蓉 专业班级: 软件工程1121班 指导教师: 王绪梅 工作单位:华夏学院计算机教研室 设计题目:用C 语言实现多项式简单计算器的设计 设计目的

1. 巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法; 2. 选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算; 3. 提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养 ;

设计任务 (在规定的时间内完成下列任务)

〔问题描述〕输入并建立两个多项式并输出多项式

设计一个程序:对两个多项式进行加、减法及乘法运算, 建立一个新多项式并输出.

或设计一个程序对其中一个多项式求导。 〔实现提示〕

选择带头结点的单链表或循环链表存储多项式, 头结点中存放多项式的参数及单链表的数据 具体要完成的任务是:

A . 编制完成上述问题的C 语言程序、进行程序调试并能得出正确的运行结果。 B . 写出规范的课程设计报告书;

时间安排:6月24日---28日

具体要求

1. 课程设计报告按统一通用格式书写,具体内容如下: ① 设计任务与要求 ② 总体方案与说明

③ 软件主要模块的流程图 ④ 源程序清单与注释

⑤ 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想); ⑥ 小结与体会

附录:① 源程序(必须有简单注释) ② 使用说明 ③ 参考资料 2. 每位学生应独立完成各自的任务且每天至少在设计室工作半天;

指 导 教 师 签 名: 王绪梅 2013 年 6月 22日

教研室主任(或责任教师)签名: 2013年 6月 24日

目 录

1. 设计题目 .............................................................................................................................1 2. 需求分析.............................................................................................................................1 2.1 一元多项式的简单计算器的基本功能 ................................................1 2.2 设计思路 ...............................................................................................................1 3. 系统过程 ............................................................................................................................2 3.1 概要设计 ...............................................................................................................2 3.2 详细设计 ...............................................................................................................3 4. 调用关系图 . ........................................................................................................................3

4.1 总流程图 ...............................................................................................................4 4.2 加法流程图 . .........................................................................................................5 4.3 减法流程图 . .........................................................................................................6 5. 测试 . ........................................................................................................................................7

5.1 测试数据 ...............................................................................................................7 5.2 打开程序时的主界面 . ....................................................................................7 5.3 输入并建立多项式 ..........................................................................................8 5.4 选择执行的操作及执行的结果 ...............................................................9 6. 心得体会及总结 ............................................................................................................10 7. 参考文献 ............................................................................................................................10 附录 ........................................................................................................................................ 11

数据结构课程设计报告书

1 设计题目

用C 语言实现多项式简单计算器的设计

2 需求分析

2. 1 一元多项式的简单计算器的基本功能

(1)输入并建立多项式; (2)输出多项式;

(3)多项式a 和b 相加,建立多项式a+b; (4) 多项式a 和b 相减,建立多项式a-b ; (5)多项式a 和b 相乘,建立多项式a*b。

2.2 设计思路

(1)定义线性表的动态分配顺序存储结构; (2)建立多项式存储结构,定义指针*next;

(3)利用链表实现队列的构造,每次输入一项的系数和指数,可以构造一元多项式;

(4)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的数据进行输入建立多项式以及多项式相加,减,乘的运行结果在屏幕上显示。 设计思路分析:

要解决多项式相加,相减,相乘,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:

运用尾插法建立两个单链表,以单链表Polyn p和Polyn h分别表示一元多项式a 和b ,a+b的求和运算等同于单链表的插入问题(将Polyn p中的结点插入到单链表Polyn h中),因此“和多项式”的结点无须另生成。

为了实现处理,设p 、q2分别指向单链表polya 和polyb 的当前项,比较p 、q2结点的指数 由此得到下列运算规则:

① 若p->expnexpn,则结点q2所指的结点应是“和多项式”中的一项,令指针q2后移。 ② 若p->expn=q2->expn,则将两个结点中的系数相加,当和不为0时修改结点q2的系数。 ③ 若p->expn>q2->expn,则结点p 所指的结点应是“和多项式”中的一项,将结点p 插入在结点q2之前,且令指针p 在原来的链表上后移。

3 系统设计

3.1 概要设计

系统的主功能模块结构如图3—1所示。

图3—1 系统的主功能模块结构

3.2 详细设计

1、元素类型、结点类型和指针类型:

typedef struct Polynomial {

float coef; //系数 int expn; //指数 struct Polynomial *next;

}*Polyn,Polynomial;

2、建立一个头指针为head 、项数为m 的一元多项式, 建立新结点以接收数据, 调用Insert 函数插入结点:

Polyn CreatePolyn(Polyn head,int m){ int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL; for(i=0;i

{

p=(Polyn)malloc(sizeof(struct Polynomial)); printf(" 请输入第%d项的系数与指数:",i+1); scanf("%f %d",&p->coef,&p->expn);

Insert(p,head); //调用Insert 函数插入结点

}

return head; }

3、主函数和其他函数:

int main() {

int m,n,flag=0; float x;

Polyn pa=0,pb=0,pc,pd,pe,pf; }

void PrintPolyn(Polyn P) //输出多项式a 和b

Polyn AddPolyn(Polyn pa,Polyn pb) //求解并建立多项式a+b,返回其头指针 Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立多项式a-b ,返回其头指针 Polyn MultiplyPolyn(Polyn pa,Polyn pb) //求解并建立多项式a*b,返回其头指针

4 调用关系图

4.1 总流程图

总流程图如图4—1所示。

4.2 执行加法流程图

执行加法流程图如图4—2所示。

图4—2 执行加法流程图

4.3

执行减法流程图

执行减法流程图如图4—3所示。

图4—3 执行减法流程图

5 测试 5.1 测试数据

1、(-3x11+5x8 +4x)+( 11x9-5x 8+7)=(-3x11+11x9+4x+7);

2、(7x-3 +4.4x2-1.2x 9-x)-(-6x-3+5.4x2-x 2+7.8x15)=(-7.8x15-1.2x 9+13x-3-x); 3、(9x8+4x6-5x 4+8x)*( x14+2x4)=(9x 22+4x20-5x 18+8x15+18x12+8x10-10x 8+16x5); 4、(x+x3)+(-x-x3)=0;

5、(1-x+x2+x3-x 4)*(-x3-x 4)=(x8-2x 6-x 3) 。

5.2. 打开程序时的主界面

打开程序时的主界面如图5—1所示。

图 5—1 打开程序时的主界面

5.3 .输入并建立多项式

输入并建立多项式如图5—2所示。

图5—2 输入并建立多项式

5.4 选择执行的操作及执行操作的结果

选择执行的操作及执行操作的结果如图5—3、5—4、5—5所示

图 5—3 选择执行的操作及执行操作的结果

图 5—4 选择执行的操作及执行操作的结果

图5—5 选择执行的操作及执行操作的结果

6 心得体会及总结

通过这次课程设计,我感觉到要自己动手真正做出一个程序并不很容易, 但只要用心去做,总会有收获, 特别是当我遇到问题, 问老师,问同学,想尽办法去解决, 最后终于找到方法时, 心里的那份喜悦之情真是难以形容. 编写程序中遇到问题再所难免, 应耐心探究其中的原因, 从出现问题的地方起, 并联系前后程序, 仔细推敲, 逐个排查. 直到最终搞清为止。

对于数据结构有了更深层次的理解, 数据结构体现的是解决问题的一种思想,怎样把这种思想体现出来,需要我们对每个方面的系统了解。并发现了许多自己的不足,平时没掌握的的知识在实践中暴露,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分的问题,还有一些小问题。但是,我相信在今后的学习中,一定能把它解决好。当今计算机应用在生活中可以说是无处不在。因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C 语言又是最常见,功能最强大的一种高级语言,因此做好c 语言版数据结构课程设计是十分必要的。我不仅巩固了数据结构程序设计的内容,掌握设计的基本方法,强化了上机动手能力,还进一步掌握了以下知识:数据类型,分支控制,循环控制,结构体及数组,指针,文件操作,编译预处理等;通过课程设计,掌握了程序的局部测试,调试方法,建立程序系统调试,测试的基本概念和思想,学会较大程序的系统测试和调试方法。当我选择通讯录管理系统时,首先系统分析主要思路和框架哦,与同学讨论,联系所学的知识。我知道书上和老师讲的有限,所以上网搜也是一种利用资源的表现。在编程中,特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努力,大体把课本上的知识点看了一遍,知识点也基本上掌握了,所以下一步就是开始正式的编程序了。当读懂了C 语言编程的基本过程和方法,经过一波三折,终于开始正式编程。

通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的知识与实际结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力。

在课程设计过程中,收获知识,提高能力的同时,我也学到了很多的人生哲理,懂得了怎么去制定计划,怎么去实现这个计划,并掌握了在执行的过程中怎样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定把课程设计的精神带到生活中,使生活变得更好。

7 参考文献

[1]唐国民,王国均. 数据结构(C 语言版)·北京:清华大学出版社.

[2] 严蔚敏,吴伟民. 数据结构(C 语言版). 北京:清华大学出版社,1997. [3] 詹春华,杨沙. 《C 语言程序设计教程》 科学出版社,2011.8

[4]董志民,崔建平,肖利娜. 《C 语言程序设计》教学改革探索与实践[J].福建电脑. [5] 王路明•C 语言程序设计教程•北京:北京邮电大学出版社,2005年5月 [6] 谭浩强·C++程序设计·北京:清华大学出版社·2004 [7]范策. 算法与数据结构(C 语言版). 北京:机械工业出版社,2004.

附录

#include #include typedef struct Polynomial { float coef; int expn;

struct Polynomial *next;

}*Polyn,Polynomial; //Polyn为结点指针类型 void Insert(Polyn p,Polyn h)

{ if(p->coef==0) free(p); //系数为0的话释放结点 else { Polyn q1,q2; q1=h;q2=h->next;

while(q2&&p->expnexpn) //查找插入位置 { q1=q2; q2=q2->next; }

if(q2&&p->expn==q2->expn) //将指数相同相合并 { q2->coef+=p->coef; free(p);

if(!q2->coef) //系数为0的话释放结点 { q1->next=q2->next; free(q2); } }

else //指数为新时将结点插入 { p->next=q2; q1->next=p; } } }//Insert

Polyn CreatePolyn(Polyn head,int m) //建立一个头指针为head 、项数为m 的一元多项式 { int i; Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL;

for(i=0;i

{ p=(Polyn)malloc(sizeof(struct Polynomial)); //建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1); scanf("%f %d",&p->coef,&p->expn); Insert(p,head); //调用Insert 函数插入结点 }

return head; }//CreatePolyn

void DestroyPolyn(Polyn p) //销毁多项式p { Polyn q1,q2; q1=p->next; q2=q1->next; while(q1->next) { free(q1);

q1=q2; //指针后移 q2=q2->next; } }

void PrintPolyn(Polyn P) { Polyn q=P->next; int flag=1; //项数计数器 if(!q) //若多项式为空,输出0 { putchar('0'); printf("\n"); return; } while (q)

{ if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项 if(q->coef!=1&&q->coef!=-1) //系数非1或-1的普通情况 { printf("%g",q->coef); if(q->expn==1) putchar('X');

else if(q->expn) printf("X^%d",q->expn); } else

{ if(q->coef==1){

if(!q->expn) putchar('1');

else if(q->expn==1) putchar('X'); else printf("X^%d",q->expn); }

if(q->coef==-1) { if(!q->expn) printf("-1"); else if(q->expn==1) printf("-X"); else printf("-X^%d",q->expn); } }

q=q->next; flag++; }//while printf("\n"); }//PrintPolyn

int compare(Polyn a,Polyn b) { if(a&&b)

{ if(!b||a->expn>b->expn) return 1; else if(!a||a->expnexpn) return -1; else return 0; }

else if(!a&&b) return -1; //a多项式已空,但b 多项式非空 else return 1; //b多项式已空,但a 多项式非空 }//compare

Polyn AddPolyn(Polyn pa,Polyn pb) //求解并建立多项式a+b,返回其头指针 { Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc;

hc=(Polyn)malloc(sizeof(struct Polynomial)); //建立头结点 hc->next=NULL; headc=hc; while(qa||qb)

{ qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)) { case 1:

{ qc->coef=qa->coef; qc->expn=qa->expn;

qa=qa->next; break; } case 0: {

qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: {

qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } }//switch if(qc->coef!=0) {

qc->next=hc->next; hc->next=qc; hc=qc; }

else free(qc);//当相加系数为0时,释放该结点 }//while return headc; }//AddPolyn

Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立多项式a-b ,返回其头指针 { Polyn h=pb; Polyn p=pb->next; Polyn pd;

while(p) //将pb 的系数取反 { p->coef*=-1; p=p->next;

}

pd=AddPolyn(pa,h);

for(p=h->next;p;p=p->next) //恢复pb 的系数 p->coef*=-1; return pd; }//SubtractPolyn

Polyn MultiplyPolyn(Polyn pa,Polyn pb) //求解并建立多项式a*b,返回其头指针 { Polyn hf,pf; Polyn qa=pa->next; Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial)); //建立头结点 hf->next=NULL; for(;qa;qa=qa->next)

{ for(qb=pb->next;qb;qb=qb->next)

{ pf=(Polyn)malloc(sizeof(struct Polynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn;

Insert(pf,hf); //调用Insert 函数以合并指数相同的项 } } return hf; }//MultiplyPolyn int main() {

int m,n,flag=0; float x;

Polyn pa=0,pb=0,pc,pd,pe,pf; //定义各式的头指针,pa 与pb 在使用前赋初值NULL printf("请输入a 的项数:"); scanf("%d",&m);

pa=CreatePolyn(pa,m); //建立多项式a printf("请输入b 的项数:"); scanf("%d",&n);

pb=CreatePolyn(pb,n); //建立多项式b //输出菜单

printf("********************操作提示**************************\n"); printf("\t 1.输出多项式a 和b\n");

printf("\t 2.建立多项式a+b\n"); printf("\t 3.建立多项式a-b\n"); printf("\t 4.建立多项式a*b\n");

printf("\t 5.退出\n*******************************************\n"); for(;;flag=0) {

printf("执行操作"); scanf("%d",&flag); if(flag==1){

printf("多项式a :");PrintPolyn(pa); printf("多项式b :");PrintPolyn(pb);continue; }

if(flag==2) {

pc=AddPolyn(pa,pb);

printf("多项式a+b:");PrintPolyn(pc); DestroyPolyn(pc);continue; }

if(flag==3) {

pd=SubtractPolyn(pa,pb);

printf("多项式a-b :");PrintPolyn(pd); DestroyPolyn(pd);continue; }

if(flag==4){

pf=MultiplyPolyn(pa,pb);

printf("多项式a*b:");PrintPolyn(pf); DestroyPolyn(pf);continue; }

if(flag==5) break;

if(flag8) printf("Error!!!\n");continue; }//for

DestroyPolyn(pa); DestroyPolyn(pb); return 0; }


相关内容

  • 算法设计与分析
    阶乘 Public static int factorial (int n){ If (n==0) return 1; return*factorial(n-1); } Hanoi Public static void hanoi(int ...
  • 单项式乘以多项式说课稿
    整式的乘法(2) ------------单项式乘以多项式(说课稿) 一. 说教材 <整式的乘法>是人教版教材第十四章<整式的运算>的重要内容.是进一步学习其它数学知识的基础,同时也是学习理.化等学科不可缺少的工具, ...
  • 针对软件研发.软件测试等软件类工程师的简历
    个 人 简 历 个人信息 姓名:王海锋 手机:134-2600-5634 Email:wanghaifeng410@126.com 地址:北京市海淀区西土城路10号北京邮电大学学六楼409室 邮编:100876 求职意向 教育背景 2008 ...
  • 郑州大学计算机研究生导师信息
    1. 导师姓名:范 明 科研方向:数据库 197k年郑州大学毕业,后在美国.加拿大进修及合作研究,教授,硕士生导师.省重点学科计算机软件与理论的学术带头人,兼任中国计算机学会数据库专业委员会委员.中国计算机学会CAD与计算机图形学专业委员会 ...
  • 用于不确定性分析的高斯过程响应面模型
    第20卷第1期 2011年3月 计算机辅助工程 ComputerAidedEngineering V01.20No.1Mar.2011 文章编号:1006-0871(2011)01.0101.05 用于不确定性分析的高斯过程响应面模型 设计 ...
  • 17秋西南大学现代教育技术_1作业标准答案参考资料
    现代教育技术 单项选择题 1.教育技术解决教育教学问题的基本指导思想是( ) A.媒体开发.技术支持.资金支持 B.以学习者为中心.依靠资源.应用系统方法 C.以教师为中心.依靠技术.应用现代手段 D.利用视听媒体.掌握信息技术.综合教学理 ...
  • 高中英语学习目标设定
    高中英语学习目标设定 作者:王勤 来源:<江西教育·综合版>2013年第09期 摘 要:学习目标的设定是教师备课的第一要素,是判断教学是否有效的直接依据.本文分析了目前高中英语课堂教学学习目标设定中存在的一些问题,阐述了英语学习 ...
  • 20世纪十大算法
    20世纪十大算法 本世纪初,美国物理学会(AmericanInstitute of Physics)和IEEE计算机社团(IEEE Computer Society)的一本联合刊物<科学与工程中的计算>发表了由田纳西大学的Jac ...
  • 用窗函数法设计FIR数字低通滤波器
    河北科技大学 课程设计报告 学生姓名: 学 号: 专业班级: 课程名称: 学年学期 指导教师: 20 年 月 课程设计成绩评定表 目 录 1. 窗函数设计低通滤波器 1.1设计目的--------------------------1 1. ...
  • 英语计算机专升本考试大纲
    附件2: 甘肃省普通高等学校专升本招生 英语科考试大纲 (试行) 一.考试目的 全面考核普通高校专科(含高职)应届毕业生英语课程是否达到教学大纲所规定的目标(领会式掌握3500单词,具体要求可参照<大学英语教学大纲>中对大学英语 ...