CC++ & Algorithm

C++数组的典型应用

困难17
语言版本:C++Python
概述:用数组解决生活中的实际问题,比如统计全班身高总和、计算平均分、找最高分等。

用数组解决生活中的批量数据问题

你有没有遇到过这样的情况:老师让你统计全班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,实现从后往前遍历。

常见错误(新手最容易掉坑的地方)

  1. 数组越界
    int arr[5] 的下标只能是0~4。如果写了 arr[5]arr[6],程序可能崩溃或输出奇怪的值。
    正确做法:循环时用 i < 数组长度,不要写成 <=

  2. 找最大值初始值设错
    有些同学喜欢把 maxVal 设成0,但假如全班身高都大于0那没问题;可如果数据里全是负数,比如温度(-5℃、-10℃),0比所有数都大,最后 maxVal 还是0,就错了。
    正确做法:永远用第一个元素当初始值。

  3. 平均值计算丢失小数
    int sum = 100; double avg = sum / 3; 结果是33(不是33.333),因为整数除法会截断。
    正确做法:先转类型 (double)sum / 3,或者写成 sum / 3.0

  4. 循环起始或结束条件搞反
    累加时 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,可以动态改变大小。

掌握了数组的这三种典型用法,就像学会了数学里的加减乘除——之后遇到批量数据问题,你就能游刃有余地处理了。多写几遍,让它们变成你的“肌肉记忆”吧!

例题精讲

1单选题

现有数组 int a[10] = {1,2,3,4,5,6,7,8,9,10},要计算所有元素的总和,正确的代码是?

Aint sum; for(int i=0;i<10;i++) sum+=a[i];
Bint sum=0; for(int i=0;i<10;i++) sum+=a[i];
Cint sum=0; for(int i=1;i<=10;i++) sum+=a[i];
Dint sum=0; for(int i=0;i<10;i++) a[i]+=sum;
2判断题

要找出数组中的最大值,必须先将数组元素从大到小排序。

3填空题
以下代码用于统计全班30人的身高总和,请补充完整。
int height[30];
// 假设已输入数据
int sum = 0;
for (int i = 0; i < 30; i++) {
    sum ___ height[i];
}
cout << "总和为:" << sum << endl;
4单选题

有数组 int scores[5] = {90,85,78,92,88}; 要访问最后一个元素,正确的下标是?

A4
B5
C6
D0
5填空题
以下代码用于找出数组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;