GESP3级 - 第四课 一维数组

1. 一维数组的概念

1.1 什么是一维数组

一维数组是一种数据结构,用于存储一组相同数据类型的元素。可以将一维数组想象成一排有编号的盒子,每个盒子内可以放置一个数据。

例如,我们可以用一组数据来模拟一维数组:

[12, 45, 23, 56, 78]

在这个例子中,我们有一个包含5个整数的一维数组。每个元素都有一个唯一的索引(下标),表示它在数组中的位置。索引从0开始,一直到数组长度减1。

一维数组具有以下特点:

  1. 通过索引可以快速访问、修改数组中的任意元素。例如,要访问上面数组中的第一个元素,可以使用arr[0],它的值为12。
  2. 数组的长度在创建时确定,之后无法改变。在上面的例子中,数组的长度为5。

一维数组的声明方式如下:

数据类型 数组名[数组长度];

例如,声明一个长度为5的整数数组:

c 复制代码
int arr[5];

这就创建了一个名为arr的数组,它可以存储5个整数类型的数据。

总之,一维数组是一种简单但非常实用的数据结构,在程序设计中有着广泛的应用。通过学习一维数组,你将掌握数组的基本概念和使用方法,为进一步学习其他数据结构打下良好的基础。

1.2 一维数组的特点

一维数组有以下几个主要特点:

  1. 固定长度

    • 数组的长度在声明时就确定了,之后无法改变。
    • 例如,声明了一个长度为5的数组 int arr[5];,数组 arr 的长度就固定为5,不能再增加或减少元素。
  2. 连续存储

    • 数组中的元素在内存中是连续存储的,即每个元素的内存地址是相邻的。

    • 例如,对于数组 [12, 45, 23, 56, 78],五个元素在内存中的排列如下:

      地址   元素
      1000   12
      1004   45
      1008   23
      1012   56
      1016   78
      
    • 这种连续存储的特性使得通过索引访问数组元素非常高效。

  3. 随机访问

    • 可以通过索引(下标)直接访问数组中的任意元素,访问时间复杂度为 O(1)。
    • 例如,对于数组 arr[5] = {12, 45, 23, 56, 78},可以通过 arr[2] 直接访问第三个元素 23。
  4. 相同数据类型

    • 数组中所有元素的数据类型必须相同。
    • 例如,定义了一个整型数组 int arr[5];,数组中只能存储整数,不能存储其他类型的数据。

这些特点使得一维数组在需要存储和操作大量相同类型数据时非常有用。了解一维数组的特点可以帮助我们更好地理解和应用这种数据结构。

1.3 一维数组在生活中的应用

一维数组在生活中有许多实际应用,以下是几个例子:

  1. 学生成绩管理

    • 将学生的成绩存储在一个数组中,每个元素代表一个学生的成绩。
    • 例如,scores[5] = {85, 92, 78, 90, 87} 表示有5个学生,他们的成绩分别是85、92、78、90和87。
    • 通过数组可以方便地计算平均成绩、找出最高分和最低分等。
  2. 商品库存管理

    • 将商品的库存量存储在一个数组中,每个元素代表一种商品的库存量。
    • 例如,inventory[3] = {120, 50, 200} 表示有三种商品,它们的库存量分别为120、50和200。
    • 通过数组可以方便地更新库存量、检查是否缺货等。
  3. 温度记录

    • 将一天中不同时间的温度存储在一个数组中,每个元素代表一个时间点的温度。
    • 例如,temperatures[4] = {25.5, 28.2, 30.1, 26.8} 表示一天中的四个时间点,温度分别为25.5、28.2、30.1和26.8摄氏度。
    • 通过数组可以方便地计算平均温度、找出最高和最低温度等。
  4. 图像处理

    • 将图像的像素值存储在一个数组中,每个元素代表一个像素的颜色值。
    • 例如,一个灰度图像可以用一个二维数组来表示,其中每个元素表示一个像素的灰度值。
    • 通过数组可以方便地进行图像的处理,如调整亮度、对比度等。
  5. 数据分析

    • 将数据存储在一个数组中,每个元素代表一个数据点。
    • 例如,data[6] = {3.2, 4.5, 6.1, 2.8, 5.9, 4.2} 表示有6个数据点。
    • 通过数组可以方便地进行数据的统计分析,如计算平均值、方差等。

这些只是一维数组在生活中应用的几个例子。一维数组还可以应用于许多其他领域,如排队系统、投票统计等。学习一维数组可以帮助我们更好地解决生活中的实际问题。

2. 一维数组的定义和初始化

2.1 定义一维数组的语法

在 C 语言中,定义一维数组的语法如下:

c 复制代码
数据类型 数组名[数组长度];

