内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(九)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下选项中,全部为C语言合法标识符的是( )
A. 2ab _abc int B. a#b _123 float
C. _A2 sum while D. max min a_1
【答案】D
【解析】A中2ab以数字开头不合法,int是关键字不合法;B中a#b含非法字符#,float是关键字;C中while是关键字;D中三个标识符均由字母、数字、下划线组成且首字符非数字,也不是关键字,全部合法。
2、下列选项中,均属于不合法的实型常量的一组是( )
A.1.2e3 0.5 .5e2 B.e4 2.5e2.5 3e5.4
C.-3.2 2e-3 1. D.0.0 .5 5e2
【答案】B
【解析】A中全部合法(1.2e3、0.5、.5e2即0.5×10²=50);B中e4缺少尾数,2.5e2.5指数为小数,3e5.4指数为小数,全部不合法;C中全部合法(负实型常量、指数形式、小数形式);D中全部合法(0.0、.5、5e2)。
3、若以下选项中的变量已正确定义,则正确的赋值语句是( )
A. a_1=33.8%3; B. 1+2=a_2;
C. a_3=0x12; D. a_4=1+2=3;
【答案】C
【解析】A中取模运算操作数不能为浮点数,B中赋值号左边不能是表达式,D中赋值号左边不能是表达式且连续赋值要求左边均为变量。
4、判断字符变量ch是否为小写字母的正确表达式是( )
A. 'a'<=ch<='z' B. (ch>='a')&&(ch<='z')
C. (ch>='a')||(ch<='z') D. (ch>=a)&&(ch<=z)
【答案】B
【解析】C语言不能连续比较,需用逻辑与连接两个关系表达式,且字符常量需加单引号。
5、若有定义 int a=3,b=4,c=5;,表达式 a+b>c && b==c 的值是( )
A. 0 B. 1 C. 2 D. 3
【答案】A
【解析】a+b=7>5为真(1),b==c为假(0),1&&0结果为0。
6、执行以下程序段后,输出结果是( )
int x=10,y=20;
if(x=y) printf("%d",x);
else printf("%d",y);
A. 10 B. 20 C. 0 D. 无输出
【答案】B
【解析】x=y是赋值表达式,值为20(非0),条件为真,执行printf("%d",x);,此时x已被赋值为20。
7、以下程序段输出结果是( )
int i;
for(i=1;i<=5;i++) {
if(i%2) continue;
printf("%d",i);
}
A. 135 B. 24 C. 12345 D. 无输出
【答案】B
【解析】i为奇数时continue跳过输出,偶数时输出:2、4。
8、以下循环的循环次数( )
int x=3;
while(x) {
printf("%d
",x);
x--;
}
A. 3 B. 4 C. 5 D. 6
【答案】A
【解析】x为3、2、1时执行循环。
9、以下程序段的输出结果是( )
int a[3][3]={{1,2},{3,4,5},{6}};
printf("%d",a[1][2]);
A. 3 B. 4 C. 5 D. 0
【答案】C
【解析】第二行(行下标1)初始化为{3,4,5},a[1][2]为5。
10、若有定义 int a[5]={10,20,30,40,50}, *p=a+2;,则*(p+1)的值是( )
A. 20 B. 30 C. 40 D. 50
【答案】C
【解析】p指向a[2](30),p+1指向a[3](40),*取值得到40。
11、以下程序段的输出结果是( )
char s[]="C Program";
printf("%d",sizeof(s));
A. 8 B. 9 C. 10 D. 11
【答案】C
【解析】字符串常量结尾隐含'\0',字符个数为9。
12、以下函数调用语句中,实参个数是( )
fun((a,b),(c,d,e),f);
A. 2 B. 3 C. 4 D. 5
【答案】B
【解析】逗号运算符在实参列表中分隔参数,第一个实参是表达式(a,b)(值为b),第二个实参是(c,d,e)(值为e),第三个是f,共3个实参。
13、以下程序运行结果是( )
int x=5;
void func(int x) {
x=10;
}
main() {
func(x);
printf("%d",x);
}
A. 5 B. 10 C. 0 D. 编译错误
【答案】A
【解析】函数参数是值传递,形参x的修改不影响实参x。
14、以下关于结构体的叙述,错误的是( )
A. 结构体成员可以是另一个结构体变量
B. 结构体变量可以整体赋值
C. 结构体类型占用的内存大小取决于占存储空间最大的那个成员
D. 结构体成员名可以与结构体变量名相同
【答案】C
【解析】由于内存对齐,结构体大小可能大于各成员大小之和。
15、以下程序段输出结果是( )
int a[2][3]={1,2,3,4,5,6};
int (*p)[3]=a;
printf("%d",*(*(p+1)+2));
A. 3 B. 4 C. 5 D. 6
【答案】D
【解析】p指向包含3个int的一维数组,p+1指向第2行,*(p+1)+2指向第2行第3列(下标2),即6。
16、以下程序段运行后,输出结果中不包括( )
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i==j) printf("%d",i);
A. 0 B. 1 C. 2 D. 3
【答案】D
【解析】i最大为2,输出0,1,2。
17、以下程序的功能是统计字符串中数字字符的个数,横线处应填( )
int countDigit(char *s) {
int n=0;
while(*s) {
if(*s>='0' && *s<='9') n++;
________;
}
return n;
}
A. s++ B. *s++ C. --s D. *s--
【答案】A
【解析】指针s需移动到下一个字符,应写s++或++s。
18、若有宏定义 #define SQR(x) x*x,则表达式 SQR(2+3) 的值是( )
A. 25 B. 13 C. 11 D. 10
【答案】C
【解析】宏展开为2+3*2+3=2+6+3=11。
19、以下递归函数的功能是( )
int f(int n) {
if(n==0) return 0;
return n%10 + f(n/10);
}
A. 求n的各位数字之和 B. 求n的位数
C. 求n的阶乘 D. 逆序输出n
【答案】A
【解析】每次取个位n%10,加上递归调用去除个位的n/10,最终得到各位数字和。
20、以下程序段输出结果是( )(假设int占4字节,char占1字节,且默认对齐方式。)
struct data {
int a;
char b;
};
printf("%d", sizeof(struct data));
A. 5 B. 6 C. 7 D. 8
【答案】D
【解析】对齐要求int在4字节边界,结构体大小为4(int)+1(char)+3(填充)=8。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言数据类型的叙述,正确的有( )
A. 整型常量十进制、八进制、十六进制分别以数字、0、0x开头
B. 浮点型常量只有十进制小数和指数两种形式
C. 字符串常量存储在内存中时自动添加'\0'
D. 字符常量与字符串常量的存储长度相同
【答案】ABC
【解析】D错误:字符常量占1字节,字符串常量至少多一个'\0'。
2、以下对二维数组a[3][4]的正确引用有( )
A. a[0][0] B. a[3][0] C. *(a[1]+2) D. *(*(a+2)+3)
【答案】ACD
【解析】B越界,行下标范围0~2。
3、以下关于指针的叙述,正确的有( )
A. 指针变量可以指向任何类型的变量
B. 指针变量可以赋值为NULL
C. 两个指针变量可以进行关系运算(如 >, <)
D. 两个不同类型的指针变量可以直接相减
【答案】BC
【解析】A错误:指针类型必须与所指变量类型匹配(void*除外但有限制);D错误:不同类型指针相减无意义且通常不允许。
4、以下关于函数的叙述,正确的有( )
A. 函数声明时可以不写形参名,只写类型
B. 函数返回值的类型由return语句表达式的类型决定
C. 静态局部变量的值在函数调用结束后保留
D. 函数可以没有返回值,此时应定义为void类型
【答案】ACD
【解析】B错误:函数返回值类型由函数定义时的返回类型决定,若不一致则以定义为准。
5、以下关于字符串处理函数的使用,正确的有( )
A. strcpy(dest, src); 要求dest有足够空间存放src及'\0'
B. strcat(dest, src); 将src连接到dest末尾
C. strcmp("ab","ac"); 返回负数
D. strlen("abc\0def"); 返回3
【答案】ABCD
【解析】strlen遇到第一个'\0'停止计数,故返回3。
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,int a=b=c=10; 是合法的定义和初始化语句。( )
【答案】×
【解析】连续赋值需逐个定义变量或先定义后赋值,如int a,b,c; a=b=c=10;。
2、表达式 !(x>y) 与 x<=y 逻辑等价。( )
【答案】√
3、在循环体内使用 break 和 continue 都可以提前结束循环。( )
【答案】×
【解析】break结束整个循环,continue仅结束本次循环。
4、若有说明:int i,j=2;p=&i;则用i=&j;可以实现将j的值赋值给i。( )
【答案】×
【解析】i=&j是将j的地址赋值给i不能实现将值赋值给i
5、结构体变量作为函数参数时,采用传值方式,形参的改变不影响实参。( )
【答案】√
6、宏定义 #define MAX 100 结束后需要加分号。( )
【答案】×
【解析】宏定义末尾不加分号。
7、若指针p指向数组元素a[3],则p[-1]表示a[2]。( )
【答案】√
8、递归函数必须包含一个递归终止条件。( )
【答案】√
9、do-while 循环的循环体至少会被执行一次。( )
【答案】√
10、对于 char str[20]; scanf("%s",str);,若用户输入 "Hello World",则str将接收 "Hello"。( )
【答案】√
【解析】%s遇到空格停止读取。
四、填空题(共10小题,每小题1分,共10分)
1、以下程序功能:求1!+2!+3!+…+n!(n由输入给定)。请填空。( )
#include <stdio.h>
int main() {
int n, i, j, fact, sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++) {
fact=1;
for(j=1;________;j++) fact*=j;
sum+=fact;
}
printf("%d",sum);
return 0;
}
【答案】j<=i
2、以下程序将数组a中所有元素逆序存放,请填空。( )
int a[5]={1,2,3,4,5};
int i,t;
for(i=0;i<________;i++) {
t=a[i];
a[i]=a[4-i];
a[4-i]=t;
}
【答案】2 或 5/2
3、以下函数采用递归计算斐波那契数列第n项(n≥1),请填空。( )
int fib(int n) {
if(n==1 || n==2) return 1;
return ________;
}
【答案】fib(n-1)+fib(n-2)
4、以下程序输出结果为 ( )。
char *p="Hello";
p+=2;
printf("%c",*p);
【答案】l
5、定义结构体 struct stu { int id; char name[10]; };,则语句 struct stu s={1001,"Tom"}; 中,为id赋值的部分是 ( )。
【答案】1001
6、以下程序使用指针实现两数交换,请填空。( )
void swap(int *x, int *y) {
int t;
t=________;
*x=*y;
*y=t;
}
【答案】*x
7、若有定义 int a = 5, b = 2;,则执行 a += b -= a * b; 后,a 的值为 ______,b 的值为 ______。
【答案】-3 -8
【解析】算术运算符优先级高于复合赋值,先计算 a * b = 10;然后 b -= 10 等价于 b = b - 10 = 2 - 10 = -8;最后 a += (-8) 等价于 a = a + (-8) = 5 - 8 = -3。复合赋值运算符从右向左结合。
8、以下程序段输出结果是 ______。( )
int a[2][3]={1,2,3,4,5,6};
printf("%d",*(a[1]+2));
【答案】6
9、以下程序使用指针遍历一维数组并求和,请填空。( )
int sumArray(int *arr, int n) {
int s=0;
for(int *p=arr; p<________; p++) s+=*p;
return s;
}
【答案】arr+n
10、以下程序将字符串s中所有大写字母转换为小写,请填空。( )
void toLower(char *s) {
while(*s) {
if(*s>='A' && *s<='Z') ________;
s++;
}
}
【答案】*s+=32 或 *s=*s+32
五、简答题(本题共3题,每题5分,共15分)
1、请写出以下程序的运行结果。
#include <stdio.h>
int main() {
int i, s=0;
for(i=1;i<=5;i++) {
if(i%3==0) continue;
s = s + i;
}
printf("%d",s);
return 0;
}
【答案】12
【解析】i=1,2,4,5时累加,1+2+4+5=12。
2、写出以下程序段的输出结果。
int a[5]={10,20,30,40,50};
int *p = a+3;
printf("%d %d", p[-1], *p--);
【答案】30 40
【解析】p指向a[3]=40,p[-1]即a[2]=30;*p--先输出*p=40,然后p自减。
3、以下程序运行后输出结果是什么。
void fun(int x) {
static int y=0;
y+=x;
printf("%d ",y);
}
main() {
fun(2);
fun(3);
}
【答案】2 5
【解析】静态局部变量y在函数调用间保留值,第一次调用y=0+2=2;第二次调用y=2+3=5。
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void rotateRight(int *arr, int n, int k),使用指针将整型数组循环右移k个位置(k为非负整数,且k可能大于n)。要求:在原数组上操作,不能使用额外数组(可以借助一个临时变量)。函数内必须使用指针操作,不能使用数组下标(但可结合指针算术)。主函数中先输入n(n≤100),再输入n个整数,再输入k,调用函数,输出移动后的数组,每个数占4位宽度。
示例:
输入:
6
1 2 3 4 5 6
2
输出:
5 6 1 2 3 4
【参考答案】
#include <stdio.h>
// 反转数组区间 [start, end) 的元素
void reverse(int *start, int *end) {
int *p = start;
int *q = end - 1;
while (p < q) {
int tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
}
void rotateRight(int *arr, int n, int k) {
if (n == 0) return;
k = k % n; // 处理k大于n的情况
if (k == 0) return;
// 三步反转法
reverse(arr, arr + n); // 整体反转
reverse(arr, arr + k); // 反转前k个
reverse(arr + k, arr + n); // 反转后n-k个
}
main() {
int arr[100], n, k;
printf("请输入元素个数:");
scanf("%d", &n);
printf("请输入%d个整数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
printf("请输入右移位数k:");
scanf("%d", &k);
rotateRight(arr, n, k);
printf("移动后:
");
for (int i = 0; i < n; i++) {
printf("%4d", *(arr + i));
}
printf("
");
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(九)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、以下选项中,全部为C语言合法标识符的是( )
A. 2ab _abc int B. a#b _123 float
C. _A2 sum while D. max min a_1
2、下列选项中,均属于不合法的实型常量的一组是( )
A.1.2e3 0.5 .5e2 B.e4 2.5e2.5 3e5.4
C.-3.2 2e-3 1. D.0.0 .5 5e2
3、若以下选项中的变量已正确定义,则正确的赋值语句是( )
A. a_1=33.8%3; B. 1+2=a_2;
C. a_3=0x12; D. a_4=1+2=3;
4、判断字符变量ch是否为小写字母的正确表达式是( )
A. 'a'<=ch<='z' B. (ch>='a')&&(ch<='z')
C. (ch>='a')||(ch<='z') D. (ch>=a)&&(ch<=z)
5、若有定义 int a=3,b=4,c=5;,表达式 a+b>c && b==c 的值是( )
A. 0 B. 1 C. 2 D. 3
6、执行以下程序段后,输出结果是( )
int x=10,y=20;
if(x=y) printf("%d",x);
else printf("%d",y);
A. 10 B. 20 C. 0 D. 无输出
7、以下程序段输出结果是( )
int i;
for(i=1;i<=5;i++) {
if(i%2) continue;
printf("%d",i);
}
A. 135 B. 24 C. 12345 D. 无输出
8、以下循环的循环次数( )
int x=3;
while(x) {
printf("%d
",x);
x--;
}
A. 3 B. 4 C. 5 D. 6
9、以下程序段的输出结果是( )
int a[3][3]={{1,2},{3,4,5},{6}};
printf("%d",a[1][2]);
A. 3 B. 4 C. 5 D. 0
10、若有定义 int a[5]={10,20,30,40,50}, *p=a+2;,则*(p+1)的值是( )
A. 20 B. 30 C. 40 D. 50
11、以下程序段的输出结果是( )
char s[]="C Program";
printf("%d",sizeof(s));
A. 8 B. 9 C. 10 D. 11
12、以下函数调用语句中,实参个数是( )
fun((a,b),(c,d,e),f);
A. 2 B. 3 C. 4 D. 5
13、以下程序运行结果是( )
int x=5;
void func(int x) {
x=10;
}
main() {
func(x);
printf("%d",x);
}
A. 5 B. 10 C. 0 D. 编译错误
14、以下关于结构体的叙述,错误的是( )
A. 结构体成员可以是另一个结构体变量
B. 结构体变量可以整体赋值
C. 结构体类型占用的内存大小取决于占存储空间最大的那个成员
D. 结构体成员名可以与结构体变量名相同
15、以下程序段输出结果是( )
int a[2][3]={1,2,3,4,5,6};
int (*p)[3]=a;
printf("%d",*(*(p+1)+2));
A. 3 B. 4 C. 5 D. 6
16、以下程序段运行后,输出结果中不包括( )
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i==j) printf("%d",i);
A. 0 B. 1 C. 2 D. 3
17、以下程序的功能是统计字符串中数字字符的个数,横线处应填( )
int countDigit(char *s) {
int n=0;
while(*s) {
if(*s>='0' && *s<='9') n++;
________;
}
return n;
}
A. s++ B. *s++ C. --s D. *s--
18、若有宏定义 #define SQR(x) x*x,则表达式 SQR(2+3) 的值是( )
A. 25 B. 13 C. 11 D. 10
19、以下递归函数的功能是( )
int f(int n) {
if(n==0) return 0;
return n%10 + f(n/10);
}
A. 求n的各位数字之和 B. 求n的位数
C. 求n的阶乘 D. 逆序输出n
20、以下程序段输出结果是( )(假设int占4字节,char占1字节,且默认对齐方式。)
struct data {
int a;
char b;
};
printf("%d", sizeof(struct data));
A. 5 B. 6 C. 7 D. 8
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言数据类型的叙述,正确的有( )
A. 整型常量十进制、八进制、十六进制分别以数字、0、0x开头
B. 浮点型常量只有十进制小数和指数两种形式
C. 字符串常量存储在内存中时自动添加'\0'
D. 字符常量与字符串常量的存储长度相同
2、以下对二维数组a[3][4]的正确引用有( )
A. a[0][0] B. a[3][0] C. *(a[1]+2) D. *(*(a+2)+3)
3、以下关于指针的叙述,正确的有( )
A. 指针变量可以指向任何类型的变量
B. 指针变量可以赋值为NULL
C. 两个指针变量可以进行关系运算(如 >, <)
D. 两个不同类型的指针变量可以直接相减
4、以下关于函数的叙述,正确的有( )
A. 函数声明时可以不写形参名,只写类型
B. 函数返回值的类型由return语句表达式的类型决定
C. 静态局部变量的值在函数调用结束后保留
D. 函数可以没有返回值,此时应定义为void类型
5、以下关于字符串处理函数的使用,正确的有( )
A. strcpy(dest, src); 要求dest有足够空间存放src及'\0'
B. strcat(dest, src); 将src连接到dest末尾
C. strcmp("ab","ac"); 返回负数
D. strlen("abc\0def"); 返回3
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,int a=b=c=10; 是合法的定义和初始化语句。( )
2、表达式 !(x>y) 与 x<=y 逻辑等价。( )
3、在循环体内使用 break 和 continue 都可以提前结束循环。( )
4、若有说明:int i,j=2;p=&i;则用i=&j;可以实现将j的值赋值给i。( )
5、结构体变量作为函数参数时,采用传值方式,形参的改变不影响实参。( )
6、宏定义 #define MAX 100 结束后需要加分号。( )
7、若指针p指向数组元素a[3],则p[-1]表示a[2]。( )
8、递归函数必须包含一个递归终止条件。( )
9、do-while 循环的循环体至少会被执行一次。( )
10、对于 char str[20]; scanf("%s",str);,若用户输入 "Hello World",则str将接收 "Hello"。( )
四、填空题(共10小题,每小题1分,共10分)
1、以下程序功能:求1!+2!+3!+…+n!(n由输入给定)。请填空。( )
#include <stdio.h>
int main() {
int n, i, j, fact, sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++) {
fact=1;
for(j=1;________;j++) fact*=j;
sum+=fact;
}
printf("%d",sum);
return 0;
}
2、以下程序将数组a中所有元素逆序存放,请填空。( )
int a[5]={1,2,3,4,5};
int i,t;
for(i=0;i<________;i++) {
t=a[i];
a[i]=a[4-i];
a[4-i]=t;
}
3、以下函数采用递归计算斐波那契数列第n项(n≥1),请填空。( )
int fib(int n) {
if(n==1 || n==2) return 1;
return ________;
}
4、以下程序输出结果为 ( )。
char *p="Hello";
p+=2;
printf("%c",*p);
5、定义结构体 struct stu { int id; char name[10]; };,则语句 struct stu s={1001,"Tom"}; 中,为id赋值的部分是 ( )。
6、以下程序使用指针实现两数交换,请填空。( )
void swap(int *x, int *y) {
int t;
t=________;
*x=*y;
*y=t;
}
7、若有定义 int a = 5, b = 2;,则执行 a += b -= a * b; 后,a 的值为 ______,b 的值为 ______。
8、以下程序段输出结果是 ______。( )
int a[2][3]={1,2,3,4,5,6};
printf("%d",*(a[1]+2));
9、以下程序使用指针遍历一维数组并求和,请填空。( )
int sumArray(int *arr, int n) {
int s=0;
for(int *p=arr; p<________; p++) s+=*p;
return s;
}
10、以下程序将字符串s中所有大写字母转换为小写,请填空。( )
void toLower(char *s) {
while(*s) {
if(*s>='A' && *s<='Z') ________;
s++;
}
}
五、简答题(本题共3题,每题5分,共15分)
1、请写出以下程序的运行结果。
#include <stdio.h>
int main() {
int i, s=0;
for(i=1;i<=5;i++) {
if(i%3==0) continue;
s = s + i;
}
printf("%d",s);
return 0;
}
2、写出以下程序段的输出结果。
int a[5]={10,20,30,40,50};
int *p = a+3;
printf("%d %d", p[-1], *p--);
3、以下程序运行后输出结果是什么。
void fun(int x) {
static int y=0;
y+=x;
printf("%d ",y);
}
main() {
fun(2);
fun(3);
}
六、编程题(本题共1小题,每小题10分,共10分)
编写一个函数 void rotateRight(int *arr, int n, int k),使用指针将整型数组循环右移k个位置(k为非负整数,且k可能大于n)。要求:在原数组上操作,不能使用额外数组(可以借助一个临时变量)。函数内必须使用指针操作,不能使用数组下标(但可结合指针算术)。主函数中先输入n(n≤100),再输入n个整数,再输入k,调用函数,输出移动后的数组,每个数占4位宽度。
示例:
输入:
6
1 2 3 4 5 6
2
输出:
5 6 1 2 3 4
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$