22 吴光辉

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
课程名称数据结构
课题名称学生成绩管理系统
专业通信工程
班级
学号
姓名
指导教师
2015 年7 月 5 日
湖南工程学院
课程设计任务书
课程名称数据结构
课题学生成绩管理系统
专业班级通信工程
学生姓名
学号
指导老师
审批
任务书下达日期2015 年 6 月29 日
任务完成日期2015 年7 月 5 日
一、课程设计内容
1.课程设计目的:
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。

通常,实习题中的问题比平时的习题复杂得多,也更接近实际。

实习着眼于原理与应用的结合点,使读者学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。

平时的练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。

2.课程设计题目
【问题描述】
根据自己这个学期的课程表,设计一个成绩管理系统管理自己班的成绩;每个学生记录包含学号、姓名、每门课程成绩、总分以及加权平均分。

【基本要求】
一个完整的成绩管理系统应具有以下功能:
(1)输入:成绩录入;
(2)输出:输出成绩表;
(3)插入:在成绩表中适当位置插入某个学生成绩;
(4)删除:在成绩表中删除某个学生成绩;
(5)查找:根据某个关键字查找某个学生成绩;
(6)排序:根据某一个或某几个关键字进行排序;
(7)筛选:根据某个关键字筛选出符合某些条件的数据;
【测试数据】
用本班的成绩总表作为测试数据。

目录
一、需求分析 (5)
1.1输入的形式和输入值的范围 (5)
1.2输出的形式 (5)
1.3程序所能达到的功能 (5)
二、概要设计 (5)
2.1 抽象数据类型的定义: (5)
2.2 主程序的流程 (6)
三、详细设计 (6)
3.1 所有数据类型 (6)
3.2 各模块设计 (7)
四、调试分析 (15)
4.1 过程分析 (15)
4.2 经验和体会 (16)
五、用户使用说明 (16)
六、实验结果 (16)
七、附录 (23)
一、需求分析
1.1输入的形式和输入值的范围
依次手动输入学号、姓名、各科成绩,以enter键结束每次输入。

学号范围1—33,姓名不大于20个字符,各科成绩应在0—100之间。

1.2输出的形式
按照学号、姓名、各科成绩、总分、加权平均分的顺序,依次按条件输出学生的信息。

1.3程序所能达到的功能
该程序能依次录入想要录入学生的成绩,并把它们显示出来;并可以在此基础上在合适的位置插入某个学生的成绩;当选择删除时,可以根据学号
将此学生的信息从链表中删除;当选择查找时,可以根据学号和姓名两种方
式查到符合条件的学生,并把他们的信息显示出来;当选择排序时,可以根
据学号和总分升序排列,再用显示函数将排序结果显示出来;当选择筛选时,
可以根据数据结构优秀和总分大于四百两个条件筛选,并把筛选结果显示出
来。

二、概要设计
2.1 抽象数据类型的定义:
typedef struct
{
int num; //学号
char name[20]; //姓名
float sco[5]; //分数
float all_sco; //总分
double ave_sco; //加权平均分
}std;
typedef struct stu
{
std date;
struct stu * next;
}LinkList;
2.2 主程序的流程
三、详细设计
3.1 所有数据类型
typedef struct
{
int num; //学号
char name[20]; //姓名
float sco[5]; //分数
float all_sco; //总分
double ave_sco; //加权平均分
}std;
typedef struct stu
{
std date;
struct stu * next;
}LinkList;
3.2 各模块设计
3.2.1 初始化
创建一个头结点,将头节点的next域置为空。

void Init(LinkList * &L) //初始化
{
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL;
}
3.2.2 信息录入
从键盘输入学生信息,用这些信息创建一个节点,用尾插法将此节点插入到链表中。

