内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(七)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、下列四个选项中,均是合法整型常量的选项是( )
A. 010 0XABC 078 0x3f B. 0X1a 072A 1234 2E03
C. 100 0x20 037 0L D. 1,000 0EAB 0x9F 0XG5
答案:C
解析: A中078是八进制但数字8非法;B中072A的A非法,2E03不是常量;D中1,000非法,0EAB非法,0XG5非法。C全部正确。
2、若有定义:int x = 0x12; 则执行 printf("%d", x); 的输出结果是( )
A. 12 B. 18 C. 17 D. 19
答案:B
解析: 0x12是十六进制数,等于1×16+2=18,%d输出十进制18。
3、若有定义:int a=2, b=3, c=4; 则表达式 a = b + c > b = a + c 的值是( )
A. 0 B. 1 C. 2 D. 编译错误
答案:D
解析:关系运算符优先级高于赋值,所以要先计算关系运算符再进行赋值,所以右边的赋值运算符的左边就是表达式,这样不符合赋值运算符的使用规则。
4、下列程序段运行后,a、b、c的值分别为( )
int a=5, b=4, c=3;
if (a > b) a = b; b = c; c = a;
A. 4,3,4 B. 4,3,3 C. 4,4,3 D. 5,4,3
答案:A
解析: if条件成立,执行a=b,a变为4;然后无条件执行b=c,b=3;c=a,c=4。最终a=4,b=3,c=4。
5、若有定义:int x=10, y=9; 则执行 x = (x>y) ? (x++) : (y++); 后,x和y的值分别是( )
A. 11,9 B. 10,10 C. 11,10 D. 10,9
答案:D
解析:x>y为真,取x++的10(后自增先使用x的值)作为条件表达式的值,同时x进行自增为11,然后再给x赋值为10。y的值保持不变。
6、以下程序段运行后,输出结果是( )
int i=0, s=0;
while (i < 5) {
if (i % 2) continue;
s += i;
i++;
}
printf("%d", s);
A. 0 B. 2 C. 4 D. 无限循环
答案:D
解析: i=0时,i%2=0,不执行continue,s+=0,i++得1;i=1时,i%2=1,执行continue,跳过i++,i永远为1,陷入无限循环。
7、若有定义:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 则 a[1][2] 的值是( )
A. 5 B. 6 C. 7 D. 8
答案:C
解析: 二维数组按行存储,a[1]为第2行(索引1),a[1][2]为第2行第3列,即7。
8、若有定义:int a[5]={1,2,3,4,5}, *p=a+2; 则 p[-1] 的值是( )
A. 1 B. 2 C. 3 D. 4
答案:B
解析: p指向a[2]=3,p[-1]等价于*(p-1)=a[1]=2。
9、有以下程序段,运行后输出结果是( )
char *s = "ABCDE";
s += 2;
printf("%c", *s);
A. A B. B C. C D. D
答案:C
解析: s指向A,s+=2后指向C,输出C。
10、若有定义:char s[20]="Hello", t[]="World"; 则执行 strcat(s, t); 后,strlen(s) 的值是( )
A. 5 B. 10 C. 11 D. 不确定
答案:B
解析: strcat将"World"连接到"Hello"后,得到"HelloWorld",长度为10。
11、以下函数定义中,正确的是( )
A. int fun(int x, int y) { return x+y; } B. int fun(int x, y) { return x+y; }
C. fun(int x, int y) { return x+y; } D. int fun(x, y) { return x+y; }
答案:A
解析: B中y缺类型;C缺返回类型;D参数缺类型。A正确。
12、有以下程序,运行后输出结果是( )
void f(int *x, int y) {
*x = *x + y;
y = *x + y;
}
main() {
int a=2, b=3;
f(&a, b);
printf("%d,%d", a, b);
}
A. 5,3 B. 5,8 C. 2,3 D. 2,8
答案:A
解析: 通过指针修改a为2+3=5;b是传值,不受影响,仍为3。
13、以下递归函数调用 fun(4) 的返回值是( )
int fun(int n) {
if (n == 0) return 0;
return n + fun(n-1);
}
A. 4 B. 6 C. 10 D. 0
答案:C
解析: 计算1+2+3+4=10。
14、若有定义:int a=8, *p=&a, **q=&p; 则 *q 的值是( )
A. 8 B. &a C. &p D. 随机
答案:B
解析: q是指向指针p的指针,*q得到p的值,即a的地址。
15、若有定义:int a[3][3]={1,2,3,4,5,6,7,8,9}; 则 *(*(a+1)+1) 的值是( )
A. 2 B. 4 C. 5 D. 6
答案:C
解析: a+1指向第1行,*(a+1)得第1行首地址,+1指向第1行第1列,即5。
16、若有定义:char *p="Programming"; 则 printf("%c", *(p+4)); 输出( )
A. r B. g C. a D. m
答案:B
解析: p指向P,p+4指向第5个字符,即'g'。
17、有以下定义:
struct student {
int id;
char name[10];
} stu1 = {1001, "Tom"}, stu2;
则以下赋值语句正确的是( )
A. stu2 = {1002, "Jerry"}; B. stu2 = stu1;
C. stu2.id = 1002; stu2.name = "Jerry"; D. stu2->id = 1002;
答案:B
解析: 同类型结构体变量可以直接赋值;A语法错误;C中不能直接给字符数组赋值字符串;D中stu2不是指针。
18、若有定义:struct point { int x; int y; } p, *q = &p; 则下列能正确给x赋值为5的是( )
A. q.x = 5; B. (*q).x = 5; C. p->x = 5; D. &p.x = 5;
答案:B
解析: 通过结构体指针访问成员用->或(*).,B正确;A错误,应为q->x;C错误,p是变量;D语法错误。
19、若有定义:#define ADD(a,b) a+b,则执行 int x=3, y=4, z=ADD(x,y)*2; 后,z的值是( )
A. 14 B. 11 C. 10 D. 7
答案:B
解析: 宏展开为 x+y*2 = 3+4*2=3+8=11。
20、以下程序输出结果是( )
int a[5] = {1,2,3,4,5};
int i, s=0;
for(i=0; i<5; i++) {
if(i%2) s += a[i];
else s -= a[i];
}
printf("%d", s);
A. -3 B. 3 C. -5 D. 5
答案:A
解析: i=0: s=-1;i=1: s=-1+2=1;i=2: s=1-3=-2;i=3: s=-2+4=2;i=4: s=2-5=-3。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言数据类型的叙述中,正确的有( )
A. int类型在32位系统中通常占4字节
B. char类型在内存中占1字节
C. float类型占4字节,double占8字节
D. 所有指针类型占相同大小的内存
答案:ABCD
解析: 数据类型的长度取决于机器字长。
2、以下关于循环控制语句的叙述中,正确的有( )
A. break语句可以用于循环和switch中
B. continue语句只能用于循环中
C. break和continue都可以用于for、while、do-while
D. 在多层循环中,break只能跳出最内层循环
答案:ABCD
解析: 均正确。
3、以下关于数组初始化的叙述中,正确的有( )
A. int a[5] = {0}; 将a所有元素初始化为0
B. int a[] = {1,2,3}; 数组长度自动设为3
C. int a[5] = {1,2}; 只初始化前两个,其余为0
D. int a[5] = {1,2,3,4,5,6}; 编译会出错
答案:ABCD
解析: 均正确。
4、以下关于字符串的叙述中,正确的有( )
A. 字符串以\0作为结束标志
B. char s[]="abc"; 数组长度为3
C. char *p="abc"; p指向字符串常量,不能通过p修改内容
D. strcmp("abc","abd") 返回负数
答案:ACD
解析: B中数组长度为4(含'\0'),故B错误。
5、以下关于函数的叙述中,正确的有( )
A. 函数可以没有返回值
B. 函数可以嵌套调用,但不能嵌套定义
C. 函数名代表函数的入口地址
D. 函数参数可以是数组名
答案:ABCD
解析: 均正确。
三、判断题(本题共10小题,每小题1分,共10分)
1、在C语言中,标识符可以由字母、数字和下划线组成,且数字不能开头。
答案:√
解析:标识符的命名原则。
2、若有定义 int a=5, b=2; 则 a/b 的结果是2.5。
答案:×
解析:整数相除结果仍为整数a/b=2。
3、在switch语句中,case后面的常量表达式可以是变量。
答案:×
解析:case标号是整型数(包括字符型)或整型常量表达式。
4、do-while循环的循环体至少执行一次。
答案:√
解析:do-while循环的特点:先执行循环体,后判断条件,至少执行一次循环体。
5、数组名作为函数参数时,传递的是整个数组的拷贝。
答案:×
解析:数组名作为函数参数时,传递的是整个数组的地址。
6、静态局部变量在函数调用结束后其值保留。
答案:√
解析:在程序运行开始就给静态局部变量分配内存,运行结束后释放。
7、结构体变量可以直接进行关系运算比较大小。
答案:×
解析:结构体变量需要逐个比较其成员变量。
8、若有定义 int *p; 则p的值是NULL。
答案:×
解析:未进行初始化,p的值为随机值。
9、#include <stdio.h> 是一个预处理命令,末尾不需要分号。
答案:√
解析:预处理命令不算程序语句不需要加分号。
10、char s[]="hello"; 等价于 char s[5]="hello";。
答案:×
解析:char s[5]="hello"初始化错误,存储字符串"hello"需要至少6个存储空间。
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=7, b=2; 则表达式 a % b 的值是( )。
答案:1
2、若有定义:int a[4]={2,4,6,8}, *p=a; 则 *(p+2) 的值是( )。
答案:6
3、以下程序段输出结果是( )。
int i, s=0;
for(i=1; i<=4; i++)
if(i%2==0) s+=i;
else s-=i;
printf("%d", s);
答案:-2
解析:1-2+3-4=-2。
4、若有定义:char str[]="C Language"; 则 strlen(str) 的值是( )。
答案:10
5、函数调用时,如果希望形参的改变影响实参,则应该使用( )传递方式。
答案:地址(或指针)
6、若有定义:int x=5, y=6; 则执行 x = x ^ y; y = x ^ y; x = x ^ y; 后,x和y的值分别是( )和( )。
答案:6,5
解析:异或交换
7、以下递归函数的功能是计算( )。
int fun(int n) {
if (n==1) return 1;
return n * fun(n-1);
}
答案:n的阶乘
8、若有定义:struct { int a; char b; } s = {5, 'A'}; 则 s.b 的值是( )。
答案:'A'
9、若有定义:int a[3][2]={1,2,3,4,5,6}; 则 a[2][1] 的值是( )。
答案:6
10、以下程序输出结果是( )。
int a=3, b=4;
printf("%d", a>b ? a : b);
答案:4
五、简答题(本题共3题,每题5分,共15分)
1、简述break和continue在多层循环中的行为区别,并举例说明如何跳出外层循环。
答案:break只能跳出最内层循环,continue只能跳过本次循环的剩余语句。要跳出外层循环,可以使用标志变量或goto语句。例如:
int flag=0;
for(i=0; i<10 && !flag; i++) {
for(j=0; j<10; j++) {
if(条件) { flag=1; break; }
}
}
2、请说明int *p[4]和int (*p)[4]的区别,并举例说明各自的使用场景。
答案:int *p[4]是指针数组,有4个元素,每个元素是指向int的指针;int (*p)[4]是数组指针,p指向一个包含4个int元素的一维数组。前者常用于存储多个字符串或动态分配的行指针,后者常用于二维数组的行指针操作。
3、简述递归函数的优缺点,并写出计算斐波那契数列第n项的递归函数。
答案:优点:代码简洁,逻辑清晰,适合解决具有递归性质的问题。缺点:效率低,多次函数调用开销大,可能栈溢出。递归函数示例:
int fib(int n) {
if (n<=2) return 1;
return fib(n-1) + fib(n-2);
}
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void replaceChar(char *str, char oldChar, char newChar),使用指针将字符串中的所有指定字符替换为新字符。
要求:在函数中必须使用指针遍历字符串,不能使用数组下标。主函数中输入一个字符串、要替换的字符和替换后的字符,调用函数,输出替换后的字符串。
示例:
输入: hello world
l
x
输出: hexxo worxd
参考答案:
#include <stdio.h>
void replaceChar(char *str, char oldChar, char newChar) {
while (*str != '\0') {
if (*str == oldChar)
*str = newChar;
str++;
}
}
main() {
char str[100];
char old, new;
printf("请输入字符串:");
gets(str);
printf("请输入要替换的字符:");
scanf("%c", &old);
getchar();
printf("请输入替换后的字符:");
scanf("%c", &new);
replaceChar(str, old, new);
printf("替换后:%s
", str);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(七)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、下列四个选项中,均是合法整型常量的选项是( )
A. 010 0XABC 078 0x3f B. 0X1a 072A 1234 2E03
C. 100 0x20 037 0L D. 1,000 0EAB 0x9F 0XG5
2、若有定义:int x = 0x12; 则执行 printf("%d", x); 的输出结果是( )
A. 12 B. 18 C. 17 D. 19
3、若有定义:int a=2, b=3, c=4; 则表达式 a = b + c > b = a + c 的值是( )
A. 0 B. 1 C. 2 D. 编译错误
4、下列程序段运行后,a、b、c的值分别为( )
int a=5, b=4, c=3;
if (a > b) a = b; b = c; c = a;
A. 4,3,4 B. 4,3,3 C. 4,4,3 D. 5,4,3
5、若有定义:int x=10, y=9; 则执行 x = (x>y) ? (x++) : (y++); 后,x和y的值分别是( )
A. 11,9 B. 10,10 C. 11,10 D. 10,9
6、以下程序段运行后,输出结果是( )
int i=0, s=0;
while (i < 5) {
if (i % 2) continue;
s += i;
i++;
}
printf("%d", s);
A. 0 B. 2 C. 4 D. 无限循环
7、若有定义:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 则 a[1][2] 的值是( )
A. 5 B. 6 C. 7 D. 8
8、若有定义:int a[5]={1,2,3,4,5}, *p=a+2; 则 p[-1] 的值是( )
A. 1 B. 2 C. 3 D. 4
9、有以下程序段,运行后输出结果是( )
char *s = "ABCDE";
s += 2;
printf("%c", *s);
A. A B. B C. C D. D
10、若有定义:char s[20]="Hello", t[]="World"; 则执行 strcat(s, t); 后,strlen(s) 的值是( )
A. 5 B. 10 C. 11 D. 不确定
11、以下函数定义中,正确的是( )
A. int fun(int x, int y) { return x+y; } B. int fun(int x, y) { return x+y; }
C. fun(int x, int y) { return x+y; } D. int fun(x, y) { return x+y; }
12、有以下程序,运行后输出结果是( )
void f(int *x, int y) {
*x = *x + y;
y = *x + y;
}
main() {
int a=2, b=3;
f(&a, b);
printf("%d,%d", a, b);
}
A. 5,3 B. 5,8 C. 2,3 D. 2,8
13、以下递归函数调用 fun(4) 的返回值是( )
int fun(int n) {
if (n == 0) return 0;
return n + fun(n-1);
}
A. 4 B. 6 C. 10 D. 0
14、若有定义:int a=8, *p=&a, **q=&p; 则 *q 的值是( )
A. 8 B. &a C. &p D. 随机
15、若有定义:int a[3][3]={1,2,3,4,5,6,7,8,9}; 则 *(*(a+1)+1) 的值是( )
A. 2 B. 4 C. 5 D. 6
16、若有定义:char *p="Programming"; 则 printf("%c", *(p+4)); 输出( )
A. r B. g C. a D. m
17、有以下定义:
struct student {
int id;
char name[10];
} stu1 = {1001, "Tom"}, stu2;
则以下赋值语句正确的是( )
A. stu2 = {1002, "Jerry"}; B. stu2 = stu1;
C. stu2.id = 1002; stu2.name = "Jerry"; D. stu2->id = 1002;
18、若有定义:struct point { int x; int y; } p, *q = &p; 则下列能正确给x赋值为5的是( )
A. q.x = 5; B. (*q).x = 5; C. p->x = 5; D. &p.x = 5;
19、若有定义:#define ADD(a,b) a+b,则执行 int x=3, y=4, z=ADD(x,y)*2; 后,z的值是( )
A. 14 B. 11 C. 10 D. 7
20、以下程序输出结果是( )
int a[5] = {1,2,3,4,5};
int i, s=0;
for(i=0; i<5; i++) {
if(i%2) s += a[i];
else s -= a[i];
}
printf("%d", s);
A. -3 B. 3 C. -5 D. 5
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言数据类型的叙述中,正确的有( )
A. int类型在32位系统中通常占4字节
B. char类型在内存中占1字节
C. float类型占4字节,double占8字节
D. 所有指针类型占相同大小的内存
2、以下关于循环控制语句的叙述中,正确的有( )
A. break语句可以用于循环和switch中
B. continue语句只能用于循环中
C. break和continue都可以用于for、while、do-while
D. 在多层循环中,break只能跳出最内层循环
3、以下关于数组初始化的叙述中,正确的有( )
A. int a[5] = {0}; 将a所有元素初始化为0
B. int a[] = {1,2,3}; 数组长度自动设为3
C. int a[5] = {1,2}; 只初始化前两个,其余为0
D. int a[5] = {1,2,3,4,5,6}; 编译会出错
4、以下关于字符串的叙述中,正确的有( )
A. 字符串以\0作为结束标志
B. char s[]="abc"; 数组长度为3
C. char *p="abc"; p指向字符串常量,不能通过p修改内容
D. strcmp("abc","abd") 返回负数
5、以下关于函数的叙述中,正确的有( )
A. 函数可以没有返回值
B. 函数可以嵌套调用,但不能嵌套定义
C. 函数名代表函数的入口地址
D. 函数参数可以是数组名
三、判断题(本题共10小题,每小题1分,共10分)
1、在C语言中,标识符可以由字母、数字和下划线组成,且数字不能开头。
2、若有定义 int a=5, b=2; 则 a/b 的结果是2.5。
3、在switch语句中,case后面的常量表达式可以是变量。
4、do-while循环的循环体至少执行一次。
5、数组名作为函数参数时,传递的是整个数组的拷贝。
6、静态局部变量在函数调用结束后其值保留。
7、结构体变量可以直接进行关系运算比较大小。
8、若有定义 int *p; 则p的值是NULL。
9、#include <stdio.h> 是一个预处理命令,末尾不需要分号。
10、char s[]="hello"; 等价于 char s[5]="hello";。
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=7, b=2; 则表达式 a % b 的值是( )。
2、若有定义:int a[4]={2,4,6,8}, *p=a; 则 *(p+2) 的值是( )。
3、以下程序段输出结果是( )。
int i, s=0;
for(i=1; i<=4; i++)
if(i%2==0) s+=i;
else s-=i;
printf("%d", s);
4、若有定义:char str[]="C Language"; 则 strlen(str) 的值是( )。
5、函数调用时,如果希望形参的改变影响实参,则应该使用( )传递方式。
6、若有定义:int x=5, y=6; 则执行 x = x ^ y; y = x ^ y; x = x ^ y; 后,x和y的值分别是( )和( )。
7、以下递归函数的功能是计算( )。
int fun(int n) {
if (n==1) return 1;
return n * fun(n-1);
}
8、若有定义:struct { int a; char b; } s = {5, 'A'}; 则 s.b 的值是( )。
9、若有定义:int a[3][2]={1,2,3,4,5,6}; 则 a[2][1] 的值是( )。
10、以下程序输出结果是( )。
int a=3, b=4;
printf("%d", a>b ? a : b);
五、简答题(本题共3题,每题5分,共15分)
1、简述break和continue在多层循环中的行为区别,并举例说明如何跳出外层循环。
2、请说明int *p[4]和int (*p)[4]的区别,并举例说明各自的使用场景。
3、简述递归函数的优缺点,并写出计算斐波那契数列第n项的递归函数。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void replaceChar(char *str, char oldChar, char newChar),使用指针将字符串中的所有指定字符替换为新字符。
要求:在函数中必须使用指针遍历字符串,不能使用数组下标。主函数中输入一个字符串、要替换的字符和替换后的字符,调用函数,输出替换后的字符串。
示例:
输入: hello world
l
x
输出: hexxo worxd
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$