当前位置:文档之家› C语言课程设计任务书

C语言课程设计任务书

信息科学与工程学院综合设计报告书课程名称:C语言课程设计班级:学号:姓名:指导教师:目录( 一) 需求分析..................................... . 2-3 1.设计题目;2.用户操作流程;3.数据处理流程;(二)概要设计......................................4-51.系统总体设计框架;2.系统功能模块图;(三)详细设计.....................................5-111.主要功能模块的算法设计思路;2.工作流程图;(四)主要源程序代码...............................12-211.完整源程序清单及关键注释;(五)调试分析过程描述.............................21-241.测试数据、测试输出结果;2.对程序调试过程中存在问题的思考;(六)课程设计小结.................................24-251.包括课程设计过程中的学习体会与收获;2.对C语言和本课程设计的认识以及自己的建议等内容。

一、需求分析1、设计题目:编程实现以下功能:(1)分别输入一元多项式pn (x)和Q n (x)。

从键盘输入一元多项式中各项的系数和指数,并用单链表加以表示。

(2)分别对一元多项式pn (x)和Q n (x)进行升幂排序。

将一元多项式中各子项按照指数从小到大的顺序排序。

(3)分别输出一元多项式pn (x)和Q n (x)。

将用单链表表示的一元多项式输出,即打印多项式的系数和指数。

(4)任意输入一个实数x0,分别求出一元多项式pn (x0)和Q n (x0)的值。

(5)已知有两个一元多项式分别为Pn (x)和Qn (x),求出两个多项式的和R n (x)和差T n (x),分别用单链表表示R n (x) 和T n (x),并将二者输出,(R n (x)=P n (x)+Q n (x),T n (x)=P n (x)-Q n (x))2、用户操作流程:(1)进入欢迎及界面。

(2)根据提示选择需要的功能。

(3)根据提示输入数据.(4)选择函数输出运行结果。

(5)退出本系统。

3、数据处理流程(1)输入数据,通过链表存储P(x) 和Q(x) 的指数和系数。

(2)通过冒泡排序法对P(x) 和Q(x) 进行升幂排序。

(3)输入x0,通过指针将其带入P(x) 和Q(x) 的表达式求出具体的数值。

(4)通过链表对两个多项式求和求差。

(5)通过链表输出运行结果。

;二、概要设计1、系统总体设计框架:功能选择函数输入数据函数升幂函数主程序赋值函数求差求和函数输出结果函数2、系统功能模块(1)功能选择函数:通过输入对应功能的数字,进行多项式的运算。

该函数在主函数中调用。

(2)输入数据函数:通过建立单链表,输入两个多项式的各项指数和系数。

(3)升幂函数:通过冒泡排序法对两个多项式进行升幂排序。

(4)求和求差函数:定义空链用来存储结果,将两个多项式相加减。

(5)输出函数:输出上一步的运行结果。

三、详细设计一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。

多项式相加的运算规则是:两个多项式中所有指数相同的项的对应系数相加,若和部位零,则构成“和多项式”中的一项;所有指数不相同的的项均“复抄”到“和多项式”中。

以单链表作为存储结构,并且“和多项式”中的节点无需另外生成,则可看做是将多项式Q 加到多项式P 中,由此得到下列运算规则:若p->exp<q->exp,则结点p 所指的结点应是“和多项式”中的一项,令指针p 后移。

若p->exp<q->exp,则结点q 所指的结点应是“和多项式”中的一项,将结点q 插入在结点p 之前,且令指针q 在原来的链表上后移。

若p->exp=q->exp,则将两个结点的系数相加,当和不为零是修改结点p 的系数,释放q 结点;若和为零,则“和多项式”中无o 此项,从P 中p 结点,同时释放p 和q 结点。

多项式相减运算规则同加法。

设计思路:实现的方法是先定义多项式结点的结构,该多项式每个结点由三个元素:输入的系数、输入的指数、以及指向下一个结点的指针构成。

该链表采用链式存储结构。

然后通过多次的输入,依次得到两个一元多项式的各个项的系数与指数。

该输入以零结尾。

然后通过对结点的判断是否为零后,进行运算或者终止的操作。

再初始化一个链表LC,将LC的各项系数和指数的指针指向LA+LB所得的结果的值,完成了最后的输出。

(1)定义结构体struct结构体为表示一个对象的不同属性提供了连贯一致的方法,结构体类型的说明从关键词struct 开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。

使用typedef 和struct 定义的新类型名称,其用途与内建类型的名称相同,可以用来:声明和初始化结构体变量;创建并根据自己的意愿初始化结构数组;(2) 单链表的建立单链表有两个域,data 域和next 域,一个是存放数据,一个是存放指针而且指向它的后继。

并且还有个head,称表结点,它一般不存放数据,只是做个特殊标记。

表的结束是NULL,也就是最后的那个链域next 为空单链表的插入运算有两种,一种是头插法,另一种是尾插法,这里运用的是尾插法(3)一元多项式的建立输入多项式采用插头的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否结束,定义一个结束标志,并输入非0 时就继续,当输入0 时,就结束一个多项式的输入(4)显示一元多项式如果系数是大于0 的话就输出+系数x 指数形式;如果系数小于0 的话输出系数x 指数形式;如果指数为0 的话,直接输出系数;如果系数是的话就直接输出+x;如果系数是-1 的话直接输出-x 输出多项式(5)一元多项式的加法计算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果数相等的话,系数就应该相加;相加的和不为0 的话,用头插法建立一个新的节点。

