数据结构与算法实训课程实训报告.docx
《数据结构与算法实训课程实训报告.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实训课程实训报告.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构与算法实训课程实训报告
XXXX学院课程实训报告
课程名:
数据结构与算法实训
学号:
姓名:
班级:
指导老师:
时间:
1.设计任务、要求及所用软件环境
(1)设计任务:
成绩管理:
设计一个程序进行学生成绩管理。
假设对某个班的学生5门课程的学习成绩进行管理,实现以下功能:
(1)求每门课程的平均成绩;
(2)输出每门课程成绩优秀(>=90分)的学生名单及成绩;(3)输出只有一门课程不及格的学生名单及每门成绩;(4)对5门课程中可以按照任一门课程的成绩进行排序。
(2)设计要求:
1)学生成绩采用链表存储方式;
2)学生人数和学生的成绩从键盘输入;
3)排序方法可以任选一种。
(3)所用软件环境:
MicrosoftVisualC++6.0(二级C语言专用版)
2.问题的模型化描述以及求解问题的算法简要描述
通过开发一个学生成绩管理信息系统,掌握与数组有关的算法、函数的调用、结构体类型变量的定义和使用,提高实际运用能力。
开始进入登录界面,根据输入的操作选项,可分别进行各项操作:
可完成学生成绩信息的输入,求平均成绩,查询每门课程成绩优秀(>=90分)的学生名单及成绩,查询只有一门课程不及格的学生名单及每门成绩,对5门课程中可以按照任一门课程的成绩进行排序等功能。
3.所选择的存储结构及基本运算、设计的模块构成、各模块的简要说明、流程图、调用关系表。
用MicrosoftVisualC++6.0(二级C语言专用版)编写,完成学生成绩的链表存储,任意学生成绩的插入、查询、排序。
(1)输入形式和输入范围:
建立成绩管理时,需要指定元素个数和每个元素的值,然后按元素的顺序建立一个链式成绩管理系统;排序时,需要确定排序方法;查找操作时需要元素的范围;在所有输入中,元素的值都是整数。
(2)输出的形式:
在所有操作中都显示操作是否正确以及操作后链表的内容。
设计的模块构成:
4.程序组成
基本操作及流程图:
(1)结构图:
(2)函数average()的流程图:
(3)函数Excellent()的流程图:
所设计软件的组成(程序文件)及使用说明。
main():
主函数
average():
求课程的平均成绩
Excellent():
查找所有个人平均分超过90分的学生,并将其学号输出
Fail():
查找有成绩不及格的学生,并输出其信息
Sort():
对班级学生按某门课程成绩排名
各函数间关系如下:
average()
Excellent()
main()Fail()
Sort()
5.程序清单
程序清单:
#include"stdio.h"
#include"stdlib.h"
#defineNUM5//课程数
#defineNULL0
typedefstructnode//学生的结构体定义
{
intid;//学号
charname[16];//姓名
intsubject[NUM];//课程数据组
floataver;//学生个人课程平均分
structnode*next;
}student;
student*head=NULL;//head为学生连表的头指针
intn;
voidSort()//对班级学生按某门课程成绩排名
{
intj;//课程序号
student*p1,*p2,*p3;
printf("请输入需要排序的课程序号(1~5):
\n");
scanf("%d",&j);
//由大到小排序,排序方法采用冒泡排序法
if(head!
=NULL)
{
p1=p2=p3=head;
while(p2->next!
=NULL)
{
p1=p2=p3=head;
p2=p1->next;//将p2移到p1下一个节点
//如果前一个节点大于下一个节点,p1和p2都往下移一个节点,p3移到p1原本指着的节点
while(p2->next!
=NULL&&p1->subject[j-1]>=p2->subject[j-1])
{
p3=p1;
p1=p2;
p2=p1->next;
}
//当出现后面一个节点大于前一个节点的时候,调整节点位置
if(p1->subject[j-1]subject[j-1])
{
p1->next=p2->next;//p1与p2的下一个节点连接
p2->next=p1;//p2与p1连接
if(p3!
=p1)
p3->next=p2;//p3与p2连接
if(p1==head)
head=p2;//当p1是头节点,那么头节点变成p1
}
}
printf("班级学生课程%d的排序是:
\n",j);
p1=head;
while(p1)//输出按课程j-1成绩排名的所有学生姓名和课程j-1的成绩
{
printf("姓名:
%s成绩:
%d\n",p1->name,p1->subject[j-1]);
p1=p1->next;
}
}
else
{
printf("没有学生信息!
\n\n");
return;
}
}
voidaverage()//求课程的平均成绩
{
inti,j;
floatsum,aver;
student*p;
printf("课程平均成绩:
\n");
printf("#######课程#######课程平均#######\n\n");
for(i=0;i{
j=0;
sum=0;
p=head;
while(p)
{
sum=sum+p->subject[i];
p=p->next;
j++;
}
aver=sum/j;
printf("课程%d%.2f\n",i+1,aver);
}
printf("\n");
printf("#################################\n\n");
}
voidFail()//查找有成绩不及格的学生,并输出其信息
{
inti;
student*p;
p=head;
printf("没有通过的结果如下:
\n");
printf("#####学号#####姓名####课程1####2####3#####4#####5####平均分###\n");
while(p)
{
i=0;//从课程1开始查找
while(i{
if(p->subject[i]<60)//如果不及格,则输出学生所有信息
{
printf("%8d%10s",p->id,p->name);
for(i=0;iprintf("%6d",p->subject[i]);
printf("%8.2f\n",p->aver);
break;//学生只要有1门课程不及格就查找成功,跳出循环
}
else
i++;//查找下一门课程
}
p=p->next;//查找下一个结点
}
printf("##############################################################\n\n");
}
voidExcellent()//查找所有个人平均分超过90分的学生,并将其学号输出
{
student*p;
boolk=false;
p=head;
while(p)//从第1个结点开始查找
{
if(p->aver>=90.0)
{
printf("\n");
printf("成绩优秀的学生学号为%d\n",p->id);
p=p->next;
k=true;
}
else
p=p->next;
}
if(!
k)
printf("没有平均分超过90分的学生\n");
}
voidmain()
{
student*p,*q;
inti,j,k,flag=1;
floatsum;
head=(student*)malloc(sizeof(student));//生成一个头结点
printf("请输入学生人数!
\n");
scanf("%d",&n);
q=head;//q指向第一个结点
for(i=0;i{
p=q;
printf("输入学生%d的学号:
",i+1);
scanf("%d",&p->id);//输入学号
printf("输入学生%d的姓名:
",i+1);
scanf("%s",p->name);//输入姓名
printf("\n");
printf("请输入学生%d的5门成绩\n",i+1);
for(j=0;j{
printf("第%d科成绩:
",j+1);
scanf("%d",&p->subject[j]);
}
q=(student*)malloc(sizeof(student));
q->next=NULL;
p->next=q;
printf("\n\n");
}
p=head;
for(i=0;ip=p->next;
q=p->next;
free(q);//将空结点释放掉
p->next=NULL;
p=head;
while(p)
{
sum=0.0;
for(j=0;jsum=sum+p->subject[j];
p->aver=sum/NUM;
p=p->next;
}
printf("\n\n");
while(flag)
{
printf("########################################################\n");
printf("1-----求每门课程的平均成绩\n");
printf("2-----输出有课程不及格的学生情况\n");
printf("3-----输出个人平均分超过90分的学生学号\n");
printf("4-----所有学生对制定课程排名\n");
printf("5-----退出\n");
printf("########################################################\n");
printf("\n\n");
printf("请选择(1-5):
");
scanf("%d",&k);
switch(k)
{
case1:
average();break;
case2:
Fail();break;
case3:
Excellent();break;
case4:
Sort();break;
case5:
flag=0;break;
default:
printf("该选项不存在!
");
}
}
}
6.运行结果:
7.设计总结和体会: