课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx

上传人:b****2 文档编号:23436874 上传时间:2023-05-17 格式:DOCX 页数:40 大小:545.53KB
下载 相关 举报
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx_第1页
第1页 / 共40页
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx_第2页
第2页 / 共40页
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx_第3页
第3页 / 共40页
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx_第4页
第4页 / 共40页
课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx

《课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx》由会员分享,可在线阅读,更多相关《课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx(40页珍藏版)》请在冰豆网上搜索。

课程设计报告实现十进制数N和二进制数之间的转换学生成绩管理拓扑排序.docx

课程设计报告实现十进制数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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1