第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; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第38练 单元8 指针的妙用《C语言程序设计》(高教版第2版)一课一练-第1页
1
第38练 单元8 指针的妙用《C语言程序设计》(高教版第2版)一课一练-第2页
2

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。