内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第23练,内容是6.6 函数应用实例(数组与函数综合、排序等)。
《编程语言基础——C语言》(第5版)一课一练 第23练
6.6 函数应用实例(数组与函数综合、排序等)
一、单选题
1. 定义函数 void sort(int a[], int n) 用于对数组排序,调用时实参为 sort(arr, 10); 其中arr是已定义的数组,下列说法正确的是( )
A. arr传递的是数组首地址,在sort中修改a[i]会直接影响arr数组
B. arr将数组所有元素的值复制一份传递给函数
C. sort函数中对a的修改不会影响实参arr
D. 函数中不能修改数组元素的值
2. 在冒泡排序中,每一趟排序的作用是( )
A. 将所有元素从小到大排好
B. 将当前未排序部分的最大(或最小)元素移动到正确位置
C. 确定所有元素的最终位置
D. 随机交换两个元素
3. 用冒泡排序对6个整数进行升序排序,共需要进行几趟比较( )
A. 6趟
B. 4趟
C. 5趟
D. 3趟
4. 选择排序的基本思想是( )
A. 相邻元素两两比较交换
B. 将待排序元素随机打乱后重新排列
C. 将数组分为有序和无序两部分,每次把无序部分的第一个元素插入有序部分
D. 每次从待排序部分选出最小(最大)元素,放到已排序部分的末尾
5. 将排序算法封装成函数的好处不包括( )
A. 使程序运行速度一定变快
B. 实现代码复用,多次调用同一排序函数
C. 提高程序的可读性和模块化程度
D. 便于修改排序算法而不影响主程序
6. 要用二分查找(折半查找)在一个数组中查找某个数,前提条件是( )
A. 数组中的元素个数必须是偶数
B. 数组必须是已排好序的
C. 数组中的元素不能有重复值
D. 数组必须是全局变量
7. 在包含1024个有序元素的数组中用二分查找法查找一个元素,最坏情况下需要比较的次数约为( )
A. 1024次
B. 512次
C. 10次
D. 1次
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void bubble(int a[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
main()
{
int arr[5] = {5, 3, 4, 1, 2}, i;
bubble(arr, 5);
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
}
三、程序填空题
9. 以下程序的功能是:用选择排序法对数组进行升序排序。请填空。
#include <stdio.h>
void selectSort(int a[], int n)
{
int i, j, min, t;
for (i = 0; i < n - 1; i++)
{
min = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
【1】;
if (min != i)
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
main()
{
int arr[5] = {8, 3, 6, 1, 9}, i;
selectSort(arr, 5);
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用二分查找法在有序数组中查找指定元素。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 int binarySearch(int a[], int n, int x)
L3 {
L4 int low = 0, high = n - 1, mid;
L5 while (low <= high)
L6 {
L7 mid = (low + high) / 2;
L8 if (a[mid] == x)
L9 return mid;
L10 else if (x < a[mid])
L11 low = mid + 1;
L12 else
L13 high = mid - 1;
L14 }
L15 return -1;
L16 }
L17 main()
L18 {
L19 int arr[8] = {1, 3, 5, 7, 9, 11, 13, 15};
L20 printf("%d
", binarySearch(arr, 8, 7));
L21 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第23练,内容是6.6 函数应用实例(数组与函数综合、排序等)。
《编程语言基础——C语言》(第5版)一课一练 第23练
6.6 函数应用实例(数组与函数综合、排序等)
一、单选题
1. 定义函数 void sort(int a[], int n) 用于对数组排序,调用时实参为 sort(arr, 10); 其中arr是已定义的数组,下列说法正确的是( )
A. arr传递的是数组首地址,在sort中修改a[i]会直接影响arr数组
B. arr将数组所有元素的值复制一份传递给函数
C. sort函数中对a的修改不会影响实参arr
D. 函数中不能修改数组元素的值
【答案】A
【解析】数组名作为函数参数时,传递的是数组的首地址。因此形参数组a和实参数组arr指向同一段内存,函数中对a元素的任何修改都会直接影响实参数组arr的值。
2. 在冒泡排序中,每一趟排序的作用是( )
A. 将所有元素从小到大排好
B. 将当前未排序部分的最大(或最小)元素移动到正确位置
C. 确定所有元素的最终位置
D. 随机交换两个元素
【答案】B
【解析】冒泡排序每趟将当前未排序部分的最大值(升序时)通过相邻比较和交换,逐次'冒泡'到最后。n个元素的冒泡排序共需n-1趟,每趟比较次数递减。
3. 用冒泡排序对6个整数进行升序排序,共需要进行几趟比较( )
A. 6趟
B. 4趟
C. 5趟
D. 3趟
【答案】C
【解析】冒泡排序对n个元素进行排序需要n-1趟。6个元素需要5趟。每趟之后,当前未排序部分的最大值会被交换到最后,因此下一趟的比较次数减少1次。
4. 选择排序的基本思想是( )
A. 相邻元素两两比较交换
B. 将待排序元素随机打乱后重新排列
C. 将数组分为有序和无序两部分,每次把无序部分的第一个元素插入有序部分
D. 每次从待排序部分选出最小(最大)元素,放到已排序部分的末尾
【答案】D
【解析】选择排序每趟从当前未排序部分中选出最小元素,然后将其与未排序部分的第一个元素交换,将其放到已排序部分的末尾。n个元素的选择排序共需n-1趟。
5. 将排序算法封装成函数的好处不包括( )
A. 使程序运行速度一定变快
B. 实现代码复用,多次调用同一排序函数
C. 提高程序的可读性和模块化程度
D. 便于修改排序算法而不影响主程序
【答案】A
【解析】将排序封装成函数的好处包括代码复用、提高可读性和模块化、便于维护等。但封装本身不会保证运行速度变快——速度取决于算法本身和实现方式。
6. 要用二分查找(折半查找)在一个数组中查找某个数,前提条件是( )
A. 数组中的元素个数必须是偶数
B. 数组必须是已排好序的
C. 数组中的元素不能有重复值
D. 数组必须是全局变量
【答案】B
【解析】二分查找的基本思想是将查找区间不断对半缩小,每次比较中间元素与目标值的关系来决定下一步查找左半还是右半。这要求数组是有序的,否则无法判断目标值在左半还是右半。
7. 在包含1024个有序元素的数组中用二分查找法查找一个元素,最坏情况下需要比较的次数约为( )
A. 1024次
B. 512次
C. 10次
D. 1次
【答案】C
【解析】二分查找每次将查找范围缩小一半,最坏情况需要查找直到区间长度为0。比较次数约为log₂(n)+1。log₂(1024)=10,因此最坏约需10次比较。相比顺序查找的1024次效率大幅提升。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void bubble(int a[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
main()
{
int arr[5] = {5, 3, 4, 1, 2}, i;
bubble(arr, 5);
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
}
【答案】1 2 3 4 5
【解析】程序使用冒泡排序对数组{5,3,4,1,2}进行升序排列。排序过程:第1趟后最大值5在末尾,第2趟后4在倒数第二...经过4趟排序后数组变为升序1 2 3 4 5。注意数组名传递的是地址,排序结果直接影响main中的arr。
三、程序填空题
9. 以下程序的功能是:用选择排序法对数组进行升序排序。请填空。
#include <stdio.h>
void selectSort(int a[], int n)
{
int i, j, min, t;
for (i = 0; i < n - 1; i++)
{
min = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
【1】;
if (min != i)
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
main()
{
int arr[5] = {8, 3, 6, 1, 9}, i;
selectSort(arr, 5);
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
}
【答案】【1】min = j
【解析】选择排序每趟在当前未排序部分中找出最小元素的下标。内层for循环遍历未排序元素,当发现a[j]比当前最小值a[min]更小时,将min更新为j。循环结束后min指向最小元素的位置,然后将其与a[i]交换。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用二分查找法在有序数组中查找指定元素。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 int binarySearch(int a[], int n, int x)
L3 {
L4 int low = 0, high = n - 1, mid;
L5 while (low <= high)
L6 {
L7 mid = (low + high) / 2;
L8 if (a[mid] == x)
L9 return mid;
L10 else if (x < a[mid])
L11 low = mid + 1;
L12 else
L13 high = mid - 1;
L14 }
L15 return -1;
L16 }
L17 main()
L18 {
L19 int arr[8] = {1, 3, 5, 7, 9, 11, 13, 15};
L20 printf("%d
", binarySearch(arr, 8, 7));
L21 }
【答案】【1】L10-L11: else if (x < a[mid]) low = mid + 1; → 应改为 else if (x < a[mid]) high = mid - 1;(x小于中间值时应在左半部分查找,应缩小high而非增大low)
【解析】二分查找的核心逻辑:当x<a[mid]时,目标值在左半部分,应使high=mid-1缩小查找范围的上界;当x>a[mid]时,目标值在右半部分,应使low=mid+1。原程序中x<a[mid]的条件处理反了,将导致查找失败。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$