其中:

  • 数据类型:指定数组中元素的类型,可以是 intfloatchar 等。
  • 数组名:为数组选择一个合适的名称,遵循变量命名规则。
  • 数组长度:指定数组中元素的个数,必须是一个正整数。

以下是一些定义一维数组的示例:

  1. 定义一个整型数组,包含 5 个元素:

    c 复制代码
    int numbers[5];
  2. 定义一个浮点型数组,包含 7 个元素:

    c 复制代码
    float prices[7];
  3. 定义一个字符型数组,包含 10 个元素:

    c 复制代码
    char letters[10];
  4. 定义一个布尔型数组,包含 3 个元素:

    c 复制代码
    bool flags[3];

需要注意的是,数组的长度必须是一个常量表达式,即在编译时就确定的值。不能使用变量作为数组的长度。例如,以下定义是错误的:

c 复制代码
int n = 5;
int numbers[n]; // 错误,数组长度必须是常量表达式

在定义数组时,数组中的元素不会被自动初始化,它们的初始值是未定义的。如果需要给数组中的元素赋初值,可以在定义数组时进行初始化,语法如下:

c 复制代码
数据类型 数组名[数组长度] = {元素1, 元素2, ..., 元素n};

例如:

c 复制代码
int numbers[5] = {1, 2, 3, 4, 5};

这将创建一个包含 5 个元素的整型数组,并将它们初始化为 1、2、3、4、5。

以下是一些错误的数组定义示例:

  1. 数组长度为负数:

    c 复制代码
    int arr[-5]; // 错误,数组长度必须是正整数
  2. 数组长度为浮点数:

    c 复制代码
    float arr[3.14]; // 错误,数组长度必须是整数
  3. 数组长度为变量:

    c 复制代码
    int n = 5;
    int arr[n]; // 错误,数组长度必须是常量表达式
  4. 数组初始化时元素个数超过数组长度:

    c 复制代码
    int arr[3] = {1, 2, 3, 4, 5}; // 错误,初始化元素个数超过数组长度

理解并掌握定义一维数组的语法是使用数组的基础。在实际编程中,根据具体需求选择合适的数据类型和数组长度非常重要,同时也要避免上述错误的定义方式。

2.2 不同数据类型的一维数组(整数、浮点数、字符等)

在 C 语言中,一维数组可以存储各种不同的数据类型,包括整数、浮点数、字符等。下面详细介绍不同数据类型的一维数组:

  1. 整数类型数组

    • 可以使用 int 类型定义整数数组,用于存储整数值。

    • 示例:

      c 复制代码
      int ages[5] = {18, 20, 25, 30, 35};
  2. 浮点数类型数组

    • 可以使用 floatdouble 类型定义浮点数数组,用于存储带小数点的数值。

    • 示例:

      c 复制代码
      float prices[4] = {9.99, 19.5, 25.75, 12.8};
      double distances[3] = {5.2, 10.8, 3.14};
  3. 字符类型数组

    • 可以使用 char 类型定义字符数组,用于存储单个字符。

    • 示例:

      c 复制代码
      char grades[5] = {'A', 'B', 'C', 'D', 'F'};
  4. 布尔类型数组

    • 可以使用 bool 类型(需要导入 stdbool.h 头文件)定义布尔数组,用于存储真(true)或假(false)的值。

    • 示例:

      c 复制代码
      #include <stdbool.h>
      bool flags[3] = {true, false, true};

需要注意的是,数组中的元素必须是同一数据类型。不能在同一个数组中混合存储不同类型的数据。例如,以下定义是错误的:

c 复制代码
int mixed[4] = {1, 2.5, 'A', true}; // 错误,数组元素类型不同

在实际编程中,根据具体问题的需求选择合适的数据类型来定义数组。例如,如果要存储学生的成绩,可以使用整数数组或浮点数数组;如果要存储一组字符,可以使用字符数组;如果要存储一组开关状态,可以使用布尔数组。

以下是一些不同数据类型数组的应用示例:

  1. 整数数组应用:

    c 复制代码
    int scores[5] = {85, 92, 78, 90, 88}; // 存储学生的考试成绩
    int counts[3] = {10, 20, 15}; // 存储不同类型的计数器
  2. 浮点数数组应用:

    c 复制代码
    float temperatures[7] = {25.5, 28.2, 30.1, 26.8, 29.3, 27.6, 24.9}; // 存储一周的温度记录
    double coefficients[4] = {1.2, 0.5, 2.1, 1.8}; // 存储方程的系数
  3. 字符数组应用:

    c 复制代码
    char vowels[5] = {'a', 'e', 'i', 'o', 'u'}; // 存储元音字母
    char message[10] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'}; // 存储一条消息
  4. 布尔数组应用:

    c 复制代码
    bool switches[4] = {true, false, true, false}; // 存储开关状态
    bool flags[3] = {true, true, false}; // 存储标记位

