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