资源描述
上海应用技术学院课程设计报告
课程名称 《数据结构课程设计》
设计题目 数据结构课程设计
院系 计算机科学与信息工程学院 专业游戏软件制作与开发 班级
姓名 学号 指导教师 日期 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
展开阅读全文