杭电-数据结构课程设计报告模板(内附C代码)

上传人:B**** 文档编号:59154383 上传时间:2022-03-01 格式:DOC 页数:84 大小:1.10MB
收藏 版权申诉 举报 下载
杭电-数据结构课程设计报告模板(内附C代码)_第1页
第1页 / 共84页
杭电-数据结构课程设计报告模板(内附C代码)_第2页
第2页 / 共84页
杭电-数据结构课程设计报告模板(内附C代码)_第3页
第3页 / 共84页
资源描述:

《杭电-数据结构课程设计报告模板(内附C代码)》由会员分享,可在线阅读,更多相关《杭电-数据结构课程设计报告模板(内附C代码)(84页珍藏版)》请在装配图网上搜索。

1、.数据结构课程设计报告学院专业:软件工程班级:学号:学生姓名:指导老师:彭伟民日期:专业资料.目录1猴子吃桃子问题 .31.1需求分析 .31.2程序设计思想 .31.3程序源代码 .31.4程序运行结果 .72进制数转化问题 .72.1需求分析 .82.2程序设计思想 .82.3程序源代码 .82.4程序运行结果 .113长整数运算 .123.1需求分析 .123.2程序设计思想 .123.3程序源代码 .123.4程序运行结果 .204学生成绩管理系统 .214.1需求分析 .214.2程序设计思想 .224.3程序源代码 .224.4程序运行结果 .355哈夫曼编码应用 .375.1需求

2、分析 .375.2程序设计思想 .385.3程序源代码 .385.4程序运行结果 .416学校超市选址问题 .436.1需求分析 .436.2程序设计思想 .436.3程序源代码 .436.4程序运行结果 .507学生成绩管理系统 .517.1需求分析 .517.2程序设计思想 .517.3程序源代码 .517.4程序运行结果 .628排序综合 .648.1需求分析 .648.2程序设计思想 .658.3程序源代码 .668.4程序运行结果 .819课程设计总结 .82专业资料.1 猴子吃桃子问题1.1需求分析有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第 10 天就只

3、余下一个桃子。 用多种方法实现求出原来这群猴子共摘了多少个桃子。1.2 程序设计思想已知第十天只余下1 个桃子,第一天开始每天都吃当前桃子一半再多一个,那么就只需要从第十天开始倒推即可,用链表、数组、递推、常规方法都可以采用这种思路实现计算第一天桃子数量。1.3 程序源代码#includeusing namespace std;/ 有一群猴子摘了一堆桃子, 他们每天都吃当前桃子的一半且再多吃一个,到了第 10 天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。/ 链表方法实现typedef structint *base;int *top;Stack;void InitSta

4、ck(Stack &s)s.base=(int *)malloc(sizeof(int);专业资料.if(s.base) s.top=s.base;elseprintf( 空间分配错误! n);exit(0);/ 入栈void PushStack(Stack &s,int data)*s.top+=data;/ 出栈int PopStack(Stack &s)return *(-s.top);int main()int peach=0;专业资料.void shuZu();int digui(int i,int j);int changgui();shuZu();peach=digui(1,1)

5、;cout 递归方法实现结果: peach1)data=PopStack(s);/ 出栈一个元素保存在data 中PushStack(s,2*(data+1);/ 再将 2*(data+1) 入栈/ 最后栈中剩余的那个元素就是第 1 天摘的桃子数cout 链表方法实现结果: PopStack(s)endl;专业资料.cout 常规方法实现结果: changgui()=0;i-)peachi=(peachi+1+1)*2;cout 数组方法实现结果: peach0endl;int digui(int i,int j)/ 递归方法实现static int peach=i;static int da

