跳转到内容

第 5 章 数组

  • 5.1 一维数组的定义和应用
  • 5.2 二维数组的定义和应用
  • 5.3 字符数组的定义和应用
  • 5.4 编程实战

学完这一章,你应该能做到:

  • 理解数组是“一组相同类型数据”的集合。
  • 会定义和使用一维数组、二维数组。
  • 会用下标访问数组元素。
  • 能利用数组处理一批数据。
  • 理解字符数组和字符串的关系。
  • 能写出简单的字符串处理程序。

前面学的变量一般一次只存一个值,例如:

int a;
int b;
int c;

如果要存 100 个成绩,就不可能定义 100 个单独变量。

数组就是为了解决“一组同类数据”的存储和处理问题。

int a[5];

表示定义了一个有 5 个元素的整型数组。

数组 a[5] 的合法下标是:

  • a[0]
  • a[1]
  • a[2]
  • a[3]
  • a[4]

a[5] 是越界访问。

#include <stdio.h>
int main(void)
{
int a[5];
int i;
for (i = 0; i < 5; i++)
scanf("%d", &a[i]);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
sum = 0;
for (i = 0; i < n; i++)
sum += a[i];
max = a[0];
for (i = 1; i < n; i++)
{
if (a[i] > max)
max = a[i];
}
for (i = n - 1; i >= 0; i--)
printf("%d ", a[i]);

二维数组可以理解成表格或矩阵。

int a[3][4];

表示 3 行 4 列。

输入模板:

for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%d", &a[i][j]);
}
}

字符数组用于存放字符,也常用于存放字符串。

char s[20];

输入一个字符串:

scanf("%19s", s);

输出一个字符串:

printf("%s\n", s);

C 字符串末尾有一个特殊字符:

'\0'

它表示字符串结束。

例如:

char s[] = "abc";

内存里其实是:

'a' 'b' 'c' '\0'

不使用库函数时,可以一个字符一个字符数,直到遇到 '\0'

int i = 0;
while (s[i] != '\0')
i++;
int i = 0;
while (s1[i] != '\0')
{
s2[i] = s1[i];
i++;
}
s2[i] = '\0';
  • 数组下标从 0 开始,不是从 1 开始。
  • 下标越界。
  • scanf("%s", s) 写成 scanf("%s", &s)
  • 字符数组长度不够,放不下 '\0'
  • 二维数组输入输出时把行列顺序写乱。
#include <stdio.h>
int main(void)
{
int a[100];
int i, n, sum = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < n; i++)
sum += a[i];
printf("%d\n", sum);
return 0;
}
sum = 0;
for (i = 0; i < n; i++)
sum += a[i][i];
int len = 0;
while (s[len] != '\0')
len++;
  1. 写出下面程序的输出结果。
#include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
printf("%d\n", a[0] + a[4]);
return 0;
}
  1. 写出下面程序的输出结果。
#include <stdio.h>
int main(void)
{
char s[] = "abc";
printf("%c %c\n", s[0], s[2]);
return 0;
}
  1. 找出并改正下面程序中的错误。
#include <stdio.h>
int main(void)
{
int a[5];
int i;
for (i = 1; i <= 5; i++)
scanf("%d", &a[i]);
return 0;
}
  1. 修改下面程序,使其能正确输入字符串。
#include <stdio.h>
int main(void)
{
char s[20];
scanf("%s", &s);
printf("%s\n", s);
return 0;
}
  1. 输入 5 个整数,输出它们的和与平均值。
  2. 输入 10 个整数,找出最大值和最小值。
  3. 输入 6 个整数,按逆序输出。
  4. 将长度为 8 的数组循环右移 1 位。
  5. 输入 10 个整数,统计偶数个数。
  6. 输入一个 3 x 3 矩阵,求主对角线元素和。
  7. 输入一个 2 x 3 矩阵,输出其转置结果。
  8. 输入一个字符串,统计元音字母个数。
  9. 不用库函数,求字符串长度。
  10. 不用库函数,将字符串 A 复制到字符串 B。
  11. 不用库函数,判断两个字符串是否相等。
  12. 输入若干学生成绩,输出高于平均分的成绩。
  13. 统计一个字符串中数字字符出现的个数。
  14. 把一个字符串中的小写字母改成大写字母。
  • 我知道数组下标从 0 开始。
  • 我会用循环遍历数组。
  • 我会在数组中求和、找最大值、逆序输出。
  • 我能读写二维数组。
  • 我知道字符数组和字符串的关系。
  • 我能不使用库函数写出字符串长度和复制。
  • 第 5 章最重要的是“下标”和“循环”配合。
  • 数组题一出错,先检查是不是越界了。
  • 字符串题不要怕,本质上就是字符数组加循环。

学完这一章后,你处理的数据就不再只是一个一个的值,而是一整组值了。