数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序_第1页
数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序_第2页
数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序_第3页
数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序_第4页
数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、上海应用技术学院课程设计报告课程名称 数据结构课程设计 设计题目 数据结构课程设计 院系 计算机科学与信息工程学院 专业游戏软件制作与开发 班级 姓名 学号 指导教师 日期 2016-1-14 一. 目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力二. 课程设计内容说明1. 项目一(1) 对设计任务内容的概述实现十进制数n和二进制数之间的转换。(2) 需求分析或功能描述输入相应的各式正确的数值(可以是混合小数的形式

2、),程序按照设定的算法执行后,给出相对应的进制数数值,对于输入数据的合法性可以不做检查。采用栈。(3) 概要设计或程序流程图内容:利用栈实现十进制和其他任意进制数的任意转换输出问题进制转换原理:n=(ndivd)*d+nmodd(其中:div为整除运算,mod为求余运算)步骤:1定义栈数据类型,采用链式存储结构实现2链栈基本操作函数原型声明3初始化栈4输入栈5输出栈6判空栈7自定义实现进制转换函数8数据调试9程序结束开始创建栈数制转换函数输出结果(4) 详细设计或源代码说明#define stack_init_size 100 /存储空间初始分配量 #define stackincrement

3、 10 /存储空间分配增量 #define error 0 #define overflow -2 #include #include#include #include #include #includemath.h typedef int selemtype; typedef struct selemtype *base;/ 在栈构造之前和销毁之后,base 的值为null selemtype *top;/ 栈顶指针 int stacksize; /当前已分配的存储空间,以元素为单位 sqstack1; void initstack(sqstack1 *s) /初始化栈 s-base =(s

