课程设计报告.docx
- 文档编号:28213444
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:34
- 大小:412.40KB
课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(34页珍藏版)》请在冰豆网上搜索。
课程设计报告
课程设计报告
学院:
课程名称:
专业班级:
学生姓名:
学号:
目录
1一元稀疏多项式计算器3
1.2实验内容3
1.3概要设计3
1.4调试分析5
1.5源程序代码6
2哈夫曼编/译码器6
2.1概述9
2.2实验内容9
2.3概要设计10
2.4调试分析11
2.5源程序代码13
3图的基本操作与实现19
3.1概述19
3.2实验内容19
3.3概要设计19
3.4调试分析21
3.5源程序代码22
《数据结构》课程设计评分表26
1一元稀疏多项式计算器
1.1概述
为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元素
使用语言:
C语言
编译环境:
VC++6.0
1.2实验内容
1、问题描述
设计一个一元稀疏多项式简单计算器。
基本要求:
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,c1,e1,分别是第i项的系数和指数,序数按指数降序排序;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b;
(5)计算多项式在x处的值;
(6)计算器的仿真界面(选做)。
2、需求分析
(1)输入的形式和输入值的范围:
输入是从键盘输入的,输入的内容为多项式的系数和指数,数为任意的整数,指数为大于等于0的整数
(2)输出的形式
从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值。
(3)程序所能达到的功能
a:
输入并建立多项式;
b:
输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
c:
多项式a和b相加,建立多项式a+b;
d:
多项式a和b相减,建立多项式a-b;
e:
多项式的输出形式为类数学表达式;
f:
系数值为1的非零项的输出形式中略去系数1,而-1x的输出形式为-x。
1.3概要设计
1、存储结构
typedefstructPolynomial
{floatcoef;intexpn;structPolynomial*next;
}*Polyn,Polynomial;
该结构体用以存放第i项的系数和指数和下一个指针,以链栈为基础。
2、函数
PolynCreatePolyn(Polynhead,intm)
该函数用于建立一个头指针为head,项数为m的一元多项式
voidDestroyPolyn(Polynp)该函数用于销毁多项式
voidPrintPolyn(PolynP)该函数用于输出多项式a
PolynAddPolyn(Polynpa,Polynpb)
该函数用于求解并建立多项式a+b,返回其头指针
PolynSubtractPolyn(Polynpa,Polynpb)
该函数用于求解并建立多项式a-b,返回其头指针
floatValuePolyn(Polynhead,intx)
该函数用于输入x值,计算并返回多项式的值
intcompare(Polyna,Polynb)该函数用于比较a和b的指数
3、流程图
1.4调试分析
1、问题分析
2、运行结果
1.5源程序代码
#include
#include
typedefstructPolynomial{floatcoef;intexpn;structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){if(p->coef==0)free(p);else{Polynq1,q2;q1=h;q2=h->next;while(q2&&p->expn
if(q2&&p->expn==q2->expn){q2->coef+=p->coef;free(p);
if(!
q2->coef){q1->next=q2->next;free(q2);}}else{p->next=q2;q1->next=p;}}}
PolynCreatePolyn(Polynhead,intm){
inti;Polynp;p=head=(Polyn)malloc(sizeof(structPolynomial));head->next=NULL;
for(i=0;i printf("请输入第%d项的系数与指数,用空格隔开: ",i+1); scanf("%f%d",&p->coef,&p->expn);Insert(p,head);}returnhead;} voidDestroyPolyn(Polynp){Polynq1,q2;q1=p->next;q2=q1->next;while(q1->next){free(q1);q1=q2;q2=q2->next;}} voidPrintPolyn(PolynP){Polynq=P->next;intflag=1; if(! q){putchar('0');printf("\n");return;}while(q){if(q->coef>0&&flag! =1)putchar('+');if(q->coef! =1&&q->coef! =-1){printf("%g",q->coef); if(q->expn==1)putchar('X');elseif(q->expn)printf("X^%d",q->expn);} else{if(q->coef==1){if(! q->expn)putchar('1'); elseif(q->expn==1)putchar('X');elseprintf("X^%d",q->expn);} if(q->coef==-1){if(! q->expn)printf("-1");elseif(q->expn==1)printf("-X"); elseprintf("-X^%d",q->expn);}}q=q->next;flag++;}printf("\n");} intcompare(Polyna,Polynb){if(a&&b){ if(! b||a->expn>b->expn)return1;elseif(! a||a->expn return-1;elsereturn0;}elseif(! a&&b)return-1;elsereturn1;} PolynAddPolyn(Polynpa,Polynpb){ Polynqa=pa->next;Polynqb=pb->next;Polynheadc,hc,qc; hc=(Polyn)malloc(sizeof(structPolynomial));hc->next=NULL;headc=hc; while(qa||qb){qc=(Polyn)malloc(sizeof(structPolynomial)); switch(compare(qa,qb)){ case1: {qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;} case0: {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;}}if(qc->coef! =0) {qc->next=hc->next;hc->next=qc;hc=qc;}elsefree(qc);}returnheadc;} PolynSubtractPolyn(Polynpa,Polynpb){ Polynh=pb;Polynp=pb->next;Polynpd;while(p) {p->coef*=-1;p=p->next;}pd=AddPolyn(pa,h); for(p=h->next;p;p=p->next)p->coef*=-1;returnpd;} floatValuePolyn(Polynhead,intx){Polynp;inti,t;floatsum=0; for(p=head->next;p;p=p->next){t=1;for(i=p->expn;i! =0;){if(i<0){t/=x;i++;}else{t*=x;i--;}}sum+=p->coef*t;}returnsum;} PolynMultiplyPolyn(Polynpa,Polynpb) {Polynhf,pf;Polynqa=pa->next;Polynqb=pb->next; hf=(Polyn)malloc(sizeof(structPolynomial));hf->next=NULL; for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){ pf=(Polyn)malloc(sizeof(structPolynomial));pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn;Insert(pf,hf);}}returnhf;} voidmain(){intm,n,a,x,f,k=1;Polynpa=0,pb=0,pc;while(k! =0){ printf("请输入a的项数: ");scanf("%d",&m);pa=CreatePolyn(pa,m); printf("请输入b的项数: ");scanf("%d",&n);pb=CreatePolyn(pb,n); printf("*1: 输出多项式a2: 输出多项式b\n"); printf("*3: 代入x的值计算a4: 代入x的值计算b\n"); printf("*5: 输出a+b6: 输出a-b\n"); printf("*7: 输出a*b0: 退出\n"); while(a){printf("\n请选择操作: ");scanf("%d",&f);switch(f){ case1: {printf("\n多项式a=");PrintPolyn(pa);break;} case2: {printf("\n多项式b=");PrintPolyn(pb);break;} case3: {printf("输入x的值: x=");scanf("%d",&x); printf("\nx=%d时a=%.3f\n",x,ValuePolyn(pa,x));break;} case4: {printf("输入x的值: x=");scanf("%d",&x); printf("\nx=%d时b=%.3f\n",x,ValuePolyn(pb,x));break;} case5: {pc=AddPolyn(pa,pb);printf("\na+b=");PrintPolyn(pc);break;} case6: {pc=SubtractPolyn(pa,pb);printf("\na-b=");PrintPolyn(pc);break;} case7: {pc=MultiplyPolyn(pa,pb);printf("\na*b=");PrintPolyn(pc);break;} case0: {DestroyPolyn(pa);DestroyPolyn(pb);a=0;break;} default: printf("\n您的选择错误,请重新择! \n");}}}} 2哈夫曼编/译码器 2.1概述 本课程设计用于建立哈夫曼树,对其进行编码、译码以及打印。 使用语言: C语言 编译环境: VC++6.0 2.2实验内容 1、问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。 但是,这要求在发送端通过一个编码系统对待传输数据预先编码;在接受端将传来的数据进行译码(复原)。 对于双工信道(即可以双向传输信息的通道),每端都需要一个完整的编/译码系统。 试为这样的信息站写一个哈夫曼的编译码系统。 基本要求: (1)初始化。 从终端读入字符集大小n及n个字符和m个权值,建立哈夫曼树,并将它存于文件中。 (2)编码。 利用已建立好的哈夫曼树(如不在内存,则从文件中的正文进行编码,然后将结果存入文件中。 ) (3)解码。 利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。 (4)打印哈夫曼树。 将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将字符形式的哈夫曼树写入文件中。 2、需求分析 (1)初始化: 输入一串字符,计算不同的字符出现的频率,根据(以该种字符出现的次数作为其出现频率),根据权值建立哈夫曼树,输出每一种字符的哈夫曼编码。 (2)利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。 (3)对于得到的一串编码,利用已求得得哈夫曼编码进行译码,将译出的正文输出。 (4)以树的形式输出哈夫曼树。 2.3概要设计 1、存储结构 typedefstructnode1 { datatyped[MAX]; intweight[MAX]; intlen;//长度 }nodes; 该结构体定义了两个数组,分别用以存放哈夫曼树的关键字和权值,另外还定义了哈夫曼树权值的长度。 typedefstructnode2 { datatypedata; intquan; structnode2*lchild,*rchild,*next; }Node; 该结构体用以存放哈夫曼树的关键字、权值、左孩子、右孩子、以及下一个指针,以链栈为基础。 2、函数 nodes*sort(nodes*s)该函数用以权值排序 voidprint(nodes*s)该函数用以打印出字符统计以及对应的权值 nodes*keyinsert(nodes*n,chartxt[100]) 该函数用以统计从键盘输入的一串字符 Node*buildlinks(Node*head) 该函数用以建立单链表存储从键盘输入的一串字符 Node*readkeybords(Node*head,chartxt[100]) 该函数用以从键盘输入一串字符 Node*readfile(Node*head,chartxt[100])该函数用以从文件读取一段字符串 Node*insert(Node*head,Node*s)该函数用以从哈夫曼树中插入一个节点 Node*creathuffman(linknode*head) Node*buid_hafumantree(Node*root,chartxt[100]) 两个函数用以建立一棵哈夫曼树 intbinary(Node*p,charch) voidmain_binary(Node*root)该函数用于哈夫曼树编码并保存到文件中, charonlydecode(Node*head,charyima[100]) voiddecoding(Node*root,charyima[100])该函数用以哈夫曼树译码 voidprintleaf(Node*p)该函数用以打印哈夫曼树 3、流程图 2.4调试分析 1、问题分析 (1)一开始调试时发现不少小问题,如某变量缺少定义,函数调用位置出错,通过输出结果调试,基本错误已改正。 2、运行结果 2.5源程序代码 #include #include #include typedefchardatatype; #defineMAX100charbin[500];intnum=0;inttop1=-1;intmm=10; typedefstructnode1{datatyped[MAX];intweight[MAX];intlen;}nodes; typedefstructnode2{datatypedata;intquan; structnode2*lchild,*rchild,*next;}Node; typedefNode*linknode;nodes*n;Node*init(Node*head){returnNULL;} nodes*sort(nodes*s){inti,j;datatypetemp1;inttemp2; for(i=0;i<=s->len-2;i++)for(j=i+1;j<=s->len-1;j++){ if(s->weight[i]>s->weight[j]){temp1=s->d[i]; s->d[i]=s->d[j];s->d[j]=temp1;temp2=s->weight[i]; s->weight[i]=s->weight[j];s->weight[j]=temp2;}}returns;} voidprint(nodes*s){inti; for(i=0;i nodes*keyinsert(nodes*n,chartxt[100]){inti=0,j=0,k,m=0,v,leng; datatypec;charp,filename[10];FILE*fp; n=(nodes*)malloc(sizeof(nodes)); printf("\t请输入一串字符: ");gets(txt);leng=strlen(txt); printf("\t字符串的长度: %d\n",leng); for(k=0;k for(k=0;k n->weight[m]=n->weight[m]+1;m++; elsefor(v=0;v if(n->d[v]==txt[k]){n->weight[v]=n->weight[v]+1;break;}}; if(v==m){n->d[m]=txt[k];n->weight[m]=n->weight[m]+1;m++;}} n->len=m;n=sort(n); printf("\t是否要保存文件(输入y代表是,输入其他代表否): "); scanf("%c",&p);c=getchar(); if(p=='y'){printf("\t请输入要保存的文件名: ");scanf("%s",filename); fp=fopen(filename,"w");fprintf(fp,"%s",txt);fclose(fp)}returnn;} Node*buildlinks(Node*head){ Node*p=NULL,*q=head;intj=0; p=(Node*)malloc(sizeof(Node));p->data=n->d[j];p->quan=n->weight[j]; p->lchild=p->rchild=NULL; while(j if(head==NULL)head=p;elseq->next=p;q=p;p=(Node*)malloc(sizeof(Node)); p->data=n->d[j];p->quan=n->weight[j];p->lchild=p->rchild=NULL;} if(head! =NULL)q->next=NULL;returnhead;} Node*readkeybords(Node*head,chartxt[100]){n=keyinsert(n,txt); printf("\t统计字符权值为: \n");print(n);head=buildlinks(head);returnhead;} Node*readfile(Node*head,chartxt[100]){ inti=0,m=0,v,k,leng;FILE*fp;charfilename[10];n=(nodes*)malloc(sizeof(nodes)); printf("\t请输入要读出的文件名: ");scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL){printf("can'topenfile! \n");exit(0);} fscanf(fp,"%s",txt);fclose(fp);leng=strlen(txt); for(k=0;k for(k=0;k n->weight[m]=n->weight[m]+1;m++;} elsefor(v=0;v if(n->d[v]==txt[k]){n->weight[v]=n->weight[v]+1;break;}}; if(v==m){n->d[m]=txt[k];n->weight[m]=n->weight[m]+1;m++;}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告