void Create(LinkList * &L) //成绩录入
{
int n,b;
char na[20];
int i,j;
float a;
LinkList *s,*p;
s = L;
printf("请输入要录入学生的个数(1--33):");
scanf("%d",&b);
for(j=0;j<b;j++)
{
p = (LinkList *)malloc(sizeof(LinkList));
printf("请输入学号:");
scanf("%d",&n);
printf("请输入姓名:");
scanf("%s",&na);
p->date.num=n;
strcpy(p->,na);
p->date.all_sco = 0;
p->date.ave_sco = 0;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
printf("请输入概率论的分数:");
break;
case 1:
printf("请输入数据结构的分数:");
break;
case 2:
printf("请输入数字信号的分数:");
break;
case 3:
printf("请输入EDA技术的分数:");
break;
case 4:
printf("请输入英语的分数:");
default:
break;
}
scanf("%f",&a);
p->date.sco[i] = a;
p->date.all_sco +=p->date.sco[i];
}
p->date.ave_sco=(p->date.sco[0]*3.0+p->date.sco[1]*3.0+p->date.sco[2]*4.0+p-
>date.sco[3]*2.5+p->date.sco[4]*4.0)/16.5;
s->next = p;
s = p;
s->next = NULL;
}
}
3.2.3 信息显示
将此链表中的所有节点的信息显示出来。

void Display(LinkList * L) //显示
{
LinkList *p = L->next;
printf("学号姓名概率论数据结构数字信号 EDA技术英语总分加权平均分\n");
while(p != NULL)
{
printf("%d %s",p->date.num,p->);
for(int i = 0;i<5;i++)
printf(" %3.2f ",p->date.sco[i]);
printf(" %3.2f %3.2f",p->date.all_sco,p->date.ave_sco);
p = p->next;
printf("\n");
}
}
3.2.4 插入
建立一个新的节点,用该节点保存插入学生的信息,把该节点插到链表的合适位置。

void Insert(LinkList * &L) //插入
{
LinkList *p=L,*q;
int a;
float c;
char b[20];
q = (LinkList *)malloc(sizeof(LinkList));
printf("输入要插入学生的学号:");
scanf("%d",&a);
printf("请输入姓名:");
scanf("%s",&b);
q->date.num=a;
strcpy(q->,b);
q->date.all_sco = 0;
q->date.ave_sco = 0;
for(int i=0;i<5;i++)
{
switch(i)
{
case 0:
printf("请输入概率论的分数:");
break;
case 1:
printf("请输入数据结构的分数:");
break;
case 2:
printf("请输入数字信号的分数:");
break;
case 3:
printf("请输入EDA技术的分数:");
break;
case 4:
printf("请输入英语的分数:");
default:
break;
}
scanf("%f",&c);
q->date.sco[i] = c;
q->date.all_sco +=q->date.sco[i];
}
q->date.ave_sco=(q->date.sco[0]*3.0+q->date.sco[1]*3.0+q->date.sco[2]*4. 0+q->date.sco[3]*2.5+q->date.sco[4]*4.0)/16.5;
while(p->next!=NULL && p->next->date.num<a)
p=p->next;
if(p==NULL)
{
p->next=q;
q->next=NULL;
}
else
{
q->next=p->next;
p->next=q;
}
}
3.2.5 删除
查找该链表中和要删除的学生学号相同的节点,把它删除。

void Delete(LinkList * &L) //删除
{
int a;
LinkList *p=L,*q;
printf("请输入要删除的学生的学号:");
scanf("%d",&a);
while(p!=NULL && p->next->date.num!=a)
p=p->next;
if(p==NULL)
printf("没有该学生!");
else
{
q=p->next;
p->next=q->next;
free(q);
}
printf("您要删除的学生已删除!");
}
3.2.6 查找
按学号和姓名查找,找到符合要求的输出。

void Search_num(LinkList * L) //按学号查询
{
int a;
LinkList *p;
printf("请输入要查询的学生的学号:");
scanf("%d",&a);
p=L->next;
while(p!=NULL && p->date.num!=a)
p=p->next;
if(p==NULL)
printf("没有该学生!");
else
{
Show(p);
}
}
void Search_name(LinkList * L) //按姓名查询
{
char a[20];
LinkList *p;
printf("请输入要查询的学生的姓名:");
scanf("%s",&a);
int n;
p=L->next;
while(p!=NULL && n!=0)
{
n=strcmp(p->,a);
if(n!=0)
p=p->next;
}
if(p==NULL)
printf("没有该学生!");
else
{
Show(p);
}
}
void Search(LinkList * L) //查询
{
int n;
printf("请输入查询方式:1.按学号查询,2.按姓名查询");
scanf("%d",&n);
if(n==1)
Search_num(L);
else if(n==2)
Search_name(L);
else
printf("输入有误!");
}
3.2.7 排序
用直接插入法按学号和总分排序,排序后可用显示函数查看结果。

