内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(六)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下关于C语言变量和常量的叙述中,正确的是( )
A. 宏定义 #define PI 3.14 定义的是一个浮点型常量,占用内存
B. const int a = 10; 定义了一个只读变量,其值不能修改
C. 全局变量未初始化时,其值是随机数
D. 静态局部变量在函数调用结束后立即被销毁
2、若有定义:int x=2, y=3, z=4; 则表达式 x += y *= z -= 2 的值是( )
A. 6 B. 8 C. 10 D. 12
3、以下程序的输出结果是( )
int a=1, b=2, c=3;
if (a=5) c = a++;
else if (b=4) b++;
printf("%d,%d,%d", a, b, c);
A. 5,2,5 B. 6,2,5 C. 5,4,5 D. 6,4,5
4、以下程序输出结果是( )
int i=1, s=0;
while(i<=5) {
if(i%3==0) { i++; continue; }
s += i;
i++;
}
printf("%d", s);
A. 8 B. 9 C. 10 D. 12
5、若有定义:int a[5]={1,3,5,7,9}, *p=a+2; 则 p[-1] + *(p+1) 的值是( )
A. 10 B. 12 C. 14 D. 16
6、以下程序输出结果是( )
int a[3][3]={1,2,3,4,5,6,7,8,9};
int i,j,s=0;
for(i=0;i<3;i++)
for(j=i;j<=i;j++)
if(i+j==2) s+=a[i][j];
printf("%d",s);
A. 15 B. 14 C. 13 D. 12
7、以下程序输出结果是( )
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char *p = s;
while(*p) p++;
p--;
while(s < p) {
char t = *s; *s = *p; *p = t;
s++; p--;
}
}
main() {
char str[] = "abcde";
fun(str);
printf("%s", str);
}
A. abcde B. edcba C. edcba D. 编译错误
8、若有定义:int a[4]={10,20,30,40}, *p=a, *q=&a[2]; 则 q - p 的值是( )
A. 2 B. 4 C. 8 D. 20
9、以下函数调用 fun(5) 的返回值是( )
int fun(int n) {
if(n==1) return 1;
return fun(n-1) + n;
}
A. 10 B. 15 C. 20 D. 25
10、有以下定义:
struct stu { int id; int score; } s[3] = {{1,80},{2,90},{3,85}};
struct stu *p = s;
则 (p+1)->score 的值是( )
A. 80 B. 90 C. 85 D. 随机
11、若有定义:char *p = "Hello"; char *q = "World"; 则执行 strcat(p, q); 的结果是( )
A. "HelloWorld" B. "Hello"
C. 编译错误或运行时错误 D. "WorldHello"
12、以下程序输出结果是( )
void swap(int *a, int *b) {
int *t = a; a = b; b = t;
}
main() {
int x=3, y=5;
swap(&x, &y);
printf("%d,%d", x, y);
}
A. 3,5
B. 5,3
C. 3,3
D. 5,5
13、以下程序输出结果是( )
int a[5] = {1,2,3,4,5};
int i, s=0;
for(i=0; i<5; i++)
if(i%2) s += a[i];
printf("%d", s);
A. 6 B. 9 C. 10 D. 15
14、若有定义:#define PRODUCT(x,y) (x*y);则int a=5, b=PRODUCT(++a, a++); 后,b的值是( )
A. 27 B. 64 C. 24 D. 42
15、若有定义:int a[2][3] = {1,2,3,4,5,6}; 则 *(a[1]+1) 的值是( )
A. 2 B. 3 C. 4 D. 5
16、以下程序输出结果是( )
char *s = "abcde";
s += 2;
printf("%c", *s);
A. a B. b C. c D. d
17、若有定义:struct { int x; } a, *p=&a; 则下列给x赋值为10正确的是( )
A. p.x = 10; B. (*p).x = 10;
C. a->x = 10; D. &p->x = 10;
18、以下递归函数的功能是( )
int fun(int a[], int n) {
if (n==0) return 0;
return a[n-1] + fun(a, n-1);
}
A. 计算数组最大值 B. 计算数组元素之和
C. 计算数组元素个数 D. 反转数组
19、以下程序输出结果是( )
int x=0, y=0;
while(x<3) {
y++;
if(y>2) break;
x++;
}
printf("%d,%d", x, y);
A. 2,3 B. 3,3 C. 2,2 D. 3,2
20、以下程序输出结果是( )
int a=1, b=2, c=3;
int *p[] = {&a, &b, &c};
printf("%d", (p+1));
A. 1 B. 2 C. 3 D. 地址值
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言函数参数的叙述中,正确的有( )
A. 形参是局部变量,函数调用时分配内存,结束时释放
B. 实参可以是常量、变量或表达式
C. 数组名作为实参时,传递的是数组首元素的地址
D. 形参和实参可以同名,它们占据不同的内存单元
2、以下关于指针的叙述中,正确的有( )
A. 指针变量可以指向同类型的不同变量
B. 指针变量可以指向数组元素
C. 指针变量可以指向函数
D. 指针变量可以指向另一个指针
3、以下关于二维数组的叙述中,正确的有( )
A. 二维数组在内存中是按行优先存储的
B. 数组名a代表首行的首地址
C. a[i][j] 等价于 *(*(a+i)+j)
D. 二维数组作为函数参数时,第二维必须指定
4、以下关于字符串的叙述中,正确的有( )
A. 字符串以\0结尾,所以字符数组长度至少比字符串长度大1
B. strcpy函数复制字符串时会复制结尾的\0
C. strcat函数连接字符串时,会覆盖第一个字符串的\0
D. strcmp函数比较字符串时,返回0表示相等
5、以下关于递归函数的叙述中,正确的有( )
A. 递归函数必须有一个递归结束条件
B. 递归函数效率通常低于循环
C. 递归函数每次调用都会占用新的栈空间
D. 任何问题都适合用递归解决
三、判断题(本题共10小题,每小题1分,共10分)
1、在C语言中,do-while循环的循环体至少执行一次。( )
2、若有定义 int a=0, b=2, c=3; 则表达式 (a=0) && (c=4) 执行后,变量c的值仍然是3。( )
3、break语句只能用于循环结构中。( )
4、静态局部变量在函数调用结束后其值不变,下次调用时继续使用。( )
5、数组名作为函数参数时,被调函数中可以修改原数组的元素值。( )
6、结构体变量不能进行整体赋值。( )
7、若有定义 int *p; 则 p 的默认值是NULL。( )
8、#define 定义的宏常量在编译时进行替换,不占用内存。( )
9、函数的形参和实参可以同名,它们占用不同的内存单元。( )
10、char *s = "hello"; 和 char t[] = "hello"; 中,s 可以修改字符串内容,t 不可以。
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=10, b=3; 则表达式 a % b + a / b 的值是( )。
2、若有定义:int a[3][2] = {{1,2},{3,4},{5,6}}; 则 a[2][1] 的值是( )。
3、以下程序段输出结果是( )。
int i, s=0;
for(i=1; i<=6; i++) if(i%2==0) s+=i; else s-=i;
printf("%d", s);
4、若有定义:char *p = "C Programming"; 则 *(p+5) 的值是( )。
5、函数调用时,如果希望形参的改变影响实参,应该传递实参的( )。
6、若有定义:int x=5, y=6; 则执行 x = x ^ y; y = x ^ y; x = x ^ y; 后,x和y的值分别是( )和( )。
7、以下程序输出结果是( )。
int a=2, b=3;
printf("%d", a>b ? a : b);
8、若有定义:struct { int id; char name[20]; } stu = {1001, "Zhang"}; 则 stu.name[0] 的值是( )。
9、若有定义:int a[5]={2,4,6,8,10}, *p=a+4; 则 *(p-2) 的值是( )。
10、以下递归函数的功能是计算( )。
int fun(int n) {
if (n==0) return 1;
return n * fun(n-1);
}
五、简答题(本题共3题,每题5分,共15分)
1、简述C语言中 if-else 与 switch 的异同点。
2、简述如何通过指针遍历一维数组,并说明指针自增运算的意义。
3、简述递归函数的优缺点。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void removeOdd(int *arr, int *n),使用指针删除整型数组中的所有奇数,要求:
在原数组上操作,不申请新数组;
删除奇数后,剩余元素保持原顺序,并通过指针 n 返回新数组的长度;
- 主函数中先输入数组长度 N(N≤100),再输入N个整数,调用函数,输出删除奇数后的数组元素,每个数占4位宽度。
示例:
输入:
6
1 2 3 4 5 6
输出:
2 4 6
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(六)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下关于C语言变量和常量的叙述中,正确的是( )
A. 宏定义 #define PI 3.14 定义的是一个浮点型常量,占用内存
B. const int a = 10; 定义了一个只读变量,其值不能修改
C. 全局变量未初始化时,其值是随机数
D. 静态局部变量在函数调用结束后立即被销毁
【答案】B
【解析】 A错,宏定义不占用内存,在预处理阶段替换;C错,全局变量未初始化自动赋0;D错,静态局部变量生命周期为整个程序,值保留。B正确。
2、若有定义:int x=2, y=3, z=4; 则表达式 x += y *= z -= 2 的值是( )
A. 6 B. 8 C. 10 D. 12
【答案】B
【解析】 赋值运算符右结合,先算 z-=2 得 z=2,表达式值为2;再 y*=2 得 y=6;最后 x+=6 得 x=8。
3、以下程序的输出结果是( )
int a=1, b=2, c=3;
if (a=5) c = a++;
else if (b=4) b++;
printf("%d,%d,%d", a, b, c);
A. 5,2,5 B. 6,2,5 C. 5,4,5 D. 6,4,5
【答案】B
【解析】 if条件 a=5 是赋值,非0为真,执行 c = a++,c=5,a变为6;跳过else部分。最终a=6,b=2,c=5。输出6,2,5。
4、以下程序输出结果是( )
int i=1, s=0;
while(i<=5) {
if(i%3==0) { i++; continue; }
s += i;
i++;
}
printf("%d", s);
A. 8 B. 9 C. 10 D. 12
【答案】D
【解析】 i=1: 1%3!=0, s=1,i=2; i=2: 2%3!=0, s=3,i=3; i=3: 3%3==0, i++得4, continue跳过累加; i=4: 4%3!=0, s=7,i=5; i=5: 5%3!=0, s=12,i=6; 循环结束,输出12。
5、若有定义:int a[5]={1,3,5,7,9}, *p=a+2; 则 p[-1] + *(p+1) 的值是( )
A. 10 B. 12 C. 14 D. 16
【答案】B
【解析】 p指向a[2]=5,p[-1]=a[1]=3,*(p+1)=a[3]=7,和为10。
6、以下程序输出结果是( )
int a[3][3]={1,2,3,4,5,6,7,8,9};
int i,j,s=0;
for(i=0;i<3;i++)
for(j=i;j<=i;j++)
if(i+j==2) s+=a[i][j];
printf("%d",s);
A. 15 B. 14 C. 13 D. 12
【答案】A
【解析】 累加的元素有(0,2)=3, (1,1)=5, (2,2)=7,和为15。所以选A。
7、以下程序输出结果是( )
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char *p = s;
while(*p) p++;
p--;
while(s < p) {
char t = *s; *s = *p; *p = t;
s++; p--;
}
}
main() {
char str[] = "abcde";
fun(str);
printf("%s", str);
}
A. abcde B. edcba C. edcba D. 编译错误
【答案】B
【解析】 函数实现字符串反转,将"abcde"反转为"edcba"。
8、若有定义:int a[4]={10,20,30,40}, *p=a, *q=&a[2]; 则 q - p 的值是( )
A. 2 B. 4 C. 8 D. 20
【答案】A
【解析】 指针相减得到元素个数差,q指向a[2],p指向a[0],差为2。
9、以下函数调用 fun(5) 的返回值是( )
int fun(int n) {
if(n==1) return 1;
return fun(n-1) + n;
}
A. 10 B. 15 C. 20 D. 25
【答案】B
【解析】 fun(5)=fun(4)+5=fun(3)+4+5=...=1+2+3+4+5=15。
10、有以下定义:
struct stu { int id; int score; } s[3] = {{1,80},{2,90},{3,85}};
struct stu *p = s;
则 (p+1)->score 的值是( )
A. 80 B. 90 C. 85 D. 随机
【答案】B
【解析】 p指向s[0],p+1指向s[1],score为90。
11、若有定义:char *p = "Hello"; char *q = "World"; 则执行 strcat(p, q); 的结果是( )
A. "HelloWorld" B. "Hello"
C. 编译错误或运行时错误 D. "WorldHello"
【答案】C
【解析】 p指向字符串常量,不能修改,strcat试图修改常量区,导致运行时错误。
12、以下程序输出结果是( )
void swap(int *a, int *b) {
int *t = a; a = b; b = t;
}
main() {
int x=3, y=5;
swap(&x, &y);
printf("%d,%d", x, y);
}
A. 3,5
B. 5,3
C. 3,3
D. 5,5
【答案】A
【解析】 交换的是指针形参本身,不是指针指向的内容,因此x,y不变。
13、以下程序输出结果是( )
int a[5] = {1,2,3,4,5};
int i, s=0;
for(i=0; i<5; i++)
if(i%2) s += a[i];
printf("%d", s);
A. 6 B. 9 C. 10 D. 15
【答案】A
【解析】 i为奇数时累加,即a[1]=2, a[3]=4,和为6。
14、若有定义:#define PRODUCT(x,y) (x*y);则int a=5, b=PRODUCT(++a, a++); 后,b的值是( )
A. 27 B. 64 C. 24 D. 42
【答案】D
【解析】 宏展开后为++a*a++,从右往左计算,先执行完自增后再进行*,7*6=42。
15、若有定义:int a[2][3] = {1,2,3,4,5,6}; 则 *(a[1]+1) 的值是( )
A. 2 B. 3 C. 4 D. 5
【答案】D
【解析】 a[1]是第二行首地址,+1指向第二行第二列,即5。
16、以下程序输出结果是( )
char *s = "abcde";
s += 2;
printf("%c", *s);
A. a B. b C. c D. d
【答案】C
【解析】 s指向a,s+=2指向c,输出c。
17、若有定义:struct { int x; } a, *p=&a; 则下列给x赋值为10正确的是( )
A. p.x = 10; B. (*p).x = 10;
C. a->x = 10; D. &p->x = 10;
【答案】B
【解析】 结构体指针访问成员用->或(*p).,B正确;A错误;C中a是变量,不能用->;D语法错误。
18、以下递归函数的功能是( )
int fun(int a[], int n) {
if (n==0) return 0;
return a[n-1] + fun(a, n-1);
}
A. 计算数组最大值 B. 计算数组元素之和
C. 计算数组元素个数 D. 反转数组
【答案】B
【解析】 递归累加最后一个元素加上前n-1个元素的和。
19、以下程序输出结果是( )
int x=0, y=0;
while(x<3) {
y++;
if(y>2) break;
x++;
}
printf("%d,%d", x, y);
A. 2,3 B. 3,3 C. 2,2 D. 3,2
【答案】A
【解析】 初始x=0,y=0;第一轮:y=1,y>2?否,x=1;第二轮:y=2,y>2?否,x=2;第三轮:y=3,y>2真,break;此时x=2,y=3。输出2,3。
20、以下程序输出结果是( )
int a=1, b=2, c=3;
int *p[] = {&a, &b, &c};
printf("%d", (p+1));
A. 1 B. 2 C. 3 D. 地址值
【答案】D
【解析】 p是指针数组,p+1指向第二个元素(存放b的地址),(p+1)得到b的地址。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言函数参数的叙述中,正确的有( )
A. 形参是局部变量,函数调用时分配内存,结束时释放
B. 实参可以是常量、变量或表达式
C. 数组名作为实参时,传递的是数组首元素的地址
D. 形参和实参可以同名,它们占据不同的内存单元
【答案】ABCD
【解析】 所有选项正确。
2、以下关于指针的叙述中,正确的有( )
A. 指针变量可以指向同类型的不同变量
B. 指针变量可以指向数组元素
C. 指针变量可以指向函数
D. 指针变量可以指向另一个指针
【答案】ABCD
【解析】 均正确。
3、以下关于二维数组的叙述中,正确的有( )
A. 二维数组在内存中是按行优先存储的
B. 数组名a代表首行的首地址
C. a[i][j] 等价于 *(*(a+i)+j)
D. 二维数组作为函数参数时,第二维必须指定
【答案】ABCD
【解析】 均正确。
4、以下关于字符串的叙述中,正确的有( )
A. 字符串以\0结尾,所以字符数组长度至少比字符串长度大1
B. strcpy函数复制字符串时会复制结尾的\0
C. strcat函数连接字符串时,会覆盖第一个字符串的\0
D. strcmp函数比较字符串时,返回0表示相等
【答案】ABCD
【解析】 均正确。
5、以下关于递归函数的叙述中,正确的有( )
A. 递归函数必须有一个递归结束条件
B. 递归函数效率通常低于循环
C. 递归函数每次调用都会占用新的栈空间
D. 任何问题都适合用递归解决
【答案】ABC
【解析】 D错误,递归可能造成栈溢出,且并非所有问题都适合递归
三、判断题(本题共10小题,每小题1分,共10分)
1、在C语言中,do-while循环的循环体至少执行一次。( )
【答案】√
【解析】do-while循环中先执行do后边的语句,在判断循环条件。
2、若有定义 int a=0, b=2, c=3; 则表达式 (a=0) && (c=4) 执行后,变量c的值仍然是3。( )
【答案】√
【解析】 逻辑与运算符&&具有短路特性:当左侧表达式为假(0)时,右侧表达式不再计算。(a=0)的值为0,因此(c=4)不被执行,c保持原值3。
3、break语句只能用于循环结构中。( )
【答案】×
【解析】 break还可用于switch语句中。
4、静态局部变量在函数调用结束后其值不变,下次调用时继续使用。( )
【答案】√
【解析】静态局部变量在程序运行开始就给静态局部变量分配内存,运行结束后释放。
5、数组名作为函数参数时,被调函数中可以修改原数组的元素值。( )
【答案】√
【解析】数组名做函数参数时,实际上传递的是数组的首地址。
6、结构体变量不能进行整体赋值。( )
【答案】×
【解析】 同类型的结构体变量可以相互赋值。
7、若有定义 int *p; 则 p 的默认值是NULL。( )
【答案】×
【解析】 未初始化的指针变量其值不确定,不一定是NULL。
8、#define 定义的宏常量在编译时进行替换,不占用内存。( )
【答案】√
【解析】#difine是预处理命令。
9、函数的形参和实参可以同名,它们占用不同的内存单元。( )
【答案】√
【解析】形参和实参在内存中分别占用不同的内存单元,形参单元的值改变不会影响到实参单元中的值。
10、char *s = "hello"; 和 char t[] = "hello"; 中,s 可以修改字符串内容,t 不可以。
【答案】×
【解析】 s指向字符串常量,不能修改;t是字符数组,可以修改。
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=10, b=3; 则表达式 a % b + a / b 的值是( )。
【答案】4
【解析】10%3=1,10/3=3,和为4
2、若有定义:int a[3][2] = {{1,2},{3,4},{5,6}}; 则 a[2][1] 的值是( )。
【答案】6
【解析】第三行第二个元素的值。
3、以下程序段输出结果是( )。
int i, s=0;
for(i=1; i<=6; i++) if(i%2==0) s+=i; else s-=i;
printf("%d", s);
【答案】-3
【解析】1-2+3-4+5-6 = -3
4、若有定义:char *p = "C Programming"; 则 *(p+5) 的值是( )。
【答案】'g'
【解析】C(0),空格(1),P(2),r(3),o(4),g(5),r(6),a(7),m(8),m(9),i(10),n(11),g(12)。所以*(p+5)= 'g'。
5、函数调用时,如果希望形参的改变影响实参,应该传递实参的( )。
【答案】地址
6、若有定义:int x=5, y=6; 则执行 x = x ^ y; y = x ^ y; x = x ^ y; 后,x和y的值分别是( )和( )。
【答案】6, 5
【解析】异或交换
7、以下程序输出结果是( )。
int a=2, b=3;
printf("%d", a>b ? a : b);
【答案】3
8、若有定义:struct { int id; char name[20]; } stu = {1001, "Zhang"}; 则 stu.name[0] 的值是( )。
【答案】'Z'
9、若有定义:int a[5]={2,4,6,8,10}, *p=a+4; 则 *(p-2) 的值是( )。
【答案】6
【解析】p指向10,p-2指向6
10、以下递归函数的功能是计算( )。
int fun(int n) {
if (n==0) return 1;
return n * fun(n-1);
}
【答案】n的阶乘
五、简答题(本题共3题,每题5分,共15分)
1、简述C语言中 if-else 与 switch 的异同点。
【答案】 相同点:都用于多分支选择。
不同点:if-else 可以处理范围条件(如大于、小于),switch 只能处理等值判断;switch 的表达式必须是整型或字符型,且case后必须是常量表达式。
2、简述如何通过指针遍历一维数组,并说明指针自增运算的意义。
【答案】 定义指针 p = 数组名,然后通过 p++ 移动指针依次访问每个元素。指针自增 p++ 表示指针指向下一个元素,移动的字节数取决于基类型的大小。例如 int *p,p++ 移动4字节。通过 *p 获取当前元素值。
3、简述递归函数的优缺点。
【答案】 优点:代码简洁,逻辑清晰,适合解决具有递归性质的问题。缺点:效率较低,多次函数调用开销大,可能导致栈溢出。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void removeOdd(int *arr, int *n),使用指针删除整型数组中的所有奇数,要求:
在原数组上操作,不申请新数组;
删除奇数后,剩余元素保持原顺序,并通过指针 n 返回新数组的长度;
- 主函数中先输入数组长度 N(N≤100),再输入N个整数,调用函数,输出删除奇数后的数组元素,每个数占4位宽度。
示例:
输入:
6
1 2 3 4 5 6
输出:
2 4 6
参考【答案】
#include <stdio.h>
void removeOdd(int *arr, int *n) {
int i, j = 0;
for (i = 0; i < *n; i++) {
if (arr[i] % 2 == 0) { // 偶数保留
arr[j] = arr[i];
j++;
}
}
*n = j; // 更新长度
}
main() {
int arr[100], n, i;
printf("请输入元素个数:");
scanf("%d", &n);
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
removeOdd(arr, &n);
printf("删除奇数后:
");
for (i = 0; i < n; i++) {
printf("%4d", arr[i]);
}
printf("
");
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$