6、y=j;if (day=10)return peach;专业资料.else peach=(digui(peach,+day)+1)*2;return peach;int changgui()int peach = 1;for (int i = 1; i 10; i+)peach = (peach+1)*2;return peach;1.4 程序运行结果2 进制数转化问题专业资料.2.1 需求分析任意给定一个 M 进制的数 x ,请实现如下要求1) 求出此数 x 的 10 进制值(用 MD 表示)2) 实现对 x 向任意的一个非 M 进制的数的转换。3) 至少用两种或两种以上的方法实现上述要求(

7、用栈解决,用数组解决,其它方法解决)2.2 程序设计思想假如 N 为输入的数, n 为要转换为的进制,若要将十进制231 转换为 8 进制数,过程如下 ;NN/nN%n2312872834303则输出为 347 ,可以看出,首先得到的应该是7,然后才是 4,最后是 3,但是要逆序显示,自然就类似压栈出栈的数据结构了。所以,只需要初始化栈后, 将 N%n 不断的压入栈底, 需要注意的是如果要转换为 16 进制,则需要对大于9 的数字作字符处理。2.3 程序源代码#include #include #include #include 专业资料.void TransIntoDec(double M,

8、 int X)void TransIntoAny(int X);char *p = NULL;int len = 0;int i;int sum = 0;int by = 1;printf( 十进制数为 : );p = (char*)malloc(32);itoa(X, p, 10);len = strlen(p);for(i = 0; i len; i+)by *= pow(M,len-i-1);by *= (*(p + i) - 0);sum += by;by = 1;printf(%dn, sum);TransIntoAny(sum);void TransIntoAny(int X)专业

9、资料.int r;int temp32;int i = 0;printf( 请输入转化进制: n);scanf(%d, &r);while(X)tempi+ = X % r;X /= r;printf( 经转化为 : );while(i)printf(%d, temp-i);printf(n);void main()int m;int x;int i;专业资料.int length;char* p = NULL;printf( 请输入数字及确定其进制:n);scanf(%d %d, &m, &x);p = (char*)malloc(32);itoa(x, p, 10);length = st

10、rlen(p);for(i = 0; i m)break;if(i = length)TransIntoDec(m, x);elseprintf(Input errorn);return;2.4 程序运行结果专业资料.3 长整数运算3.1 需求分析设计一个程序实现两个任意长的整数求和运算。提示:可利用双项循环链表实现长整数的存储,每个结点含一个整型变量。3.2 程序设计思想定义双链表的节点结构,每个节点存储一个4 位的数,比如 1,0031,0056存入链表后就是 1,31,56 三个节,输出的时候再补0 输出,由此完成长整数加法或减法运算。3.3 程序源代码#include #include

11、 #include / 以下是双链表的节点结构,每个节点存储一个4 位的数,比如1,0031,0056 存入链表后就是1,31,56 三个节,输出的时候再补0 输出!typedef struct nodeint n;专业资料.struct node *next;struct node *prev; node; node *p;char num11024,num21024;int conv(char *a)int n=0,i;for(i=0;ai;+i)n*=10;n+=(ai-0);return n;int main()char c2;int i,f;node *q;专业资料.p=(node*

