C语言课程设计_第1页
C语言课程设计_第2页
C语言课程设计_第3页
C语言课程设计_第4页
C语言课程设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3;虐利技天母

二O一五〜二。一六学年第二学期

信息科学与工程学院

软件综合设计报告书

课程名称:C语言课程设计

班级:__________

学号:________________

姓名:___________________

指导老师:______________________

二。一六年六月

一、需求分析

用单链表实现随意两个•元多项式的加、减法运算

任务:编程实现以下功能:

①分别输入■•元多项式pn(x)和Qn(x)。

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

②分别对一元多项式pn(x)和Qn(x)进行升累排序。

将一元多项式中各子项依据指数从小到大的依次排序。

③分别输出一元多项式pn(x)和Qn仅)。

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

④随意输入一个实数xO,分别求出一元多项式pn(xO)和Qn(xO)的值。

⑤已知有两个一元多项式分别为Pn(x)和Qn(x),求出两个多项式的和

Rn(x)和差Tn(x),分别用单链表表示Rn(x)和Tn(:《),并将二者输出,

(Rn(x)=Pn(x)+Qn(x),Tn(x)=Pn(x)-Qn(x))

@保存多项式,即分别将一元多项式pn(x)和Qn(x)各项的系数和指数保存到外部磁盘文

件。

⑦由程序从所存文件中读出多项式的系数和指数,重新构建一元多项式Pn(x)和Qn

(x),并可对其再次进行运算操作。

用户操作流程:

(1)进入菜单界面;

(2)依据提示输入对应功能数字,调用功能;

(3)依据提示输入参数;

(4)选择功能输出结果;

(5)退出。

二、概要设计

1、系统总体设计框架:

2、系统功能模块

(1)功能选择函数:通过输入对应功能的数字,调用对应的函数进行多项式的运算。

(2)输入数据函数:采纳尾插法建立单链表并输入保存两个多项式的各项指数和系数。

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

(4)求和求差函数:定义空链用来存储结果,将两个多项式相加减分别得到Rn(x)和Tn

(X)o

(5)输出函数:输出当前保存的多项式。

三、具体设计

创建一元多项式链表,链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,

分别存放该项的系数、指数以及指向下一个多项式项结点的指针。对每一项的系数和指数进

行相应的操作完成计算

1.定义结构体struct

运用typedef和struct定义的新类型名称,声明和初始化结构体变量;创建并依据自

己的意愿初始化结构数组。

2.建立单链表并输入保存一元多项式各项的系数和指数。单链表有两个域,data域和next

域,一个是存放数据,一个是存放指针而且指向它的后继。将表的最终一个结点的next

置NULL,以示表的结束。由于Pn(x)和Qn(x)的输入方式一样,所以在这里就只探

讨Pn(x)的输入。在输入系数和指数的时候,在最终输入0以示输入结束。

起先

3.建立功能选择函数

通过switch来推断外界输入的数字,调用对应的函数

4.多项式相加减:

多项式相加的运算规则是:两个多项式中全部指数相同的项的对应系数相加,若和不为

零,则构成“和多项式”中的一项;全部指数不相同的的项均复抄到“和多项式”中。

以单链表作为存储结构,并且“和多项式”中的节点无需另外生成,则可看做是将多项

式Q加到多项式P中,由此得到下列运算规则:(设p、q分别是多项式Pn(x)和Qn

(x)的一项,比较结点的指数项);

若p->exp<q->exp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。

若p->exp>q->exp,则结点q所指的结点应是“和多项式”中的--项,将结点q插入在

结点p之前,且令指针q在原来的链表上后移。

若p->exp=q->exp,则将两个结点的系数相加,当和不为零是修改结点p的系数,格放q

结点;若和为零,则“和多项式”中无此项,从P中p结点,同时释放p和q结点。多

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

求和函数程序流程图:

求差函数程序流程图:

四、主要源程序代码

include<stdio.h>

#include<math.h>

#include<algorithT»

typedefstructPloynode

{

intcoef;

intexp;

structPloynode*next;

}DXS;

intget()

intnum;

printf("输入选择功能对应的数字:");

scanf("%d",&num);

returnnum;

)

voidfunl(DXS*PHEAD,DXS*QHEAD)

