课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx
《课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx》由会员分享,可在线阅读,更多相关《课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx(40页珍藏版)》请在冰豆网上搜索。
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序
上海应用技术学院课程设计报告
课程名称《数据结构课程设计》
设计题目数据结构课程设计
院系计算机科学与信息工程学院专业游戏软件制作与开发班级
姓名学号指导教师日期2016-1-14
一.目的与要求
1.巩固和加深对常见数据结构的理解和掌握
2.掌握基于数据结构进行算法设计的基本方法
3.掌握用高级语言实现算法的基本技能
4.掌握书写程序设计说明文档的能力
5.提高运用数据结构知识及高级语言解决非数值实际问题的能力
二.课程设计内容说明
1.项目一
(1)对设计任务内容的概述
实现十进制数N和二进制数之间的转换。
(2)需求分析或功能描述
输入相应的各式正确的数值(可以是混合小数的形式),程序按照设定的算法执行后,给出相对应的进制数数值,对于输入数据的合法性可以不做检查。
采用栈。
(3)概要设计或程序流程图
内容:
利用栈实现十进制和其他任意进制数的任意转换输出问题
进制转换原理:
N = (N div d) *d + N mod d(其中:
div 为整除运算,mod 为求余运算)
步骤:
1 定义栈数据类型,采用链式存储结构实现
2 链栈基本操作函数原型声明
3 初始化栈
4 输入栈
5 输出栈
6 判空栈
7 自定义实现进制转换函数
8 数据调试
9 程序结束
(4)详细设计或源代码说明
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
#defineERROR0
#defineOVERFLOW-2
#include
#include
#include
#include
#include
#include"math.h"
typedefintSElemType;
typedefstruct{
SElemType*base;//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;//栈顶指针
intStackSize;//当前已分配的存储空间,以元素为单位
}SqStack1;
voidInitStack(SqStack1*s)//初始化栈
{s->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
s->base)exit(OVERFLOW);
s->top=s->base;
s->StackSize=STACK_INIT_SIZE;}
voidPush(SqStack1*s,SElemTypee)//输入栈
{if(s->top-s->base>=s->StackSize)
{s->base=(SElemType*)realloc(s->base,(s->StackSize+STACKINCREMENT)*sizeof(SElemType));//栈满,追加存储空间
if(!
s->base)exit(OVERFLOW);//若内存中没有s->StackSize+STACKINCREMENT个连续空间则分配失败
s->top=s->base+s->StackSize;
s->StackSize+=STACKINCREMENT;}
*s->top++=e;}
intPop(SqStack1*s,SElemType*e)//输出栈
{if(s->top==s->base)
returnERROR;
s->top=s->top-1;
*e=*s->top;}
intStackEmpty(SqStack1s)//判空栈
{if(s.top==s.base)
return1;
else
return0;}
voidConversion(intN,intm)
{SElemTypee;
SqStack1s;
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");}
voidsqunion(){
intn,m;
printf("请输入一个十进制数:
");
scanf("%d",&n);
printf("需要转成的进制m:
");
scanf("%d",&m);
Conversion(n,m);}
voidlinkunion(){
inta,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("%d\n",y);}
voidlist1()
{
inti,flag=1,k;
while(flag)
{
printf("**************************************\n");
printf("\t1:
十进制转换为任意进制\n");
printf("\t2:
二进制转换为十进制\n");
printf("\t0:
返回\n");
printf("\t请选择:
\n");
printf("**************************************\n");
while(true)
{
scanf("%d",&i);
if(i>=0&&i<=2)
break;
else
printf("请选择0--2:
\n");
}
switch(i)
{
case1:
squnion();break;
case2:
linkunion();break;
case0:
{flag=0;break;}
}
}
}
(5)程序模块及其接口描述
voidInitStack(SqStack1*s)//初始化栈
voidPush(SqStack1*s,SElemTypee)//输入栈
intPop(SqStack1*s,SElemType*e)//输出栈
intStackEmpty(SqStack1s)//判空栈
voidConversion(intN,intm) 功能是:
将十进制转换为其他进制
voidlinkunion()功能是:
将二进制转换为十进制
(6)程序的输入与输出描述
输入要求的整数
输出二进制
(7)调试分析或程序测试
在主界面中选择“1”进入进制转换子界面
在子界面中选择“1”进入十进制转换为其他进制的测试,输入:
99,转换为二进制,得出:
1100011
在子界面中选择“2”,进行二进制转换为十进制测试。
测试结果如下:
输入“0”,正常返回主界面。
(8)尚未解决的问题或改进方向
未完善的问题:
不能由二进制直接转换为任意进制;在十进制转换过程中不能输入小数。
改进方向:
界面美化;调整程序,使其可以输入小数。
(9)对软件的使用说明
根据界面提示选择需要的操作,输入整数,注意二进制只包含“1”“0”。
2.项目二
(1)对设计任务内容的概述
任务:
要求实现对学生资料的录入、浏览、插入和删除等功能。
输入:
设学生成绩以记录形式存储,每个学生记录包含的信息有:
学号和各门课程的成绩。
存储结构:
采用线性链式结构。
(2)需求分析或功能描述
管理系统中有五个要求:
输入查找修改插入删除存储
输入要求:
能够通过键盘输入和文件输入两种
查找要求:
能够根据学生号查找单个学生的信息,也可以遍历所有学生信息
修改要求:
能够根据学生号修改单个学生所有信息
插入要求:
能够实现头插和尾插
删除要求:
能够根据学生号删除单个学生信息
存储要求:
通过链表存储所有信息
(3)概要设计或程序流程图
首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等;其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;最后,编写主函数对每个实现进行按需调用,实现操作。
(4)详细设计或源代码说明
#include
#include
#include
structStudent
{charname[10];
charsubject[10];
intnum;
intgrade;
Student*next;};
voidStuMain();//学生成绩管理系统的主函数,由main函数调用
voidStuInput(Student*);//学生成绩管理系统的输入函数,由主函数调用
voidStuSelect(Student*);//学生成绩管理系统的查找函数,由主函数调用
voidStuAlter(Student*);//学生成绩管理系统的修改函数,由主函数调用
voidStuInsert(Student*);//学生成绩管理系统的插入函数,由主函数调用
voidStuDelect(Student*);//学生成绩管理系统的删除函数,由主函数调用
voidStuSave(Student*);//学生成绩管理系统的存储函数,由主函数调用
voidStuOutput(Student*p);//输出函数
intStuImport(Student*head,Student*p);//输入函数
voidStuOutput(Student*p)//打印函数,将链表的该节点信息输出
{printf("学生姓名:
");
printf("%s",p->name);
printf("学生号:
");
printf("%d",p->num);
printf("科目:
");
printf("%s",p->subject);
printf("学生成绩:
");
printf("%d\n",p->grade);}
intStuImport(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->subject,p->subject))
{printf("该学生这门科目已有成绩,请重新输入\n");
return1;}
Opinion=Opinion->next;}
printf("学生成绩:
\n");
scanf("%d",&p->grade);
return0;}
voidlist2()
{StuMain();}
voidStuMain()
{chardecide='y';//定义while变量,函数是否继续进行
intnum=1;//定义switch变量,函数跳转到哪个子函数
Student*head;//定义链表的头指针
head=(Student*)malloc(sizeof(Student));//给头指针开辟空间
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)
{case1:
StuInput(head);break;
case2:
StuSelect(head);break;
case3:
StuAlter(head);break;
case4:
StuInsert(head);break;
case5:
StuDelect(head);break;
case6:
StuSave(head);break;
default:
decide='n';break;}};}
voidStuInputHand(Student*head);//学生成绩管理系统的手动输入函数,由输入函数调用
voidStuInputFile(Student*head);//学生成绩管理系统的文件输入函数,由输入函数调用
voidStuInput(Student*head)//学生成绩管理系统的输入函数,由主函数调用
{chardecide='y';//定义while变量,函数是否继续进行
intnum;//定义switch变量,函数跳转到哪个子函数
while(decide!
='n')
{
printf("***************************************************\n");
printf("**1手动输入2文件输入3退出**\n");
printf("***************************************************\n");
scanf("%d",&num);
switch(num)
{case1:
StuInputHand(head);break;
case2:
StuInputFile(head);
default:
decide='n';break;}}}
voidStuInputHand(Student*head)//学生成绩管理系统的手动输入函数,由输入函数调用
{if(head->next==NULL)
{Student*point=(Student*)malloc(sizeof(Student));//链表中最后一个节点,只在该函数中存在
point->next=NULL;intdecide=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/0\n");
scanf("%d",&decide);}}
else
printf("管理系统中已存在信息,若想输入学生信息,请转插入子系统");}
voidStuInputFile(Student*head)//学生成绩管理系统的文件输入函数,由输入函数调用
{if(head->next!
=NULL)
{printf("学生管理系统中已有信息,请跳转到插入选项\n");}
FILE*fp;
printf("请输入文件名(包括物理地址)\n");
charfilename[10];scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{printf("cannotopenfile\n");
return;}
Student*point=(Student*)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))
{printf("该文件中有重复学生信息,请验明再传输\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");}
voidStuSelectErg(Student*head);//学生成绩管理系统的遍历函数,由查找函数调用
voidStuSelectNumFind(Student*head);//学生成绩管理系统的按学号查找函数,由查找函数调用
voidStuSelectSubFind(Student*head);//学生成绩管理系统的按科目查找函数,由查找函数调用
voidStuSelect(Student*head)//学生成绩管理系统的查找函数,由主函数调用
{chardecide='y';//定义while变量,函数是否继续进行
intnum;//定义switch变量,函数跳转到哪个子函数
while(decide!
='n'){
printf("***************************************************\n");
printf("****1遍历2学号查找3科目查找4退出****\n");
printf("***************************************************\n");
scanf("%d",&num);
switch(num)
{case1:
StuSelectErg(head);break;
case2:
StuSelectNumFind(head);break;
case3:
StuSelectSubFind(head);break;
default:
decide='n';break;}}}
voidStuSelectErg(Student*head)//学生成绩管理系统的遍历函数,由查找函数调用
{
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{printf("第%d位学生信息:
\n",i);
StuOutput(p);p=p->next;i++;}}
voidStuSelectNumFind(Student*head)//学生成绩管理系统的查找子系统,有查找函数调用
{intnum;
printf("输入想要查找学生的学生号:
\n");
scanf("%d",&num);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;inti=1;
while(p!
=NULL)
{if(num==p->num)
{
StuOutput(p);
i++;}
p=p->next;}
if(i==1)
printf("没有该学生信息");
}
voidStuSelectSubFind(Student*head)//学生成绩管理系统的按科目查找函数,由查找函数调用
{charSub[10];
printf("输入想要查找科目:
\n");
scanf("%s",Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{if(!
strcmp(Sub,p->subject))
{StuOutput(p);
i++;}
p=p->next;}
if(i==1)printf("没有该学生信息");}
voidStuAlter(Student*head)//学生成绩管理系统的修改函数,由主函数调用
{intnum;
printf("输入想要查找学生的学生号:
\n");
scanf("%d",&num);charSub[10];
printf("输入想要查找科目:
\n");
scanf("%s",Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;inti=1;