内容正文:
6.1节:一维数组的定义与引用
C语言程序设计
电子工业出版社
理解一维数组的定义、引用及初始化方法,掌握数组在内存中的存储结构
能够运用一维数组解决简单的编程问题,如数据统计、排序查找及最值计算
培养逻辑思维能力,体会算法优化思想,建立程序设计的严谨性与规范性意识
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:一个有趣的问题
❓ 思考问题
如何高效地存储和处理一个班级50名学生的数学成绩?
💡 现有方法的局限
如果使用简单变量,需要定义50个变量(如score1, score2...)。这种方式繁琐且不利于后续的数据统计与分析。
数据的批量存储与集合示意
思考:有没有一种数据结构可以一次性存储这50个数据?
教学导入:传统方法的弊端
// 1. 定义变量:数据量越大,定义越繁琐
int score1, score2, score3, ..., score50;
// 2. 输入数据:重复性劳动,极易出错
scanf("%d", &score1); scanf("%d", &score2); ... scanf("%d", &score50);
核心痛点:
当数据量很大时,传统的单个变量操作不仅代码冗长、效率低下,而且在重复编写过程中极易出现拼写错误或逻辑遗漏。
教学导入:数组的概念
核心定义
数组是一组具有相同数据类型的变量集合,在内存中连续存储,拥有共同名字。我们通过下标快速访问每一个元素。
应用示例
例如,存储50名学生成绩:score[50]
•score[0]代表第1个学生的成绩
•score[1]代表第2个学生的成绩
💡 核心记忆:数组 = 连续存储 + 相同类型 + 下标访问
知识讲授
一维数组的定义与引用
一维数组的定义及元素的引用
一维数组的初始化和程序举例
第一部分
一维数组的定义及元素的引用
知识讲授
知识讲授:数组的概念
知识讲授:一维数组的定义格式
核心语法定义:
类型标识符 数组名 [ 常量表达式 ] ;
代码示例:
int a[10]; // 定义了包含10个整型元素的数组 a
数组名 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]
a
💡 重要提示
数组下标从 0 开始计数。例如 int a[10] 的合法下标是 0 到 9,而不是 1 到 10,注意避免“数组越界”错误。
知识讲授:一维数组的定义格式
类型标识符
指定数组中所有元素的数据类型,例如 int、float、char 等。整个数组的元素类型必须一致。
数组名
遵循C语言标识符命名规则,是整个数组的名称,用于后续引用该数组,类似变量名。
常量表达式
表示数组的长度,即元素个数。必须是一个大于0的整数常量,不能是变量。
语法示例:int score[100];
说明:定义了一个名为 score 的整型数组,包含 100 个元素。
知识讲授:数组定义的注意事项
元素类型一致
一个数组中所有元素的数据类型必须相同,不可混合定义。
下标从0开始
编号从0开始。例如,a[10]的有效元素是a[0]到a[9]。
长度必须是常量
方括号中必须是常量表达式。错误示例:int n=5; int a[n];
知识讲授:数组元素的引用格式
核心语法格式
数组名[下标]
💡 概念说明:
下标:可以是整型常量或表达式,用于定位元素位置。
操作:通过下标可像普通变量一样进行赋值、取值等操作。
inta[10];// 定义数组
a[0] = 10;// 给第一个元素赋值
printf("%d", a[0]);// 输出第一个元素
注意:数组下标通常从 0 开始计数
数组名 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]
a
知识讲授:引用数组元素的注意事项
下标不能越界
这是最常见的错误。数组的下标范围是从0到长度-1。
例如,数组a[10]的有效下标是 0 到 9,若访问 a[10] 即为越界,会导致程序运行崩溃。
下标可以是表达式
下标不仅限于常量,也可以是整型变量或表达式。
例如:a[i]、a[i+1]。这一特性使得我们可以利用循环结构高效地遍历整个数组。
知识讲授:程序举例(随机输入10个数并输出)
程序文本【6.1】随机输入10个数并输出
#include"stdio.h"
main()
{
int a[10],i; //定义整型数组a,数组a内可存储10个元素
printf("input 10 numbers:
");
for(i=0; i<10; i++)
scanf("%d", &a[i]); //引用数组存储数据
printf("
");
for(i=0; i<10; i++)
printf("%d ", a[i]); //引用数组输出数据
}
知识讲授:程序举例(随机输入10个数并输出)
知识讲授:程序分析(数组定义与输入)
// 定义数组与变量
inta[10], i;
// 提示输入
printf("input 10 numbers:
");
// 循环输入数据
for(i=0; i<10; i++)
scanf("%d", &a[i]);
变量定义
声明一个长度为10的整型数组 a 和循环变量 i,为后续存储数据做准备。
交互提示
通过 printf 输出提示信息,引导用户在控制台输入10个数字。
循环赋值核心逻辑
利用 for 循环(0-9)遍历数组下标,通过 scanf 将用户输入的数值依次存入数组 a[0] 到 a[9] 中。
💡 核心要点:程序通过“定义-提示-循环输入”三步完成数据的获取与存储,循环变量与数组下标的配合是实现自动化输入的关键。
知识讲授:程序分析(数组输出)
// 换行
printf("
");
// 循环输出数组元素
for(i=0; i<10; i++)
printf("%d ", a[i]);
格式化换行
使用printf("
");实现换行,优化输出排版,使数据展示更清晰。
循环遍历输出
利用for循环从下标 0 到 9 遍历数组,将存储的 10 个数据依次打印到屏幕上。
核心要点:通过循环结构,程序能够高效地处理批量数据的输出,避免了重复编写10次打印语句。
背诵记忆
一维数组定义格式
类型标识符 数组名[常量表达式];
例如:int arr[10];
数组下标规则
下标从0开始
合法范围:0 ~ 长度-1
数组元素引用格式
数组名[下标]
例如:arr[0] 表示数组的第一个元素
核心注意事项
1. 所有元素类型必须一致
2. 长度必须是常量,下标不能越界
例题分析:求数组中的最大值
核心思想
利用for循环遍历数组,通过一个变量(如max)来记录当前的最大值,依次与数组中的每个元素比较,若发现更大的值则更新max。
关键点提示
初始化max为数组的第一个元素;循环从下标1开始,逐个比较;确保循环范围覆盖整个数组。
i++;
例题分析:求数组中的最大值
程序文本
#include<stdio.h>
main()
{ int arr[10],i, max;
printf("请输入10个整数:
");
for(i = 0; i < 10; i++)
scanf("%d", &arr[i]);
max = arr[0];
for(i = 1; i < 10; i++)
{ if(arr[i] > max)
max = arr[i]; }
printf("数组中的最大值是:%d
", max);
}
例题分析:求数组中的最大值
课堂问答
问题 1:数组的下标从几开始?
答案:从 0 开始。
问题 2:定义 int a[5]; 后,数组 a 有几个元素?分别是哪些?
答案:有 5 个元素,分别是 a[0], a[1], a[2], a[3], a[4]。
请牢记数组索引规则,这是编程的基础常识
课堂练习
题目介绍
定义一个整型数组age[5],用于存储5个学生的年龄,然后通过键盘输入这5个年龄,并将它们输出到屏幕上。
假
int ages[5],i;
开始
输入:ages[i]
i=0;
i<5
真
输出:ages[i]
i=0;
i<5
真
i++
i++
假
结束
课堂练习
程序文本
#include"stdio.h"
main()
{
int ages[5], i;
printf("请输入5个学生的年龄:
");
for(i=0; i<5; i++)
scanf("%d", &ages[i]);
printf("这5个学生的年龄是:
");
for(i=0; i<5; i++)
printf("%d ", ages[i]);
}
课堂练习
第二部分
知识讲授
一维数组的初始化和程序举例
知识讲授
知识讲授:数组初始化的概念
什么是数组初始化?
是指在定义数组的同时,给数组的元素赋初值。这样可以避免数组元素在使用前是随机值的问题,确保程序运行的确定性。
标准初始化格式
类型标识符 数组名[常量表达式] = { 常量列表 };
💡 提示:大括号 { } 不仅是赋值符号,它也是数组元素列表的界定符。
知识讲授:数组初始化的方式
方式一:完全初始化
给数组的所有元素都赋初值,确保每个位置都有确定的值。
int a[5] = {1, 2, 3, 4, 5};
注意:大括号内的数值个数必须与数组长度一致。
内存映射与对应关系
1
2
3
4
5
a[0] a[1] a[2] a[3] a[4]
数组下标从 0 开始计数。
第一个元素存储在索引 0 的位置,最后一个元素存储在索引 4 的位置。
核心要点:完全初始化要求大括号内的数值个数必须与数组长度严格一致,是最严谨的初始化方式。
知识讲授:数组初始化的方式
方式二:部分初始化
只给数组的前几个元素赋初值,未赋值的元素会被自动初始化为0。
这在需要快速将数组部分置数、其余清零的场景下非常高效。
inta[5] = {1,2};
// 仅初始化前两个元素
// 其余元素自动为 0
内存状态图解:
a[0]
1
a[1]
2
a[2]
0
a[3]
0
a[4]
0
手动赋值
自动补0
知识讲授:数组初始化的方式
方式三:省略长度的初始化
在初始化时,可以省略数组的长度,编译器会根据初始化列表中常量的个数自动确定数组的长度。
这种方式在已知初始值但不确定具体个数时非常高效。
代码示例
inta[] = {1, 2, 3, 4, 5};
编译器自动确定数组a的长度为5
效果等同于inta[5] = {1, 2, 3, 4, 5};
关键点:省略长度时,必须提供初始化列表,否则编译器无法推断长度。
知识讲授:一维数组初始化的误区
知识讲授:程序举例(求最小值)
结束
真
min=a[i];
min=a[0];
min>a[i]
假
int i,min,a[10];
开始
i<10
i=0;
输入:a[i]
假
真
i<10
i=0;
假
真
i++;
i++;
核心算法逻辑
初始化假设
将数组第一个元素设为当前最小值 `min = a[0]`
遍历比较
从第二个元素开始,依次与 `min` 比较
更新最小值
若发现更小的元素,立即更新 `min` 的值
知识讲授:程序举例(求最小值)
程序文本【6.2】从键盘输入10个数,求其中的最小值并显示
#include"stdio.h"
main()
{
int i, min, a[10];
printf("input 10 numbers:
");
for(i=0; i<10; i++)
scanf("%d", &a[i]);
min = a[0];// 假设第一个元素是最小值
for(i=0; i<10; i++)
if(min>a[i])
min = a[i];// 更新最小值
printf("min value is %d
", min); }
知识讲授:程序举例(求最小值)
知识讲授:程序举例(斐波那契数列)
结束
真
输出:‘
’
i%5==0
假
int i,f[20]={1,1};
开始
i<20
i=2;
f[i]=f[i-1]+f[i-2];
假
真
i<20
i=0;
假
真
i++;
输出:f[i]
i++;
数列定义
前两项为 1,从第三项开始,每一项等于前两项之和。
核心算法
利用循环结构,通过递推公式 f[i] = f[i-1] + f[i-2] 计算后续项。
存储与输出
使用数组存储数列,控制每行输出 5 个数字,保证排版整齐。
知识讲授:程序举例(斐波那契数列)
程序文本【6.3】用数组处理斐波那契数列问题
#include"stdio.h"
main()
{
int i;// 循环变量
int f[20] = {1, 1};// 初始化前两项
for(i=2; i<20; i++)
f[i] = f[i-1] + f[i-2];// 递推公式
for(i=0; i<20; i++)
{
if(i%5==0) printf("
");
printf("%12d",f[i]);
}
}
知识讲授:程序举例(斐波那契数列)
知识讲授:程序举例(冒泡排序)
9 8 8 8 8 8
8 9 5 5 5 5
5 5 9 4 4 4
4 4 4 9 2 2
2 2 2 2 9 0
0 0 0 0 0 9
第1次 第2次 第3次 第4次 第5次 结果
8 5 5 5 5
5 8 4 4 4
4 4 8 2 2
2 2 2 8 0
0 0 0 0 8
第1次 第2次 第3次 第4次 结果
核心算法思想
基本原理:重复走访待排序数列,一次比较两个相邻元素,若顺序错误则交换。
终止条件:直到某一趟走访中没有发生任何交换,说明数列已完全有序。
算法命名:越小的元素会经由交换慢慢“浮”到数列的顶端,如同水中气泡上浮。
知识讲授:程序举例(冒泡排序)
程序文本【6.4】用冒泡法对10个数从小到大排序
#include"stdio.h"
main()
{ int a[10];
int i, j, t;
printf("input 10 numbers:
");
for(i=0; i<10; i++)
scanf("%d", &a[i]);
// 冒泡排序核心部分
for(j=0; j<9; j++)// 外层循环控制排序趟数
for(i=0; i<9-j; i++)// 内层循环控制比较次数
if(a[i] < a[i+1])// 比较相邻元素
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }
printf("the sorted numbers:
");
for(i=0; i<10; i++)
printf("%d ", a[i]); }
知识讲授:程序举例(冒泡排序)
背诵记忆
完全初始化
int arr[5] = {1, 2, 3, 4, 5};
所有元素都被明确赋值,数组长度固定为5。
部分初始化
int arr[5] = {1, 2};
未赋值的元素自动初始化为0,剩余3个元素为0。
省略长度初始化
int arr[] = {1, 2, 3};
数组长度由初始化列表的元素个数决定,此处为3。
重点记忆:部分初始化时,未赋值的元素会自动补0;省略长度时,编译器会根据大括号内的元素个数自动计算数组长度。这是数组操作的基础,务必熟练掌握。
课堂练习
练习题 1:数组初始化与遍历
请定义一个整型数组,并用初始化的方式存储前 10 个偶数(0, 2, 4, ..., 18),然后将它们依次输出到屏幕上。
提示:注意数组下标越界问题,确保循环次数正确。
限时 5 分钟,请在练习本或编辑器中完成代码编写,稍后我们一起讲解。
课堂练习
程序文本
#include"stdio.h"
main()
{
int even[10] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
int i;
printf("前10个偶数是:
");
for(i=0; i<10; i++)
printf("%d ", even[i]);
}
课堂练习
课堂小结
课堂小结
一维数组的定义
语法格式:类型 数组名[长度];
注意:数组下标从 0 开始,内存连续分配。
数组元素的引用
访问方式:数组名[下标]
核心原则:下标不能越界,范围 [0, 长度-1]。
数组的初始化
三种方式:完全初始化、部分初始化、省略长度初始化。
未初始化的全局数组元素默认为 0。
数组的应用
结合循环批量处理数据,如冒泡排序。
实现数据的统计、查找、排序等复杂功能。
核心收获:掌握一维数组的核心语法与循环遍历技巧是解决复杂数据问题的基础。
课后任务
作业任务:编写一个C语言程序
1. 输入数据:请输入10个整数,并将其存入一个数组中。
2. 统计分析:遍历数组,统计并输出这10个数中正数、负数和零的个数。
💡 核心考点提示
本题目综合考察了数组的定义与使用以及循环结构的逻辑控制,请同学们在编写时注意边界条件的处理。
谢谢观看
THANKS
$