经济管理系
计算机信息管理专业
《高级语言程序设计》
实 训 报 告
一、设计题目及要求
1.综合应用实例——学生成绩管理
编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:
(1) 能输入并显示 n 个学生的 m 门考试科目的成绩、总分和平均分。
(2) 按总分进行排序。
(3) 按学号进行排序。
(4) 任意输入一个学号,能显示该学生的姓名、各门功课的成绩
(5) 将输入的学生成绩数据保存到文件中。
(6) 从文件中读出学生成绩数据。
具体要求如下:
1 )先用静态的数据结构(结构体数组)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
2 )排序函数是一个具有多种排序方式的、通用的、排序程序,即不仅可以实现成绩的升序排序,还可以实现成绩的降序排序。
3 )程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
4 )输出菜单形式如下:
1.输入学生记录
2.浏览学生记录
3.修改学生记录
4.排序
0.退出
请选择(0-4):
5) 排序菜单形式如下:
排序方式:
1.按总分升序排序
2.按总分降序排序
3.按学号排序
0.返回主菜单
请选择:
二、算法分析及实现步骤
总体算法分析的思路就是用调用函数来实现每个小程序的作用,首先是确定头文件,定义学生成绩结构体类型,用结构体函数实现。然后在函数执行过程中调用主菜单函数,紧接着被调用函数返回一个值给主函数,由返回来的值确定主函数应该执行下面的哪个步骤,再用一个while语句控制下面的几个步骤的循环,里面再嵌套switch语句来控制对每个小菜单程序的执行。例如:当调用函数返回“1”时,经过switch语句的判断之后就会执行相应的程序,最后,又会返回到主菜单程序中。其它的都一样。当调用函数返回的值是“4”时,此时因为排序里面还有一个排序的子菜单,所以此时这里我又用了一个switch语句来实现对排序程序的控制,也就是说在switch语句里面再嵌套switch语句。对排序程序进行的控制。等到跳出排序程序的时候,其它的都和之前的选择那样。其中,浏览每个学生信息的函数先计算出每个学生的平均成绩然后用for语句来实现每个学生信息的循环输入。修改学生信息的函数里面也用到了for语句,先找到相同的学号,然后在修改后循环执行。后来的排序程序都选用冒泡法来执行。当然一切程序都是从主函数开始执行。
三、源程序代码
#include <iostream.h>
struct student // 定义学生成绩结构体类型
{ int no;
char name[8];
float eng,phy,math,sum,ave;};
int menu(student s[],int n) // 主菜单函数
{ int k;
cout<<"欢迎使用学生成绩管理软件"<<endl;
cout<<" "<<endl;
cout<<"学生成绩管理系统菜单"<<endl;
cout<<"1.输入学生记录"<<endl;
cout<<"2.浏览学生记录"<<endl;
cout<<"3.修改学生记录"<<endl;
cout<<"4.排序"<<endl;
cout<<"0.退出"<<endl;
cout<<"请选择(0-4):";
cin>>k;
return k;}
void Input(student s[],int n) // 输入函数
{ int i;
cout<<"输入学号:"<<endl;
cout<<"学号、姓名、英语、物理、数学成绩"<<endl;
for(i=0;i<n;i++)
{ cout<<"第"<<i+1<<"位学生的信息:";
cin>>s[i].no>>s[i].name>>s[i].eng>>s[i].phy>>s[i].math;
s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math; }}
void Ave(student s[],int n) // 浏览每个学生信息的函数 { int i;
for(i=0;i<n;i++)
{ s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math; }
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"英语"<<'\t'<<"物理"<<'\t'<<"数学"<<'\t'<<"总成绩"<<'\t'<<"平均成绩"<<'\n';
for (i=0;i<n;i++)
cout<<s[i].no<<'\t'<<s[i].name<<'\t'<<s[i].eng<<'\t'<<s[i].phy<<'\t'<<s[i].math<<'\t'<<s[i].sum<<'\t'<<s[i].ave<<'\n';}
int Sort(student s[],int n) // 排序的子菜单函数
{ int y;
cout<<"排序方式:"<<endl;
cout<<"1.按总分升序排序"<<endl;
cout<<"2.按总分降序排序"<<endl;
cout<<"3.按学号排序"<<endl;
cout<<"0.返回主菜单"<<endl;
cout<<"请选择:";
cin>>y;
return y; }
void change(student s[],int n) // 修改学生信息的函数
{ int i,j;
cout<<"请输入要修改的学生的学号:";
cin>>j;
for(i=0;i<n;i++)
if(j==s[i].no)
{ cout<<endl;
cout<<"学生的信息:"<<endl;
cout<<s[i].no<<'\t'<<s[i].name<<'\t'<<s[i].eng<<'\t'<<s[i].phy<<'\t'<<s[i].math<<'\t'<<s[i].sum<<'\t'<<s[i].ave<<'\n';
cout<<"请输入修改的信息"<<endl;
cin>>s[i].no>>s[i].name>>s[i].eng>>s[i].phy>>s[i].math;
s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math; }}
void zpxs(student s[],int n) // 按总分升序排序的函数
{ int i,j;
student temp;
for(i=0;i<n;i++)
{ s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math;}
for(i=0;i<n-1;i++)
{ for(j=0;j<n-i-1;j++)
if(s[j].sum>s[j+1].sum)
{ temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;}}
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"英语"<<'\t'<<"物理"<<'\t'<<"数学"<<'\t'<<"总成绩"<<'\t'<<"平均成绩"<<'\n';
for (i=0;i<n;i++)
cout<<s[i].no<<'\t'<<s[i].name<<'\t'<<s[i].eng<<'\t'<<s[i].phy<<'\t'<<s[i].math<<'\t'<<s[i].sum<<'\t'<<s[i].ave<<'\n';}
void zpxj(student s[],int n) // 按总分降序排序的函数
{ int i,j;
student temp;
for(i=0;i<n;i++)
{ s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math;}
for(i=0;i<n-1;i++)
{ for(j=0;j<n-i-1;j++)
if(s[j].sum<s[j+1].sum)
{ temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;}}
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"英语"<<'\t'<<"物理"<<'\t'<<"数学"<<'\t'<<"总成绩"<<'\t'<<"平均成绩"<<'\n';
for (i=0;i<n;i++)
cout<<s[i].no<<'\t'<<s[i].name<<'\t'<<s[i].eng<<'\t'<<s[i].phy<<'\t'<<s[i].math<<'\t'<<s[i].sum<<'\t'<<s[i].ave<<'\n';}
void xhpxs(student s[],int n) // 按学号升序排序的函数
{ int i,j;
student temp;
for(i=0;i<n;i++)
{ s[i].ave=(s[i].eng+s[i].phy+s[i].math)/3;
s[i].sum=s[i].eng+s[i].phy+s[i].math;}
for(i=0;i<n-1;i++)
{ for(j=0;j<n-i-1;j++)
if(s[j].no>s[j+1].no)
{ temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;}}
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"英语"<<'\t'<<"物理"<<'\t'<<"数学"<<'\t'<<"总成绩"<<'\t'<<"平均成绩"<<'\n';
for (i=0;i<n;i++)
cout<<s[i].no<<'\t'<<s[i].name<<'\t'<<s[i].eng<<'\t'<<s[i].phy<<'\t'<<s[i].math<<'\t'<<s[i].sum<<'\t'<<s[i].ave<<'\n';}
void main() // 主函数
{ int i,g;
student stu[3];
while (i)
{i=menu(stu,3);
switch(i)
{ case 1:Input(stu,3);
cout<<" "<<endl; break;
case 2:Ave(stu,3);
cout<<" "<<endl;break;
case 3:change(stu,3);
cout<<" "<<endl;break;
case 4: while (g)
{ g=Sort(stu,3);
switch (g)
{ case 1:zpxs(stu,3);break;
case 2:zpxj(stu,3);break;
case 3:xhpxs(stu,3);break;
case 0:g=0;} }
cout<<" "<<endl;break;
case 0:cout<<'\t'<<"退出"<<endl;break;}}}
四、 实训总结
通过这两个礼拜的实训练习,让我收获很多,在实训的第一节课上,老师给我们一个关于学生成绩管理程序的执行文件,然后告诉我们它有什么功能,一一演示给我们看。最后对我们说我们这两个礼拜的实训作业就是运用我们之前所学过的知识来写出这个程序的源程序代码。在此之前我们都惊呆了,都说不会做。可是在老师悉心的教导下,我们先开始写好自己对这个题目的思路,然后一步一步往下做,一个一个程序的写。在做完题后我自己觉得其实正如老师所说的那样,那些知识我们都学过的,只是我们欠缺对知识的整合能力。虽然在完成作业的过程中遇到了很多不懂的地方,但是在老师的殷切指导下以及与同学的交流中,我
最后还是完成了实训作业。让我的知识又得到了很大一步的提升,真希望以后多让我们做这种作业。这样的话我觉得学到的知识会更多,动手能力也提升的很快。
高级语言程序设计实验报告班级学号姓名成绩实验2数据类型运算符和表达式一实验目的1理解语言中各种数据类型的意义掌握各种数据类型的定义…
高级语言程序设计实验报告实验一选择结构程序设计班级179学号20xx179姓名一实验目的1熟悉VC60编程环境2进一步熟悉用VC6…
重庆交通大学信息科学与工程学院综合性班级学号实验项目名称实验项目性质实验所属课程实验室中心指导教师实验完成时间设计性实验报告专业级…
Java项目开发实训总结设计人:浦江峰班级和班内序号:1132304112项目选题意义:在民营企业、中小型公司高速蓬勃发展的今天,…
建筑工程学院班级:建工125班姓名:朱理想学号:120701511日期:20xx年x月x日1房屋建筑学课程设计实训总结一、概述房屋…
河北科技师范学院欧美学院实习类型教学实习实习单位河北科技师范学院欧美学院实习起止时间年月年日指导教师刘正林所在院(系)信息技术系专…
实训名称:JSP程序设计实训人:指导老师:实训地点:实训时间:实训目的:1、掌握jsp在具体项目中的应用2、熟练掌握MyEclip…
通过上个学期的C语言学习之后,这学期我开始了C语言的实训。这次实训一共有12道题,可以说这12道题要运用学过的所有C语言知识。刚开…
实习名称:用汇编语言实现音乐程序设计专业:计算机科学与技术专业班级:200级计算机科学与技术专业班学号:姓名:指导教师:成绩:2x…