数据结构
发布时间:2015-03-19 13:21:19
发布时间:2015-03-19 13:21:19
课 程 设 计 报 告
课程名称 数据结构课程设计
课题名称 教学计划编制问题
专 业 应用物理
班 级 1201
学 号 201210040128
姓 名 张大帅
指导教师 刘长松 黄哲
2014年 12月13日
湖南工程学院
课 程 设 计 任 务 书
课程名称 数据结构课程设计
课 题 教学计划编制问题
专业班级 应用物理1201
学生姓名 张大帅
学 号 201210040128
指导老师 刘长松 黄哲
审 批
任务书下达日期: 2014 年 12 月 13 日
任务完成日期: 2014 年 12 月 20 日
一、设计内容与设计要求
1.设计内容:
1)问题描述
大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。
2)基本要求
a.输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
b.允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。计划的表格格式自行设计。
3)测试数据
学期总数:6;
学分上限:10;
该专业共开设课数:12
课程号:从C01到C12;
学分顺序:2,3,4,3,2,3,4,4,7,5,2,3。
先修关系如下图:
4)实现提示
可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。应建立内部课程号与课程号之间的对应关系。
2.设计要求:
● 课程设计报告规范
1)需求分析
a.程序的功能。
b.输入输出的要求。
2)概要设计
a. 程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
b. 课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
3)详细设计
a.采用C语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
4)调试分析以及设计体会
a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
5)使用说明
用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)书写格式
见附带说明。
7)附录
a.参考书目
b.源程序清单(带注释)
● 考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:
① 平时出勤 (占10%)
② 系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
③ 程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
④ 设计报告(占30%)
注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
⑤ 独立完成情况(占10%)。
● 课程验收要求
① 运行所设计的系统。
② 回答有关问题。
③ 提交课程设计报告。
④ 提交电子文档(源程序、设计报告文档)。
⑤ 依内容的创新程度,完善程序情况及对程序讲解情况打分。
二、进度安排
附:
课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
编制教学计划。大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。
a.输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
b.允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。计划的表格格式自行设计。
图2.1-1 功能模块图
int termtime=0; //学期总数
int limitgrade=0; //学分上线
char str[100][4]; //课程号
int score[100]={0}; //课程学分
int totalcourse=0; //课程总数
struct node //课程节点
{
int variable; //标志属不属于同一个学期所修
int previous; //前修课程
int next; //后学课程
struct node * courselink[100]; //后修课程的指针
}* coursenode[100]={NULL}; //课程数目节点
FILE *fp //保存到文件
int termtime=0; //学期总数
int limitgrade=0; //学分上线
char str[100][4]; //课程号
int score[100]={0}; //课程学分
int totalcourse=0; //课程总数
struct node //课程节点
{
int variable; //标志属不属于同一个学期所修
int previous; //前修课程
int next; //后学课程
struct node * courselink[100]; //后修课程的指针
}* coursenode[100]={NULL}; //课程数目节点
A. 初始化课程节点
void initialNode() //初始化课程节点
{
int i;
int j;
printf("\n正在初始化。。。。。。。\n");
for(i=0;i<100;i++)
{
后修课程的指针置零;
同学期学习的课程置零;
前修课程置零;
后修课程置零;
for(j=0;j<100;j++)
coursenode[i]->courselink[j]=NULL;
}
printf("\n初始化完毕。。。。。。。\n");
}
B. 建立课程顺序
void createNode() //建立课程顺序
{
int i;
int temp;
int flag;
for(i=0;i
{
printf("\n请输入%d的深入课程数目:",i+1);
scanf("%d",&(coursenode[i]->next));
printf("\n请输入%d的深入课程课程代号分别是什么(用空格分开):",i+1);
for(temp=0;temp
{
scanf("%d",&flag);
coursenode[i]->courselink[temp]=coursenode[flag-1];
coursenode[flag-1]->previous++;
}
}
printf("\n课程代号\t前修课程数\t深入课程数\n");
for(temp=0;temp
{
printf("%d\t\t%d\t\t%d\n",temp+1,coursenode[temp]->previous,coursenode[temp]->next);
}
}
C.排课程
void sortNode() //排课程
{
int i,j,flag=0,session=1;
FILE *fp;
if((fp=fopen("d:\\course.txt","a"))==NULL) //如果文件已经存在,可以追加学生信息
{
if((fp=fopen("d:\\course.txt","w"))==NULL) // 文件不存在时,创建新文件,输入学生信息
{
printf("文件打开失败!\n");
return;
}
}
printf("\n-----------------------------\n");
printf("课程代号\t课程号\t课程学分\n");
fprintf(fp,"课程代号\t课程号\t课程学分\n");
while(1)
{
flag=1;
for(i=0;i
if(课程数目节点为空)
if(同学期学习课程为空)
if(前修课程为0)
{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
fprintf(fp,"%d\t%s\t%d\n",i+1,str[i],score[i]);
for(j=0;j
{
前修课程数目节点减一;
coursenode[i]->courselink[j]->variable=1;
coursenode[i]->courselink[j]=NULL;
}
coursenode[i]->next=0;
释放数目结点;
flag=0;
}
if(flag!=0)break;
else
{
if(session<=termtime)
{ printf("第%d学期课程结束\n------------------------------------\n",session);
fprintf(fp,"第%d学期课程结束\n------------------------------------\n",session) ;
session++;}
else
{
printf("学习时间不够!!!\n");
exit(0);
}if(session<=termtime);
}
for(i=0;i
if(课程节目数不为O)
coursenode[i]->variable=0;
}
fclose(fp); //关闭文件指针
}
D,输入基本信息
void inputBasicInformation() //输入基本信息
{
int i;
printf("请输入学期总数:");
scanf("%d",&termtime);
if(termtime>=12)
{
printf("\n对不起,学期总数不能超过12\n");
exit(0);
}
printf("\n请输入学分上限:");
scanf("%d",&limitgrade);
printf("\n请输入课程总数:");
scanf("%d",&totalcourse);
for(i=0;i
printf("请输入第%d门课程号(三个字符,回车结束):",i+1);
scanf("%s",&str[i]);
str[i][3]='\0';
printf("请输入第%d门课程学分(回车结束):",i+1);
scanf("%d",&score[i]);
if(学分高于上限)
{
printf("\n对不起,课程学分不能超过学分上限\n");
exit(0);
}
}
printf("\n您所输入的数据如下,请核实:\n");
printf("课程代号\t课程号\t课程学分\n");
for(i=0;i
{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
}
}
E.清空信息
void cls()
{
int i=0;
学期数置零;
学分上限置零;
for(i=0;i<100;i++)
{
str[i][0]='\0';
score[100]=0;
}
总课程数置零;
printf("\n原来数据已经清空\n");
}
F.菜单
void menu()
{
printf(" ************************* 教学计划编制************************\n ");
printf("\n 1 输入课程安排基本信息");
printf("\n 2 建立课程顺序");
printf("\n 3 排列课程顺序");
printf("\n 4 原来数据清空");
printf("\n 5 退出");
}
G.主函数
void main()
{
int n;
initialNode();
while(1)
{
menu();
printf("\n 请输入您要选择的操作序号,按回车键确认:");
scanf("%d",&n);
switch(n)
{
case 1: inputBasicInformation();;break;
case 2: createNode();;break;
case 3: sortNode();;break;
case 4: cls();break;
case 5: exit(0);
default: printf("输入错误,请输入列表中存在的序号!\n ");
}
}
}
图2.3-1 流程图
学期总数:6;
学分上限:10;
该专业共开设课数:12
课程号:从C01到C12;
学分顺序:2,3,4,3,2,3,4,4,7,5,2,3。
先修关系如下图:
图4.1-1 测试数据先修关系图
正确输入测试数据后,如果系统符合要求,正确排序,则如图4.1-2所示。
图4.1-2 正确的测试结果
程序十分的复杂,遇到了很多常见的语法错误,及逻辑错误。这需要我们不断的调试分析。符号的格式之类,指针的用法,判断输入输出的条件都是十分容易出错的地方。在逐条排除,向同学老师请教后,程序终于得以完成。
经过此次课程设计,我们认识到了理论与实践结合的重要性,仅仅只是从课本上学到算法原理是远远不够的。在实践中,我们总会出现许多错误。这就要求我们以一个脚踏实地的态度来处理问题。我们深刻地认识到自己写程序的不足,使我们学到了好多有用的知识,让我们明白了C语言的语句用法。
上机实践是学生对本门课程所学知识的一种全面、综合的能力训练,是与课堂听讲、自学和练习相辅相成必不可少的一个教学环节,也是对课堂教学效果的一种检验。通常,实习题中的问题比平时的习题复杂得多,也更接近实际。实习题注重原理与应用的结合,目的让学生学会如何把书上学到的知识运用于解决实际问题的过程中去,培养从事软件开发设计工作所必需的基本技能。同时,通过实践能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的作用。平时的练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,可以多人合作,有利于一整套软件工程规范的训练和科学作风的培养。此外,实践环节中有很重要的一点,就是机器是比任何教师都严格的主考官。
经过此次课程设计,我认识到了理论与实践结合的重要性,仅仅只是从课本上学到算法原理是远远不够的。在实践中,我们总会出现许多错误。这就要求我们以一个脚踏实地的态度来处理问题。我深刻地认识到自己写程序的不足,使我们学到了好多有用的知识,让我们明白了C语言的语句用法。
使用VC++,打开schedule.c文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。显示如图5-1:
图5-1 程序编译正确
要求输入学期总数、一个学期的学分上限、需要编排课程总数、课程名、课程号、该课程的学分,按照出现的每一步来输入该课程设计所提供的相关数据。如图5-2所示。
图5-2 输入课程安排基本信息
要求依次输入各课程的深入(后续)课程代号,按照出现的每一步来输入该课程设计所提供的相关数据。如图5-3所示。
图5-3 建立课程顺序
各项信息输入完毕后,在主选菜单中选择3,系统将自动排出课程。如图5-4所示。
‘
图5-4 排列课程数据
同时,系统会将教学编制计划自动保存到d:\course.txt下,如图5-5、5-6所示。
图5-5 保存目录
图5-6 course文件内容
如果信息输入错误,或者需要更换新的信息,可以在主选菜单中选择清空信息选项,系统将自动删除原有数据。如图5-7所示。
图5-7 数据清空
在主选菜单中选择5退出后,系统将自动关闭。
A.《数据结构教程》 李春葆等 编著 清华大学出版社
B.《数据结构教程上机实验指导》 李春葆等 编著 清华大学出版社
#include "stdio.h"
#include "malloc.h"
#include "iostream.h"
#include "stdlib.h"
int termtime=0; //学期总数
int limitgrade=0; //学分上线
char str[100][4]; //课程号
int score[100]={0}; //课程学分
int totalcourse=0; //课程总数
struct node //课程节点
{
int variable; //标志属不属于同一个学期所修
int previous; //前修课程
int next; //后学课程
struct node * courselink[100]; //后修课程的指针
}* coursenode[100]={NULL}; //课程数目节点
void initialNode(); //初始化课程节点
void createNode(); //建立课程顺序
void sortNode(); //排课程
void inputBasicInformation(); //输入基本信息
void cls(); //清空信息
void menu(); //主菜单
void initialNode() //初始化课程节点
{
int i;
int j;
printf("\n&&&&&&&&&&&&&&&&&&&&应用物理1201班&&&&&&&&&&&&&&&&&&&&&\n");
printf("&&&&&&&&&&&&&&&&&&&【20号张大帅】&&&&&&&&&&&&&&&&&&&&&&\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n正在初始化\n");
for(i=0;i<100;i++)
{
coursenode[i]=(struct node *)malloc(sizeof(struct node));
coursenode[i]->variable=0;
coursenode[i]->previous=0;
coursenode[i]->next=0;
for(j=0;j<100;j++)
coursenode[i]->courselink[j]=NULL;
}
printf("\n初始化完毕\n");
printf("\n");
printf("\n");
printf("\n");
}
void createNode() //建立课程顺序
{
int i;
int temp;
int flag;
for(i=0;i
{
printf("\n请输入%d的深入课程数目:",i+1);
scanf("%d",&(coursenode[i]->next));
printf("\n请输入%d的深入课程课程代号分别是什么(用空格分开):",i+1);
for(temp=0;temp
{
scanf("%d",&flag);
coursenode[i]->courselink[temp]=coursenode[flag-1];
coursenode[flag-1]->previous++;
}
}
printf("\n课程代号\t前修课程数\t深入课程数\n");
for(temp=0;temp
{
printf("%d\t\t%d\t\t%d\n",temp+1,coursenode[temp]->previous,coursenode[temp]->next);
}
}
void sortNode() //排课程
{
int i,j,flag=0,session=1,k=0;
FILE *fp;
if((fp=fopen("d:\\course.txt","a"))==NULL) //如果文件已经存在,可以追加学生信息
{
if((fp=fopen("d:\\course.txt","w"))==NULL) // 文件不存在时,创建新文件,输入学生信息
{
printf("文件打开失败!\n");
return;
}
}
printf("\n========================\n");
printf("课程代号\t课程号\t课程学分\n");
fprintf(fp,"课程代号\t课程号\t课程学分\n");
while(1)
{
flag=1;
for(i=0;i
if(coursenode[i]!=NULL)
if(coursenode[i]->variable==0)
if(coursenode[i]->previous==0)
{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
fprintf(fp,"%d\t%s\t%d\n",i+1,str[i],score[i]);
for(j=0;j
{
coursenode[i]->courselink[j]->previous-=1;
coursenode[i]->courselink[j]->variable=1;
coursenode[i]->courselink[j]=NULL;
}
coursenode[i]->next=0;
free(coursenode[i]);
flag=0;
k++;
}
if(flag!=0){
if(k!=totalcourse)
{
printf("\n课程排序不合理,有死循环!");
exit(0);
}
break;
}
else
{
if(session<=termtime)
{
printf("第%d学期课程结束\n========================\n",session);
fprintf(fp,"第%d学期课程结束\n========================\n",session);
session++;
}
else
{
printf("学习时间不够!!!\n");
exit(0);
}if(session<=termtime);
}
for(i=0;i
if(coursenode[i]!=NULL)
coursenode[i]->variable=0;
}
fclose(fp); //关闭文件指针
}
void inputBasicInformation() //输入基本信息
{
int i;
printf("请输入学期总数:");
scanf("%d",&termtime);
if(termtime>=12)
{
printf("\n对不起,学期总数已超过12\n");
exit(0);
}
printf("\n请输入学分上限:");
scanf("%d",&limitgrade);
printf("\n请输入课程总数:");
scanf("%d",&totalcourse);
for(i=0;i
printf("请输入第%d门课程号(三个字符,回车结束):",i+1);
scanf("%s",&str[i]);
str[i][3]='\0';
printf("请输入第%d门课程学分(回车结束):",i+1);
scanf("%d",&score[i]);
if(score[i]>limitgrade)
{
printf("\n对不起,课程学分已超过学分上限\n");
exit(0);
}
}
printf("\n您所输入的数据如下,请核实:\n");
printf("课程代号\t课程号\t课程学分\n");
for(i=0;i
{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
}
}
void cls()
{
int i=0;
termtime=0;
limitgrade=0;
for(i=0;i<100;i++)
{
str[i][0]='\0';
score[100]=0;
}
totalcourse=0;
printf("\n原来数据应经清空\n");
}
void menu()
{
printf("******************************* 学生课程排序******************************");
printf("\n 一· 输入课程安排基本信息 ");
printf("\n 二· 建立课程顺序 ");
printf("\n 三· 排列课程顺序 ");
printf("\n 四· 原来数据清空 ");
printf("\n 五· 退出 ");
printf("\n");
}
void main()
{
int n;
initialNode();
while(1)
{
menu();
printf("\n");
printf("\n");
printf("\n");
printf("\n [请输入您要选择的操作序号,按回车键确认]:");
scanf("%d",&n);
switch(n)
{
case 1: inputBasicInformation();;break;
case 2: createNode();;break;
case 3: sortNode();;break;