C++数组的典型应用
困难17用数组解决生活中的批量数据问题
你有没有遇到过这样的情况:老师让你统计全班30个人的身高总和、平均身高,或者找出最高分、最低分?如果每个数据都用一个单独的变量来存,比如 height1, height2, … height30,那代码会写得又长又乱,而且没法用循环自动处理。这时候,数组就是你的好帮手——它像一排带编号的抽屉,可以把同类数据整整齐齐地放进去,再配合循环一把搞定。
下面我们就来看三个最常用的数组“套路”,学会它们,你就能轻松处理成百上千个数据了。
一、累加和:算总分、平均分
有什么用?
比如老师要算全班同学的总分,或者你想算自己一周的零花钱总和。利用数组和循环,把每个数加起来,放到一个“总和”变量里。
生活例子
小明一周5天的零花钱分别是:8元、12元、5元、10元、15元。他想知道这周一共花了多少钱?用数组存起来,循环累加就行。
代码示例
下面的代码计算5个同学的总分和平均分(保留原有内容并补充注释):
#include <iostream>
using namespace std;
int main() {
int scores[5] = {88, 92, 73, 85, 96}; // 5个学生的考试成绩
int sum = 0; // 存放总分,初始为0
// 用for循环把每个成绩累加到sum中
for(int i = 0; i < 5; i++) {
sum = sum + scores[i]; // 等价于 sum += scores[i];
}
// 注意:整数除法会丢掉小数,所以把sum转成double再除
double average = (double)sum / 5;
cout << "总分: " << sum << endl;
cout << "平均分: " << average << endl;
return 0;
}
要点解释
int scores[5]表示创建了一个能装5个整数的数组,下标从0到4。sum一开始是0,然后循环里每次加上一个元素,最后得到总和。- 计算平均值时,
(double)sum把整数变成小数,这样除法结果就是小数,否则会丢掉小数部分。
二、找最大值和最小值:比身高、比分数
有什么用?
从中找最高的、最低的、最快的…… 只要先假定第一个是最大(或最小),然后拿剩下的挨个比,发现更大的就更新。
生活例子
体育课上5位同学的身高(厘米):150、165、172、158、180。谁最高?用数组加循环就能轻松找出。
代码示例
(保留原有内容并补充找最小值的例子)
#include <iostream>
using namespace std;
int main() {
int height[] = {150, 165, 172, 158, 180}; // 5人身高,单位厘米
int n = 5; // 数组元素个数
int maxVal = height[0]; // 先假设第一个是最高
int minVal = height[0]; // 也假设第一个是最矮
// 从第二个元素(下标1)开始比较
for(int i = 1; i < n; i++) {
if(height[i] > maxVal) {
maxVal = height[i]; // 发现更高的,更新最高
}
if(height[i] < minVal) {
minVal = height[i]; // 发现更矮的,更新最矮
}
}
cout << "最高身高: " << maxVal << " 厘米" << endl;
cout << "最矮身高: " << minVal << " 厘米" << endl;
return 0;
}
要点解释
maxVal初始化为数组第一个元素,不能随便设成0(如果数组里全是负数,0比所有数都大,就永远找不到最大值)。- 循环从
i=1开始,因为第一个已经当“种子”了,不需要跟自己比。 - 找最小值的方法一模一样,只是把
>改成<。
三、倒序输出:倒着报数、倒序显示
有什么用?
有时候需要把数据从后往前处理,比如倒着报成绩、显示历史记录的最新一条在最后等。
生活例子
老师让同学们按学号从小到大报身高,现在想请他们从大到小报一遍(倒序输出数组)。代码很简单:从最后一个下标开始,往前走到第一个。
代码示例
(保留原有内容,加完整上下文)
#include <iostream>
using namespace std;
int main() {
int height[] = {150, 165, 172, 158, 180};
int n = 5;
cout << "倒序输出身高: ";
for(int i = n-1; i >= 0; i--) {
cout << height[i] << " ";
}
cout << endl;
return 0;
}
要点解释
- 数组最后一个元素的下标是
n-1(因为下标从0开始)。 - 循环条件
i >= 0保证输出到第一个元素。 i--每次减1,实现从后往前遍历。
常见错误(新手最容易掉坑的地方)
-
数组越界
int arr[5]的下标只能是0~4。如果写了arr[5]或arr[6],程序可能崩溃或输出奇怪的值。
正确做法:循环时用i < 数组长度,不要写成<=。 -
找最大值初始值设错
有些同学喜欢把maxVal设成0,但假如全班身高都大于0那没问题;可如果数据里全是负数,比如温度(-5℃、-10℃),0比所有数都大,最后maxVal还是0,就错了。
正确做法:永远用第一个元素当初始值。 -
平均值计算丢失小数
int sum = 100; double avg = sum / 3;结果是33(不是33.333),因为整数除法会截断。
正确做法:先转类型(double)sum / 3,或者写成sum / 3.0。 -
循环起始或结束条件搞反
累加时for(i=0; i<=5; i++)会多访问下标5(越界)。
倒序时for(i=n; i>=0; i--)第一个元素是n,也越界了。
正确做法:细心数下标范围,多测试。
完整示例:综合统计
下面是一个完整的程序,把上面三个技巧合并在一起:输入5个同学的数学成绩,输出总分、平均分、最高分、最低分,并且倒序显示成绩。
#include <iostream>
using namespace std;
int main() {
const int num = 5; // 同学人数
int scores[num]; // 存放成绩的数组
int sum = 0; // 总分
int maxScore, minScore; // 最高分和最低分
// 1. 输入成绩
cout << "请输入" << num << "位同学的数学成绩:";
for(int i = 0; i < num; i++) {
cin >> scores[i];
}
// 2. 累加总分
for(int i = 0; i < num; i++) {
sum += scores[i];
}
// 3. 找最大最小(先假设第一个是)
maxScore = scores[0];
minScore = scores[0];
for(int i = 1; i < num; i++) {
if(scores[i] > maxScore) maxScore = scores[i];
if(scores[i] < minScore) minScore = scores[i];
}
// 4. 输出结果
double average = (double)sum / num; // 平均分
cout << "总分:" << sum << endl;
cout << "平均分:" << average << endl;
cout << "最高分:" << maxScore << endl;
cout << "最低分:" << minScore << endl;
// 5. 倒序输出
cout << "倒序显示成绩:";
for(int i = num-1; i >= 0; i--) {
cout << scores[i] << " ";
}
cout << endl;
return 0;
}
运行示例:
请输入5位同学的数学成绩:88 92 73 85 96
总分:434
平均分:86.8
最高分:96
最低分:73
倒序显示成绩:96 85 73 92 88
相关知识点指引
- 二维数组:处理表格数据(比如全班各科成绩),你需要行和列两个下标。
- 数组长度与常量:用
const int n = 5定义数组大小,方便修改。 - 排序算法:想从大到小或从小到大排列成绩,可以用冒泡排序、选择排序等。
- 字符数组与字符串:字符串其实就是一个字符数组,比如
char name[20]。 - vector容器(高级):C++还有一种更灵活的数组叫
vector,可以动态改变大小。
掌握了数组的这三种典型用法,就像学会了数学里的加减乘除——之后遇到批量数据问题,你就能游刃有余地处理了。多写几遍,让它们变成你的“肌肉记忆”吧!
例题精讲
现有数组 int a[10] = {1,2,3,4,5,6,7,8,9,10},要计算所有元素的总和,正确的代码是?
要找出数组中的最大值,必须先将数组元素从大到小排序。
以下代码用于统计全班30人的身高总和,请补充完整。
int height[30];
// 假设已输入数据
int sum = 0;
for (int i = 0; i < 30; i++) {
sum ___ height[i];
}
cout << "总和为:" << sum << endl;有数组 int scores[5] = {90,85,78,92,88}; 要访问最后一个元素,正确的下标是?
以下代码用于找出数组arr中的最大值,请补充完整。
int arr[10] = {23,45,12,67,34,89,11,56,78,90};
int max = arr[0];
for (int i = 1; i < 10; i++) {
if (___ ) {
max = arr[i];
}
}
cout << "最大值是:" << max;