void Sort_num(LinkList * &L) //按学号排序
{
LinkList * p,* pre,* q;
p=L->next->next;
if(p!=NULL)
{
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL && pre->next->date.num < p->date.num) pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
Display(L);
}
void Sort_all_sco(LinkList * &L) //按总分排序
{
LinkList * p,* pre,* q;
p=L->next->next;
if(p!=NULL)
{
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL && pre->next->date.all_sco <
p->date.all_sco)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
Display(L);
}
void Sort(LinkList * &L) //排序
{
int n;
printf("请输入查询方式:1.按学号排序,2.按总分排序");
scanf("%d",&n);
if(n==1)
Sort_num(L);
else if(n==2)
Sort_all_sco(L);
else
printf("输入有误!");
}
3.2.8 筛选
按数据结构优秀和总分大于四百筛选,每一种没符合一个条件建立一个新节点,将符合条件的节点复制给新建立的节点,将此节点用尾插法插入到一
新链表中。

void Screen_yx(LinkList * L,LinkList * &m) //数据结构优秀
{
LinkList *p,*r,*q;
p=L->next;
r=m;
while(p!=NULL)
{
if(p->date.sco[1]>90)
{
q = (LinkList *)malloc(sizeof(LinkList));
q->date.num=p->date.num;
strcpy(q->,p->);
for(int i=0;i<5;i++)
q->date.sco[i]=p->date.sco[i];
q->date.all_sco=p->date.all_sco;
q->date.ave_sco=p->date.ave_sco;
r->next=q;
r=q;
r->next=NULL;
}
p=p->next;
}
}
void Screen_zf(LinkList * L,LinkList * &k) //总分大于400 {
LinkList *p,*r,*q;
p=L->next;
r=k;
while(p!=NULL)
{
if(p->date.all_sco>400)
{
q = (LinkList *)malloc(sizeof(LinkList));
q->date.num=p->date.num;
strcpy(q->,p->);
for(int i=0;i<5;i++)
q->date.sco[i]=p->date.sco[i];
q->date.all_sco=p->date.all_sco;
q->date.ave_sco=p->date.ave_sco;
r->next=q;
r=q;
r->next=NULL;
}
p=p->next;
}
}
void Screen(LinkList * L) //筛选
{
int n;
LinkList *q;
Init(q);
printf("请输入筛选方式:1.数据结构优秀,2.总分大于400\n");
scanf("%d",&n);
if(n==1)
{
Screen_yx(L,q);
if(q->next!=NULL)
Display(q);
else
printf("没有此类学生!");
}
else if(n==2)
{
Screen_zf(L,q);
if(q->next!=NULL)
Display(q);
else
printf("没有此类学生!");
}
else
printf("输入有误!");
}
3.2.9 菜单函数
void menu() //菜单函数
{
printf(" *************** 欢迎使用学生成绩管理系统***************");
printf("\n");
printf(" 1----录入(Input)\n");
printf(" 2----显示(Show)\n");
printf(" 3----插入(Insert)\n");
printf(" 4----删除(Delete)\n");
printf(" 5----查找(Search)\n");
printf(" 6----排序(Sort)\n");
printf(" 7----筛选(Screen)\n");
printf(" 8----退出(Exit)\n");
}
四、调试分析
4.1 过程分析
做本次试验时,开始建立数据类型时出现了麻烦,我一共设计了几种不同的数据类型,比如:用两个表保存---一个保存信息一个保存成绩;用一个表保存。

真正做时候发现第一种录入信息时比较麻烦,第二种一个节点过长,操作麻烦。

最后我用一个结构体保存信息、成绩,用一个链表保存这个结构体和指针域,这样比较简单。

在做各个模块时,其他的都比较简单,就筛选这一块遇到了麻烦。

刚开始,找到一个节点输出一个,发现这样显示不规范;经过同学提醒,新建一个链表保存找
到的节点,开始我是把新建的链表建立在筛选的子函数里,但是结果一直错误,错误有两点,以适当符合条件的学生有多个时只显示第一个,二是主链表的信息遭到了修改。

经过询问老师,才发现不能这样做。

应该把新建的链表建在筛选主函数里,在子函数的形参中加入该链表,并且新建节点把找到的节点复制给它,把它用尾插法插入到新建的链表中,这才解决了筛选模块。

