内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第18练,内容是5.4 数组的应用举例。
《编程语言基础——C语言》(第5版)一课一练 第18练
5.4 数组的应用举例
一、单选题
1. 在有序数组中插入一个新元素并保持有序,正确的做法是( )
A. 从后向前找到插入位置,将大于新元素的元素依次后移,再插入
B. 直接将新元素放在数组末尾
C. 将数组所有元素前移一位,再插入
D. 删除最后一个元素后插入
2. 在例5-6有序插入程序中,while循环条件是 i>=0 && a[i]>x,循环体内执行 a[i+1]=a[i]; i--;。当找到插入位置后,新元素应放在( )
A. a[n]处
B. a[i+1]处
C. a[0]处
D. a[i]处
3. 字符串逆序/转置的两种方法中,关于方法二(就地转置),正确的描述是( )
A. 不使用额外数组,通过对称位置交换实现,交换 s[i] 与 s[j](其中 i 从首端递增,j 从末端递减)
B. 需要借助另一个数组才能完成
C. 从数组两端向中间,将字符全部前移
D. 使用strcpy函数直接复制即可
4. 有一个5行3列的二维数组scores存储学生成绩,要求第i个学生的平均成绩,正确的计算方式是( )
A. 对scores[i][j]的所有j求和后除以5
B. 对scores[i][0]、scores[i][1]、scores[i][2]求和后除以3
C. 对scores[0][i]到scores[4][i]求和后再运算
D. 对scores[j][i]的所有j求和后除以3
5. 有以下程序段,其功能是输出低于平均分的成绩个数:
float a[5]={60,70,80,90,100}, sum=0, ave;
int i, count=0;
for(i=0;i<5;i++) sum+=a[i];
ave=sum/5;
for(i=0;i<5;i++)
if(______) count++;
printf("%d", count);
横线处应填入( )
A. a[i] >= ave
B. a[i] > ave
C. a[i] == ave
D. a[i] < ave
6. 在5x3的学生成绩二维数组中,求第j门课程的平均成绩,需要( )
A. 对一行中的5个元素求和后除以3
B. 对一列中的3个元素求和后除以3
C. 对一列中的5个元素求和后除以5
D. 对所有15个元素求和后除以5
7. 在有序数组插入算法中,元素后移的顺序为什么必须从后往前?( )
A. 从前往后和从后往前效果一样
B. 从后往前是为了提高效率
C. 防止数据覆盖:若从前往后移,后面的元素会被前面搬移来的数据覆盖而丢失
D. 因为数组下标从0开始
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
#include <string.h>
main()
{
char s[20] = "abcdef";
int i = 0, j = strlen(s) - 1;
char tmp;
while (i < j)
{
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
puts(s);
}
三、程序填空题
9. 以下程序的功能是:将一个数x插入到已排好序的升序数组中,保持有序。请填空。
#include <stdio.h>
main()
{
int a[20] = {3, 7, 10, 12, 18, 20};
int x = 15, i, n = 6;
i = n - 1;
while (i >= 0 && a[i] > x)
{
______【1】______;
i--;
}
a[i+1] = x;
n++;
for (i = 0; i < n; i++)
printf("%3d", a[i]);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是统计一个班级中低于平均分的学生人数。程序中有2处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 main()
L3 {
L4 float scores[5] = {85, 72, 90, 58, 66};
L5 int i, count;
L6 float sum, ave;
L7 for (i = 0; i < 5; i++)
L8 sum += scores[i];
L9 ave = sum / 5;
L10 for (i = 0; i < 5; i++)
L11 if (scores[i] < ave)
L12 count++;
L13 printf("count=%d
", count);
L14 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第18练,内容是5.4 数组的应用举例。
《编程语言基础——C语言》(第5版)一课一练 第18练
5.4 数组的应用举例
一、单选题
1. 在有序数组中插入一个新元素并保持有序,正确的做法是( )
A. 从后向前找到插入位置,将大于新元素的元素依次后移,再插入
B. 直接将新元素放在数组末尾
C. 将数组所有元素前移一位,再插入
D. 删除最后一个元素后插入
【答案】A
【解析】有序数组插入的典型算法:从末端开始寻找插入位置,将大于新元素的元素依次后移一个位置腾出空位,然后将新元素插入到正确位置。
2. 在例5-6有序插入程序中,while循环条件是 i>=0 && a[i]>x,循环体内执行 a[i+1]=a[i]; i--;。当找到插入位置后,新元素应放在( )
A. a[n]处
B. a[i+1]处
C. a[0]处
D. a[i]处
【答案】B
【解析】循环结束时,a[i]<=x(即a[i]不大于x,这时i可能已小于0),所以新元素应放在a[i+1]的位置。
3. 字符串逆序/转置的两种方法中,关于方法二(就地转置),正确的描述是( )
A. 不使用额外数组,通过对称位置交换实现,交换 s[i] 与 s[j](其中 i 从首端递增,j 从末端递减)
B. 需要借助另一个数组才能完成
C. 从数组两端向中间,将字符全部前移
D. 使用strcpy函数直接复制即可
【答案】A
【解析】就地转置(方法二)的算法:设i=0指向首端,j=n-1指向末端,当i<j时交换s[i]与s[j],然后i++、j--,直到i>=j。这种方法不需要额外的数组空间。
4. 有一个5行3列的二维数组scores存储学生成绩,要求第i个学生的平均成绩,正确的计算方式是( )
A. 对scores[i][j]的所有j求和后除以5
B. 对scores[i][0]、scores[i][1]、scores[i][2]求和后除以3
C. 对scores[0][i]到scores[4][i]求和后再运算
D. 对scores[j][i]的所有j求和后除以3
【答案】B
【解析】scores[i][j]中第1维i表示学生(行),第2维j表示课程(列)。求第i个学生的平均成绩应将该行所有列(3门课程)的成绩求和后除以3。
5. 有以下程序段,其功能是输出低于平均分的成绩个数:
float a[5]={60,70,80,90,100}, sum=0, ave;
int i, count=0;
for(i=0;i<5;i++) sum+=a[i];
ave=sum/5;
for(i=0;i<5;i++)
if(______) count++;
printf("%d", count);
横线处应填入( )
A. a[i] >= ave
B. a[i] > ave
C. a[i] == ave
D. a[i] < ave
【答案】D
【解析】题目要求统计低于平均分的个数,需判断每个成绩是否小于平均分ave,条件为a[i] < ave。平均分是(60+70+80+90+100)/5=80,低于80的有60和70共2个。
6. 在5x3的学生成绩二维数组中,求第j门课程的平均成绩,需要( )
A. 对一行中的5个元素求和后除以3
B. 对一列中的3个元素求和后除以3
C. 对一列中的5个元素求和后除以5
D. 对所有15个元素求和后除以5
【答案】C
【解析】5行3列的数组中,第j列共有5个元素(每个学生都有一个该课程的成绩)。求第j门课程的平均成绩,需要将这5个元素求和后除以5(即学生人数)。
7. 在有序数组插入算法中,元素后移的顺序为什么必须从后往前?( )
A. 从前往后和从后往前效果一样
B. 从后往前是为了提高效率
C. 防止数据覆盖:若从前往后移,后面的元素会被前面搬移来的数据覆盖而丢失
D. 因为数组下标从0开始
【答案】C
【解析】在有序插入中,必须从后往前依次移动元素。如果从前往后(如先将12后移覆盖18),那么18就已丢失,无法再后移。从后往前可以保证每个元素在被覆盖前已搬移到新位置。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
#include <string.h>
main()
{
char s[20] = "abcdef";
int i = 0, j = strlen(s) - 1;
char tmp;
while (i < j)
{
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
puts(s);
}
【答案】fedcba
【解析】这是字符串就地转置程序。初始i=0指向'a',j=5指向'f'。交换后:第1轮交换a/f→fbcdea;第2轮交换b/e→fecdba;第3轮交换c/d→fedcba;然后i=3,j=2不满足i<j,循环结束。输出fedcba。
三、程序填空题
9. 以下程序的功能是:将一个数x插入到已排好序的升序数组中,保持有序。请填空。
#include <stdio.h>
main()
{
int a[20] = {3, 7, 10, 12, 18, 20};
int x = 15, i, n = 6;
i = n - 1;
while (i >= 0 && a[i] > x)
{
______【1】______;
i--;
}
a[i+1] = x;
n++;
for (i = 0; i < n; i++)
printf("%3d", a[i]);
}
【答案】【1】a[i+1] = a[i]
【解析】有序插入的核心是将大于x的元素依次后移一个位置。从末端开始,当a[i]>x时,将a[i]搬到a[i+1]处。循环结束后,a[i+1]位置空出,将x插入此处即可。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是统计一个班级中低于平均分的学生人数。程序中有2处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 main()
L3 {
L4 float scores[5] = {85, 72, 90, 58, 66};
L5 int i, count;
L6 float sum, ave;
L7 for (i = 0; i < 5; i++)
L8 sum += scores[i];
L9 ave = sum / 5;
L10 for (i = 0; i < 5; i++)
L11 if (scores[i] < ave)
L12 count++;
L13 printf("count=%d
", count);
L14 }
【答案】【1】L5: int i, count; → 修改为 int i, count = 0;(变量count未初始化,初始值是随机的,会导致统计错误)
【2】L6: float sum, ave; → 修改为 float sum = 0, ave;(变量sum未初始化,累加结果错误)
【解析】sum和count是局部变量,声明时不会自动初始化为0,其初始值是随机的。sum未初始化会导致累加结果错误;count未初始化也会导致统计结果错误。声明时应写作:float sum=0; int count=0;
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$