C语言课程设计任务书Word格式文档下载.docx
- 文档编号:21196857
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:21
- 大小:107.77KB
C语言课程设计任务书Word格式文档下载.docx
《C语言课程设计任务书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言课程设计任务书Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
(3)将一元多项式中各子项按照指数从小到大的顺序排序。
(4)分别输出一元多项式pn(x)和Qn(x)。
(5)将用单链表表示的一元多项式输出,即打印多项式的系数和指数。
(6)任意输入一个实数x0,分别求出一元多项式pn(x0)和Qn(x0)的值。
(7)已知有两个一元多项式分别为Pn(x)和Qn(x),求出两个多项式的和
(8)Rn(x)和差Tn(x),分别用单链表表示Rn(x)和Tn(x),并将二者输出,
(Rn(x)=Pn(x)+Qn(x),Tn(x)=Pn(x)-Qn(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后移。
exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
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)一元多项式的减法计算
它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果数相等的话,系数就应该相减;
并且建立的节点的系数为原来的相反数;
当第一个多项式为空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点系数为原来的相反数。
数学模型:
在数学上,一个一元多项式Pn(x)可按升幂写成:
Pn(x)=p0+p1x+p2x2+……+pnxn
它由n+1个系数唯一确定,因此,在计算机中它可用一个线性表P来表示:
P=(p0,p1,p2,……,pn)
每一项的指数i隐含在其系数Pi的序号里,每一项的值顺序为各个多项式的系数值。
加法模型:
假设Qm(X)是一元m次多项式,同样可用线性表Q来表示:
Q=(q0,q1,q2,……qm)
不失一般性,设m<
n,则两个多项式相加的结果Rn(x)=P(x)+Q(x)也可用线性表R来表示,为了更具一般性,设n>
m,相加的结果也可以用单链表来表示,规则是相同指数的项的系数相加,所以P(x)+Q(x)=(p0+q0,p1+q1……pm+qm,pm+1……pn),例如:
P(x)=2x4+5x2+3x+1,Q(x)=3x2+1,相加后R(x)=2x4+8x2+3x+2,用一维向量表表示分别为(1,3,5,0,2)+(1,0,3,)=(2,3,8,0,2),写成数学形式即为2x4+8x2+3x+2,结论正确。
减法模型同加法模型。
具体函数模块的流程图:
功能选择模块:
输入数据函数:
求和函数模块:
求差函数模块:
四、主要源程序代码
#include<
stdio.h>
math.h>
algorithm>
typedefstructduoxiangshi
{
intcoef;
intexp;
structduoxiangshi*next;
}DXS;
intgetNum()
intnum;
printf("
输入选择功能对应的数字:
"
);
scanf("
%d"
&
num);
returnnum;
}
voidfun1(DXS*PHEAD,DXS*QHEAD)
intzs,xs;
//定义指数系数
请输入P(x)中各项的系数和指数\n"
%d%d"
xs,&
zs);
while(zs!
=0||xs!
=0)
{
DXS*p=(DXS*)malloc(sizeof(DXS));
p->
coef=xs;
exp=zs;
PHEAD->
next=p;
next=NULL;
PHEAD=PHEAD->
next;
}
请输入Q(x)中各项的系数和指数\n"
=0||xs!
QHEAD->
QHEAD=p;
输入5显示结果\n"
voidfun2(DXS*PHEAD,DXS*QHEAD)//升幂排序
DXS*p,*q;
//链表的冒泡排序
p=PHEAD->
for(p;
p!
=NULL;
p=p->
next)
for(q=p->
q!
q=q->
if(p->
exp>
q->
exp)
inttemp;
temp=p->
coef;
coef=q->
coef=temp;
exp;
exp=q->
exp=temp;
p=QHEAD->
输入5显示结果。
\n"
voidfun5(DXS*PHEAD,DXS*QHEAD)
当前保存的P(x),Q(x)序列如下:
P(x)="
while(PHEAD->
next!
=NULL)
%d*x^%d"
PHEAD->
coef,PHEAD->
exp);
if(PHEAD->
+"
Q(x)="
while(QHEAD->
QHEAD=QHEAD->
QHEAD->
coef,QHEAD->
if(QHEAD->
\n\n"
voidfun4(DXS*PHEAD,DXS*QHEAD)
intx0;
doublesum;
输入x的值:
x0);
sum=0;
sum+=PHEAD->
coef*pow(x0,PHEAD->
exp);
P(x)=%.0lf\n"
sum);
sum+=QHEAD->
coef*pow(x0,QHEAD->
Q(x0)=%.0lf\n\n"
voidfun3(DXS*PHEAD,DXS*QHEAD)//求两个多项式的和差
fun2(PHEAD,QHEAD);
//先进行升幂排序
DXS*RHEAD,*THEAD;
RHEAD=(DXS*)malloc(sizeof(DXS));
THEAD=(DXS*)malloc(sizeof(DXS));
RHEAD->
THEAD->
DXS*p=PHEAD,*q=QHEAD;
//多项式相加
DXS*r=RHEAD;
while(p!
=NULL&
&
=NULL)//当两个序列都有数值时
DXS*t=(DXS*)malloc(sizeof(DXS));
if(p->
exp==q->
exp)//指数相同的情况
t->
coef=p->
coef+q->
exp=p->
elseif(p->
exp<
exp)//P的指数小于Q的指数
exp)//P的指数大于Q的指数
r->
next=t;
r=r->
while(p!
=NULL)//当只有一个序列有数值时
while(q!
r=RHEAD;
R(x)="
while(r->
if(r->
coef>
=0)
{
if(r!
=RHEAD->
next)
printf("
printf("
r->
coef,r->
}
else
-%d*x^%d"
-1*r->
//多项式相减
p=PHEAD;
q=QHEAD;
DXS*T=THEAD;
coef-q->
coef=-1*q->
T->
T=T->
T=THEAD;
//消除系数为0项
while(T->
if(T->
next->
coef==0)
next=T->
if(T==NULL)
break;
T(x)="
while(T->
coef>
=0)
if(T!
=THEAD->
T->
coef,T->
else
-1*T->
coef,T->
if(THEAD->
next==NULL)
printf("
0\n"
voidmenu()
-----------------------------------------------\n"
1.分别输入Pn(x)和Qn(x)。
2.分别对Pn(x)和Qn(x)进行升幂排序。
3.分别求出Pn(x)和Qn(x)的和差。
4.任意输入一个实数x,分别求出一元多项式Pn(x)和Qn(x)的值。
5.分别输出上一步运行结果的Pn(x)和Qn(x)。
Ifyouwanttoexitthesystem,pleaseinput0.\n"
intmain()
Welcometothemenu~~\n"
menu();
num=getNum();
if(num==0)
\nExitthesystem,goodbye~~\n"
DXS*PHEAD,*QHEAD;
PHEAD=(DXS*)malloc(sizeof(DXS));
QHEAD=(DXS*)malloc(sizeof(DXS));
while(num)
switch(num)
case1:
fun1(PHEAD,QHEAD);
case2:
case3:
fun3(PHEAD,QHEAD);
case4:
fun4(PHEAD,QHEAD);
case5:
fun5(PHEAD,QHEAD);
default:
输入错误,请重新输入\n\n"
\nExitthesystem,goodbye!
return0;
五、调试分析过程描述
测试数据及实验过程:
1、欢迎界面以及选择功能1和功能5得到的结果:
2、调用功能2对应的函数并输出结果
2、调用功
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 任务书