4.2 经验和体会
经过本次试验,不仅巩固了课堂上老师讲的知识,还学会了遇到问题时分析问题、解决问题的能力以及程序设计的步骤和程序的使用;加强了我们动手、思考的能力。

这次的课程设计使我懂得理论与实际结合是非常重要的,只有理论知识是远远不够的,只有把所学知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。

调试时经常会遇到这样那样的问题,有的是语法问题,有的是方法错误。

在设计的过程中发现了自己的不足,对以前所学的知识理解不够深刻,掌握不够牢固。

最后,感谢老师和同学在这过程中给我的指导,让我能够顺利的完成本次课程设计。

五、用户使用说明
图5.1
该图是本程序的菜单显示,根据上面不同选项,选择不同数字完成不同功能。

六、实验结果
1.录入
录入3个学生信息,如图6.1:
图6.1 2.显示,如图6.2:
图6.2 3.插入
插入一个学号为4的学生,如图6.3,6.4:
图6.3
图6.4 4.删除
删除学号为4的学生,如图6.5,6.6:
图6.5
图6.6 5.查找
按学号查找,如图6.7:
图6.7 按姓名查找,如图6.8:
图6.8 6.排序
按学号排序,如图6.9:
图6.9 按总分排序,如图6.10:
图6.10 7.筛选
按数据结构筛选,如图6.11:
图6.11
按总分大于四百筛选,如图6.12:
图6.12 8.退出,如图6.13:
图6.13 七、附录
# include <stdio.h>
# include <malloc.h>
# include <string.h>
# include <stdlib.h>
typedef struct
{
int num; //学号
char name[20]; //姓名
float sco[5]; //分数
float all_sco; //总分
double ave_sco; //加权平均分
}std;
typedef struct stu
{
std date;
struct stu * next;
}LinkList;
//函数声明
void Init(LinkList * &L); //初始化
void Create(LinkList * &L); //成绩录入
void Display(LinkList * L); //显示
void Show(LinkList * p); //输出某个学生成绩
void Insert(LinkList * &L); //插入
void Delete(LinkList * &L); //删除
void Search_num(LinkList * L); //按学号查询
void Search_name(LinkList * L); //按姓名查询
void Search(LinkList * L); //查询
void Sort_num(LinkList * &L); //按学号排序
void Sort_all_sco(LinkList * &L); //按总分排序
void Sort(LinkList * &L); //排序
void Screen_yx(LinkList * L,LinkList * &m); //数据结构优秀void Screen_zf(LinkList * L,LinkList * &k); //总分大于400 void Screen(LinkList * L); //筛选
void menu(); //菜单函数
int main()
{
LinkList *L;
int flag,n;
Init(L);
menu();
do
{
printf("请选择你需要操作的步骤(1--8):\n");
scanf("%d",&n);
if(n >= 1 && n <= 9)
{
flag=1;
break;
}
else
{
flag=0;
printf("您输入有误,请重新选择!\n");
}
}while(flag == 0);
while(flag == 1)
{
switch(n)
{
case 1:
printf(" * * * 录入学生成绩* * *\n");
printf("\n");
Create(L);
break;
case 2:
printf(" * * * 显示学生成绩* * *\n");
printf("\n");
Display(L);
break;
case 3:
printf(" * * * 插入学生成绩* * *\n");
printf("\n");
Insert(L);
break;
case 4:
printf(" * * * 删除学生成绩* * * \n");
printf("\n");
Delete(L);
break;
case 5:
printf(" * * * 查找学生成绩* * * \n");
printf("\n");
Search(L);
break;
case 6:
printf(" * * * 排序学生成绩* * * \n");
printf("\n");
Sort(L);
break;
case 7:
printf(" * * * 筛选学生成绩* * * \n");
printf("\n");
Screen(L);
case 8:
exit(0);
break;
default :
break;
}
getchar();
printf("\n");
printf("是否继续进行(y or n):\n");
char a;
scanf("%c",&a);
if(a == 'y')
{
flag = 1;
system("cls"); //清屏
menu();
printf("请再次选择你需要操作的步骤(1--8):\n");
scanf("%d",&n);
printf("\n");
}
else
exit(0);
}
return 0;
}
课程设计评分表
教师签名:
日期:。

相关文档
最新文档