第38练 单元8 指针的妙用《C语言程序设计》(高教版第2版)一课一练
|
2份
|
9页
|
29人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元8的第38练,内容涵盖单元8“考试系统”的优化的8.2.7、8.5 动态内存分配与考试系统优化。
《C语言程序设计》(高教版第2版)一课一练 第38练
单元8 “考试系统”的优化
8.3 指针的妙用
1、 单项选择题(本题共5小题)
1、关于情境与问题 8.14 中process函数的描述,错误的是( )
A. 通过指针*(a+i)遍历数组元素,等价于下标法a[i]
B. 交换最值时直接操作指针指向的内存单元,会直接修改原数组
C. 寻找最小值时,初始值min = *a的设置是正确的,以第一个元素为基准
D. 寻找最大值时必须从第二个元素开始遍历,否则无法找到正确的最大值
【答案】D
【解析】寻找最大值时即使从第一个元素开始遍历,通过比较所有元素仍能找到最大值,初始值设为*a不影响最终结果,选项 D 错误;其他选项均符合指针操作数组的核心逻辑。
2、以下关于自定义str_len函数的实现逻辑,正确的是( )
A. 遍历字符串时,统计包括'\0'在内的所有字符个数
B. 循环终止条件是str == '\0',判断指针是否指向结束标志
C. 循环中通过str++移动指针,直到指向'\0'停止
D. 函数返回值是指针str的地址值
【答案】C
【解析】str_len函数统计字符串有效长度,不包含'\0';循环终止条件是*str != '\0',判断指针指向的字符是否为结束标志;函数返回累计的长度值,选项 C 符合实现逻辑。
3、在冒泡排序的指针实现中,以下表达式表示相邻两个元素的比较的是( )
A. *(a+i) > *(a+i+1)
B. a[i] > a[i+1]
C. *(a+i) > a[i+1]
D. 以上都正确
【答案】D
【解析】指针法*(a+i)与下标法a[i]完全等价,三种表达式都能正确比较相邻两个数组元素的大小,符合冒泡排序的核心比较逻辑。
4、自定义str_copy函数的循环for(;*to++=*from++;);,其循环终止的条件是( )
A. *from == '\0'
B. *to == '\0'
C. 赋值操作*to = *from为假(即赋值'\0'时)
D. from指针为空
【答案】C
【解析】该循环是将*from的值赋值给*to,然后两个指针同时后移;当*from为'\0'时,赋值后*to也为'\0',此时赋值表达式的值为 0(假),循环终止,实现完整字符串复制。
5、当数组名作为函数实参传递时,形参接收的是( )
A. 数组的长度
B. 数组首元素的地址
C. 数组所有元素的复制值
D. 数组最后一个元素的地址
【答案】B
【解析】数组名代表数组首元素的地址,作为实参传递时,形参(数组形式或指针形式)接收该地址,形参与实参数组共用同一片内存空间,对形参的操作会直接修改原数组。
2、 判断题(本题共4题)
1、在 C 语言中,指针操作数组时,*(a+i)与a[i]完全等价,其中a是数组名,i是整型下标。( )
【答案】√
【解析】数组名a是数组首元素的地址,a+i表示第i个元素的地址,取值*(a+i)就是该元素的值,与下标法a[i]在编译时的处理逻辑完全一致。
2、自定义str_cat函数时,目标字符串to指向的字符数组必须有足够的存储空间,否则会导致内存越界。( )
【答案】√
【解析】str_cat是将from的字符串追加到to的末尾,若to的数组空间不足,会覆盖后续内存区域,引发未定义行为,因此必须保证目标数组空间足够。
3、调用rand()函数生成随机数时,不需要包含stdlib.h头文件也能正常运行。( )
【答案】×
【解析】rand()函数的定义位于stdlib.h头文件中,必须在程序开头包含该头文件,否则编译器会识别为未定义函数,报错无法编译。
4、当数组名作为函数实参时,传递的是数组的所有元素值,形参数组会复制一份实参数组的内容。( )
【答案】×
【解析】数组名作为实参传递的是数组首元素的地址,形参数组与实参数组共用同一片内存空间,不会复制元素内容,对形参的操作会直接影响原数组。
3、 程序填空题(本题共1题)
1、题目描述:以下程序实现输入 10 个整数,将最小值与第一个元素交换、最大值与最后一个元素交换的功能,要求用指针完成操作,请补充缺失代码使程序正常运行。
#include <stdio.h>
// 输入函数:用指针接收数组地址,读取10个整数
void input(int *a, int n) {
int i;
printf("输入数据:
");
for(i=0; i<n; i++) {
//用指针方式读取输入到数组元素中
scanf("%d", __(1) __);
}
}
void process(int *a, int n) {
int i, minIndex, maxIndex, temp;
int min = *a, max = *a;
minIndex = 0;
// 初始化最大值下标
__ (2) __;
// 寻找最小值的下标
for(i=0; i<n; i++) {
if(*(a+i) < min) {
min = *(a+i);
minIndex = i;
}
}
// 交换最小值与第一个元素
temp = *a;
*a = *(a+minIndex);
*(a+minIndex) = temp;
// 寻找最大值的下标
for(i=0; i<n; i++) {
if(*(a+i) > max) {
max = *(a+i);
maxIndex = i;
}
}
// 交换最大值与最后一个元素
temp = *(a+n-1);
// 将最大值赋值到数组最后一个元素位置
__(3)__;
*(a+maxIndex) = temp;
}
void output(int *a, int n) {
int i;
printf("输出数据:
");
for(i=0; i<n; i++) {
// (4) 打印元素并添加空格分隔
printf("%d ____", *(a+i));
}
printf("
");
}
int main(int argc, char* argv[]) {
int a[10];
input(a, 10);
process(a, 10);
output(a, 10);
return 0;
}
【答案】
1) a+i(或&*(a+i))
2) maxIndex = 0;
3) *(a+n-1) = *(a+maxIndex);
4) " "
【解析】
(1):a+i是数组第i个元素的地址,scanf通过该地址将输入值存入对应数组元素,等价于&a[i],符合指针操作数组的语法规范。
(2):初始化最大值下标为 0,与最大值初始值*a(第一个元素)对应,保证遍历开始时的基准值正确,避免遗漏第一个元素。
(3):将最大值元素*(a+maxIndex)赋值到数组最后一个元素的位置*(a+n-1),完成最大值与最后一个元素的交换逻辑,直接修改原数组内存。
(4):打印每个元素后添加空格,使输出格式清晰易读,符合题目要求的输出规范。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元8的第38练,内容涵盖单元8“考试系统”的优化的8.2.7、8.5 动态内存分配与考试系统优化。
《C语言程序设计》(高教版第2版)一课一练 第38练
单元8 “考试系统”的优化
8.3 指针的妙用
1、 单项选择题(本题共5小题)
1、关于情境与问题 8.14 中process函数的描述,错误的是( )
A. 通过指针*(a+i)遍历数组元素,等价于下标法a[i]
B. 交换最值时直接操作指针指向的内存单元,会直接修改原数组
C. 寻找最小值时,初始值min = *a的设置是正确的,以第一个元素为基准
D. 寻找最大值时必须从第二个元素开始遍历,否则无法找到正确的最大值
2、以下关于自定义str_len函数的实现逻辑,正确的是( )
A. 遍历字符串时,统计包括'\0'在内的所有字符个数
B. 循环终止条件是str == '\0',判断指针是否指向结束标志
C. 循环中通过str++移动指针,直到指向'\0'停止
D. 函数返回值是指针str的地址值
3、在冒泡排序的指针实现中,以下表达式表示相邻两个元素的比较的是( )
A. *(a+i) > *(a+i+1)
B. a[i] > a[i+1]
C. *(a+i) > a[i+1]
D. 以上都正确
4、自定义str_copy函数的循环for(;*to++=*from++;);,其循环终止的条件是( )
A. *from == '\0'
B. *to == '\0'
C. 赋值操作*to = *from为假(即赋值'\0'时)
D. from指针为空
5、当数组名作为函数实参传递时,形参接收的是( )
A. 数组的长度
B. 数组首元素的地址
C. 数组所有元素的复制值
D. 数组最后一个元素的地址
2、 判断题(本题共4题)
1、在 C 语言中,指针操作数组时,*(a+i)与a[i]完全等价,其中a是数组名,i是整型下标。( )
2、自定义str_cat函数时,目标字符串to指向的字符数组必须有足够的存储空间,否则会导致内存越界。( )
3、调用rand()函数生成随机数时,不需要包含stdlib.h头文件也能正常运行。( )
4、当数组名作为函数实参时,传递的是数组的所有元素值,形参数组会复制一份实参数组的内容。( )
3、 程序填空题(本题共1题)
1、题目描述:以下程序实现输入 10 个整数,将最小值与第一个元素交换、最大值与最后一个元素交换的功能,要求用指针完成操作,请补充缺失代码使程序正常运行。
#include <stdio.h>
// 输入函数:用指针接收数组地址,读取10个整数
void input(int *a, int n) {
int i;
printf("输入数据:
");
for(i=0; i<n; i++) {
//用指针方式读取输入到数组元素中
scanf("%d", __(1) __);
}
}
void process(int *a, int n) {
int i, minIndex, maxIndex, temp;
int min = *a, max = *a;
minIndex = 0;
// 初始化最大值下标
__ (2) __;
// 寻找最小值的下标
for(i=0; i<n; i++) {
if(*(a+i) < min) {
min = *(a+i);
minIndex = i;
}
}
// 交换最小值与第一个元素
temp = *a;
*a = *(a+minIndex);
*(a+minIndex) = temp;
// 寻找最大值的下标
for(i=0; i<n; i++) {
if(*(a+i) > max) {
max = *(a+i);
maxIndex = i;
}
}
// 交换最大值与最后一个元素
temp = *(a+n-1);
// 将最大值赋值到数组最后一个元素位置
__(3)__;
*(a+maxIndex) = temp;
}
void output(int *a, int n) {
int i;
printf("输出数据:
");
for(i=0; i<n; i++) {
// (4) 打印元素并添加空格分隔
printf("%d ____", *(a+i));
}
printf("
");
}
int main(int argc, char* argv[]) {
int a[10];
input(a, 10);
process(a, 10);
output(a, 10);
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$