内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(五)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下关于C语言程序结构的叙述中,错误的是( )
A. C程序由一个或多个函数组成,但必须有且仅有一个main函数
B. C程序的执行总是从main函数开始,在main函数中结束
C. 可以在一个函数内部定义另一个函数
D. 函数可以嵌套调用,但不能嵌套定义
2、若有定义:int a=5, b=2; 则表达式 (float)a/b 的值是( )
A. 2 B. 2.5 C. 2.0 D. 2.500000
3、若有定义:int x=1, y=2, z=3; 则表达式 (x>y?x:y)>z? (x>y?x:y):z 的值是( )
A. 1 B. 2 C. 3 D. 表达式错误
4、若有定义:int a=5; 则执行语句 printf("%d,%d", a, (a=3)); 的输出结果是( )
A. 3,3 B. 3,5 C. 5,3 D. 5,5
5、以下程序的输出结果是( )
int x=2, y=3;
if (x++ > y)
printf("A");
else
printf("B");
printf("%d,%d", x, y);
A. A2,3 B. B2,3 C. A3,3 D. B3,3
6、以下程序段的输出结果是( )
int i, j, s = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) break;
s += i + j;
}
}
printf("%d", s);
A. 3 B. 4 C. 5 D. 6
7、以下程序的输出结果是( )
int i, j, s = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == j) continue;
s += i * j;
if (s > 20) break;
}
if (s > 20) break;
}
printf("%d", s);
A. 18 B. 20 C. 22 D. 24
8、运行以下程序段的运行结果是( )
int a[6] = {2, 4, 6, 8, 10, 12};
int i, j, s = 0;
for(i = 0; i < 5; i++) {
for(j = i+1; j < 6; j++) {
if(a[j] % a[i] == 0)
s += a[i];
}
}
printf("%d", s);
A. 12 B. 18 C. 24 D. 30
9、以下程序段的输出结果为( )
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int i, j, max, s = 0;
for(j = 0; j < 4; j++) {
max = a[0][j];
for(i = 1; i < 3; i++) {
if(a[i][j] > max)
max = a[i][j];
}
s += max;
}
printf("%d", s);
A. 30 B. 38 C. 42 D. 48
10、以下程序段的输出结果是( )
char str[]="Hello";
printf("%d", sizeof(str));
A. 5 B. 6 C. 4 D. 不确定
11、若函数定义如下,则函数返回值类型是( )
fun(double x, int y) {
return x+y;
}
A. int B. double C. 不确定 D. void
12、以下程序的输出结果是( )
void func(int x) {
x = 10;
}
main() {
int y = 5;
func(y);
printf("%d", y);
}
A. 5 B. 10 C. 编译错误 D. 随机值
13、以下递归函数的功能是( )
int fun(int n) {
if(n==0) return 0;
return n%10 + fun(n/10);
}
A. 计算n的位数 B. 计算n各位数字之和
C. 计算n的阶乘 D. 反转n的数字
14、若有定义:int a = 2, b = 3;int *p = &a, *q = &b;则执行以下语句:
p = q;*p = 5;后,变量 a 和 b 的值分别是( )
A. 2, 3 B. 2, 5 C. 5, 3 D. 5, 5
15、若有定义:int a[3][4]; 则下列选项中,不能正确表示a[1][2]地址的是( )
A. *(a+1)+2 B. a[1]+2 C. &a[1][2] D. &a[1]+2
16、若有定义:char *s="Language";则执行s+=2;后,printf("%s",s);的输出是( )
A. Language B. anguage C. nguage D. guage
17、若有定义:struct date { int year; int month; int day; } d1, d2; 则下列赋值语句中正确的是( )
A. d1 = {2024, 12, 25}; B. d1 = d2;
C. d1 == d2; D. d1.year = 2024; d1 = {12, 25};
18、若有定义:
struct student
{ int id;
char name[20]; } stu[3]={{1,"Tom"},{2,"Jerry"}}; 则 stu[1].name 的值是( )
A. Tom B. Jerry C. 2 D. 空字符串
19、有以下定义:
struct student {
int id;
char name[20];
} stu = {1001, "LiMing"}, *p = &stu;
则下列选项中,能正确输出 name 成员值的是( )
A. printf("%s", p->name); B. printf("%s", (*p).name);
C. printf("%s", stu.name); D. 以上全部
20、有以下程序:
#include <stdio.h>
int fun(int a[], int n) {
int i, s = 0;
for (i = 0; i < n; i++) {
if (i % 2 == 0) s += a[i];
}
return s;
}
main() {
int b[5] = {2, 4, 6, 8, 10};
int result = fun(b, 3);
printf("%d", result);
}
程序运行后的输出结果是( )
A. 2 B. 6 C. 8 D. 12
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言输入输出的叙述中,正确的有( )
A. printf函数可以输出各种类型的数据
B. scanf函数输入字符串时,遇到空格会自动结束
C. getchar函数只能输入一个字符
D. puts函数输出字符串后会自动换行
2、以下关于数组作为函数参数的叙述中,正确的有( )
A. 数组名作为函数参数时,传递的是数组首元素的地址
B. 在被调函数中,可以修改原数组的元素值
C. 传递数组时,可以不指定数组大小
D. 传递二维数组时,必须指定第二维的大小
3、以下关于C语言指针与数组的叙述中,正确的有( )
A. 数组名是一个指针常量,不能进行自增运算
B. 若有定义 int a[5], *p=a; 则 p++ 是合法的,a++ 是非法的
C. 对于二维数组 int a[3][4];,a[1] 是一个指针常量,指向第1行首元素
D. 数组作为函数参数时,传递的是数组首元素的地址
4、以下关于字符串处理函数的叙述中,正确的有( )
A. strcpy(s1, s2) 会将 s2 复制到 s1,包括结尾的 \0
B. strcat(s1, s2) 要求 s1 有足够空间存放连接后的字符串
C. strcmp(s1, s2) 比较两个字符串,若相等返回0
D. strlen(s) 返回字符串的长度,不包括 \0
5、以下关于结构体的叙述中,正确的有( )
A. 结构体变量的定义可以放在函数内部,也可以放在函数外部
B. 结构体变量可以作为函数参数,传递方式有传值和传地址两种
C. 结构体变量之间可以直接使用赋值运算符 = 进行整体赋值
D. 结构体变量之间可以直接使用关系运算符 == 比较是否相等
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,所有变量在使用前都必须先定义。( )
2、若有定义 int a=5, b=3; 则表达式 printf(“%f”,(float)a%b) 的结果是2。( )
3、在switch语句中,default子句必须放在所有case子句的最后。( )
4、循环语句 for(i=0; i<10; i++); 循环体为空,会无限循环。( )
5、若有定义 char s[20]="hello";则s是一个指针常量,可以指向其他字符串。( )
6、函数的形参和实参可以同名,它们占据不同的内存单元。( )
7、全局变量在程序的整个运行期间都占用内存。( )
8、指针变量可以指向任何类型的变量,只要进行强制类型转换即可。( )
9、结构体变量所占的内存大小等于所有成员所占内存大小之和。( )
10、#define PI 3.14 是C语言的语句,结尾必须有分号。( )
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=5, b=3; 则执行 a += a -= a * b; 后,a的值为( )。
2、若有定义:int a[5]={2,4,6,8,10}, *p=a+2; 则 *(p-1) + p[2] 的值为( )。
3、有以下程序段:
char s[20]="C Program";
int i;
for(i=0; s[i]!='\0'; i++)
if(s[i]>='a' && s[i]<='z') s[i] -= 32;
程序执行后,s的内容是( )。
4、函数调用时,若需要修改实参的值,应传递实参的( )。
5、若有定义:int a[3][4]={0}; 则数组a中元素个数为( ),所有元素初始值为( )。
6、以下函数的功能是计算斐波那契数列的第n项,请补充完整:
int fib(int n) {
if (n==1 || n==2) return 1;
else return ( );
}
7、若有定义:struct { int x; float y; } s = {10, 3.14}; 则 s.y 的值是( )。
8、若有定义:int x=7, y=3; 则表达式 x % y + x / y 的值是( )。
9、若有定义:int a=5, b=8; 则执行 a = a + b; b = a - b; a = a - b; 后,a和b的值分别是( )和( )。
10、以下程序段的输出结果是( )。
int i, s=0;
for(i=1; i<=10; i++) {
if(i%3==0) continue;
s += i;
}
printf("%d", s);
五、简答题(本题共3题,每题5分,共15分)
1、简述if语句的三种基本形式及其适用场景。
2、简述for循环、while循环和do-while循环的区别。
3、简述数组名和指针变量的异同点。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void reverseString(char *str),使用指针实现字符串的反转。要求:
(1)函数内必须使用指针操作字符串,不能使用数组下标(即不能出现str[i]的形式);
(2)在原字符串上直接进行反转,不能使用额外的数组;
(3)在主函数中输入一个字符串(长度≤100),调用该函数,输出反转后的字符串。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(五)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下关于C语言程序结构的叙述中,错误的是( )
A. C程序由一个或多个函数组成,但必须有且仅有一个main函数
B. C程序的执行总是从main函数开始,在main函数中结束
C. 可以在一个函数内部定义另一个函数
D. 函数可以嵌套调用,但不能嵌套定义
【答案】C
【解析】 C语言不支持函数的嵌套定义,但支持函数的嵌套调用。A、B、D均正确。
2、若有定义:int a=5, b=2; 则表达式 (float)a/b 的值是( )
A. 2 B. 2.5 C. 2.0 D. 2.500000
【答案】B
【解析】 将a强制转换为float类型,再与整型b进行除法运算,结果为浮点数2.5。
3、若有定义:int x=1, y=2, z=3; 则表达式 (x>y?x:y)>z? (x>y?x:y):z 的值是( )
A. 1 B. 2 C. 3 D. 表达式错误
【答案】C
【解析】 嵌套条件运算符,先计算内层条件表达式,x>y?x:y的值为2,再与z比较:2>3?2:3的值为3。
4、若有定义:int a=5; 则执行语句 printf("%d,%d", a, (a=3)); 的输出结果是( )
A. 3,3 B. 3,5 C. 5,3 D. 5,5
【答案】A
【解析】 实参求值顺序自右向左,先计算(a=3),a被赋值为3,表达式值为3;再计算第一个a,此时a已为3,输出3,3。
5、以下程序的输出结果是( )
int x=2, y=3;
if (x++ > y)
printf("A");
else
printf("B");
printf("%d,%d", x, y);
A. A2,3 B. B2,3 C. A3,3 D. B3,3
【答案】D
【解析】 x++先使用x的值2,2>3为假,执行else输出B;然后x自增为3,y不变,输出3,3。
6、以下程序段的输出结果是( )
int i, j, s = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) break;
s += i + j;
}
}
printf("%d", s);
A. 3 B. 4 C. 5 D. 6
【答案】D
【解析】 i=0:内层循环j=0时,执行if语句后的break,内层循环结束;
i=1:内层循环j=0时,s=0+(1+0)=1;j=1时,执行if语句后的break,内层循环结束;
i=2:内层循环j=0时,s=1+(2+0)=3;j=1时,s=3+(2+1)=6;j=2时,执行if语句后的break,内层循环结束。
7、以下程序的输出结果是( )
int i, j, s = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == j) continue;
s += i * j;
if (s > 20) break;
}
if (s > 20) break;
}
printf("%d", s);
A. 18 B. 20 C. 22 D. 24
【答案】C
【解析】i=0: j=0 continue; j=1: s+=0=0; j=2: s+=0=0; j=3: s+=0=0; 内层结束s=0。
i=1: j=0: s+=0=0; j=1 continue; j=2: s+=2=2; j=3: s+=3=5; 内层结束s=5。
i=2: j=0: s+=0=5; j=1: s+=2=7; j=2 continue; j=3: s+=6=13; 内层结束s=13。
i=3: j=0: s+=0=13; j=1: s+=3=16; j=2: s+=6=22; 此时s=22>20,执行内层break;然后外层判断s>20,执行外层break。输出22。
8、运行以下程序段的运行结果是( )
int a[6] = {2, 4, 6, 8, 10, 12};
int i, j, s = 0;
for(i = 0; i < 5; i++) {
for(j = i+1; j < 6; j++) {
if(a[j] % a[i] == 0)
s += a[i];
}
}
printf("%d", s);
A. 12 B. 18 C. 24 D. 30
【答案】C
【解析】 内层循环判断 a[j] 是否能被 a[i] 整除,若能则将 a[i] 累加到 s 中。
i=0, a[0]=2:后面能被2整除的有 a[1]=4, a[2]=6, a[3]=8, a[4]=10, a[5]=12 → 共5个,s += 2×5 = 10。
i=1, a[1]=4:后面能被4整除的有 a[3]=8, a[5]=12 → 共2个,s += 4×2 = 8,此时 s=18。
i=2, a[2]=6:后面能被6整除的有 a[5]=12 → 共1个,s += 6×1 = 6,此时 s=24。
i=3, a[3]=8:后面无被8整除的数 → 加0。
i=4, a[4]=10:后面无被10整除的数 → 加0。所以s最终值为24。
9、以下程序段的输出结果为( )
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int i, j, max, s = 0;
for(j = 0; j < 4; j++) {
max = a[0][j];
for(i = 1; i < 3; i++) {
if(a[i][j] > max)
max = a[i][j];
}
s += max;
}
printf("%d", s);
A. 30 B. 38 C. 42 D. 48
【答案】D
【解析】 程序按列遍历二维数组,每列找出最大值,然后累加到s中。
第0列:元素1,5,9 → 最大值9
第1列:2,6,10 → 最大值10
第2列:3,7,11 → 最大值11
第3列:4,8,12 → 最大值12
s = 9+10+11+12 = 42。
10、以下程序段的输出结果是( )
char str[]="Hello";
printf("%d", sizeof(str));
A. 5 B. 6 C. 4 D. 不确定
【答案】B
【解析】 sizeof计算数组所占内存字节数,字符串"Hello"包含结尾的'\0',共6个字符。
11、若函数定义如下,则函数返回值类型是( )
fun(double x, int y) {
return x+y;
}
A. int B. double C. 不确定 D. void
【答案】A
【解析】 函数没有显示指定返回类型时,C语言默认返回int类型。x+y为double类型,但返回值被转换为int。
12、以下程序的输出结果是( )
void func(int x) {
x = 10;
}
main() {
int y = 5;
func(y);
printf("%d", y);
}
A. 5 B. 10 C. 编译错误 D. 随机值
【答案】A
【解析】 传值调用,形参x是实参y的副本,修改x不影响y的值。
13、以下递归函数的功能是( )
int fun(int n) {
if(n==0) return 0;
return n%10 + fun(n/10);
}
A. 计算n的位数 B. 计算n各位数字之和
C. 计算n的阶乘 D. 反转n的数字
【答案】B
【解析】 每次递归取出n的最低位n%10,加上fun(n/10)处理剩余部分,最终返回各位数字之和。
14、若有定义:int a = 2, b = 3;int *p = &a, *q = &b;则执行以下语句:
p = q;*p = 5;后,变量 a 和 b 的值分别是( )
A. 2, 3 B. 2, 5 C. 5, 3 D. 5, 5
【答案】B
【解析】 初始时,p 指向 a,q 指向 b。执行 p = q; 后,p 改为指向 b。执行 *p = 5; 等价于 b = 5;,因为 p 指向 b。a 的值未受影响,仍为 2;b 被修改为 5。
15、若有定义:int a[3][4]; 则下列选项中,不能正确表示a[1][2]地址的是( )
A. *(a+1)+2 B. a[1]+2 C. &a[1][2] D. &a[1]+2
【答案】D
【解析】 A、B、C都能正确表示a[1][2]的地址;D中&a[1]是第1行的首地址,&a[1]+2指向第3行首地址,不是a[1][2]的地址。
16、若有定义:char *s="Language";则执行s+=2;后,printf("%s",s);的输出是( )
A. Language B. anguage C. nguage D. guage
【答案】C
【解析】 s指向字符串首字符L,s+=2使指针指向第三个字符n,输出从n开始的字符串"nguage"。
17、若有定义:struct date { int year; int month; int day; } d1, d2; 则下列赋值语句中正确的是( )
A. d1 = {2024, 12, 25}; B. d1 = d2;
C. d1 == d2; D. d1.year = 2024; d1 = {12, 25};
【答案】B
【解析】 同类型的结构体变量可以相互赋值;A、D语法错误,C中结构体不能直接比较。
18、若有定义:
struct student
{ int id;
char name[20]; } stu[3]={{1,"Tom"},{2,"Jerry"}}; 则 stu[1].name 的值是( )
A. Tom B. Jerry C. 2 D. 空字符串
【答案】B
【解析】 结构体数组初始化,stu[1]对应第二个元素,其name成员为"Jerry"。
19、有以下定义:
struct student {
int id;
char name[20];
} stu = {1001, "LiMing"}, *p = &stu;
则下列选项中,能正确输出 name 成员值的是( )
A. printf("%s", p->name); B. printf("%s", (*p).name);
C. printf("%s", stu.name); D. 以上全部
【答案】D
【解析】 结构体变量 stu 访问成员用点运算符 stu.name;结构体指针 p 访问成员可用箭头 p->name 或解引用后加点 (*p).name。三种方式均正确,故 D 正确。
20、有以下程序:
#include <stdio.h>
int fun(int a[], int n) {
int i, s = 0;
for (i = 0; i < n; i++) {
if (i % 2 == 0) s += a[i];
}
return s;
}
main() {
int b[5] = {2, 4, 6, 8, 10};
int result = fun(b, 3);
printf("%d", result);
}
程序运行后的输出结果是( )
A. 2 B. 6 C. 8 D. 12
【答案】C
【解析】函数 fun 接收一个整型数组 a 和长度 n,通过循环遍历前 n 个元素,将下标为偶数的元素累加到 s 中,最后返回 s。主函数中定义数组 b 并初始化为 {2,4,6,8,10},调用 fun(b, 3) 表示只处理前3个元素:b[0]=2(下标0偶数,累加),b[1]=4(下标1奇数,不累加),b[2]=6(下标2偶数,累加)。累加和 s = 2 + 6 = 8,输出 8。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言输入输出的叙述中,正确的有( )
A. printf函数可以输出各种类型的数据
B. scanf函数输入字符串时,遇到空格会自动结束
C. getchar函数只能输入一个字符
D. puts函数输出字符串后会自动换行
【答案】ABCD
【解析】 所有选项均正确。scanf输入字符串时遇到空格、Tab或换行会结束;puts自动在末尾添加换行符。
2、以下关于数组作为函数参数的叙述中,正确的有( )
A. 数组名作为函数参数时,传递的是数组首元素的地址
B. 在被调函数中,可以修改原数组的元素值
C. 传递数组时,可以不指定数组大小
D. 传递二维数组时,必须指定第二维的大小
【答案】ABCD
【解析】 数组名作为参数时退化为指针,可以修改原数组;一维数组可不指定大小;二维数组必须指定第二维大小以便指针运算。
3、以下关于C语言指针与数组的叙述中,正确的有( )
A. 数组名是一个指针常量,不能进行自增运算
B. 若有定义 int a[5], *p=a; 则 p++ 是合法的,a++ 是非法的
C. 对于二维数组 int a[3][4];,a[1] 是一个指针常量,指向第1行首元素
D. 数组作为函数参数时,传递的是数组首元素的地址
【答案】ABD
【解析】 A正确,数组名是地址常量;B正确,指针变量可自增,数组名不可;C错误,a[1] 是第1行首元素的地址。
4、以下关于字符串处理函数的叙述中,正确的有( )
A. strcpy(s1, s2) 会将 s2 复制到 s1,包括结尾的 \0
B. strcat(s1, s2) 要求 s1 有足够空间存放连接后的字符串
C. strcmp(s1, s2) 比较两个字符串,若相等返回0
D. strlen(s) 返回字符串的长度,不包括 \0
【答案】ABCD
【解析】 所有选项均正确,考察常用字符串函数的基本功能。
5、以下关于结构体的叙述中,正确的有( )
A. 结构体变量的定义可以放在函数内部,也可以放在函数外部
B. 结构体变量可以作为函数参数,传递方式有传值和传地址两种
C. 结构体变量之间可以直接使用赋值运算符 = 进行整体赋值
D. 结构体变量之间可以直接使用关系运算符 == 比较是否相等
【答案】ABC
【解析】 A正确,结构体变量作用域与普通变量相同;B正确,可传值或传指针;C正确,同类型结构体变量可直接赋值;D错误,不能直接使用关系运算符比较,需逐个成员比较。
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,所有变量在使用前都必须先定义。( )
【答案】√
【解析】C语言变量使用规则。
2、若有定义 int a=5, b=3; 则表达式 printf(“%f”,(float)a%b) 的结果是2。( )
【答案】×
【解析】%的操作数只能是整型,不能是float。此题目中是将a的值先转换为float型,再进行%,所以编译会报错。
3、在switch语句中,default子句必须放在所有case子句的最后。( )
【答案】×
【解析】 default子句可以放在任何位置,通常放在最后,但不是必须的。
4、循环语句 for(i=0; i<10; i++); 循环体为空,会无限循环。( )
【答案】×
【解析】 循环体为空,但循环条件i<10在i=10时变为假,循环正常结束,不会无限循环。
5、若有定义 char s[20]="hello";则s是一个指针常量,可以指向其他字符串。( )
【答案】×
【解析】 s是数组名,是地址常量,不能重新赋值指向其他字符串。
6、函数的形参和实参可以同名,它们占据不同的内存单元。( )
【答案】√
【解析】C语言规定,当是简单变量做参数时,形参和实参分别占用存储空间,即便同名也是不同的存储单元。
7、全局变量在程序的整个运行期间都占用内存。( )
【答案】√
【解析】全局变量在函数外定义,又称外部变量或全程变量。全局变量的有效范围是从定义位置到文件结束。
8、指针变量可以指向任何类型的变量,只要进行强制类型转换即可。( )
【答案】√
【解析】 强制类型转换后可以指向,但解引用时需注意类型匹配。
9、结构体变量所占的内存大小等于所有成员所占内存大小之和。( )
【答案】×
【解析】 由于内存对齐,结构体大小可能大于成员大小之和。
10、#define PI 3.14 是C语言的语句,结尾必须有分号。( )
【答案】×
【解析】 预处理命令不是C语句,结尾不需要分号。
四、填空题(共10小题,每小题1分,共10分)
1、若有定义:int a=5, b=3; 则执行 a += a -= a * b; 后,a的值为( )。
【答案】-20
【解析】 赋值运算符右结合,先计算 a*b=15,a -= 15 得 a=5-15=-10;再 a += (-10) 得 a=-10-10=-20。
2、若有定义:int a[5]={2,4,6,8,10}, *p=a+2; 则 *(p-1) + p[2] 的值为( )。
【答案】14
【解析】 p指向a[2]=6;*(p-1)=a[1]=4;p[2]=*(p+2)=a[4]=10;和为14。
3、有以下程序段:
char s[20]="C Program";
int i;
for(i=0; s[i]!='\0'; i++)
if(s[i]>='a' && s[i]<='z') s[i] -= 32;
程序执行后,s的内容是( )。
【答案】"C PROGRAM"
【解析】 遍历字符串,将小写字母转换为大写字母,空格不变。
4、函数调用时,若需要修改实参的值,应传递实参的( )。
【答案】地址(或指针)
【解析】 通过传递地址,形参和实参指向同一内存单元,从而修改实参。
5、若有定义:int a[3][4]={0}; 则数组a中元素个数为( ),所有元素初始值为( )。
【答案】12, 0
【解析】 3行4列共12个元素,部分初始化其余自动补0。
6、以下函数的功能是计算斐波那契数列的第n项,请补充完整:
int fib(int n) {
if (n==1 || n==2) return 1;
else return ( );
}
【答案】fib(n-1) + fib(n-2)
【解析】 斐波那契数列递归定义:第n项等于前两项之和。
7、若有定义:struct { int x; float y; } s = {10, 3.14}; 则 s.y 的值是( )。
【答案】3.14
【解析】 结构体变量初始化,y成员被赋值为3.14。
8、若有定义:int x=7, y=3; 则表达式 x % y + x / y 的值是( )。
【答案】3
【解析】 7%3=1,7/3=2(整数除法),和为3。
9、若有定义:int a=5, b=8; 则执行 a = a + b; b = a - b; a = a - b; 后,a和b的值分别是( )和( )。
【答案】8, 5
【解析】 通过加减法交换两个变量的值,无需临时变量。
10、以下程序段的输出结果是( )。
int i, s=0;
for(i=1; i<=10; i++) {
if(i%3==0) continue;
s += i;
}
printf("%d", s);
【答案】37
【解析】 累加1到10中不能被3整除的数:1+2+4+5+7+8+10=37。
五、简答题(本题共3题,每题5分,共15分)
1、简述if语句的三种基本形式及其适用场景。
【答案】
(1)if(表达式) 语句序列;:当条件成立时执行语句序列,适用于单一条件判断。
(2)if(表达式) 语句1; else 语句2;:条件成立时执行语句1,否则执行语句2,适用于二分支选择。
(3)if(表达式1) 语句1; else if(表达式2) 语句2; ... else 语句n;:适用于多分支选择,根据不同的条件执行不同的操作。
2、简述for循环、while循环和do-while循环的区别。
【答案】
(1)for循环通常用于循环次数已知的情况,将初始化、条件判断、循环变量更新集中在一起。
(2)while循环先判断条件后执行循环体,适用于循环次数未知、仅根据条件判断是否继续的情况。
(3)do-while循环先执行一次循环体后判断条件,循环体至少执行一次,适用于需要至少执行一次的场景。
3、简述数组名和指针变量的异同点。
【答案】
相同点:数组名和指针变量都可以通过加减整数来访问数组元素,都表示地址。
不同点:数组名是地址常量,不能自增自减或重新赋值;指针变量是变量,可以改变指向。另外,sizeof(数组名)得到整个数组的大小,sizeof(指针)得到指针本身的大小(通常为4或8字节)。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void reverseString(char *str),使用指针实现字符串的反转。要求:
(1)函数内必须使用指针操作字符串,不能使用数组下标(即不能出现str[i]的形式);
(2)在原字符串上直接进行反转,不能使用额外的数组;
(3)在主函数中输入一个字符串(长度≤100),调用该函数,输出反转后的字符串。
参考程序:
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
char *start = str; // 指向字符串开头
char *end = str + strlen(str) 1; // 指向字符串结尾
char temp;
while (start < end) {
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
main() {
char str[101];
printf("请输入一个字符串:");
gets(str);
reverseString(str);
printf("反转后的字符串:%s
", str);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$