通过合理选择数据类型和创建对应的一维数组,可以方便地存储和处理各种类型的数据集合。

2.3 一维数组的初始化方式

在 C 语言中,一维数组可以在定义时进行初始化,也可以在定义后的代码中对数组元素进行赋值。下面介绍几种常见的一维数组初始化方式:

  1. 在定义时完全初始化数组

    • 在数组定义时,可以使用大括号 {} 将初始值放在其中,用逗号分隔。

    • 示例:

      c 复制代码
      int numbers[5] = {1, 2, 3, 4, 5};
      float prices[4] = {9.99, 19.5, 25.75, 12.8};
      char grades[5] = {'A', 'B', 'C', 'D', 'F'};
  2. 在定义时部分初始化数组

    • 如果在数组定义时只为部分元素提供初始值,其余元素将自动初始化为零。

    • 示例:

      c 复制代码
      int numbers[5] = {1, 2, 3}; // 等同于 {1, 2, 3, 0, 0}
      float prices[4] = {9.99, 19.5}; // 等同于 {9.99, 19.5, 0.0, 0.0}
      char grades[5] = {'A', 'B'}; // 等同于 {'A', 'B', '\0', '\0', '\0'}
  3. 在定义时不指定数组长度

    • 如果在数组定义时提供了初始值,可以不指定数组长度,编译器会根据初始值的数量自动确定数组的长度。

    • 示例:

      c 复制代码
      int numbers[] = {1, 2, 3, 4, 5}; // 数组长度为 5
      float prices[] = {9.99, 19.5, 25.75, 12.8}; // 数组长度为 4
      char grades[] = {'A', 'B', 'C', 'D', 'F'}; // 数组长度为 5
  4. 在定义后逐个初始化数组元素

    • 在数组定义后的代码中,可以使用赋值语句对数组元素逐个进行初始化。

    • 示例:

      c 复制代码
      int numbers[5];
      numbers[0] = 1;
      numbers[1] = 2;
      numbers[2] = 3;
      numbers[3] = 4;
      numbers[4] = 5;

需要注意的是,在初始化数组时,初始值的数量不能超过数组的长度。如果初始值的数量少于数组长度,剩余的元素将自动初始化为零。

以下是一些初始化数组的注意事项:

  1. 数组长度不匹配:

    c 复制代码
    int numbers[3] = {1, 2, 3, 4, 5}; // 错误,初始值数量超过数组长度
  2. 初始化时使用变量:

    c 复制代码
    int n = 5;
    int numbers[n] = {1, 2, 3, 4, 5}; // 错误,数组长度必须是常量表达式
  3. 初始化时混合使用不同类型的值:

    c 复制代码
    int numbers[4] = {1, 2.5, 'A', true}; // 错误,初始值类型不匹配

在实际编程中,根据具体情况选择合适的初始化方式,并确保初始值的数量和类型与数组定义相匹配。合理的初始化可以确保数组在使用前包含正确的初始值。