12、)malloc(sizeof(node);p-next=p-prev=0;q=p;num10=num20=,;printf( 请输入第一个数字 :n);scanf(%s,num1+1);for(i=strlen(num1);i=0;-i)if(num1i=,)num1i=0;q-next=(node*)malloc(sizeof(node);q-next-prev=q;q-next-next=0;q=q-next;q-n=conv(num1+i+1);q-next=p;p-prev=q;printf( 请输入运算符号 :n);scanf(%s,c);专业资料.*c=*c=+?0:1;print

13、f( 请输入第二个数字 :n);scanf(%s,num2+1);q=p;f=0;if(!*c) /+for(i=strlen(num2);i=0;-i)if(num2i=,)num2i=0;if(q-next=p)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=0;p-prev=q-next;q=q-next;q-n+=(conv(num2+i+1)+f);if(q-nn-=10000;if(f)if(q-next=p)q-next=(node*)malloc(sizeof(node);q-next

14、-next=p;q-next-prev=q;q-next-n=1;elsewhile(q-next!=p)q=q-next;专业资料.q-n+=1;if(q-nn=0;f=1;if(f)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=1;printf(%d,p-prev-n);专业资料.for(q=p-prev-prev;q!=p;q=q-prev)printf(%04d,q-n);else /-for(i=strlen(num2);i=0;-i)if(num2i=,)num2i=0;if(q-nex

15、t=p)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=0;p-prev=q-next;q=q-next;q-n-=(conv(num2+i+1)+f);if(q-n=0)f=0;专业资料.elsef=1;q-n+=10000;if(f)if(q-next=p)q-n-=10000;elsewhile(q-next!=p)q=q-next;q-n-=1;if(q-n=0)f=0;专业资料.break;elseq-n+=10000;f=1;if(f)q-n-=10000;printf(%d,p-prev

16、-n);for(q=p-prev-prev;q!=p;q=q-prev)printf(%04d,q-n);return 0;3.4 程序运行结果专业资料.4 学生成绩管理系统4.1 需求分析现有学生成绩信息文件1( 1.txt),内容如下(数据可以自拟)姓名学号语文数学英语张明明01677882李成友02789188张辉灿03688256王露04564577陈东明05673847.学生成绩信息文件2 (2.txt ),内容如下 :姓名学号语文数学英语陈果31576882李华明32889068张明东33484256李明国34504587专业资料.陈道亮35475877.试编写一管理系统,要求如下

17、:1) 实现对两个文件数据进行合并,生成新文件3.txt2) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt3) 对合并后的文件 3.txt 中的数据按总分降序排序 (至少采用两种排序方法实现 )4) 输入一个学生姓名后 ,能查找到此学生的信息并输出结果 (至少采用两种查找方法实现 )5) 要求使用结构体,链或数组等实现上述要求。4.2 程序设计思想建立学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成后或者在相应的命令后再将学生信息保存到文本文档中。数据类型主要是c

18、har、int 、float 等数据类型,内容包括学号、姓名等数据。4.3 程序源代码#include#include#includeusing namespace std;专业资料.char top50; /成绩文件顶部的标题用top 保存typedef struct student / 单个学生成绩的记录char name10; / 姓名int number; / 学号int chinese; / 语文int math; / 数学int english; / 英语struct student *next;student,*gradelist;gradelist fileread(char

