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

2026-04-01
| 2份
| 15页
| 42人阅读
| 0人下载

资源信息

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

内容正文:

《编程语言基础-C语言》(高教版第5版) 期末复习卷(四)原卷版 时间:90分钟 总分:100分 班级 姓名 学号 成绩 一、单项选择题(本题共20小题,每小题2分,共40分) 1、以下关于C语言源程序的叙述中,正确的是( ) A. 一个C程序只能有一个函数,那就是主函数 B. 所有函数都必须放在主函数之前 C. 注释可以出现在程序的任何位置 D. 每行只能写一条语句 2、若有定义:float x=3.14; 则表达式 (int)x 的值是( ) A. 3.14 B. 3 C. 4 D. 3.0 3、表达式 (3<5) ? 6 : 7 的值是( ) A. 3 B. 5 C. 6 D. 7 4、若有 int a=10; 则执行 printf("%d,%d", a, a++); 的输出结果是( ) A. 10,10 B. 10,11 C. 11,10 D. 11,11 5、以下程序段输出结果是( ) int x=2, y=3; if (x>y) x++; else y--; printf("%d,%d", x, y); A. 2,2 B. 2,3 C. 3,2 D. 3,3 6、以下程序的输出结果是( ) int i=1, s; do { s += i; i++; } while (i<=3); printf("%d", s); A. 3 B. 6 C. 1 D.不确定的值 7、以下程序段执行后,输出星号的数量是( ) for (int i=1; i<=3; i++) for (int j=1; j<=i; j++) printf("*"); A. 3 B. 4 C. 5 D. 6 8、若有定义:int a[5]={10,20,30,40,50}, *p=a+2; 则 *(p-1) 的值是( ) A. 10 B. 20 C. 30 D. 40 9、若有定义:int a[2][3]={{1,2},{3,4,5}}; 则 a[1][2] 的值是( ) A. 3 B. 4 C. 5 D. 0 10、以下能正确输出字符串"Hello"的语句是( ) A. char s[5]="Hello"; printf("%s",s); B. char s[]={'H','e','l','l','o'}; printf("%s",s); C. char s[6]="Hello"; printf("%s",s); D. char s[]={'H','e','l','l','o','\0'}; printf("%c",s); 11、以下函数定义中,正确的是( ) A. void fun(int x, int y) { return x+y; } B. int fun(int x, y) { return x+y; } C. int fun(int x, int y) { return x+y; } D. int fun(x, y) { return x+y; } 12、若有函数调用 func(a, &b);,则下列函数原型中正确的是( ) A. void func(int x, int y); B. void func(int x, int *y); C. void func(int *x, int y); D. void func(int *x, int *y); 13、以下递归函数的功能是( ) int fun(int n) { if (n==1) return 1; else return n + fun(n-1); } A. 计算n的阶乘 B. 计算1+2+...+n C. 计算n的平方 D. 计算n的n次方 14、若有定义:int a=5, *p=&a; 则下列表达式能正确输出a的值的是( ) A. printf("%d", p); B. printf("%d", *p); C. printf("%d", &a); D. printf("%d", *&p); 15、若有定义:int a[10], *p=a; 则以下对数组元素的引用错误的是( ) A. a[5] B. *(a+5) C. p[5] D. *p+5 16、若有定义:char *s="China"; 则 printf("%c", *(s+2)); 的输出是( ) A. C B. h C. i D. n 17、以下结构体变量定义中,正确的是( ) A. struct stu { int num; } s; B. struct s; C. struct stu { int num; } D. struct stu s { int num; } 18、若有定义:struct student { int id; char name[20]; } stu, *p=&stu; 则下列访问id成员的写法正确的是( ) A. p.id B. (*p).id C. stu->id D. (*stu).id 19、在64位的编译系统中,若有定义:double *p; 则 sizeof(p) 的值是( ) A. 4 B. 8 C. 取决于p指向的变量 D. 编译错误 20、若有以下定义: typedef int ARR[5]; ARR a; 则 a 的类型是( ) A. int B. int * C. 包含5个整型元素的数组 D. 指向整型数组的指针 二、多选题(本题共5小题,每小题3分,共15分) 1、以下关于C语言运算符优先级的叙述中,正确的有( ) A. 算术运算符 > 关系运算符 > 逻辑运算符 B. 逻辑非! > 算术运算符 C. 赋值运算符优先级最低 D. 逗号运算符优先级最低 2、以下关于break和continue的叙述中,正确的有( ) A. break只能用于循环语句中 B. continue只能用于循环语句中 C. break可以终止switch语句 D. continue可以终止switch语句 3、以下关于数组初始化的叙述中,正确的有( ) A. int a[5] = {0}; 将a所有元素初始化为0 B. int a[5] = {1,2}; 只初始化前两个元素,其余为0 C. int a[] = {1,2,3}; 数组长度自动设为3 D. int a[5] = {1,2,3,4,5,6};能正常进行编译 4、以下关于函数指针的叙述中,正确的有( ) A. 函数指针指向函数的入口地址 B. 函数指针可以作为函数参数 C. 函数指针可以指向任何类型的函数 D. 函数指针的定义格式为 类型 (*指针名)(参数列表) 25、下列关于指针的叙述正确的是( ) A. 指针变量存放的是内存地址,可以通过取地址运算符&获得变量的地址 B. 两个同类型的指针变量可以相加,其结果仍为同类型指针 C. 指针变量可以作为函数参数,实现“传址调用”,使函数内部可以修改实参的值 D. 若有定义int a[5];,则数组名a是一个指针常量,不能进行自增运算 三、判断题(本题共10小题,每小题1分,共10分) 1、在C语言中,标识符可以由字母、数字和下划线组成,且数字不能开头。( ) 2、若有定义 int a=3,b=4,c; 则 c =a+++b++; 执行后c的值为7,a为4,b为5。( ) 3、在switch语句中,case后面的常量表达式可以是变量。( ) 4、循环语句 for(;;) 是一个无限循环,等价于 while(1)。( ) 5、数组名作为函数参数时,传递的是数组首元素的地址。( ) 6、C语言中,函数的声明和定义可以分开,声明告诉编译器函数的返回类型和参数类型,定义则提供函数的具体实现。( ) 7、递归函数必须包含一个明确的递归结束条件,否则会导致无限递归。 8、结构体变量所占的内存大小等于所有成员所占内存大小之和。 9、char *p = "hello";和char s[]="hello";中,p和s都可以修改字符串内容。( ) 10、若有定义int a[5]={1,2,3,4,5}, *p=a;,则执行p = p + 2;后,p指向a[2],此时*p的值为3。 四、填空题(共10小题,每小题1分,共10分) 1、设x的值为15,n的值为2,则表达式x % = (n+=3)运算后,x的值是( )。 2、若有定义:int a=10, b=20; 则执行 a = a ^ b; b = a ^ b; a = a ^ b; 后,a和b的值分别是( )和( )。 3、若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为( )(假设a[0][0]在第一位置)。 4、若有定义:char str[20]="C Program"; 则 printf("%d", strlen(str)); 的输出是( )。 5、函数调用时,实参与形参之间的数据传递方式有( )和( )两种。 6、若有定义:int x=5, *p=&x; 则 *p+1的值是( )。 7、若有定义:int a[5]={2,4,6,8,10}, *p=a+3; 则 p[-1] 的值是( )。 8、定义指向整型数组的指针变量p,该数组有10个元素,正确的定义语句是( )。 9、若有定义:struct { int x; char y; } s={10,'A'}; 则 s.x 的值是( )。 10、下面程序段的运行结果是( )。 char a[ ] = "language",*p; p = a; while (*p ! = 'u') { printf ("%c",*p - 32); p++; } 五、简答题(本题共3题,每题5分,共15分) 1、简述函数的原型声明的作用,并举例说明。 2、简述如何通过指针变量遍历一维数组,并说明指针与数组名的异同。 3、简述结构体类型与结构体变量的区别,并说明如何定义结构体指针。 六、编程题(本题共1小题,每小题10分,共10分) 编写一个函数 void countChar(char *str, int *letters, int *digits, int *others),统计字符串中字母、数字和其他字符的个数。 要求: 使用指针遍历字符串,不能使用数组下标; 通过指针参数返回统计结果; 在主函数中输入一个字符串(长度≤100),调用该函数,输出统计结果,格式如:字母:5 数字:3 其他:2。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 《编程语言基础-C语言》(高教版第5版) 期末复习卷(四)解析版 时间:90分钟 总分:100分 班级 姓名 学号 成绩 一、单项选择题(本题共20小题,每小题2分,共40分) 1、以下关于C语言源程序的叙述中,正确的是( ) A. 一个C程序只能有一个函数,那就是主函数 B. 所有函数都必须放在主函数之前 C. 注释可以出现在程序的任何位置 D. 每行只能写一条语句 【答案】C 【解析】 一个C程序可以有多个函数,但主函数main只能有一个;函数可以任意顺序定义;注释可以出现在任何空白处;一条语句可以分多行写,一行也可以写多条语句。 2、若有定义:float x=3.14; 则表达式 (int)x 的值是( ) A. 3.14 B. 3 C. 4 D. 3.0 【答案】B 【解析】 强制类型转换将浮点数转换为整型,直接截断小数部分,结果为3。 3、表达式 (3<5) ? 6 : 7 的值是( ) A. 3 B. 5 C. 6 D. 7 【答案】C 【解析】 条件运算符,3<5为真,取冒号前的值6。 4、若有 int a=10; 则执行 printf("%d,%d", a, a++); 的输出结果是( ) A. 10,10 B. 10,11 C. 11,10 D. 11,11 【答案】C 【解析】 实参求值顺序自右向左,先计算a++(值为10,a自增为11),再计算a(此时为11),所以输出11,10。 5、以下程序段输出结果是( ) int x=2, y=3; if (x>y) x++; else y--; printf("%d,%d", x, y); A. 2,2 B. 2,3 C. 3,2 D. 3,3 【答案】A 【解析】 x>y为假,执行else后的y--,y变为2,x不变为2,输出2,2。 6、以下程序的输出结果是( ) int i=1, s; do { s += i; i++; } while (i<=3); printf("%d", s); A. 3 B. 6 C. 1 D.不确定的值 【答案】D 【解析】 s未赋初值,输出结果不确定。 7、以下程序段执行后,输出星号的数量是( ) for (int i=1; i<=3; i++) for (int j=1; j<=i; j++) printf("*"); A. 3 B. 4 C. 5 D. 6 【答案】D 【解析】 外层i=1时内层执行1次;i=2时2次;i=3时3次;共1+2+3=6次。 8、若有定义:int a[5]={10,20,30,40,50}, *p=a+2; 则 *(p-1) 的值是( ) A. 10 B. 20 C. 30 D. 40 【答案】B 【解析】 p指向a[2]=30,p-1指向a[1]=20。 9、若有定义:int a[2][3]={{1,2},{3,4,5}}; 则 a[1][2] 的值是( ) A. 3 B. 4 C. 5 D. 0 【答案】C 【解析】 第一行初始化1,2,0(不足补0);第二行初始化3,4,5;a[1][2]为第二行第三列,即5。 10、以下能正确输出字符串"Hello"的语句是( ) A. char s[5]="Hello"; printf("%s",s); B. char s[]={'H','e','l','l','o'}; printf("%s",s); C. char s[6]="Hello"; printf("%s",s); D. char s[]={'H','e','l','l','o','\0'}; printf("%c",s); 【答案】C 【解析】 A中数组长度5不够存放'\0',输出可能乱码;B中没有'\0',输出会越界;D用%c只能输出一个字符;C正确,长度为6,有'\0'。 11、以下函数定义中,正确的是( ) A. void fun(int x, int y) { return x+y; } B. int fun(int x, y) { return x+y; } C. int fun(int x, int y) { return x+y; } D. int fun(x, y) { return x+y; } 【答案】C 【解析】A中void函数不能返回int值;B中y未指定类型;D中参数未指定类型;C正确。 12、若有函数调用 func(a, &b);,则下列函数原型中正确的是( ) A. void func(int x, int y); B. void func(int x, int *y); C. void func(int *x, int y); D. void func(int *x, int *y); 【答案】B 【解析】 实参a是int变量,对应形参应为int类型;&b是int*类型,对应形参应为int*类型。 13、以下递归函数的功能是( ) int fun(int n) { if (n==1) return 1; else return n + fun(n-1); } A. 计算n的阶乘 B. 计算1+2+...+n C. 计算n的平方 D. 计算n的n次方 【答案】B 【解析】 递归公式为n + fun(n-1),且fun(1)=1,即求1到n的和。 14、若有定义:int a=5, *p=&a; 则下列表达式能正确输出a的值的是( ) A. printf("%d", p); B. printf("%d", *p); C. printf("%d", &a); D. printf("%d", *&p); 【答案】B 【解析】p是地址,*p是a的值;&a是地址;*&p相当于p本身,也是地址。只有B输出值。 15、若有定义:int a[10], *p=a; 则以下对数组元素的引用错误的是( ) A. a[5] B. *(a+5) C. p[5] D. *p+5 【答案】D 【解析】 *p+5等于a[0]+5,不是a[5]。 16、若有定义:char *s="China"; 则 printf("%c", *(s+2)); 的输出是( ) A. C B. h C. i D. n 【答案】C 【解析】 s指向字符串首字符,s+2指向第三个字符(下标2),即'i'。 17、以下结构体变量定义中,正确的是( ) A. struct stu { int num; } s; B. struct s; C. struct stu { int num; } D. struct stu s { int num; } 【答案】A 【解析】 A正确,定义结构体类型stu并声明变量s;B不是完整的结构体缺少结构体成员的定义和结构体变量的定义,struct不能直接用来定义变量;C缺少变量名;D语法错误。 18、若有定义:struct student { int id; char name[20]; } stu, *p=&stu; 则下列访问id成员的写法正确的是( ) A. p.id B. (*p).id C. stu->id D. (*stu).id 【答案】B 【解析】通过结构体指针访问成员用->或(*p).,A错误(p是指针,应用->),C、D错误(stu是变量,应用.)。 19、在64位的编译系统中,若有定义:double *p; 则 sizeof(p) 的值是( ) A. 4 B. 8 C. 取决于p指向的变量 D. 编译错误 【答案】B 【解析】 sizeof 是运算符,用于计算类型或变量所占内存字节数。指针变量本身的大小与所指向的类型无关,在64位系统中占8字节。 20、若有以下定义: typedef int ARR[5]; ARR a; 则 a 的类型是( ) A. int B. int * C. 包含5个整型元素的数组 D. 指向整型数组的指针 【答案】C 【解析】 typedef 为已有类型定义别名。ARR 被定义为长度为5的整型数组类型,因此 ARR a; 等价于 int a[5];,即 a 是一个包含5个整型元素的数组。 二、多选题(本题共5小题,每小题3分,共15分) 1、以下关于C语言运算符优先级的叙述中,正确的有( ) A. 算术运算符 > 关系运算符 > 逻辑运算符 B. 逻辑非! > 算术运算符 C. 赋值运算符优先级最低 D. 逗号运算符优先级最低 【答案】ABD 【解析】 逻辑非优先级高于算术运算符,算术运算符高于关系运算符,关系运算符高于逻辑与和或,逗号运算符优先级最低,赋值运算符优先级倒数第二低(仅高于逗号)。 2、以下关于break和continue的叙述中,正确的有( ) A. break只能用于循环语句中 B. continue只能用于循环语句中 C. break可以终止switch语句 D. continue可以终止switch语句 【答案】BC 【解析】 break可用于循环和switch;continue只能用于循环,不能用于switch。 3、以下关于数组初始化的叙述中,正确的有( ) A. int a[5] = {0}; 将a所有元素初始化为0 B. int a[5] = {1,2}; 只初始化前两个元素,其余为0 C. int a[] = {1,2,3}; 数组长度自动设为3 D. int a[5] = {1,2,3,4,5,6};能正常进行编译 【答案】ABC 【解析】 D中初始化值多于数组长度,编译出错。 4、以下关于函数指针的叙述中,正确的有( ) A. 函数指针指向函数的入口地址 B. 函数指针可以作为函数参数 C. 函数指针可以指向任何类型的函数 D. 函数指针的定义格式为 类型 (*指针名)(参数列表) 【答案】ABD 【解析】 函数指针必须指向与定义时相同的函数类型(返回类型和参数列表一致)。 25、下列关于指针的叙述正确的是( ) A. 指针变量存放的是内存地址,可以通过取地址运算符&获得变量的地址 B. 两个同类型的指针变量可以相加,其结果仍为同类型指针 C. 指针变量可以作为函数参数,实现“传址调用”,使函数内部可以修改实参的值 D. 若有定义int a[5];,则数组名a是一个指针常量,不能进行自增运算 【答案】ACD 【解析】指针变量专门用于存放内存地址,&运算符可以获取变量的地址;两个同类型的指针相加无实际意义,C语言不允许指针相加运算(但允许指针加整数或指针相减);通过传递指针(地址)作为函数参数,形参和实参指向同一内存单元,从而实现在函数内部修改实参的值;数组名代表数组首元素的地址,是地址常量,不能作为左值进行自增或赋值操作。 三、判断题(本题共10小题,每小题1分,共10分) 1、在C语言中,标识符可以由字母、数字和下划线组成,且数字不能开头。( ) 【答案】√ 【解析】这是C语言标示符的命名规则。 2、若有定义 int a=3,b=4,c; 则 c =a+++b++; 执行后c的值为7,a为4,b为5。( ) 【答案】√ 【解析】c = a+++b++相当于c = (a++)+(b++),因为是后自增,所以先使用a、b的值,再自增,所以c=3+4=7,a为4,b为5。 3、在switch语句中,case后面的常量表达式可以是变量。( ) 【答案】× 【解析】 case后必须是常量表达式,不能是变量。 4、循环语句 for(;;) 是一个无限循环,等价于 while(1)。( ) 【答案】√ 【解析】for循环的循环条件为空时,代表循环是无限循环。 5、数组名作为函数参数时,传递的是数组首元素的地址。( ) 【答案】√ 【解析】数组名是这个数组的首地址。 6、C语言中,函数的声明和定义可以分开,声明告诉编译器函数的返回类型和参数类型,定义则提供函数的具体实现。( ) 【答案】√ 【解析】函数声明(原型)通常放在头文件或源文件开头,定义包含函数体。声明使编译器在调用前了解函数接口,定义才是实际代码。 7、递归函数必须包含一个明确的递归结束条件,否则会导致无限递归。 【答案】√ 【解析】递归函数如果没有终止条件,会无限调用自身。 8、结构体变量所占的内存大小等于所有成员所占内存大小之和。 【答案】× 【解析】 由于内存对齐,结构体大小可能大于成员大小之和。 9、char *p = "hello";和char s[]="hello";中,p和s都可以修改字符串内容。( )【答案】× 【解析】 p指向字符串常量,不能修改;s是数组,可以修改。 10、若有定义int a[5]={1,2,3,4,5}, *p=a;,则执行p = p + 2;后,p指向a[2],此时*p的值为3。 【答案】√ 【解析】指针加整数表示向前移动若干个元素,p初始指向a[0],p+2指向a[2],*p得3。 四、填空题(共10小题,每小题1分,共10分) 1、设x的值为15,n的值为2,则表达式x % = (n+=3)运算后,x的值是( )。 【答案】0 【解析】赋值表达式先计算n+=3,得n的值为5,在计算x%=5,得x的值为0。 2、若有定义:int a=10, b=20; 则执行 a = a ^ b; b = a ^ b; a = a ^ b; 后,a和b的值分别是( )和( )。 【答案】20, 10 【解析】 异或运算实现两个变量值的交换。 3、若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为( )(假设a[0][0]在第一位置)。 【答案】i*m+j+1 4、若有定义:char str[20]="C Program"; 则 printf("%d", strlen(str)); 的输出是( )。 【答案】9 【解析】strlen计算的是字符串中第一个结束符前的字符个数,C Program中间有空格,所以共9个字符。 5、函数调用时,实参与形参之间的数据传递方式有( )和( )两种。 【答案】值传递,传地址 6、若有定义:int x=5, *p=&x; 则 *p+1的值是( )。 【答案】6 【解析】p为指向变量x的指针,所以*p的值为5,*p+1的值为6。 7、若有定义:int a[5]={2,4,6,8,10}, *p=a+3; 则 p[-1] 的值是( )。 【答案】6 【解析】 p指向a[3]=8,p[-1]即*(p-1)=a[2]=6。 8、定义指向整型数组的指针变量p,该数组有10个元素,正确的定义语句是( )。 【答案】int (*p)[10]; 9、若有定义:struct { int x; char y; } s={10,'A'}; 则 s.x 的值是( )。 【答案】10 10、下面程序段的运行结果是( )。 char a[ ] = "language",*p; p = a; while (*p ! = 'u') { printf ("%c",*p - 32); p++; } 【答案】LANG 【解析】while循环输出字符串中‘u’前边的字符的大写。 五、简答题(本题共3题,每题5分,共15分) 1、简述函数的原型声明的作用,并举例说明。 【答案】 函数原型声明说明函数的返回类型、函数名和参数列表,在函数调用前检查参数类型和个数是否匹配,避免编译错误。例如:int add(int a, int b); 声明了一个返回int、有两个int参数的函数。 2、简述如何通过指针变量遍历一维数组,并说明指针与数组名的异同。 【答案】 定义指针p指向数组首地址,通过p++或p+偏移访问数组元素。相同点:数组名和指针都可以通过加减整数访问元素;不同点:数组名是地址常量,不能自增,而指针是变量,可以改变指向;sizeof(数组名)是数组大小,sizeof(指针)是4或8字节。 3、简述结构体类型与结构体变量的区别,并说明如何定义结构体指针。 【答案】 结构体类型是模板,不分配内存;结构体变量是实际分配内存的实体。定义结构体指针:struct 结构体名*指针名;,例如 struct student *p;,可以指向同类型的结构体变量。 六、编程题(本题共1小题,每小题10分,共10分) 编写一个函数 void countChar(char *str, int *letters, int *digits, int *others),统计字符串中字母、数字和其他字符的个数。 要求: 使用指针遍历字符串,不能使用数组下标; 通过指针参数返回统计结果; 在主函数中输入一个字符串(长度≤100),调用该函数,输出统计结果,格式如:字母:5 数字:3 其他:2。 参考【答案】 #include <stdio.h> void countChar(char *str, int *letters, int *digits, int *others) { *letters = *digits = *others = 0; // 初始化 while (*str != '\0') { if ((*str >= 'a' && *str <= 'z') || (*str >= 'A' && *str <= 'Z')) (*letters)++; else if (*str >= '0' && *str <= '9') (*digits)++; else (*others)++; str++; // 指针移动 } } main() { char str[101]; int letters, digits, others; printf("请输入一个字符串:"); gets(str); countChar(str, &letters, &digits, &others); printf("字母:%d 数字:%d 其他:%d ", letters, digits, others); } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

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