2.4 一维数组的练习题

  1. 下面哪个是正确的一维数组定义方式?

    A. int arr[5] = {1, 2, 3, 4, 5};

    B. int arr[5] = {1, 2, 3, 4, 5, 6};

    C. int arr[5] = {1, 2, 3};

    D. int arr[] = {1, 2, 3, 4, 5};

  2. 下面哪个是错误的一维数组定义方式?

    A. float arr[4] = {1.1, 2.2, 3.3, 4.4};

    B. char arr[3] = {'a', 'b', 'c'};

    C. int arr[-5];

    D. bool arr[2] = {true, false};

  3. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3};
    printf("%d", arr[3]);

    A. 1

    B. 2

    C. 3

    D. 0

  4. 以下代码的输出结果是什么?

    c 复制代码
    char arr[] = {'H', 'e', 'l', 'l', 'o'};
    printf("%d", sizeof(arr));

    A. 1

    B. 4

    C. 5

    D. 6

  5. 以下哪个数组定义是错误的?

    A. int arr[5] = {1, 2, 3, 4, 5};

    B. float arr[] = {1.1, 2.2, 3.3};

    C. char arr[4] = {'a', 'b', 'c', 'd'};

    D. int arr[3.5];

  6. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d", arr[1] + arr[3]);

    A. 3

    B. 5

    C. 6

    D. 7

  7. 以下哪个数组初始化是正确的?

    A. int arr[5] = {1, 2, 3, 4, 5, 6};

    B. float arr[4] = {1.1, 2.2, 'a', true};

    C. char arr[] = {'H', 'e', 'l', 'l', 'o'};

    D. bool arr[2] = {1, 0};

  8. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3};
    printf("%d", arr[4]);

    A. 1

    B. 2

    C. 3

    D. 0

  9. 以下哪个数组定义是错误的?

    A. int arr[5];

    B. float arr[] = {1.1, 2.2, 3.3};

    C. char arr[4] = {'a', 'b', 'c', 'd'};

    D. int arr[5] = {1, 2.5, 'a', true, 5};

  10. 以下代码的输出结果是什么?

    c 复制代码
    int arr[] = {1, 2, 3, 4, 5};
    printf("%d", sizeof(arr) / sizeof(arr[0]));

    A. 1

    B. 4

    C. 5

    D. 6

  11. 以下哪个是正确的一维数组定义方式?

    A. int arr[5] = {1, 2, 3, 4};

    B. float arr[4] = {1.1, 2.2, 3.3, 4.4};

    C. char arr[3] = {'a', 'b', 'c', 'd'};

    D. bool arr[] = {true, false};

  12. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d", arr[2] * arr[4]);

    A. 3

    B. 8

    C. 15

    D. 20

  13. 以下哪个数组初始化是错误的?

    A. int arr[] = {1, 2, 3, 4, 5};

    B. float arr[4] = {1.1, 2.2, 3.3};

    C. char arr[4] = {'a', 'b', 'c'};

    D. int arr[5] = {1, 2, 3, 4.4, 5};

  14. 以下代码的输出结果是什么?

    c 复制代码
    char arr[5] = {'H', 'e', 'l', 'l', 'o'};
    printf("%c", arr[1]);

    A. H

    B. e

    C. l

    D. o

  15. 以下哪个数组定义是正确的?

    A. int arr[5] = {1, 2, 3, 4, 5};

    B. float arr[4] = {1.1, 2.2, 3.3, 4.4};

    C. char arr[3] = {'a', 'b', 'c'};

    D. int arr[-5];

  16. 以下代码的输出结果是什么?

    c 复制代码
    int arr[] = {1, 2, 3, 4, 5};
    printf("%d", arr[3] - arr[1]);

    A. 1

    B. 2

    C. 3

    D. 4

  17. 以下哪个数组初始化是正确的?

    A. int arr[5] = {1, 2, 3, 4, 5};

    B. float arr[] = {1.1, 2.2, 'a', 4.4};

    C. char arr[4] = {'a', 'b', 'c', 'd'};

    D. bool arr[2] = {1, 0};

  18. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3};
    printf("%d", arr[4] + arr[0]);

    A. 1

    B. 2

    C. 3

    D. 4

  19. 以下哪个数组定义是错误的?

    A. int arr[5];

    B. float arr[4.5];

    C. char arr[] = {'a', 'b', 'c', 'd'};

    D. bool arr[2] = {true, false};

  20. 以下代码的输出结果是什么?

    c 复制代码
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d", arr[2] + arr[3] - arr[0]);

    A. 3

    B. 4

    C. 5

    D. 6

答案

  1. A
  2. C
  3. D
  4. C
  5. D
  6. C
  7. C
  8. D
  9. D
  10. C
  11. B
  12. C
  13. D
  14. B
  15. A
  16. B
  17. A
  18. D
  19. B
  20. D

这些选择题涵盖了一维数组的定义、初始化以及访问元素等基本概念。通过练习这些题目,可以帮助您更好地理解和掌握一维数组的相关知识。

3. 一维数组元素的访问和修改

3.1 通过下标访问数组元素

3.2 修改数组中的元素值

3.3 数组下标的有效范围

4. 一维数组的遍历

4.1 使用for循环遍历数组

4.2 计算数组元素的和与平均值

4.3 找出数组中的最大值和最小值

5. 一维数组作为函数参数

5.1 将一维数组传递给函数

5.2 在函数中修改数组元素

5.3 通过函数返回一维数组

6. 一维数组的应用练习

6.1 成绩统计问题

6.2 数组元素的排序

6.3 简单的数据分析问题

这样排序后,学习目录更加清晰,层次分明。你可以按照这个顺序,循序渐进地学习一维数组的各个知识点。记住,学习过程中要多练习,多思考,遇到问题要及时解决。加油!

相关推荐
徐浪老师1 小时前
深入解析贪心算法及其应用实例
算法·贪心算法
软行1 小时前
LeetCode 单调栈 下一个更大元素 I
c语言·数据结构·算法·leetcode
钰爱&2 小时前
【操作系统】Linux之线程同步二(头歌作业)
linux·运维·算法
Ws_2 小时前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode
灼华十一2 小时前
数据结构-布隆过滤器和可逆布隆过滤器
数据结构·算法·golang
adam_life4 小时前
OpenJudge_ 简单英文题_04:0/1 Knapsack
算法·动态规划
龙的爹23335 小时前
论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·prompt
鸣弦artha5 小时前
蓝桥杯——杨辉三角
java·算法·蓝桥杯·eclipse
我是聪明的懒大王懒洋洋5 小时前
力扣力扣力:动态规划入门(1)
算法·leetcode·动态规划
未知陨落6 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树