内容正文:
专题六 数组(讲义)
---《编程语言基础—C语言》专题复习讲练测
[考纲要求]
1:理解一维数组的定义及初始化。
2:掌握一维数组元素的引用。
3:理解二维数组的定义及初始化。
4:掌握二维数组元素的引用。
5:掌握字符数组的定义及引用。
[课时安排]
4课时
[知识梳理]
一:一维数组
· 定义
C语言中的一维数组是一种基本的数据结构,它允许存储相同类型的多个元素。
在C语言中,一维数组的定义格式如下:
1. type arrayName[arraySize];
其中type是数据类型,arrayName是数组的名称,数组名的命名遵循与变量名相同的规则。arraySize是数组的大小,即数组可以存储的元素数量。
· 初始化数组
静态初始化:在定义数组时直接赋值。
1. int numbers[] = {10, 20, 30, 40, 50};
动态初始化:在定义数组后,通过循环或单个赋值来初始化。
1. int numbers[5];
2. for(int i = 0; i < 5; i++) {
3. numbers[i] = i * 10;
4. }
当一维数组只给部分元素赋值时,未显式赋值的元素将被初始化为该类型的默认值。对于基本数据类型(如int、char、float等),这个默认值通常是0。
1. int arr[5] = {10, 20, 30}; // 剩余的元素将被初始化为0
使用索引来访问数组的元素,索引从0开始。
1. int firstElement = numbers[0]; // 获取第一个元素
初始化一个数组,使得所有元素都具有相同的值。
1. int arr[5] = {0}; // 所有元素初始化为0
2. // 或者
3. int arr[5] = {1, 1, 1, 1, 1}; // 所有元素初始化为1
对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度。
1. int arr[] = {1, 2, 3, 4, 5}; // 长度为5的数组,每个元素分别初始化
数组在内存中是连续存储的,这意味着数组的元素在内存中是紧密排列的。数组有上限和下限,访问数组时不能超出这个范围。尝试访问数组之外的元素将导致未定义行为。
· 注意事项:
① 数组大小必须是常量:在C语言中,数组的大小必须是常量和符号常量。
② 数组不要越界:访问数组元素时,索引值必须在0到数组大小减一的范围内。
③ 初始化:没有初始化数组,那么数组的元素将包含垃圾值。
④ 使用正确的数据类型:数组可以存储任何类型的数据,确保数组的数据类型与存储的元素类型一致。
二:二维数组
C语言中的二维数组可以看作是数组的数组,即每个元素本身也是一个数组。这使得二维数组非常适合于表示矩阵或表格数据。
二维数组的定义格式如下:
1. type arrayName[rowSize][columnSize];
其中type是数据类型,arrayName是数组的名称,rowSize是行数,columnSize是列数。
二维数组的元素通过两个索引访问,第一个索引表示行,第二个索引表示列。其中,索引可以是整数表达式。在使用数组元素时,应注意下标值应在已定义的数组大小的范围内。
1. int element = arr[1][0]; // 访问第二行第一列的元素,值为3
静态初始化:
在声明时直接初始化,适用于已知所有元素值的情况。
1. int arr[3][4] = {
2. {1, 2, 3, 4},
3. {5, 6, 7, 8},
4. {9, 10, 11, 12}
5. };
arr 是一个3行4列的二维数组,每个元素都被显式初始化。
也可以将所有的数据写在一个花括弧内,按数组排序的顺序对各元素赋初值。
1. int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
二维数组的列数已知,但行数未知时,可以只初始化数组的列。例如,如果数组的列数是4:
1. int arr[3][4] = {
2. {1, 2, 3, 4}, // 第一行完全初始化
3. {5, 6} // 第二行只初始化了前两个元素
4. };
arr[0] 完全初始化,arr[1][2] 和 arr[1][3] 将自动初始化为0。arr[2] 将完全初始化为0,因为它没有任何显式的初始化值。
二维数组的行数,但列数未知时,可以初始化数组的行,但只给部分列赋值:
1. int arr[][4] = {
2. {1, 2}, // 第一行只初始化了前两个元素
3. {3, 4, 5, 6} // 第二行完全初始化
4. };
如果对全部的元素赋初值,则定义数组时对第一维的长度可以省略,第二维的长度不能省略。
三:字符数组
C语言中的字符数组是一种特殊的数组,其元素类型为char。字符数组在C语言中有着广泛的应用,特别是在处理字符串时。
字符数组的基本语法如下:
1. char arr[10]; //声明一个可以存储10个字符的数组
字符数组的元素引用:
字符数组的每个元素可以通过其索引来引用。索引从0开始。例如,对于以下声明的字符数组:
1. char arr[] = "Hello, World!";
引用第一个字符('H')如下:
1. char firstChar = arr[0]; // 将第一个字符赋值给变量firstChar
可以通过索引来修改数组中的元素:
1. arr[0] = 'h'; // 将第一个字符从'H'改为小写的'h'
字符数组的输入和输出:
输入字符数组
· 使用 scanf 函数
scanf 可以用来读取格式化的输入,但不适合直接读取字符串,因为它会在遇到空格、制表符或换行符时停止读取。
1. char arr[100];
2. printf("Enter a string: ");
3. scanf("%99s", arr); // %99s限制读取的最大字符数,防止溢出
· gets函数
gets函数用于从标准输入(通常是键盘)读取一行文本,直到遇到换行符
。它将读取的字符串存储在指定的字符数组中,并且不包括换行符。
1. char buffer[100];
2. gets(buffer);
输出字符数组
· 使用 printf 函数:使用%s格式化输出字符串。
1. char arr[] = "Hello, World!";
2. printf("The string is: %s
", arr);
· 使用 puts 函数:puts 会输出字符串,并且在末尾自动添加换行符。
1. char arr[] = "Hello, World!";
2. puts(arr); // 输出字符串并换行
· 使用循环逐个字符输出:如果你需要对字符串进行特殊处理,比如转换为大写或小写,可以逐个字符输出。
1. char arr[] = "Hello, World!";
2. for (int i = 0; arr[i] != '\0'; i++) {
3. putchar(arr[i]);
4. }
字符串处理函数:
C语言中的字符串处理函数提供了丰富的功能,用于执行各种字符串操作,如复制、连接、比较、搜索等。
· 复制字符串 - strcpy
1. #include <stdio.h>
2. #include <string.h>
3.
4. int main() {
5. char src[] = "Hello World";
6. char dest[12];
7.
8. strcpy(dest, src); // 正确使用
9. printf("Copied string: %s
", dest);
10.
11. return 0;
12. }
· 连接字符串 - strcat
1. int main() {
2. char str1[] = "Hello, ";
3. char str2[] = "World!";
4. char dest[20];
5.
6. strcpy(dest, str1); // 首先复制str1到dest
7. strcat(dest, str2); // 然后将str2连接到dest的末尾
8. printf("Concatenated string: %s
", dest);
9.
10. return 0;
11. }
· 获取字符串长度 - strlen
1. int main() {
2. char str[] = "Hello World";
3. size_t len = strlen(str);
4. printf("Length of string: %zu
", len);
5.
6. return 0;
7. }
strlen返回字符串的长度,不包括结尾的空字符'\0'。
· 比较字符串 - strcmp
1. int main() {
2. char str1[] = "Apple";
3. char str2[] = "apple";
4.
5. int result = strcmp(str1, str2); // 默认是区分大小写的
6. printf("strcmp result: %d
", result);
7.
8. return 0;
9. }
strcmp返回0如果两个字符串相等,负数如果str1小于str2,正数如果str1大于str2。
[真题练讲]
1.(2019职教高考题)以下程序运行后,键盘输入4回车,结果是( )
#include <stdio.h>
int main() {
int a[] = {1, 3, 5, 7, 2, 4, 6, 8}, i, start;
scanf("%d", &start);
for (i = 0; i < 3; i++)
printf("%d", a[(start + i) % 3]);
return 0;
}
A.131 B.264
C.351 D.486
【答案】C
【解析】start变量的值将被设置为4。接下来,循环将执行三次:
第一次循环:i = 0,(start + i) % 3的结果是4 % 3,即1。数组a中索引为1的元素是3。
第二次循环:i = 1,(start + i) % 3的结果是(4 + 1) % 3,即5。数组a中索引为5的元素是7。
第三次循环:i = 2,(start + i) % 3的结果是(4 + 2) % 3,即0。数组a中索引为0的元素是1。
因此,程序将依次打印出3、7和1。
2.(2020职教高考题)执行以下语句后,a[2]的值为( )
int a[10] = {12, 23, 5, 20, 3, 6, 18};
a[2] += a[3] + a[1] + a[4] * a[7] - a[5];
A.37 B.42
C.96 D.101
【答案】B
【解析】a[2] = a[2]+a[3]+a[1]+a[4]*a[7]-a[5]=5+20+23+3*0-6=42
3.(2020年职教高考题)下列定义二维数组的语句中,正确的是( )
A.int N = 5,f[N][N];
B.float 2ab[3][4]
C.int m[][2] = {1,2,3,4};
D.int a[2][]={{1,2},{3,4}};
【答案】C
【解析】变量不能用作定义数组的大小;数组名的命名规则和标识符的命名规则相同,即开头不能是数字。二维数组可以省略一维数组的长度,但不能省略二维数组的长度。
4.(2019年职教高考题)以下程序段的运行结果是( )
#include <stdio.h>
int main() {
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
int i = 0, j = 0, s = 0;
while (i++ < 4) {
if (i == 2 || i == 4)
continue;
j = 0;
do {
s += a[i][j];
j++;
} while (j < 4);
}
printf("%d", s);
}
A.100 B.84 C.68 D.36
【答案】B
【解析】当i等于1时,累加的元素是a[1][0]到a[1][3],即5, 6, 7, 8。
当i等于3时,累加的元素是a[3][0]到a[3][3],即13, 14, 15, 16。
所以,程序的输出将是s=(5+6+7+8)+(13+14+15+16)=26+58=84。
5.(2020年职教高考题)请编写程序,将11位评委给出的选手成绩存至一维数组,计算并输出选手的最终成绩(保留两位小数)。选手的最终成绩为去掉一个最高分和一个最低分的平均成绩。
【答案】#include <stdio.h>
int main() {
float scores[11]; // 存储11位评委给出的成绩
float sum = 0.0f; // 存储总分
float minScore = 100.0f; // 初始最低分为一个较大的数
float maxScore = 0.0f; // 初始最高分为0
int i;
// 输入11位评委的成绩
printf("请输入11位评委的成绩:
");
for (i = 0; i < 11; i++) {
scanf("%f", &scores[i]);
if (scores[i] < minScore) minScore = scores[i]; // 更新最低分
if (scores[i] > maxScore) maxScore = scores[i]; // 更新最高分
}
// 去掉最高分和最低分后的总分
for (i = 0; i < 11; i++) {
sum += (scores[i] == minScore || scores[i] == maxScore) ? 0 : scores[i];
}
// 计算平均分
float average = (sum - minScore - maxScore) / 9;
// 输出最终成绩,保留两位小数
printf("选手的最终成绩为:%.2f
", average);
return 0;
}
[限时练习]
1.关于数组描述错误的是( )
A.数组的下标是从0开始的
B.数组在内存中是连续存放的
C.数组名表示首元素的地址
D.随着数组下标的由小到大,地址由高到低
【答案】D
【解析】C语言规定,数组的下标是从0开始的。数组的空间是一段连续的内存空间。数组名表示首元素的地址。
2.以下对一维数组a进行正确初始化错误的是( )
A.int arr[10] = {1,2,3,4,5,6};
B.int arr[] = {1,2,3,4,5,6};
C.int arr[] = (1,2,3,4,5,6);
D.int arr[10] = {0};
【答案】C
【解析】A选项:数组arr被显式地声明为有10个元素,并且前6个元素被初始化为1到6,剩余的元素将默认初始化为0。B选项:数组arr的大小可以根据初始化列表中的元素数量来自动确定,这里它将有6个元素。C选项:在C或C++中,数组初始化必须使用花括号{}而不是圆括号()。D选项:数组arr被显式地声明为有10个元素,并且所有元素都被初始化为0。
3.若定义int a[2][3]={1,2,3,4,5,6};则值为4的数组元素是( )
A.a[0][0] B.a[1][0]
C.a[1][1] D.a[2][1]
【答案】B
【解析】二维数组的初始化是按行进行的。给定的初始化int a[2][3] = {1, 2, 3, 4, 5, 6};意味着:
第一行(索引0)包含元素a[0][0]到a[0][2],分别初始化为1, 2, 3。
第二行(索引1)包含元素a[1][0]到a[1][2],分别初始化为4, 5, 6。
4.以下对二维数组a进行正确初始化的是( )
A.int a[2][3]={ {1,2},{3,4},{5,6} };
B.int a[ ][3]={1,2,3,4,5,6 };
C.int a[2][ ]={1,2,3,4,5,6};
D.int a[2][ ]={ { 1,2},{3,4}};
【答案】B
【解析】A选项:超过二维数组a所定义的行数。C、D选项:二维数组当中省略第二维的大小,但必须指定第一维的大小。
5.该程序的输出结果为___________。
#include <stdio.h>
int main()
{
char str[] = "hello bit";
printf("%d,%d
", sizeof(str), strlen(str));
return 0;
}
【答案】10,9
【归纳小结】
C语言中的数组是一种基本数据结构,用于存储固定数量的相同类型的元素。
声明:使用类型和数组名来声明,例如 int arr[10]; 声明了一个可以存储10个整数的数组。
初始化:静态初始化:int arr[] = {1, 2, 3}; 自动填充剩余元素为0。动态初始化:在声明后使用循环或赋值语句填充数组。
访问:通过索引访问数组元素,索引从0开始,例如 arr[0] 访问第一个元素。
大小:数组的大小在声明时确定,并且在运行时不能改变。
多维数组:可以声明多维数组,例如 int matrix[3][4]; 表示3行4列的二维数组。
指针与数组:数组名可以作为指向数组首元素的指针使用,例如 int *p = arr;。
字符串:在C语言中,字符串通常以字符数组的形式存在,并以空字符('\0')结尾。
数组越界:访问数组的非法索引(超出声明的大小)可能导致未定义行为。
学科网(北京)股份有限公司
$$