19、*adress) / 读取成绩文件FILE * fp;if(fp=fopen(adress,r)=NULL) /打开文件printf( 文件打开出错 );exit(0);gradelist file=(student *)malloc(sizeof(student); /申请空间file-next=NULL;student * p=file; /操作指针int n=0; /循环标记,具体作用是在第一次循环时方便处理标题while(!feof(fp) if(n=0) 专业资料.fgets(top,50,fp); /处理标题,并且文件指针移到第二行if(n=1) /申请空间p-next=(stud

20、ent *)malloc(sizeof(student);p=p-next;p-next=NULL;fscanf(fp,%s%d%d%d%d,p-name,&p-number,&p-chinese,&p-math,&p-english); /将文件的数据输入到链表中n=1;if(fclose(fp)/ 关闭文件printf( 文件关闭失败 );exit(0);return file;void FilePrint(gradelist file)/将成绩文件打印到屏幕上student *p=file;专业资料.printf(%sn,top); /打印标题while(p-next!=NULL) pr

21、intf(%6s %2d %d %d %dn,p-name,p-number,p-chinese,p-math,p-english); /循环打印p=p-next;void merger() / 合并文件char *address1=F:/1.txt,*address2=F:/2.txt,*address3=F:/3.txt;gradelist file1=fileread(address1),file2=fileread(address2);FILE *fp;if(fp=fopen(F:3.txt,w+)=NULL) / 先新建一个3.txt ,然后将 1.txt 和 2.txt 的内容输入

22、到里面printf( 合并成绩文档失败,原因:建立文档出错);exit(0);student *p1=file1,*p2=file2;fprintf(fp,%s,top); /先输入标题while(p1-next!=NULL) 专业资料.fprintf(fp,%6s %2d %d %d %dn,p1-name,p1-number,p1-chinese,p1-math,p1-english); /输入 1.txtp1=p1-next;while(p2-next!=NULL) fprintf(fp,%6s %2d %d %d %dn,p2-name,p2-number,p2-chinese,p2-

23、math,p2-english); /输入 2.txtp2=p2-next;if(fclose(fp) printf( 文件关闭失败 );exit(0);void extract() /抽取补考的成绩记录char * address4=F:/4.txt,*address3=F:/3.txt;FILE *fp;if(fp=fopen(F:/4.txt,w+)=NULL) /新建文件 4.txtprintf( 抽取补考学生成绩记录建立新文件失败);专业资料.exit(0);gradelist file3=fileread(address3);student *p=file3;fprintf(fp,

24、%s,top); /先输入标题while(p-next!=NULL) if(p-chinese)math)english)name,p-number,p-chinese,p-math,p-english);p=p-next;if(fclose(fp) printf( 文件关闭失败 );exit(0);void sort(int i) char * address3=F:/3.txt;专业资料.gradelist file3=fileread(address3); /先将 3.txt 读入链表student *p=file3;if(remove(F:/3.txt) /由于排序后的内容也要保存到3

25、.txt ,故删除 3.txtprintf( 删除文件出错 );exit(0);int n=0; /学生个数FILE *fp;if(fp=fopen(F:/3.txt,w+)=NULL) /新建一个空的3.txtprintf( 新建文件出错 );exit(0);fprintf(fp,%s,top); /标题先输入while(p-next!=NULL) n+;p=p-next;typedef structint totalgrade;char name10;专业资料.int number;int chinese;int math;int english;gradenote; / 成绩记录type

26、def struct gradenote r100; /只初始化了 100 了空间,学生人数超过100 就不能了,懒得动态分配了grade_list; / 待排序成绩表 grade_list L;p=file3;int t,k,j,k1,j1;for(t=1;tnext) /将链表的内容复制到结构数组里strcpy(L.rt.name,p-name);L.rt.number=p-number;L.rt.chinese=p-chinese;L.rt.math=p-math;L.rt.english=p-english;L.rt.totalgrade=p-chinese+p-math+p-engl

27、ish;专业资料.if(i=1)/ 直接插入排序for(k=2;k=n;+k) if(L.rk.totalgradeL.rk-1.totalgrade) L.r0=L.rk;L.rk=L.rk-1;for(j=k-2;L.r0.totalgradeL.rj.totalgrade;-j) L.rj+1=L.rj;L.rj+1=L.r0;if(i=2)int m;for(k1=2;k1=n;+k1) L.r0=L.rk1;int low=1,high=k1-1;while(low=high) m=(low+high)/2;专业资料.if(L.r0.totalgrade=high+1;-j1)L.r

28、j1+1=L.rj1;L.rhigh+1=L.r0;int q;for(q=n;q=1;q-)/将排序好的内容输入到3.txtfprintf(fp,%6s %2d %d %d %dn,L.rq.name,L.rq.number,L.rq.chinese,L.rq.math,L.rq.english);if(fclose(fp) printf( 文件关闭失败 );exit(0);专业资料.void search(char *name) / 按姓名查找gradelist file=fileread(F:/3.txt);student * p=file;while(p-next!=NULL) if(strcmp(name,p-name)=0) printf(%6s %2d %d %d %dn,p-name,p-number,p-chinese,p-math,p-english);return;p=p-next;printf( 查无此人 , 请确定名字输入正确 n);exit(0);void main(void)int chioce;gradelist file1=fileread(F:/1.txt),file2=fileread(F:/2.txt);printf( 现有成绩记录文件1n);printf(*专业资料.*n);FilePrint(file1);printf(*

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!