《编程语言基础-C语言》(高教版第5版)期末复习卷(五)(山东版)

2026-04-10
| 2份
| 19页
| 35人阅读
| 0人下载

资源信息

学段 中职
学科 职教专业课
课程 C语言程序设计
教材版本 C语言程序设计高教版(第五版)全一册
年级 高一
章节 第2章 基本数据类型与简单程序设计,第3章 分支结构程序设计,第5章 数组
类型 题集-专项训练
知识点 数据类型和简单程序设计,分支结构,循环结构,数组,函数
使用场景 同步教学-期末
学年 2026-2027
地区(省份) 山东省
地区(市) -
地区(区县) -
文件格式 ZIP
文件大小 132 KB
发布时间 2026-04-10
更新时间 2026-04-17
作者 xkw_063129603
品牌系列 学易金卷·期末模拟卷
审核时间 2026-04-10
下载链接 https://m.zxxk.com/soft/57276931.html
价格 3.00储值(1储值=1元)
来源 学科网

内容正文:

《编程语言基础-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); } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

《编程语言基础-C语言》(高教版第5版)期末复习卷(五)(山东版)
1
《编程语言基础-C语言》(高教版第5版)期末复习卷(五)(山东版)
2
《编程语言基础-C语言》(高教版第5版)期末复习卷(五)(山东版)
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。