GESP C++ 3 级 · 知识点

一维数组基本应用

GESP C++ 三级要求掌握一维数组的定义、初始化、遍历与常见应用,能处理查找、统计、求和、求极值等问题。数组题的分水岭在于下标边界,绝大多数错误都出在从 0 还是从 1 开始。

对应知识域:一维数组基本应用相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 掌握一维数组的定义方式与下标范围,长度为 n 的数组下标是 0 到 n-1。
  • 能正确初始化数组并遍历访问,理解未显式初始化的局部数组元素值不确定。
  • 掌握求最大值、最小值、总和与平均数等基础操作。
  • 能用数组完成查找、计数以及排序前的数据存储等任务。

典型题型

  • 给出数组和下标,要求写出访问到的元素。
  • 输出数组所有元素或求特定统计量。
  • 找出数组中第一个满足条件的元素下标。

常见错误

  • 循环写成 i 从 1 到 n,越界访问 a[n] 同时漏掉 a[0]。
  • 把数组长度当成可用的最大下标,n 个元素的最大下标是 n-1。
  • 在循环内重复初始化累加变量,导致每次统计都从零开始。
  • 以为数组可以整体赋值或整体比较,数组名不能这样用。

深入理解

下标从 0 开始,边界要算清楚

int a[10]; 定义了一个能装 10 个整数的数组,合法下标是 0 到 9,不是 1 到 10。访问 a[10] 属于越界,C++ 不会报错,而是读写到数组后面的内存,结果不可预期——可能看起来正常,也可能让程序崩溃,或者悄悄改掉别的变量。这是数组题最危险的错误,因为编译器不拦。

遍历的标准写法是 for (int i = 0; i < n; i++),条件是 < 而不是 <=。如果题目说「位置从 1 开始计数」,那只是输出时加 1,数组下标仍然从 0 开始,两者不要混。

求最大值为什么要同时记下标

只找最大值很简单:先假设第一个元素最大,然后逐个比较、遇到更大的就更新。但题目常常还要求「最大值第一次出现的位置」,这时必须额外用一个变量记下标:

int mx = a[0], pos = 0;
for (int i = 1; i < n; i++)
    if (a[i] > mx) { mx = a[i]; pos = i; }

注意条件写 > 而不是 >=。写 >= 会记录最后一次出现的位置,题目要「第一次」就必须用严格大于。这个细节是判分点,也是很多人「思路对但答案错」的原因。

初始化与数组大小

int a[100]; 里的元素不会自动清零,它们的值是内存里原有的内容。局部数组要在定义时写 int a[100] = {0}; 才会全部置零——花括号里只写一个 0,其余元素自动补 0。这个写法在求和、计数类题目里必须用。

数组大小要用常量或在定义时就确定。竞赛里通常把上限写死,例如 int a[100005];,比实际数据量大一些,避免越界。用变量当数组大小(变长数组)不是 C++ 标准的一部分,部分编译器支持,考试中不要依赖。

自编例题

一次遍历求最大值与位置

输入 n 个整数,输出最大值以及它第一次出现的位置,位置从 1 开始计数。

int best = a[0], pos = 0;
for (int i = 1; i < n; i++)
    if (a[i] > best) { best = a[i]; pos = i; }
cout << best << ' ' << pos + 1 << endl;

先把第一个元素当作当前最大值,位置记为 0,然后从下标 1 开始逐个比较。只有严格大于才更新,这样相同最大值出现多次时保留的是第一次的位置。输出时把下标加 1 转成从 1 开始的位置。如果把比较写成大于等于,相同值会不断更新,最后得到的是最后一次出现的位置,与题目要求正好相反。

相关真题

这块内容在整条路线里的位置:GESP C++ 3 级备考路径。

READY TO START

开始练习

先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。

常见问题

数组下标为什么从 0 开始?

下标表示相对首元素的偏移量,首元素偏移为 0。这样地址计算最直接,也是 C++ 的规定。

数组越界会怎样?

C++ 不检查越界,可能读到其他变量的值或写坏内存,程序不一定立刻报错,所以边界必须自己保证。

数组长度可以用变量吗?

标准 C++ 要求数组长度是编译期常量。需要动态长度时应使用 vector 或足够大的固定数组。

本级别其他知识点

官方依据