内容正文:
专题六 数组
编程语言基础—C语言
专题复习讲练测
1
理解一维数组的定义及初始化。
掌握一维数组元素的引用。
理解二维数组的定义及初始化。
掌握二维数组元素的引用。
掌握字符数组的定义及引用。
一 考纲要求
二 知识点梳理
一:一维数组
C语言中的一维数组是一种基本的数据结构,它允许存储相同类型的多个元素。
在C语言中,一维数组的定义格式如下:
其中type是数据类型,arrayName是数组的名称,数组名的命名遵循与变量名相同的规则。arraySize是数组的大小,即数组可以存储的元素数量。
初始化数组
静态初始化:在定义数组时直接赋值。
动态初始化:在定义数组后,通过循环或单个赋值来初始化。
二 知识点梳理
一:一维数组
当一维数组只给部分元素赋值时,未显式赋值的元素将被初始化为该类型的默认值。对于基本数据类型(如int、char、float等),这个默认值通常是0。
使用索引来访问数组的元素,索引从0开始。
初始化一个数组,使得所有元素都具有相同的值。
对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度。
二 知识点梳理
一:一维数组
数组在内存中是连续存储的,这意味着数组的元素在内存中是紧密排列的。数组有上限和下限,访问数组时不能超出这个范围。尝试访问数组之外的元素将导致未定义行为。
注意事项:
① 数组大小必须是常量:在C语言中,数组的大小必须是常量和符号常量。
② 数组不要越界:访问数组元素时,索引值必须在0到数组大小减一的范围内。
③ 初始化:没有初始化数组,那么数组的元素将包含垃圾值。
④ 使用正确的数据类型:数组可以存储任何类型的数据,确保数组的数据类型与存储的元素类型一致。
二 知识点梳理
二:二维数组
C语言中的二维数组可以看作是数组的数组,即每个元素本身也是一个数组。这使得二维数组非常适合于表示矩阵或表格数据。
其中type是数据类型,arrayName是数组的名称,rowSize是行数,columnSize是列数。
二维数组的元素通过两个索引访问,第一个索引表示行,第二个索引表示列。其中,索引可以是整数表达式。在使用数组元素时,应注意下标值应在已定义的数组大小的范围内。
二 知识点梳理
二:二维数组
静态初始化:在声明时直接初始化,适用于已知所有元素值的情况。
arr 是一个3行4列的二维数组,每个元素都被显式初始化。
也可以将所有的数据写在一个花括弧内,按数组排序的顺序对各元素赋初值。
二维数组的列数已知,但行数未知时,可以只初始化数组的列。例如,如果数组的列数是4:
二 知识点梳理
二:二维数组
arr[0] 完全初始化,arr[1][2] 和 arr[1][3] 将自动初始化为0。arr[2] 将完全初始化为0,因为它没有任何显式的初始化值。
二维数组的行数,但列数未知时,可以初始化数组的行,但只给部分列赋值:
如果对全部的元素赋初值,则定义数组时对第一维的长度可以省略,第二维的长度不能省略。
二 知识点梳理
三:字符数组
C语言中的字符数组是一种特殊的数组,其元素类型为char。字符数组在C语言中有着广泛的应用,特别是在处理字符串时。
字符数组的每个元素可以通过其索引来引用。索引从0开始。例如,对于以下声明的字符数组:
引用第一个字符('H')如下:
可以通过索引来修改数组中的元素:
二 知识点梳理
三:字符数组
输入字符数组:
使用 scanf 函数
scanf 可以用来读取格式化的输入,但不适合直接读取字符串,因为它会在遇到空格、制表符或换行符时停止读取。
gets函数
gets函数用于从标准输入(通常是键盘)读取一行文本,直到遇到换行符
。它将读取的字符串存储在指定的字符数组中,并且不包括换行符。
二 知识点梳理
三:字符数组
输出字符数组
使用 printf 函数:使用%s格式化输出字符串。
使用 puts 函数:puts 会输出字符串,并且在末尾自动添加换行符。
使用循环逐个字符输出:如果你需要对字符串进行特殊处理,比如转换为大写或小写,可以逐个字符输出。
二 知识点梳理
三:字符数组
字符串处理函数:
C语言中的字符串处理函数提供了丰富的功能,用于执行各种字符串操作,如复制、连接、比较、搜索等。
复制字符串 - strcpy
二 知识点梳理
三:字符数组
连接字符串 - strcat
二 知识点梳理
三:字符数组
获取字符串长度 - strlen
strlen返回字符串的长度,不包括结尾的空字符'\0'。
二 知识点梳理
三:字符数组
比较字符串 - strcmp
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
【解析】变量不能用作定义数组的大小;数组名的命名规则和标识符的命名规则相同,即开头不能是数字。二维数组可以省略一维数组的长度,但不能省略二维数组的长度。
B.switch(x+y)
{ case 11:w=y-x,break;
case 10:w=x+y;break;
default:w=x*y;) }
三 真题练讲
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.switch(x+y)
{ case 11:w=y-x,break;
case 10:w=x+y;break;
default:w=x*y;) }
三 真题练讲
【答案】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')结尾。
数组越界:访问数组的非法索引(超出声明的大小)可能导致未定义行为。
五 内容小结
感谢观看
$$