实验6 指针——学生成绩统计
目的
1. 熟练掌握指针、地址、指针类型、空指针等有关概念;
2. 熟练掌握指针的间接访问、指针的加减运算和指针表达式;
3. 学会使用指针变量访问数组元素;
4. 学会建立动态数组的方法。
实验内容与要求
1.内容:
编写一个程序,该程序提示用户输入学生的姓名及考试分数(假定每个班级学生人数最多为30人),并完成下列功能:
(1)输出班级平均分。
(2)输出考试成绩低于班级平均分的学生姓名及其分数。
(3)输出最高分及最高分学生的姓名。
2.要求:
(1) 总学生人数由用户动态输入;
(2) 学生姓名使用静态二维字符数组char name[30][20]存储,学生分数使用动态整数数组int score[n]存储。
(3) 通过数组下标使上述两个数组在逻辑上关联起来。例如,若使用二维字符数组第i行name[i]存储第i个学生的姓名,则使用整数数组的第i个元素score[i]存储第i个学生的分数。
(4) 先用数组名+下标的方式访问数组元素,完成全部要求的功能。经过测试无错误之后,修改程序,改用数组指针方式访问保存学生分数的数组元素score[i],并完成同样的功能。最后,再次修改程序,使用动态数组存储学生分数score[i],并完成全部要求的功能。
(5) 写出完整的程序,经过测试确定正确无误之后,给出测试数据并完成实验报告。
实验任务分解

指导
1.建立工程
(1) 新建一个win32 Console Application的工程:
打开VC++开发软件,从[文件]菜单中点击[新建]菜单项,出现如图所示:
在右上角的工程下输入该工程的名称,如 c2a,并设置该工程所保存的路径。
最后点击确定。

(2) 当确定后会出现要你选择工程类型的对话框,如图所示:请选择一个空的工程,即第一个选项。

(3) 当单击确定后,工程建立完毕,接下来建立程序源文件,请再单击[文件]菜单下的[新建]出现原先出现的对话框,请选择 “文件”选项卡中的c++ source file选项,并取名,如c2a

(4) 当确定后,就进入了源代码的编辑窗口
(5) 建立C++程序的基本框架 ,输入程序代码以从键盘接受一个整数,此整数即为总学生人数。
2.在函数中main( )使用一个简单的循环语句完成学生姓名和该学生的成绩的输入,例如,要输入第i个学生的姓名和分数,可使用语句cin>>name[i];同时输入该学生分数cin>>score[i];
(1)定义姓名数组name[30][20]和分数数组score[n];
(2)使用cin流输入第一个学生的姓名和成绩,并存入相应数组的0号单元中。
(3)若(2)成功,则将(2)所使用的代码嵌入一个循环体中,以实现输入多个学生的姓名和成绩。
(4)编译运行程序,改正全部编译及运行时错误。
3.完成上述数据的输入后,应输出全部学生姓名及其分数,以确保第1步的有关操作是有效的。
(1) 使用cout流输出某一个学生的姓名和成绩,注意添加必要的空格字符以便于阅读。
(2)若(1)成功,则将(1)所使用的代码嵌入一个循环体中,以实现输出全部学生的姓名和成绩,注意更新循环控制变量。
(3)编译运行程序,改正全部编译及运行时错误。
4.求平均分,这一步比较简单,只要将全部成绩累加起来,再除以学生人数就可以了。
(1)定义两个变量sun和aver分别保存全班成绩的累加和与班级平均分。
(2)使用一个循环将班级所有人的成绩累加起来;
(3)将累加和除以班级总人数即得班级平均分,将此平均分保存到相应的变量中并输出就可以了。
(4)编译运行程序,改正全部编译及运行时错误。
5.要输出低于平均分的学生姓名及其分数,只要将每一名学生的分数score[i]与步骤3中所求得的平均分进行比较,若低于平均分,则输出该分数score[i]及对应数组中的学生姓名name[i]即可。
(1)使用if语句将第一个学生的成绩score[0]与第3步求得的平均分aver进行比较,若score[0]<aver为真或者score[i]>aver为假,则输出name[0]和score[0];
(2)若(1)成功,则将(1)所使用的代码嵌入一个循环体中,以实现将全班每一个学生的成绩与aver进行比较,例如,对第个学生,可对表达式score[i]<aver进行判断,若该表达式的值为真,则输出name[i]和score[i]。
(3)编译运行程序,改正全部编译及运行时错误。
6.找出最高分及最高分学生姓名,此问题可转化为求score[i]数组中最大值的下标k,求出了k,输出name[k]和score[k]即可。
(1)定义辅助变量max和k以保存数组score[n]中当前最高分及其下标。
(2)令max = score[0]及k=0,即首先假定最高分为score[0];
(3)使用一个循环将数组score[n]中从1号单元开始的每一个元素,与max进行比较,若某一个元素score[i]>max;则更新max为score[i],同时更新k为i;循环结束后,变量max必保存最高分,变量k必保存最高分的下标。
(4)输出name[k]和score[k]。
(5)编译运行程序,改正全部编译及运行时错误。
7. 若1~5全部成功完成,则进行下列操作:
(1)将程序中凡是出现score[i]的地方改为*(score +i),编译运行程序,并比较结果是否有错误。
(2)若(1)成功,则定义指针变量 int *p = score;再将程序中凡是出现*(score +i)的地方改为*p++,注意:在每一个循环体用到*p++语句的循环语句之前要更新p的值为score,因为前一个循环结束后,p可能不再指向数组score[n]第一个元素了。
(3)编译运行程序,并比较结果是否有错误。
8. 若1~6全部成功完成,则进行下列操作:
(1)将定义数组score[i]注释掉;
(2)在同一位置添加代码 int * score = new int[n];
(3)编译运行程序,并比较结果是否有错误。