{

inte,c;〃定义指数系数

printf("请输入P3中各项的系数和指数\n“);

scanf("%d%d"/&c,&e);

while(c!=0||e!=0)/*若c=0,则代表多项式的输入结束*/

{

DXS*p=(DXS*)malloc(sizeof(DXS));/*申请新的结点*/

p->coef=c;

p->exp-e;

PHEAD->next=p;/*在当前表尾做插入*/

p->next=NULL;/*将表的最终一个结点的next置NULL,以示表结束*/

PHEAD=PHEAD->next;

scanf("%d%d",&c,&e);

)

printf("请输入Q(x)中各项的系数和指数\n");

scanf("%d%d”,&c,&e);

while(c!=0||e!=0)/*若c=0,则代表多项式的输入结束*/

{

DXS*p=(DXS*)malloc(sizeof(DXS));/*申请新的结点*/

p->coef=c;

p->exp=e;

QHEAD->next=p;/*在当前表尾做插入*/

p->next=NULL;/*将表的最终一个结点的next置NULL,以示表结束*/

QHEAD=p;

scanf("%d%d",&c,&e);

)

printf("输入5显示结果\rT);

voidfun2(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)

{

inttemp;

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)

(

irttemp;

temp=p->coef;

p->coef=q->coef;

q->coef=temp;

temp=p->exp;

p->exp=q->exp;

q->exp=temp;

)

)

)

printf("输入5显示结果。\n");

)

voidfun5(DXS*PHEAD,DXS*QHEAD)

(

printf("当前保存的P(x),Q(x)序列如下:\n“);

printf("P(x)=");

while(PHEAD->next!=NULL)

(

PHEAD=PHEAD->next;

printf("%dxA%d",PHEAD->coefzPHEAD->exp);

iffPHEAD->next!=NULL)

printf("+");

)

)

printf("\n");

printf("Q(x)=");

while(QHEAD->next!=NULL)

(

QHEAD=QHEAD->next;

printf("%dxA%d",QHEAD->coef,QHEAD->exp);

iffQHEAD->next!=NULL)

{

printf("+");

)

)

printf("\n\n");

voidfun4(DXS*PHEAD,DXS*QHEAD)

{

intxO;doublesum;

printf("输入x的值:

scanf("%d",&xO);

sum=0;

while(PHEAD->next!=NULL)

(

PHEAD=PHEAD->next;

sum+=PHEAD->coef*pow(xO,PHEAD->exp);

)

printf("P(x)=%.OIf\n"zsum);

sum=0;

while(QHEAD->next!=NULL)

(

QHEAD=QHEAD->next;

sum+=QHEAD->coef*pow(xO,QHEAD->exp);

)

printf("Q(xO)=%.OIf\n\n"zsum);

)

voidfun3(DXS*PHEAD,DXS*QHEAD)//求两个多项式的和差

(

fun2(PHEAD,QHEAD);〃先进行升哥排序

DXS*RHEAD,*THEAD;

RHEAD=(DXS*)malloc(sizeof(DXS));

THEAD=(DXS*)malloc(sizeof(DXS));

RHEAD->next=NULL;

THEAD->next=NULL;

DXS*p=PHEAD,*q=QHEAD;〃多项式相加

DXS*r=RHEAD;

p=p->next;

q=q->next;

while(p!=NULL&&q!=NULL)〃当两个序列都有数值时

(

DXS*t=(DXS*)malloc(sizeof(DXS));

if(p->exp==q->exp)〃指数相同的状况

{

t->coef-p->coef+q->coef;

t->exp=p->exp;

p=p->next;

q=q->next;

)

elseiffp->exp<q->exp)//P的指数小于Q的指数

{

t->coef=p->coef;

t->exp=p->exp;

p=p->next;

)

elseif(p->exp>q->exp)//P的指数大「Q的指数

{

t->coef=q->coef;

t->exp=q->exp;

q=q->next;

)

r->next=t;

r=r->next;

r->next=NULL;

)

while(p!=NULL)〃当只有一个序列有数值时

(

DXS*t=(DXS*)malloc(sizeof(DXS));

t->coef=p-xoef;

t->exp=p->exp;

r->next=t;

r=r->next;

r->next=NULL;

p=p->next;

)

while(q!=NULL)

(

DXS*t=(DXS*)malloc(sizeof(DXS));

t->coef=q->coef;

t->exp=q->exp;

r->next=t;

r=r->next;

r->next=NULL;

q=q->next;

)

r=RHEAD;

printf("R(x)=");

while(r->next!=NULL)

(

r=r->next;

if(r->coef>=0)

(

if(r!=RHEAD->next)

printf("+");

A

printf("%dx%d",r->coef/r->exp);

)

else

printf("-%dxA%d",-l*r->coef,r->exp);

)

printf("\n\n");

p=PHEAD;

q=QHEAD;

DXS*T=THEAD;〃多项式相减

p=p->next;

q=q->next;

while(p!=NULL&&q!=NULL)

(

DXS*t=(DXS*)malloc(sizeof(DXS));

if(p->exp==q->exp)

{

t->coef=p->coef-q->coef;

t->exp=p->exp;

p=p->next;

q=q->next;

)

elseif(p->exp<q->exp)

(

t->coef=p->coef;

t->exp=p->exp;

p=p->next;

)

elseif(p->exp>q->exp)

{

t->coef=-1*q->coef;

t->exp=q->exp;

q=q->next;

)

T->next=t;

T=T->next;

T->next=NULL;

)

while(p!=NULL)

{

DXS*t=(DXS*)malloc(sizeof(DXS));

t->coef=p->coef;

t->exp=p->exp;

T->next=t;

T=T->next;

T->next=NULL;

p=p->next;

)

while(q!=NULL)

(

DXS*t=(DXS*)malloc(sizeof(DXS));

t->coef=-14q->coef;

t->exp=q->exp;

T->next=t;

T=T->next;

T->next=NULL;

q=q->next;

)

T=THEAD;〃消退系数为0项

while(T->next!=NULL)

{

if(T->next->coef==0)

T->next=T->next->next;

)

T=T->next;

iffT==NULL)

