资源描述
课 程 设 计 报 告
]
课程名称 数据结构
课题名称 学生成绩管理系统
专 业 通信工程
班 级 1301
学 号 0302
姓 名 momom
指导老师 张鏖烽 彭帧 黄哲
7月 2日
湖南工程学院
课 程 设 计 任 务 书
课程名称 数据结构
课 题 学生成绩管理系统
专业班级 通信工程1301
学生姓名 momom
学 号 0302
指导老师 张鏖烽 彭帧 黄哲
审 批 张鏖烽
任务书下达日期 6月 29日
任 务 完成日期 7月 5日
目 录
一、课程设计分析 4
1.课程设计目标: 4
2.课程设计题目 4
3.需求分析 5
二、概要设计 5
三、具体设计 6
四、调试分析 11
(1)调试过程中碰到问题 11
(2)经验和体会 11
五、用户使用说明 12
六、测试结果 13
七、附录 18
八、课程设计评分表 37
一、课程设计分析
1.课程设计目标:
课程设计是对学生一个全方面综合训练,是和课堂听讲、自学和练习相辅相成必不可少一个教学步骤。通常,实习题中问题比平时习题复杂得多,也更靠近实际。实习着眼于原理和应用结合点,使读者学会怎样把书上学到知识用于处理实际问题,培养软件工作所需要动手能力;其次,能使书上知识变“活”,起到深化了解和灵活掌握教学内容目标。平时练习较偏重于怎样编写功效单一“小”算法,而实习题是软件设计综合训练,包含问题分析、总体结构设计、用户界面设计、程序设计基础技能和技巧,多人合作,以至一整套软件工作规范训练和科学作风培养。
2.课程设计题目
【课题】
学生成绩管理系统
【问题描述】
依据自己这个学期课程表,设计一个成绩管理系统管理自己班成绩;每个学生统计包含学号、姓名、每门课程成绩、总分和加权平均分。
【基础要求】
一个完整成绩管理系统应含有以下功效:
(1)输入:成绩录入;
(2)输出:输出成绩表;
(3)插入:在成绩表中合适位置插入某个学生成绩;
(4)删除:在成绩表中删除某个学生成绩;
(5)查找:依据某个关键字查找某个学生成绩;
(6)排序:依据某一个或某多个关键字进行排序;
(7)筛选:依据某个关键字筛选出符合一些条件数据;
【测试数据】
用本班成绩总表作为测试数据。
3.需求分析
此次课程设计题目是学生成绩管理系统,要求能够存入学生,学生信息包含学生学号、姓名、每科成绩和平均成绩和加权平均成绩等。该系统关键有以下七个功效,即对学生信息进行:输入、输出、插入、删除、查找、排序、筛选等功效。
对学生进行操作能够有很多思绪,而我选择是单链表村学生信息那一条思绪,即设置一个单链表,其中节点数据域保留学生基础信息。因为我们学号比较长,用整型数据无法保留,所以我定义char型字符串来保留学号和姓名。用一个数组来保留学生每一科成绩,另外在定义一个总分和平均分变量。定义学生以下:typedef struct Student
{
char mun[12]; //学号
char name[20]; //姓名
float score[8]; //成绩
float all_score; //总分
float ave_score; //加权平均分
struct Student *next;
}LinkList;
二、概要设计
本程序采取链表方法将每一个学生设置成为一个链表中数据节点,节点中有字符型mun[12](学号)、name[20](姓名)、浮点型数据score[8](放置每一科成绩数组)、all_score(总分)和ave_score(加权平均分)。
主函数中在实施成绩管理系统之前会先创建一个链表,并调用void InitList (LinkList *&L)函数来初始化链表;以后进入菜单选择项选择功效进行操作,主程序步骤图以下:
三、具体设计
1、添加学生: 2、输出学生:
创建节点s LinkList *p=L->next;
输入学生信息,计算总分和加权分 for(m=1;m<=总人数&&p!=NULL;m++)
r->next=s;r=s;(尾插法插入链表) 输出学生信息,p=p->next count=count+1;学生总数加1
3、插入学生 4、删除学生
输入要插入位置 数字选择删除方法
scanf("%d",&w); 按编号删除和学号删除
调用插入函数 1编号 调用Delete_Student
Insert_Student(h,w); 2学号 调用Locate_Student找到
学生位置,在用Delete_Student
步骤图以下:
Insert_Student 函数 Delete_Student函数步骤图:
Locate_Student函数步骤图和以下:Locate_Student1步骤图类似,不再反复了
5查找学生:调用Seek_Student函数,分为按学号查找和按姓名查找
1按编号 调用Locate_Student函数返回i在调用Out_one_Student输出第i个学生
2 按姓名调用Locate_Student1函数返回i在调用Out_one_Student输出第i个学生
6排序函数 调用Queue_Student函数:其中有按学号,总分,各科成绩排序
我这里采取是冒泡排序法进行排序,分别定义了两个节点指针q指向头指针p指向q下一个节点,在进入双重循环进行比较排序 步骤图以下:
排序方法全部类似,知识比较数据不一样,所以就没有一一画出来了
7 筛选
创建另一个链表r用于存筛选出来学生,并调用output_Student函数输出
筛选程序步骤图以下:
筛选程序又分为1 按总分选 2 全部及格人 3 按各科成绩
1 而总分筛选关键是输入一个数值,判定数据是否大于输入数据,大于全部输出
2 去不多个人经过比较每一科成绩是否全部大于60分,大于就选出插入新链表并输出
3 各科成绩话是只比较其中一科来创建链表并输出
其比较步骤图全部如上图所表示,这里便不再一一画出来了。
四、调试分析
(1)调试过程中碰到问题是怎样处理和对设计和实现回顾讨论和分析
在调试过程中碰到第一个问题是输出学生问题,因为输出问题,其中总是发觉输出乱码,找了很久,以后最终发觉是输入时出了问题,因为姓名我定义了字符串型,而字符串长度我定义了20,在创建节点时候我却把name[20]给了学生节点,造成输出时地址错误而输出乱码。
第二个问题是查找,我开始一直想不到怎么把查找到学生输出,以后想了很久,找到了方法,我先经过查找关键字去找到该学生是在链表那个位置,在经过返回位置值来输出想要输出那个学生,所以就定义了Locate_Student和Out_one_Student来完成查找功效。
第三个问题是筛选功效实现,我原来想经过比较,将符合关键字学生筛选出来在输出,结果发觉输出函数是已经定义成一次性全部输出形式。造成我一直想不到好方法来进行这个功效代码编写。以后经过老师指导,我知道了一个新方法来编写,就是经过创建一个新学生链表来存已经筛选出来学生。然后在经过输出函数来将新链表进行输出,这么就能够达成筛选目标。
改善方法:现在想了一下,其实能够将输出函数进行改善,改成一个一个学生输出形式,在经过一个判定语句进行选择性输出,用这个输出方法能够降低代码量,而达成一样效果。
第四个问题是主函数问题,因为我想让主函数看起来简练一点,就把主函数分成两部分,一部分用于选择操作,另一部分用于进行选择好操作,可是这么一来却出现了问题,就是输出数据以后无法暂停在输出界面,而是闪了一下就退出来进入主界面了,这个问题我开始认为是输出函数问题,结果我去改了输出函数,结果还是无法停留。以后知道原因了,主函数退出switch循环以后会立即回到主菜单界面,到时无法停在输出界面。我在主函数最终加一个system(“pause”)以后才打到能够观察到地方。
改善方法:能够将主函数定义成一个,不用分开,去掉for(;;)这个循环会好点。
(2)经验和体会
此次课程设计题目我一开始看到时候认为很轻易就能做出来,所以只是大约想了一下思绪,就直接开始了,其实这个试验能够用次序表做会思绪更清楚部分,我没有选择次序表来做,因为我在单链表这一部分有点模糊,所以想挑战一下用单链表来做。这个程序每一个代码全部是我经过一步一步分析写出来,在编写过程中碰到了很多阻碍,很多自己无法预知错误,在不停找错过程中,我感觉到自己在c语言这首先不足,对算法精髓还不是很了解, 对于单链表操作也不是很熟练,尤其是在节点指针多起来时候会有点乱,甚至搞不清指针到底指向哪里了。
然而,在编程过程中,一次次测试失败,再一次次修更正确却让我慢慢熟悉了数据结构部分使用方法,逐步知道要编写一个系统,需要多种功效协调才能算一个系统,而每一个功效有需要很多函数之间相互联络来调用和支撑。同时要想将课程设计完成好,就需要主动提问,碰到不懂地方能够找老师或同学相互交流经验,这么才会愈加有效率完成课设。
经过这一段时间课设,我学到不仅仅是数据结构想关知识,也知道了团体协作关键性,知道学习需要真正扎实去学习,这么才能真正学到知识,并灵活利用这些所学知识。
五、用户使用说明
1、添加学生功效:进入系统后先选择1回车即可进入输入界面,然后根据提醒输入学生学号、姓名和数据结构、数字信号处理、数字电子技术基础分数在按回车,假如还想再继续添加就按1继续,不然能够按任何键退出。
2、输出学生:用户在输入完学生数据后既能够按2输出所输入全部学生
3、插入学生:用户需在主界面按3即能够进入插入界面,此时能够按数字键在选择要插入位置,如输入1即能够将要插入学生插入到第一个位置,能够在主界面输入2进行查看是否插入到指定位置。
4、删除学生:用户能够在主界面输入4进入删除,在经过选择编号来删除要删除学生。
5、查找:查找查找功效有按学号和姓名查找,如按一进入学号查找,能够输入要查找学号,回车即能够输出要查找学生。
6、排序:排序能够经过学号,总分,和各科成绩,输入1能够按学号从小到大排序,输入2能够按总分从小到大进行排序,输入3能够进入科目选择,再按1进行数据结构排序,2进行数字型号处理排序,3进行数电排序。
7、筛选:能够按1进入总分筛选,进入以后输入筛选多少分以上人,输入分数,如:200,即可输出全部大于200分学生;在筛选界面输入2能够输出全部及格学生;按3能够进入各科成绩筛选,再按1选出全部数据结构及格学生、再按2选出全部数字信号处理及格学生、再按3选出全部数字电子技术基础及格学生。
8、退出:退出程序只需要在主界面按0再回车即能够退出程序。
六、测试结果
1、添加学生:
2、输出学生:
3、 插入学生:
4、删除学生:
5、查找学生:
6、排序
7、筛选
0、退出程序:
七、附录
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int count =0; //统计学生人数
typedef struct Student
{
char mun[12]; //学号
char name[20]; //姓名
float score[8]; //成绩
float all_score; //总分
float ave_score; //加权平均分
struct Student *next;
}LinkList;
void InitList (LinkList *&L) //初始化链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void Creat_Student (LinkList *&L) //输入学生并添加到链表里面
{
LinkList *r=L,*s;
int i=0,j=1;
float all=0,ave,a[8];
while(j==1)
{
while(r->next!=NULL)
r=r->next;
s=(LinkList *)malloc(sizeof(LinkList));
s->next=NULL;
printf("输入学生学号、姓名、每科成绩\n");
printf("学号:");
scanf("%s",&s->mun);
printf("姓名:");
scanf("%s",&s->name);/*数据结构3.0、数字信号处理4.0、数字电子技术基础2.5 这里只输入三门成绩作为示范*/
for(i=0;i<3;i++)
{
if(i==0)
{
printf("输入数据结构分数\n");
scanf("%f",&a[i]);
s->score[i]=a[i];
}
if(i==1)
{
printf("输入数字信号处理分数\n");
scanf("%f",&a[i]);
s->score[i]=a[i];
}
if(i==2)
{
printf("输入数字电子技术基础分数\n");
scanf("%f",&a[i]);
s->score[i]=a[i];
}
}
all=a[0]+a[1]+a[2];
s->all_score=all;
ave=(a[0]*3.0+a[1]*4.0+a[2]*2.5)/9.5;
s->ave_score=ave;
r->next=s;
r=s;
count=count+1;
printf("是否继续?(按1继续,其它退出。)");
scanf("%d",&j);
}
}
void output_Student (LinkList *&L,int n) //输出全部学生
{
LinkList *p=L->next;
if(p==NULL)
{
printf("没有学生成绩!请添加学生。。。\n");
return;
}
printf("\t\t 学生成绩表 \n");
printf("编号 学号 姓名 数据结构 数字信号 数字电路 总分 加权平均分\n");
int m;
for(m=1;m<=n&&p!=NULL;m++)
{
printf("%-5d%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1f\n",m,p->mun,p->name,p->score[0],p->score[1],p->score[2],p->all_score,p->ave_score);
p=p->next;
}
}
void Delete_Student(LinkList *&L,int i) //删除第i个学生
{
int j=0;
LinkList *p=L,*q;
if (i<=0)
{
printf("没有找到该学生");
return;
}
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("没有找到该学生");
return ;
}
else
{
q=p->next;
if(q==NULL)
return ;
p->next=q->next;
free(q);
count=count-1;
printf("删除成功!\n");
return;
}
}
int Locate_Student(LinkList *L,char* mun) //按学号定位,返回第i个学生
{
int i=1;
LinkList *p=L->next;
while(p!=NULL&&strcmp(p->mun,mun)!=0)
{
i++;
p=p->next;
}
if(p==NULL)
return (0);
else
return (i);
}
int Locate_Student1(LinkList *L,char* name) //按姓名定位,返回第i个学生
{
int i=1;
LinkList *p=L->next;
while(p!=NULL&&strcmp(p->name,name)!=0)
{
i++;
p=p->next;
}
if(p==NULL)
return (0);
else
return (i);
}
void Queue_Subject(LinkList *&L) //不一样科目排序
{
int i;
LinkList *q,*p,*t1,*t2;
printf("请输入科目标代号:1 数据结构 2 数字信号处理 3 数电\n请输入:");
scanf("%d",&i);
if(i>=1||i<=3)
{
for(q=L;q->next!=NULL;q=q->next)
for(p=q->next;p->next!=NULL;p=p->next)
{
if(q->next->score[i-1]>p->next->score[i-1])
{
if(q->next==p)
{
t1=p->next;
p->next=p->next->next;
t1->next=q->next;
q->next=t1;
p=t1;
}
else
{
t1=p->next;
t2=q->next;
p->next=p->next->next;
q->next=q->next->next;
t1->next=q->next;
q->next=t1;
t2->next=p->next;
p->next=t2;
}
}
}
}
else
{
printf("没有找到该科目!\n");
return;
}
}
void Queue_Student(LinkList *&L) //排序函数
{
int i,j=1;
printf("1、根据学号 2、总分3、按各科分排序\n请输入:");
scanf("%d",&i);
LinkList *q,*p,*t1,*t2;
switch(i)
{
case 1: //学号排序
for(q=L;q->next!=NULL;q=q->next)
for(p=q->next;p->next!=NULL;p=p->next)
{
if(strcmp(q->next->mun,p->next->mun)==1)
{
if(q->next==p)
{
t1=p->next;
p->next=p->next->next;
t1->next=q->next;
q->next=t1;
p=t1;
}
else
{
t1=p->next;
t2=q->next;
p->next=p->next->next;
q->next=q->next->next;
t1->next=q->next;
q->next=t1;
t2->next=p->next;
p->next=t2;
}
}
}
break;
case 2: //总分排序
for(q=L;q->next!=NULL;q=q->next)
for(p=q->next;p->next!=NULL;p=p->next)
{
if(q->next->all_score>p->next->all_score)
{
if(q->next==p)
{
t1=p->next;
p->next=p->next->next;
t1->next=q->next;
q->next=t1;
p=t1;
}
else
{
t1=p->next;
t2=q->next;
p->next=p->next->next;
q->next=q->next->next;
t1->next=q->next;
q->next=t1;
t2->next=p->next;
p->next=t2;
}
}
}
break;
case 3:
Queue_Subject(L); //科目排序
break;
}
}
void Out_one_Student(LinkList *L,int i) //输出第i个学生
{
int j=0;
LinkList *p=L;
while(j<i)
{
j++;
p=p->next;
}
printf("%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1f\n",p->mun,p->name,p->score[0],p->score[1],p->score[2],p->all_score,p->ave_score);
}
int Seek_Student(LinkList *L) //查找学生 1 按学号查找 2 按姓名查找
{
int m;
printf("1 按学号查找 2 按姓名查找 3 退出\n请输入:");
scanf("%d",&m);
switch(m)
{
case 1:
char a[12];
printf("输入学号:");
scanf("%s",&a);
return (Locate_Student(L,a)); //返回学号查找到值
break;
case 2:
char b[20];
printf("输入姓名:");
scanf("%s",&b);
return(Locate_Student1(L,b));
break;
case 3:
break;
}
}
void Filter_Student(LinkList *&L) //筛选
{
LinkList *s,*p=L->next,*r,*q;
int y,count2=0;
printf("1 按总分选 2 全部及格人 3 按各科成绩 4 退出\n请输入:");
scanf("%d",&y);
switch(y)
{
case 1:
s=(LinkList *)malloc(sizeof(LinkList));
q=s;
int i;
float all;
printf("您要总分多少分以上人,请输入:");
scanf("%f",&all);
for (i=0;i<count;i++,p=p->next)
{
if (p==NULL)
{
printf("没有");
return;
}
if(p->all_score>all)
{
r=(LinkList *)malloc(sizeof(LinkList));
strcpy(r->mun,p->mun);
strcpy(r->name,p->name);
r->score[1]=p->score[1];
r->score[2]=p->score[2];
r->score[0]=p->score[0];
r->all_score=p->all_score;
r->ave_score=p->ave_score;
q->next=r;
q=q->next;
q->next=NULL;
count2++;
}
}
output_Student(s,count2);
free(s);
break;
case 2:
s=(LinkList *)malloc(sizeof(LinkList));
q=s;
int j;
for (j=0;j<count;j++,p=p->next)
{
if (p==NULL)
{
printf("没有");
return;
}
if(p->score[0]>59&&p->score[1]>59&&p->score[2]>59)
{
r=(LinkList *)malloc(sizeof(LinkList));
strcpy(r->mun,p->mun);
strcpy(r->name,p->name);
r->score[1]=p->score[1];
r->score[2]=p->score[2];
r->score[0]=p->score[0];
r->all_score=p->all_score;
r->ave_score=p->ave_score;
q->next=r;
q=q->next;
q->next=NULL;
count2++;
}
}
output_Student(s,count2);
free(s);
break;
case 3:
s=(LinkList *)malloc(sizeof(LinkList));
q=s;
int k,x;
printf("选择 1 数据结构及格 2 数字信号处理及格 3 数电及格\n");
printf("请输入:");
scanf("%d",&x);
for (k=0;k<count;k++,p=p->next)
{
if (p==NULL)
{
printf("没有");
return;
}
if(p->score[x-1]>59)
{
r=(LinkList *)malloc(sizeof(LinkList));
strcpy(r->mun,p->mun);
strcpy(r->name,p->name);
r->score[1]=p->score[1];
r->score[2]=p->score[2];
r->score[0]=p->score[0];
r->all_score=p->all_score;
r->ave_score=p->ave_score;
q->next=r;
q=q->next;
q->next=NULL;
count2++;
}
}
output_Student(s,count2);
free(s);
break;
case 4:
break;
}
}
bool Insert_Student(LinkList *&L,int i) //插入学生
{
int j=0;
LinkList *p=L,*s;
if (i<=0)
{
printf("对不起,没有该位置!\n");
return false;
}
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("对不起,没有该位置!\n");
return false;
}
else
{
s=(LinkList *)malloc(sizeof(LinkList));
s->next=NULL;
float all,ave,score;
printf("输入学生学号、姓名、每科成绩\n");
printf("学号:");
scanf("%s",&s->mun);
printf("姓名:");
scanf("%s",&s->name);
for(i=0;i<3;i++)
{
if(i==0)
{
printf("输入数据结构分数\n");
scanf("%f",&score);
s->score[i]=score;
}
if(i==1)
{
printf("输入数字信号处理分数\n");
scanf("%f",&score);
s->score[i]=score;
}
if(i==2)
{
printf("输入数字电子技术基础分数\n");
scanf("%f",&score);
s->score[i]=score;
}
}
all=s->score[1]+s->score[2]+s->score[0];
s->all_score=all;
ave=(s->score[0]*3.0+s->score[1]*4.0+s->score[2]*2.5)/9.5;
s->ave_score=ave;
s->next=p->next;
p->next=s;
count++;
printf("插入成功\n");
return true;
}
}
int menu_select() /*菜单选择程序*/
{
int c;
do{
system("cls");
printf("\n\t 欢迎使用学生成绩管理系统 \n");
printf("\t 1. 添加学生 \n");
printf("\t 2. 输出学生 \n");
printf("\t 3. 插入学生 \n");
printf("\t 4. 删除学生 \n");
printf("\t 5. 查找学生 \n");
printf("\t 6. 排序 \n");
printf("\t 7. 筛选 \n");
printf("\t 0. 退出程序 \n");
printf("\t **************************\n");
printf("\t 请您选择(0-7):");
scanf("%d",&c);
}
while(c<0||c>7);
return(c);
}
void main()
{
LinkList *h;
InitList(h); //初始化
for(;;)
{
switch(menu_select())
{
case 1: //添加学生
Creat_Student(h); //添加学生
break;
case 2:
output_Student(h,count); //输出全部学生
break;
case 3: //插入
int w;
printf("输入插入位置,位置为大于或等于
展开阅读全文