《数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.doc(27页珍藏版)》请在三一办公上搜索。
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*);/学生成绩管理系统的存储函数,由主函数调用基本操作函数:voidStuOut