高级语言程序设计实训报告C++

经济管理系

计算机信息管理专业

《高级语言程序设计》

实 训 报 告

一、设计题目及要求

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;}}}

四、 实训总结

通过这两个礼拜的实训练习,让我收获很多,在实训的第一节课上,老师给我们一个关于学生成绩管理程序的执行文件,然后告诉我们它有什么功能,一一演示给我们看。最后对我们说我们这两个礼拜的实训作业就是运用我们之前所学过的知识来写出这个程序的源程序代码。在此之前我们都惊呆了,都说不会做。可是在老师悉心的教导下,我们先开始写好自己对这个题目的思路,然后一步一步往下做,一个一个程序的写。在做完题后我自己觉得其实正如老师所说的那样,那些知识我们都学过的,只是我们欠缺对知识的整合能力。虽然在完成作业的过程中遇到了很多不懂的地方,但是在老师的殷切指导下以及与同学的交流中,我

最后还是完成了实训作业。让我的知识又得到了很大一步的提升,真希望以后多让我们做这种作业。这样的话我觉得学到的知识会更多,动手能力也提升的很快。

相关推荐