人无完人,我只是一位C++的初学者,并不是一位专业的C++软件工程师,如果本篇文章有一些细微的错误或者是您有什么好的方法也希望您可以在本文下面评论,我会认真阅读并考虑采纳的。
题目内容
输入n个学生的成绩,求他们的平均成绩,并求出成绩大于等于平均分的人数。
这道题其实是南京大学出版社丛书《信息学奥赛一本通(C++版)》中为了引出数组而给出的一道例题改编而来的。
分析过程
在写程序的时候我们很讲究过程,理清楚过程后我们就大体知道如何去做这题了。
由于这一次的数据量较为丰富,我们采用一维数组来保存这些数据。
首先我们要输入学生的数量,并且我们还需要不断输入学生的成绩到我们的数组里,并且累加与学生的数量相除得到平均分。
但是我们还需要求出成绩大于平均分的人数,我们可以挨个读数组里面的数据去与平均分比较。
思路理清楚后,我们大致就可以尝试实现一下这个程序了。
定义变量
// 定义存平均分的双精度浮点型变量aver,并将初始值赋为0
double aver = 0;
// 定义学生数量和所有学生的总成绩的整型变量,初始值赋为0
// 这里同时也定义了一个可以存50个整型变量的一维数组
int num = 0, score[50] = {}, sum = 0;
这里为什么我只定义了一个可以存50个整型变量的一维数组,因为我不知道我们的使用需求是什么,这个地方也只能用常量我只能先写个50,反正一个班也够用,如果不够用把后面的50改大一点即可。
输入学生数量&写入成绩
此处我们使用num这个整型变量来存学生数量(我们定义的一维数组score[50],只能存50个整型变量,所以这个num是小于等于50的,num的最大值取决于你定义的这个一维数组能存的元素个数,当然实际你写的时候你可以灵活调整的)。
我们可以使用for循环,再定义一个变量i,若i小于num就一直输入成绩,并且将我们所有的成绩加入sum变量中,也就是边写边加。
// 输入学生数量
cin >> num;
// 边输入数据边将分数加至sum变量中,直到i=num跳出循环
for (int i = 0; i < num; ++i) {
cin >> score[i];
sum += score[i];
}
计算平均分&统计分数和输出结果
我们已经写到这个程度了,现在我们还需要计算平均分,其实很简单,只需要拿sum去除以num即可。
统计成绩我们再定义一个整型变量k,初始值先赋为0,可以再加个for循环,按照惯例我们再定义一个变量j去遍历一下数组里面的数据,for循环里面扔一个条件判断语句:如果score[i]≥aver,则k就加1,重复执行直到j=num,输出平均分及人数。
// 计算平均分,并存至变量aver中
aver = (double) sum / num;
// 定义整型变量k,初始值为0,用于存有多少人的成绩超过了平均分
int k = 0;
// 遍历数组,如果有谁的值大于等于平均分则将k自增1
for (int j = 0; j < num; ++j) {
if (score[j] >= aver) {
++k;
}
}
// 输出平均分与成绩大于等于平均分的人数
printf("平均分: %lf, 成绩大于等于平均分的人数: %d", aver, k);
这个程序到这里就算写完了(但基础的那几行还是需要,本文只是把程序分成的多个部分来讲而已)。
最终程序
#include <bits/stdc++.h>
using namespace std;
int main() {
// 定义存平均分的双精度浮点型变量aver,并将初始值赋为0
double aver = 0;
// 定义学生数量和所有学生的总成绩的整型变量,初始值赋为0
// 这里同时也定义了一个可以存50个整型变量的一维数组
int num = 0, score[50] = {}, sum = 0;
// 输入学生数量
cin >> num;
// 边输入数据边将分数加至sum变量中
for (int i = 0; i < num; ++i) {
cin >> score[i];
sum += score[i];
}
// 计算平均分,并存至变量aver中
aver = (double) sum / num;
// 定义整型变量k,初始值为0,用于存有多少人的成绩超过了平均分
int k = 0;
// 遍历数组,如果有谁的值大于等于平均分则将k自增1
for (int j = 0; j < num; ++j) {
if (score[j] >= aver) {
++k;
}
}
// 输出平均分与成绩大于等于平均分的人数
printf("平均分: %lf, 成绩大于等于平均分的人数: %d", aver, k);
return 0;
}
一些疑问
这里我会解答一下在看本文中的一些常见疑问
为什么我这里有的用cin有的用printf()?
我这里用的是万能库(bits/stdc++.h),平时练习在这里并没有严格限制一定要用scanf()或者是cin,这里就没有严格一定用的是sin还是scanf(),但平时还是建议大家不要和本文一样混用。
如果你用的是iostream库那么输入就得用cin,输出cout,cstdio就便是scanf()和printf()。
为什么我跟着这篇文章写代码却报错了?
本文中分割的版块没有包括头文件等内容,也就是说本文中提到的内容基本上都视你已经写完这些内容了,所以自然就报错了。
遇到这种情况也不必慌,本文在最终程序板块中给了完整的代码,可以对照着参考一下。
参与讨论