p 的指数小于q 的指数的话,就应该复制q 节点到多项式中。

p 的指数大于q 的指数的话,就应该复制p 节点到多形式中。

当第二个多项式为空时,第一个多项式不为空时,将第一个多项式用心节点产生。

当第一个多项式为空,第二个多项式不为空时,将第二个多项式用新节点产生(6)一元多项式的减法计算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果数相等的话,系数就应该相减;相加的和不为0 的话,用头插法建立一个新的节点。

p 的指数小于q 的指数的话,就应该复制q 节点到多项式中。

p 的指数大于q 的指数的话,就应该复制p 节点到多形式中。

并且建立的节点的系数为原来的相反数;当第二个多项式为空时,第一个多项式不为空时,将第一个多项式用心节点产生。

当第一个多项式为空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点系数为原来的相反数。

数学模型:在数学上,一个一元多项式Pn(x) 可按升幂写成:P n(x)=p 0+p1x+p2x n x2+,, +p n2+,, +pn它由n+1个系数唯一确定,因此,在计算机中它可用一个线性表P来表示:P=(p0 ,p 1,p 2, ,, ,pn)每一项的指数i 隐含在其系数Pi 的序号里,每一项的值顺序为各个多项式的系数值。

加法模型:假设Qm(X)是一元m次多项式,同样可用线性表Q来表示:Q=(q0,q 1,q 2, ,, q m)不失一般性,设m<n,则两个多项式相加的结果R n(x)=P(x)+Q(x) 也可- 8 -链表来表示,规则是相同指数的项的系数相加,所以P(x)+Q(x)=(p0+q0,p 1+q1,, p m+q m,p m+1,, pn),例如:P(x)=2x 4+5x2+3x+1,Q(x)=3x 2+1, 相加后R(x)= 2x 4+8x2+3x+2,用一维向量表表示分别为(1,3,5,0,2)+(1,0,3 ,)=(2,3,8,0 ,2),写成数学形式即为2x4+8x2+3x+2,结论正确。

减法模型同加法模型。

具体函数模块的流程图:功能选择模块:输入数据函数:开始开始输入各项的指指数系数输入功能函数对应的数字判断输入是否合法调用输出函数通过switch 判断返回哪显示运行结果一个功能函数调用该功能函数结束结束开始定义存储结果的空链r是存储多项式 1 的空链P 是否为空否是存储多项式 2 的空链Q 是否为空否直接把q 中各直接把p 中各项存入r 项存入r 中同指数项系数相加后存入r 中输出存储多项式的和的链r合并同类项结束开始定义存储结果的空链r是存储多项式 1 的空链P 是否为空否是存储多项式 2 的空链Q 是否为空否直接把q 中把p 中各项系数改各项存入r 变符号后存入r 中同指数项系数相加后存入r 中输出存储多项式的和的链r合并同类项结束四、主要源程序代码#include <stdio.h>#include <math.h>#include <algorithm>typedef struct duoxiangshi{int coef;int exp;struct duoxiangshi *next;}DXS;int getNum(){int num;printf(" 输入选择功能对应的数字: ");scanf("%d", &num);return num;}void fun1( DXS *PHEAD, DXS *QHEAD ){int zs, xs;// 定义指数系数printf(" 请输入P(x) 中各项的系数和指数\n");scanf("%d %d", &xs, &zs);while( zs != 0 || xs != 0 ){DXS *p = (DXS*) malloc(sizeof(DXS));p->coef = xs;p->exp = zs;PHEAD->next = p;p->next = NULL; PHEAD= PHEAD->next;scanf("%d %d", &xs, &zs); }printf(" 请输入Q(x) 中各项的系数和指数\n");scanf("%d %d", &xs, &zs);while( zs != 0 ||xs != 0 ){DXS *p = (DXS*) malloc(sizeof(DXS));p->coef = xs;p->exp = zs;QHEAD->next = p;p->next = NULL;QHEAD = p;scanf("%d %d", &xs, &zs);}printf(" 输入5 显示结果\n");}void fun2( DXS *PHEAD, DXS *QHEAD )// 升幂排序{DXS *p, *q;// 链表的冒泡排序p = PHEAD->next;for( p; p != NULL; p = p->next ){for( q = p->next; q != NULL; q = q->next ){if( p->exp > q->exp ){int temp;temp = p->coef;p->coef = q->coef;q->coef = temp;temp = p->exp;p->exp = q->exp;q->exp = temp; }}}p = QHEAD->next;for( p; p != NULL; p = p->next ){for( q = p->next; q != NULL; q = q->next ){if( p->exp > q->exp ){int temp;temp = p->coef;p->coef = q->coef;q->coef = temp;temp = p->exp;p->exp = q->exp;q->exp = temp;} }}printf(" 输入5 显示结果。

相关主题