4、elemtype*)malloc (stack_init_size * sizeof(selemtype); if(!s-base) exit(overflow); s-top=s-base; s-stacksize= stack_init_size; void push(sqstack1 *s,selemtype e) / 输入栈 if (s-top-s-base=s-stacksize) s-base=(selemtype *) realloc (s-base,(s-stacksize+stackincrement)*sizeof(selemtype); /栈满,追加存储空间 if(!s-

5、base) exit(overflow); /若内存中没有s-stacksize+stackincrement个连续空间则分配失败 s-top=s-base+s-stacksize; s-stacksize+=stackincrement; *s-top+ =e; int pop(sqstack1 *s,selemtype *e) /输出栈 if (s-top=s-base) return error;s-top=s-top-1; *e = *s-top; int stackempty(sqstack1 s) /判空栈 if (s.top =s.base) return 1; else ret

6、urn 0; void conversion(int n,int m) selemtype e; sqstack1 s; initstack(&s); while(n) push(&s,n%m); n= n/m; printf(转换后的%d进制数为:,m); while(stackempty(s)!=1) pop(&s,&e); if(e=10) printf(%c,e-10+a); else printf(%d,e); printf(n); void squnion() int n,m; printf(请输入一个十进制数: ); scanf(%d,&n); printf(需要转成的进制m:)

7、; scanf(%d,&m); conversion(n,m); void linkunion() int a,i,k=-1,y=0; printf(n 请输入一个正确的二进制数:); scanf(%d,&a); printf(n%d十进制为:,a); while(a!=0) i=a%10; k+; y+=i*pow(2,k); a=a/10; printf(%dn,y); void list1()int i,flag=1,k;while(flag)printf(*n); printf(t1:十进制转换为任意进制n); printf(t2:二进制转换为十进制n);printf(t0:返回n);

8、printf(t请选择:n); printf(*n); while (true)scanf(%d,&i);if (i=0 & i=2)break;elseprintf(请选择0-2:n);switch (i)case 1:squnion();break;case 2:linkunion() ;break;case 0:flag=0;break;(5) 程序模块及其接口描述void initstack(sqstack1 *s) /初始化栈 void push(sqstack1 *s,selemtype e) / 输入栈 int pop(sqstack1 *s,selemtype *e) /输出栈

9、int stackempty(sqstack1 s) /判空栈 void conversion(int n,int m) 功能是:将十进制转换为其他进制void linkunion() 功能是:将二进制转换为十进制(6) 程序的输入与输出描述输入要求的整数输出二进制(7) 调试分析或程序测试 在主界面中选择“1”进入进制转换子界面在子界面中选择“1”进入十进制转换为其他进制的测试,输入:99,转换为二进制,得出:1100011在子界面中选择“2”,进行二进制转换为十进制测试。测试结果如下:输入“0”,正常返回主界面。(8) 尚未解决的问题或改进方向未完善的问题:不能由二进制直接转换为任意进制;

10、在十进制转换过程中不能输入小数。改进方向:界面美化;调整程序,使其可以输入小数。(9) 对软件的使用说明根据界面提示选择需要的操作,输入整数,注意二进制只包含“1”“0”。2. 项目二(1) 对设计任务内容的概述任务:要求实现对学生资料的录入、浏览、插入和删除等功能。输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩。存储结构:采用线性链式结构。(2) 需求分析或功能描述管理系统中有五个要求:输入 查找 修改 插入 删除 存储 输入要求:能够通过键盘输入和文件输入两种查找要求:能够根据学生号查找单个学生的信息,也可以遍历所有学生信息修改要求:能够根据学生号修改单个学

11、生所有信息插入要求:能够实现头插和尾插删除要求:能够根据学生号删除单个学生信息存储要求:通过链表存储所有信息(3) 概要设计或程序流程图首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等; 其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能; 最后,编写主函数对每个实现进行按需调用,实现操作。(4) 详细设计或源代码说明#include #include #include struct student char name10; char subject10; int num; int grade; student

12、*next; ; void stumain(); /学生成绩管理系统的主函数,由main函数调用 void stuinput(student *); /学生成绩管理系统的输入函数,由主函数调用 void stuselect(student *); /学生成绩管理系统的查找函数,由主函数调用 void stualter(student *); /学生成绩管理系统的修改函数,由主函数调用 void stuinsert(student *); /学生成绩管理系统的插入函数,由主函数调用 void studelect(student *); /学生成绩管理系统的删除函数,由主函数调用 void stu

13、save(student *); /学生成绩管理系统的存储函数,由主函数调用 void stuoutput(student *p); /输出函数 int stuimport(student *head,student *p); /输入函数 void stuoutput(student *p) /打印函数,将链表的该节点信息输出 printf(学生姓名:); printf(%s ,p-name); printf(学生号:); printf(%d ,p-num); printf(科目: ); printf(%s ,p-subject); printf(学生成绩:); printf(%d n,p-g

14、rade); int stuimport(student *head,student *p) student *opinion=(student *)malloc(sizeof(student); /用来判断输入节点中学生号是否有重复 opinion=head-next; printf(学生姓名:n); scanf(%s,p-name); printf(学生号:n); scanf(%d,&p-num); printf(科目:n); scanf(%s,p-subject); if(opinion!=null) if(opinion-num=p-num&!strcmp(opinion-subjec

15、t,p-subject) printf(该学生这门科目已有成绩,请重新输入n); return 1; opinion=opinion-next; printf(学生成绩:n); scanf(%d,&p-grade); return 0; void list2() stumain(); void stumain() char decide=y; /定义while变量,函数是否继续进行 int num=1; /定义switch变量,函数跳转到哪个子函数 student *head; /定义链表的头指针 head=(student *)malloc(sizeof(student); /给头指针开辟空

16、间 head-next=null; /初始化头指针 while(decide!=n) printf( *n); printf( * 1 输入 2 查找 3 修改 4 插入 *n); printf( * 5 删除 6 存储 7 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: stuinput(head); break; case 2: stuselect(head); break; case 3: stualter(head); break; case 4: stuinsert(head); break; case 5: stud

17、elect(head); break; case 6: stusave(head); break; default: decide=n; break; ; void stuinputhand(student *head); /学生成绩管理系统的手动输入函数,由输入函数调用 void stuinputfile(student *head); /学生成绩管理系统的文件输入函数,由输入函数调用 void stuinput(student *head) /学生成绩管理系统的输入函数,由主函数调用 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch

18、变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf( * 1 手动输入 2 文件输入 3 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: stuinputhand(head); break; case 2: stuinputfile(head); default: decide=n; break; void stuinputhand(student *head) /学生成绩管理系统的手动输入函数,由输入函数调用 if(head-next=null) student *point=

19、(student *)malloc(sizeof(student); /链表中最后一个节点,只在该函数中存在 point-next=null; int decide=1; while(decide!=0) student *p=(student *)malloc(sizeof(student); p-next=null; stuimport(head,p); if(head-next=null) head-next=p; point=p; else point-next=p; point=p; printf(是否继续:1/0n); scanf(%d,&decide); else printf(

20、管理系统中已存在信息,若想输入学生信息,请转插入子系统); void stuinputfile(student *head) /学生成绩管理系统的文件输入函数,由输入函数调用 if(head-next!=null) printf(学生管理系统中已有信息,请跳转到插入选项n); file *fp; printf(请输入文件名(包括物理地址)n); char filename10; scanf(%s,filename); if(fp=fopen(filename,r)=null) printf(can not open filen); return; student *point=(student

21、 *)malloc(sizeof(student); student *opinion=(student *)malloc(sizeof(student); /用来判断输入节点中学生号是否有重复 while(!feof(fp) opinion=head-next; student *p=(student *)malloc(sizeof(student); p-next=null; fread(p,sizeof(student),1,fp); if(opinion!=null) if(opinion-num=p-num&!strcmp(opinion-subject,p-subject) pri

22、ntf(该文件中有重复学生信息,请验明再传输n); head-next=null; opinion=opinion-next; if(head-next=null) head-next=p; point=p; else point-next=p; point=p; ; opinion=head-next; while(opinion-next!=null) opinion=opinion-next; if(opinion-next-next=null) opinion-next=null; ; fclose(fp); printf(传输成功n); void stuselecterg(stude

23、nt *head); /学生成绩管理系统的遍历函数,由查找函数调用 void stuselectnumfind(student *head); /学生成绩管理系统的按学号查找函数,由查找函数调用 void stuselectsubfind(student *head); /学生成绩管理系统的按科目查找函数,由查找函数调用 void stuselect(student *head) /学生成绩管理系统的查找函数,由主函数调用 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) pr

24、intf( *n); printf( * 1 遍历 2 学号查找 3 科目查找 4 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: stuselecterg(head); break;case 2: stuselectnumfind(head); break; case 3: stuselectsubfind(head); break; default: decide=n; break; void stuselecterg(student *head) /学生成绩管理系统的遍历函数,由查找函数调用 student *p=(stu

25、dent *)malloc(sizeof(student); p=head-next; int i=1; while(p!=null) printf(第%d位学生信息:n,i); stuoutput(p); p=p-next; i+; void stuselectnumfind(student *head) /学生成绩管理系统的查找子系统,有查找函数调用 int num; printf(输入想要查找学生的学生号:n); scanf(%d,&num); student *p=(student *)malloc(sizeof(student); p=head-next; int i=1; whil

26、e(p!=null) if(num=p-num) stuoutput(p); i+; p=p-next; if(i=1) printf(没有该学生信息); void stuselectsubfind(student *head) /学生成绩管理系统的按科目查找函数,由查找函数调用 char sub10; printf(输入想要查找科目:n); scanf(%s,sub); student *p=(student *)malloc(sizeof(student); p=head-next; int i=1; while(p!=null) if(!strcmp(sub,p-subject) stu

27、output(p); i+; p=p-next; if(i=1) printf(没有该学生信息); void stualter(student *head) /学生成绩管理系统的修改函数,由主函数调用 int num; printf(输入想要查找学生的学生号:n); scanf(%d,&num); char sub10; printf(输入想要查找科目:n); scanf(%s,sub); student *p=(student *)malloc(sizeof(student); p=head-next; int i=1; while(p!=null) if(num=p-num&!strcmp

28、(sub,p-subject) printf(输入修改成绩:n); scanf(%d,&p-grade); printf(修改成功n); i+; p=p-next; if(i=1)printf(没有该学生信息); void stuinsert(student *head) /学生成绩管理系统的插入函数,由主函数调用 student *point=(student *)malloc(sizeof(student); point=head-next; while(point-next!=null) point=point-next; /找到尾结点 char decide=y; /定义while变量

29、,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf( * 1 头插 2 尾插 3 退出 *n); printf( *n); scanf(%d,&num); student *p=(student *)malloc(sizeof(student); switch(num) case 1: stuimport(head,p); p-next=head-next; head-next=p; printf(插入成功n); break; case 2: stuimport(head,p); poin

30、t-next=p; p-next=null; printf(插入成功n); break; default: decide=n; break; void studelect(student *head) /学生成绩管理系统的删除函数,由主函数调用 int num;printf(输入想要删除学生的学生号:n); scanf(%d,&num); char sub10; printf(输入想要删除科目:n); scanf(%s,sub); student *p=(student *)malloc(sizeof(student); p-next=head-next; int i=1; while(p-n

31、ext!=null) if(num=p-next-num&!strcmp(sub,p-next-subject) stuoutput(p-next); printf(是否删除:1/0n); scanf(%d,&i); if(num=head-next-num&!strcmp(sub,head-next-subject) head-next=head-next-next; else p-next=p-next-next; i=2; printf(删除成功n); break; p=p-next; if(i=1) printf(没有该学生信息n); void stusave(student *hea

32、d) /学生成绩管理系统的存储函数,由主函数调用 file *fp; char filename10; printf(请输入存储文件名(包括物理地址)n); scanf(%s,filename); student *p=(student *)malloc(sizeof(student); p=head-next; if(fp=fopen(filename,w)=null) printf(cannot open file); return; printf(input data:/n); while(p!=null) fwrite(p,sizeof(student),1,fp); /* 成块写入文

33、件*/ p=p-next; fclose(fp); (5) 程序模块及其接口描述voidstuinput(student*);/学生成绩管理系统的输入函数,由主函数调用voidstuselect(student*);/学生成绩管理系统的查找函数,由主函数调用voidstualter(student*);/学生成绩管理系统的修改函数,由主函数调用voidstuinsert(student*);/学生成绩管理系统的插入函数,由主函数调用voidstudelect(student*);/学生成绩管理系统的删除函数,由主函数调用voidstusave(student*);/学生成绩管理系统的存储函数,

34、由主函数调用基本操作函数:voidstuoutput(student*p);/输出函数intstuimport(student*head,student*p);/输入函数voidstuinputhand(student*head);/学生成绩管理系统的手动输入函数,由输入函数调用voidstuinputfile(student*head);/学生成绩管理系统的文件输入函数,由输入函数调用voidstuselecterg(student*head);/学生成绩管理系统的遍历函数,由查找函数调用voidstuselectnumfind(student*head);/学生成绩管理系统的按学号查找函数

35、,由查找函数调用voidstuselectsubfind(student*head);/学生成绩管理系统的按科目查找函数,由查找函数调用(6) 程序的输入与输出描述输入学生基本信息。输出学生基本信息(7) 调试分析或程序测试由主界面进入学生成绩管理界面。手动输入学生基本信息由学号等基本信息查找学生科目成绩修改成绩插入新的学生基本信息删除选择出来的学生信息储存刚才的学生信息(8) 尚未解决的问题或改进方向未解决的问题:不能同时输入多科成绩,存储后的文件无法正常查看。改进方向:输入多科成绩。(9) 对软件的使用说明操作较为复杂,需要耐心以及根据界面提示做,不可乱输入。3. 项目三(1) 对设计任务

36、内容的概述编写函数实现图的拓扑排序。(2) 需求分析或功能描述。(3) 概要设计或程序流程图开始输入顶点及信息n输入符合条件?y根据输入信息建立邻接表建栈在邻接表中寻找入度为0的顶点,将其按入栈弹出栈顶,打印,将与栈顶元素邻接的顶点的入度减一n栈是否为空y终止。(4) 详细设计或源代码说明#include #include #define true 1 #define false 0 #define max_vextex_num 20 #define m 20 #define stack_init_size 100 #define stackincrement 10 /*-图的邻接表存储结构-

37、*/ typedef struct arcnode /*弧结点结构类型*/ int adjvex; /*该弧指向的顶点的位置*/ struct arcnode *nextarc; /*指向下一条弧的指针*/ arcnode; typedef struct vnode /*邻接表头结点类型*/ int data; /*顶点信息*/ arcnode *firstarc; /*指向第一条依附于该点的弧的指针*/ vnode,adjlistmax_vextex_num; /*adjlist为邻接表类型*/ typedef struct adjlist vertices; int vexnum, arcnum; algraph; /*-*/ void creatgraph(algraph *g) /*通过用户交互产生一个图的邻接表*/ int m, n, i; arcnode *p; printf(=); printf(n输入顶点数:); scanf(%d,&g-vexnum); printf(n输入边数:); scanf(%d,&g-arcnum); printf(=); for (i=1; ivexnum;i+) /*初始化各顶点*/ g-verticesi.data=i; /*

温馨提示

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

最新文档

评论

0/150

提交评论