收藏 分销(赏)

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

上传人:仙人****88 文档编号:9343926 上传时间:2025-03-22 格式:DOC 页数:27 大小:673.62KB
下载 相关 举报
课程设计报告-实现十进制数N和二进制数之间的转换-学生成绩管理-拓扑排序.doc_第1页
第1页 / 共27页
课程设计报告-实现十进制数N和二进制数之间的转换-学生成绩管理-拓扑排序.doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述
上海应用技术学院课程设计报告 课程名称 《数据结构课程设计》 设计题目 数据结构课程设计 院系 计算机科学与信息工程学院 专业游戏软件制作与开发 班级 姓名 学号 指导教师 日期 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) 详细设计或源代码说明 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define ERROR 0 #define OVERFLOW -2 #include <stdio.h> #include<string.h> #include <stdlib.h> #include<malloc.h> #include<process.h> #include"math.h" typedef int SElemType; typedef struct { SElemType *base;// 在栈构造之前和销毁之后,base 的值为NULL SElemType *top;// 栈顶指针 int StackSize; //当前已分配的存储空间,以元素为单位 }SqStack1; void InitStack(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; } 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->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 return 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:"); 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("%d\n",y); } void list1() { int i,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) { 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) //输出栈 int StackEmpty(SqStack1 s) //判空栈 void Conversion(int N,int m)  功能是:将十进制转换为其他进制 void linkunion() 功能是:将二进制转换为十进制 (6) 程序的输入与输出描述 输入要求的整数 输出二进制 (7) 调试分析或程序测试 在主界面中选择“1”进入进制转换子界面 在子界面中选择“1”进入十进制转换为其他进制的测试,输入:99,转换为二进制,得出:1100011 在子界面中选择“2”,进行二进制转换为十进制测试。测试结果如下: 输入“0”,正常返回主界面。 (8) 尚未解决的问题或改进方向 未完善的问题:不能由二进制直接转换为任意进制;在十进制转换过程中不能输入小数。 改进方向:界面美化;调整程序,使其可以输入小数。 (9) 对软件的使用说明 根据界面提示选择需要的操作,输入整数,注意二进制只包含“1”“0”。 2. 项目二 (1) 对设计任务内容的概述 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩。 存储结构:采用线性链式结构。 (2) 需求分析或功能描述 管理系统中有五个要求:输入 查找 修改 插入 删除 存储 输入要求:能够通过键盘输入和文件输入两种 查找要求:能够根据学生号查找单个学生的信息,也可以遍历所有学生信息 修改要求:能够根据学生号修改单个学生所有信息 插入要求:能够实现头插和尾插 删除要求:能够根据学生号删除单个学生信息 存储要求:通过链表存储所有信息 (3) 概要设计或程序流程图 首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等; 其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能; 最后,编写主函数对每个实现进行按需调用,实现操作。 (4) 详细设计或源代码说明 #include<stdio.h> #include<malloc.h> #include<string.h> struct Student { char name[10]; char subject[10]; int num; int grade; Student *next; }; void StuMain(); //学生成绩管理系统的主函数,由main函数调用 void StuInput(Student *); //学生成绩管理系统的输入函数,由主函数调用 void StuSelect(Student *); //学生成绩管理系统的查找函数,由主函数调用 void StuAlter(Student *); //学生成绩管理系统的修改函数,由主函数调用 void StuInsert(Student *); //学生成绩管理系统的插入函数,由主函数调用 void StuDelect(Student *); //学生成绩管理系统的删除函数,由主函数调用 void StuSave(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->grade); } 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->subject,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)); //给头指针开辟空间 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: StuDelect(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变量,函数跳转到哪个子函数 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=(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/0\n"); scanf("%d",&decide); } } else printf("管理系统中已存在信息,若想输入学生信息,请转插入子系统"); } void StuInputFile(Student *head) //学生成绩管理系统的文件输入函数,由输入函数调用 { if(head->next!=NULL) { printf("学生管理系统中已有信息,请跳转到插入选项\n"); } FILE *fp; printf("请输入文件名(包括物理地址)\n"); char filename[10]; scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL) { printf("can not open file\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"); } void StuSelectErg(Student *head); //学生成绩管理系统的遍历函数,由查找函数调用 void StuSelectNumFind(Student *head); //学生成绩管理系统的按学号查找函数,由查找函数调用 void StuSelectSubFind(Student *head); //学生成绩管理系统的按科目查找函数,由查找函数调用 void StuSelect(Student *head) //学生成绩管理系统的查找函数,由主函数调用 { char decide='y'; //定义while变量,函数是否继续进行 int num; //定义switch变量,函数跳转到哪个子函数 while(decide!='n') { printf(" ***************************************************\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=(Student *)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; while(p!=NULL) { if(num==p->num) { StuOutput(p); i++; } p=p->next; } if(i==1) printf("没有该学生信息"); } void StuSelectSubFind(Student *head) //学生成绩管理系统的按科目查找函数,由查找函数调用 { char Sub[10]; 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)) { StuOutput(p); i++; } p=p->next; } if(i==1) printf("没有该学生信息"); } void StuAlter(Student *head) //学生成绩管理系统的修改函数,由主函数调用 { int num; printf("输入想要查找学生的学生号:\n"); scanf("%d",&num); char Sub[10]; 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(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变量,函数是否继续进行 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); point->next=p; p->next=NULL; printf("插入成功\n"); break; default: decide='n'; break; } } } void StuDelect(Student *head) //学生成绩管理系统的删除函数,由主函数调用 { int num; printf("输入想要删除学生的学生号:\n"); scanf("%d",&num); char Sub[10]; printf("输入想要删除科目:\n"); scanf("%s",Sub); Student *p=(Student *)malloc(sizeof(Student)); p->next=head->next; int i=1; while(p->next!=NULL) { if(num==p->next->num&&!strcmp(Sub,p->next->subject)) { StuOutput(p->next); printf("是否删除:1/0\n"); 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 *head) //学生成绩管理系统的存储函数,由主函数调用 { FILE *fp; char filename[10]; 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); /* 成块写入文件*/ p=p->next; } fclose(fp); } (5) 程序模块及其接口描述 void StuInput(Student *);   //学生成绩管理系统的输入函数,由主函数调用  void StuSelect(Student *);  //学生成绩管理系统的查找函数,由主函数调用  void StuAlter(Student *);   //学生成绩管理系统的修改函数,由主函数调用  void StuInsert(Student *);  //学生成绩管理系统的插入函数,由主函数调用  void StuDelect(Student *);  //学生成绩管理系统的删除函数,由主函数调用 void StuSave(Student *);    //学生成绩管理系统的存储函数,由主函数调用  基本操作函数:  void StuOut
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服