《C语言程序设计》-综合性实验-冒泡排序.doc
《《C语言程序设计》-综合性实验-冒泡排序.doc》由会员分享,可在线阅读,更多相关《《C语言程序设计》-综合性实验-冒泡排序.doc(5页珍藏版)》请在冰豆网上搜索。
《C语言程序设计》综合性实验
一、实验名称:
学生成绩管理程序
二、实验目的:
(1)了解数组和结构体的概念
(2)掌握使用结构体数组存储数据的方法
(3)掌握一种常用的排序算法
(4)能够使用顺序结构、选择结构、循环结构语句编写程序求解问题
三、实验内容:
假设有一个班级学生n人,期末考试老师要对成绩从高到低列出,并对各科的考试成绩求出其最高分、最低分和平均成绩。
试设计一个成绩管理程序,按要求显示输出学生的记录和相关的成绩。
(1)学生成绩的数据来源于程序的结构数组,定义若干个(不少于10)学生的记录,学生记录包括:
学号、姓名、三至五门科目的考试成绩;
(2)使用一种排序算法对上述某门科目的成绩进行排序;
(3)将排序后的成绩,以每个学生记录的形式显示输出;
(4)求出每门科目的最高分、最低分和平均分的信息;
(5)输出的数据要清晰,排列整齐。
四、实验摘要:
通过学生成绩管理程序教师可以轻易地了解学生学习情况,传统手工的学生成绩管理,操作效率低,并且易于出错,查询不方便。
本程序实现了对一个班的学生考试成绩按科目进行排序,并统计出各科目的最高分、最低分和平均分的数据。
一、基本设计思想
假设有一个班级的学生n人,期末考试老师要对成绩从高到低列出,并对各科的考试成绩求出其最高分、最低分和平均成绩。
现在设计一个成绩管理程序,能够实现以下的功能:
(1)对某门科目的成绩进行排序并显示输出;
(2)求出每门科目的最高分、最低分和平均分的信息;
学生成绩的数据用结构数组表示,包括:
学号、姓名、三门科目的考试成绩,其结构格式如下:
学号
姓名
无机化学
大学英语
高等数学
intnum
charname[10]
intscore[3]
二、设计方法
1.冒泡排序(BubbleSort)
(1)基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
(2)排序过程:
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则。
从下往上扫描数组R。
凡扫描到违反本原则的轻气泡。
就使其向上"漂浮"。
如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
冒泡排序的程序代码:
voidBubbleSort(inta[],intn)
{inttemp;
for(inti=0;ifor(intj=0;jif(a[j]>a[j+1])
{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}
}
2.程序流程图
(1)排序算法---冒泡的排序
定义学生人数SN、考试科目数CN
定义学生数据记录的结构体student
定义实现排序算法的函数bubble()
定义输出学生数据的函数output()
定义求最高、最低分函数maxmin()和求平均分函数avescore()
初始化学生数据记录
输入执行排序的科目
调用排序算法的函数bubble()
调用输出学生函数output()显示排序后的结果
调用函数maxmin()输出最高分和最低分
调用函数avescore()输出各各科的平均分
i从0到n
j从0到i-1
如果a[j]>a[j+1]
真交换a[j],a[j+1]
(2)学生成绩管理程序
3.程序实现
#include
#include
#defineSN10//学生人数
#defineCN3//课程数目
intcourse;//要排序的那门课程
structstudent
{intnum;
charname[10];
intscore[CN];
};
voidbubble(structstudent*pstu)//冒泡排序(从大到小)
{structstudenttmp;
for(inti=0;i{
for(intj=0;j{
if(pstu[j+1].score[course]>pstu[j].score[course])//比较相邻的两个数:
{tmp=pstu[j+1];
pstu[j+1]=pstu[j];
pstu[j]=tmp;
}//对调两个数,需要有"第三者"参以
}
}
}
voidoutput(structstudent*pstu)
{
cout<cout<cout<cout<cout<for(inti=0;i {cout<cout< for(intj=0;j cout< cout<}
voidavgscore(structstudent*pstu)
{
intsum[CN],n;
for(n=0;n {sum[n]=0;
for(intj=0;j sum[n]+=pstu[j].score[n];
}
cout<<"各科课程的平均成绩:
";
for(n=0;n cout< cout<}
voidmaxmin(structstudent*pstu)
{
intmax[CN],min[CN],n;
for(n=0;n {max[n]=0;
min[n]=100;
for(intj=0;j {if(pstu[j].score[n]>max[n])
max[n]=pstu[j].score[n];
if(pstu[j].score[n] min[n]=pstu[j].score[n];
}
}
cout<<"各科课程的最高分:
";
for(n=0;n cout< cout< cout<<"各科课程的最低分:
";
for(n=0;n cout< cout<}
voidmain()
{
structstudentstu[SN]={
{2004101,"花拓也",95,97,93},
{2004102,"梁慕橙",94,99,92},
{2004103,"梁晓乐",96,89,96},
{2004104,"任光晞",88,86,83},
{2004105,"花痴心",72,73,85},
{2004106,"何以茜",79,81,93},
{2004107,"花泽类",85,86,76},
{2004108,"道明寺",100,100,100},
{2004109,"西门",65,63,75},
{2004110,"美作",62,60,87},
};
intn;
cout<cout<<"要对第几门课程的成绩排序:
";
cin>>n;//输入要排序的第几门课程
course=n-1;
structstudent*pstu=stu;
cout<bubble(pstu);
output(pstu);
cout<maxmin(pstu);
avgscore(pstu);
}
三、验证结果
四、总结
本实验的程序有一定的实用性,是对所学过的知识的综合运用。
程序的核心是对数据进行排序,必须要对排序算法有深入的领会,由于学生的数据是使用结构体数组表示,因此在调用排序函数时,需要对排序算法的原代码作相应的修改,还要注意函数参数引用的格式。
此外在程序调试时,会出现一些编译错误,其中包括语法错误和逻辑错误,必须要对其修改,在编写和调试程序过程中,提高了本人编程技能。
五、参考资料与网上资源
(1)《C语言程序设计实验指导与习题解答》蒋清明主编人民邮电出版社
(2)《C++程序设计技能百练》蒋立翔编著中国铁道出版社
(3)唯C世界,
(4)C语言编程网,
(5)C语言编程宝典,
(6)C语言程序基础,