break;

)

T=THEAD;

printf("T(x)=");

while(T->next!=NULL)

(

T=T->next;

iffT->coef>=0)

(

if(T!=THEAD->next)

printf("+");

A

printf("%dx%d"/T->coef,T->exp);

)

else

printff"-%dxA%d",-1*T->coef,T->exp);

)

if(THEAD->next==NULL)

printf("O\n");

printf("\n");

)

voidmenu()

(

printf("--------------------------------------------------\n");

printf("l.分别输入Pn(x)和Qn(x)。\n");

printf("2.分别对Pn(x)和Qn(x)进行升基排序。\n");

printf(”3.分别求出Pn(x)和Qn(x)的和差。\n");

printf("4.随意输入一个实数X,分别求出一元多项式Pn(x)和Qn(x)的值。\n");

printf(”5.分别输出上一步运行结果的Pn(x)和Qn(x)o\n");

printf(".............................................................\n");

printf("lfyouwanttoexitthesystem,pleaseinputO.\n");}

intmain()

(

printf("Welcometothemenu~~\n");

menu();

intnum;

num=get();

if(num==0)

printf("\nExitthesystem,goodbye~~\n");

DXS叩HEAD,*QHEAD;

PHEAD=(DXS*)malloc(sizeof(DXS));

QHEAD=(DXS*)malloc(sizeof(DXS));

PHEAD->next=NULL;

QHEAD->next=NULL;

while(num)

(

switch(num)

(

case1:

funl(PHEAD,QHEAD);break;

case2:

fun2(PHEAD,QHEAD);break;

case3:

fun3(PHEAD,QHEAD);break;

case4:

fun4(PHEAD,QHEAD);break;

case5:

fun5(PHEAD,QHEAD);break;

default:

printf("输入错误,请重新输入\n\n)

)

num=get();

if(num==0)

printf("\nExi:thesystem,goodbye!\n");

)

return0;

)

五、调试分析过程描述

1.进入菜单界面,调用功能1完成多项式的输入,再调用功能5显示结果。

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.

输入选择功能对应的数字:1

请输入P(x)中各项的系数和指数

42615300

请输入Q(x)中各项的系数和指数

25748500

输入5显示结果

输入选择功能对应的数字:5

当前保住的P(x)[Q(x)序?如下:

P(x)=4x2+6x1+5x3

Q(x)=2x5+7x4+8x5

输入选择功能对应的数字:

2.调用功能2对多项式进行排序。

输入选择功能对应的数字:2

输入5显示结果。

输入选择功能对应的数字:5

当前保存的P(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论