学号
2016-2017 学年 第二学期
《网络工程》
课程设计报告
题 目 : 用 C 语言设计一元稀疏多项式
专 业 :
网络工程
班 级 :
姓 名 :
指导教师:
成 绩 :
《C 语言课程设计》课程实验报告
一、问题描述 ............................................................................................................................ 3
二、 需求分析 .......................................................................................................................... 3
三、概要设计 ............................................................................................................................ 4
四、详细设计 ............................................................................................................................ 5
五、 源代码.............................................................................................................................. 6
六 、程序测试 .......................................................................................................................... 6
七、 使用说明 ........................................................................................................................ 23
八、 课设总结 ........................................................................................................................ 24
第 2 页 共 23 页
《C 语言课程设计》课程实验报告
一、问题描述
1.1 基本要求
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中
n 是多项式的项数,ci,ei,分别是第 i 项的系数和指数,序列按指数降序排序;
(3)多项式 a 和 b 相加,建立多项式 a+b;
(4)多项式 a 和 b 相减,建立多项式 a-b;
(5)计算多项式在 x 处的值。
(6)计算器的仿真界面。
1.2 设计目的
数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个
强有力手段。课程设计要求学生在完成程序设计的同时能够写出比较规范
的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的
培养和软件工作者工作作风的训练,将起到显著的促进作用
二、 需求分析
2.1 设计开发环境:
软件方面:系统 windows 7
2.2 思路分析:
①一般情况下的一元 n 次多项式可写成
pn(x)=p1xe1+p2xe2+……+pmxem
其中,p1 是指数为 ei 的项的非零系数,且满足 0≦e1
《C 语言课程设计》课程实验报告
三、概要设计
菜单
输入
Insert(
Polyn
p,Poly
n h)
乘法
Multip
lyPoly
n(ma,
mb)
输出
deskto
p()
加法
AddPo
lyn(ma
,mb)
减法
Subtra
ctPoly
n(ma,
mb)
除法
Device
Polyn(
ma,mb
)
求值
ValueP
olyn(
ma,x)
图 3-1 功能模块图
为实现上述程序功能,用带表头结点的单链表存储多项式。元素类型,节
点类型,和指针类型:typedef struct Polynomial{
int coe; //系数
int exp;//指数
第 4 页 共 23 页
《C 语言课程设计》课程实验报告
struct Polynomial *next;
}*Polyn,Polynomial;
各个模块之间的调用如图 3-1 所示,调用 insert()函数将输入的多项式按
降幂排列,通过主函数 main()中 swith 语句,选择用户所选择的对应的
模块,然后又模块对应的功能函数对用户输入的数据进行相应的操作,最
后通过 desktop()模块将最后结果输出。
四、详细设计
开始运行
多项式加法计算器
输入多项式
求和(差)
求积、商
退出
建立2个多项式
多项式相加求和
(差)
多项式求积、商
关闭运行
输出求和(差)
结果
输出结果
按任意键退出
图 4-1 功能实现流程图
4.1 输入模块
用户可通过本模块来输入一个多项式,在每次输入一个多项式时,本
模块会先判断谁否是第一次输入,如果是,创建节点,如果不是则模块会
通过判断本次输入的数的指数与第一项输入的指数的大小,如果第一项的
第 5 页 共 23 页
《C 语言课程设计》课程实验报告
指数较大,则刚输入的这一项继续与第二项比较指数,以此类推,如果发
现刚输入的这一项的指数比比较的这一项的指数要大,则插入比较项的前
面。
4.2 求和、差模块
用户通过本模块可以实现两个多项式的求和或差值,此模块先调用输
入模块,进行对两个要运算的多项式进行初始化,并按降幂排列。然后将
两个多项式的幂进行一个对比,如果第一个数的第一项的系数大于第二个
多项式的第一个项的系数,那么直接将第一项赋值于刚开始创建的链表的
第一项,作为答案的最后一项,反之亦然,如果第一个数的第一项,与第
二个数的第一项的系数相同,那么将两个数的系数与指数分别相加或者相
减并将对应值赋值给答案相对应的项。以此类推。最后有输出模块输出最
后答案。
4.3 求积、商模块
用户可通过该模块实现两个多项式的相乘(相除),此模块先调用输
入模块,进行对两个要运算的多项式的初始化,并按降幂排列。然后将第
一个数的系数、指数与第二个数的系数、指数分别相乘(相除),相加(相
减),并且赋值给答案相应的系数、指数。完成后执行第一个数的第一项
与第二个数的第二项进行相应的操作…….执行完之后最后调用输出模块将
结果输出到屏幕上。
4.4 求值模块
用户可通过此模块实现多项式的求值,此模块调用输入模块,完成相
对应的操作,然后需要用户输入此时变量的值,并且将变量的值赋值给变
量,最后将答案通过输出模块输出到屏幕上。
#include
#include
#include
#include
#define maxlen 10
#define large 999
五、 源代码
第 6 页 共 23 页
《C 语言课程设计》课程实验报告
typedef struct Linklistomial{
float coef;
int expn;
struct Linklistomial *next;
}Linklistomial,*Linklist;
void Insert(Linklist p,Linklist h){
if(p->coef==0) free(p);//系数为 0 的话释放结点
else
{
Linklist 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;
}
}
}
}
}
}
Linklist CreateLinklist(Linklist head,int m){
//建立一个头指针为 head、项数为 m 的一元多项式
int i;
第 7 页 共 23 页
《C 语言课程设计》课程实验报告
Linklist p;
p=head=(Linklist)malloc(sizeof(struct Linklistomial));
head->next=NULL;
for(i=0;icoef,&p->expn);
Insert(p,head);
//调用 Insert 函数插入结点
}
}
return head;
void DestroyLinklist(Linklist p){
//销毁多项式 p
Linklist q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next; }
}
void PrintLinklist(Linklist P){
Linklist 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);
第 8 页 共 23 页