内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(十)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、在C语言中,字符常量 'A' 和字符串常量 "A" 的区别是( )
A. 存储长度不同 B. 前者可以赋值给char变量,后者不能
C. 后者末尾自动添加 '\0' D. 以上都是
【答案】D
【解析】字符常量占1字节;字符串常量占2字节('A'和'\0'),可赋值给字符数组但不能直接赋值给char变量;字符串常量末尾有'\0'。故D正确。
2、若有定义 int a=3, b=2; 则表达式 (float)a/b 的值是( )
A. 1 B. 1.5 C. 1.0 D. 1.500000
【答案】B
【解析】(float)a 将a转换为float,再除以整型b,整型自动提升为float,结果为1.5。
3、以下程序段输出结果是( )
int a=0, b=0, c=0;
if(++a>0 || ++b>0 && ++c>0) ;
printf("%d,%d,%d", a,b,c);
A. 1,1,1 B. 1,0,0 C. 1,1,0 D. 0,0,0
【答案】B
【解析】++a得1>0为真,由于||左边为真,右边整体不计算(短路),所以b、c不变。输出1,0,0。
4、若有定义 int x=2, y=3, z=4; 则表达式 ++x + y-- + --z 的值是( )
A. 9 B. 10 C. 11 D. 12
【答案】A
【解析】++x得3,y--得3(后减),--z得3,和为3+3+3=9。
5、执行 printf("%x,%o", 16, 16); 的输出结果是( )
A. 10,20 B. 10,10 C. 20,10 D. 20,20
【答案】A
【解析】%x十六进制,16的十六进制是10;%o八进制,16的八进制是20。
6、若有定义 int a[5]={1,2,3,4,5}, *p=a; 则 *(p+4) 的值是( )
A. 1 B. 2 C. 4 D. 5
【答案】D
【解析】p指向a[0],p+4指向a[4],*取值5。
7、若有定义 int a[5]={10,20,30,40,50}, *p=a+4, *q=a+1; 则 p-q 的值是( )
A. 3 B. 4 C. 1 D. 2
【答案】A
【解析】指针相减得到元素个数差,p指a[4],q指a[1],相差3。
8、以下定义中,表示p是一个指向整型常量的指针的是( )
A. const int *p; B. int const *p; C. int * const p; D. A和B均正确
【答案】D
【解析】const int *p 和 int const *p 都表示指针指向的值不可变,指针本身可变;int * const p 表示指针本身不可变。题目要求“指向整型常量的指针”,即指向常量的指针,D正确。
9、汉诺塔问题中,将n个盘子从A柱移到C柱,需要移动的次数是( )
A. n B. 2ⁿ-1 C. n² D. n!
【答案】B
【解析】递归关系 f(n)=2f(n-1)+1,解得2ⁿ-1。
10、若有定义 int a[3][4]; 则以下表示数组中第2行第3列元素地址的是( )
A. a[2][3] B. *(a+1)+2 C. &a[1][2] D. B和C
【答案】D
【解析】第2行下标1,第3列下标2,地址为&a[1][2],也是*(a+1)+2(行指针偏移后取地址)。
11、有以下结构体声明和初始化:
struct student { int id; char name[10]; };
struct student stu[2] = {{101,"Li"}, {102,"Wang"}};
则 stu[1].id 的值是( )
A. 101 B. 102 C. Li D. Wang
【答案】B
【解析】结构体数组stu,有两个元素stu[0],和stu[1],每个元素有两个域,stu[1]的id域的值为102。
12、下面程序的运行结果是( )
for(x=10;x>3;x--)
{
if(x%3)x--;
--x;--x;
printf(“%d”,x);
}
A. 63 B. 74 C. 62 D. 73
【答案】B
【解析】初始x=10,进入循环。
第一次循环:x%3=1,执行x--得9;再两次--x得7,输出7;循环结束x--得6。
第二次循环:x%3=0,跳过x--;两次--x得4,输出4;循环结束x--得3,不满足x>3,退出。
13、以下关于 #define PI 3.14 和 typedef float REAL; 的叙述,正确的是( )
A. 都是预处理指令
B. 都会在编译时进行类型检查
C. PI在预处理阶段替换,REAL在编译阶段处理
D. 两者完全等价
【答案】C
【解析】#define是预处理宏,纯文本替换;typedef是编译时定义类型别名。
14、以下循环结构中,循环体至少执行一次的是( )
A. for B. while C. do-while D. 都需要条件
【答案】C
【解析】do-while循环要先执行循环体,再判断循环条件,所以循环体至少执行一次。
15、以下条件表达式等价于 if(x>y) z=x; else z=y; 的是( )
A. z = x>y ? x : y; B. z = (x>y) ? x : y;
C. z = x>y ? x, y; D. A和B
【答案】D
【解析】条件运算符的优先级高于赋值运算符,所以先计算x>y ? x : y的值,再给z赋值。
16、对于字符数组 char s[20]="Hello";,sizeof(s) 和 strlen(s) 的值分别是( )
A. 20, 5 B. 6, 5 C. 5, 5 D. 20, 6
【答案】A
【解析】sizeof(s)是数组总大小20字节;strlen(s)是字符串长度5(不含'\0')。
17、以下函数声明正确的是( )
A. int fun(int a, b); B. int fun(int a, int b);
C. fun(int a, int b); D. int fun(a, b);
【答案】B
【解析】函数声明的格式:类型说明符 函数名(参数类型 参数1,参数类型 参数2……)
18、以下关于全局变量的叙述, 错误的是( )
A. 全局变量定义在所有函数之外
B. 全局变量默认初始化为0
C. 全局变量作用域是整个程序
D. 全局变量与局部变量同名时,优先使用全局变量
【答案】D
【解析】同名时局部变量优先。
19、表达式 (int)(3.14 + 2.71) 的值是( )
A. 5 B. 5.85 C. 6 D. 5.0
【答案】A
【解析】先计算浮点3.14+2.71=5.85,强制转int得5。
20、对数组 int a[5]={5,3,1,4,2}; 进行第一趟选择排序(升序)后,数组内容变为( )
A. 1,3,5,4,2 B. 1,3,5,2,4 C. 1,2,3,4,5 D. 3,1,5,4,2
【答案】A
【解析】选择排序第一次找到最小值1与第一个元素5交换,得1,3,5,4,2。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于指针运算的叙述,正确的有( )
A. 两个同类型指针可以相减得到元素个数
B. 指针可以加上一个整数
C. 指针可以减去一个整数
D. 两个同类型指针可以相加
【答案】ABC
【解析】D指针相加无意义且非法。
2、关于静态局部变量,以下叙述正确的有( )
A. 在函数调用结束后其值保留
B. 若未初始化,默认值为0
C. 作用域仅限于定义它的函数内
D. 生命周期是整个程序运行期间
【答案】ABCD
【解析】均正确。
3、以下关于数组初始化的写法,正确的有( )
A. int a[5] = {0}; B. int b[] = {1,2,3};
C. int c[5] = {1,2}; D. int d[5] = {1,2,3,4,5,6};
【答案】ABC
【解析】D编译 ×,初始值过多。
4、以下关于字符串处理函数的说法,正确的有( )
A. strcpy(dest, src) 会复制 '\0'
B. strcat(dest, src) 要求 dest 有足够空间
C. strcmp("a", "b") 返回负数
D. strlen("abc") 返回3
【答案】ABCD
【解析】均正确。
5、关于递归与循环,以下说法正确的有( )
A. 递归函数必须有终止条件
B. 递归效率通常低于循环
C. 任何递归都可以用循环实现
D. 递归调用会占用额外的栈空间
【答案】ABCD
【解析】均正确。
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,char str[] = "Hello"; 和 char *str = "Hello"; 完全等价。( )
【答案】 ×
【解析】前者是字符数组,可修改;后者是指针指向字符串常量,不可修改。
2、表达式 3/2 的值是1.5。( )
【答案】 ×
【解析】整数除法得1。
3、在 switch 语句中,若没有 break,则会顺序执行后续 case 分支。( )
【答案】√
【解析】break用于提前结束switch语句,没有break,会顺序执行后续所有case语句,直到switch语句结束。
4、若有语句:int a[3][4],(*p)[4];p=a;则p+2代表a数组的a[0][2]的值。( )
【答案】×
【解析】p + 2表示指针向后移动 2 个“行”,因此p + 2指向a[2](第三行的首地址),并不是a[0][2]的值。
5、结构体变量作为函数参数时,采用值传递,函数内修改形参不影响实参。( )
【答案】√
【解析】值传递时值传递值,形参和实参均有自己单独的存储空间,修改形参不会影响实参。
6、C语言中,函数的形参如果是指针类型,则在函数内部修改该形参指针的值会影响到调用该函数时传入的实参指针变量。( )
【答案】×
【解析】函数参数传递是值传递。形参指针是实参指针的一个副本,在函数内部修改形参指针本身不会影响实参指针,实参指针仍指向原地址。但修改形参指针所指向的内容会影响实参所指的变量。
7、宏定义 #define ADD(x,y) x+y 调用 ADD(2,3)*4 的结果是20。( )
【答案】 ×
【解析】展开为2+3*4=14,非20。
8、break 语句只能用在循环和 switch 语句中。( )
【答案】√
【解析】break语句可以用在循环语句也可以用在switch语句
9、函数可以没有返回值,此时应定义为 void 类型。( )
【答案】√
【解析】不需要返回值时,可以定义为void类型。
10、若有 int x=10; 则 x++ 和 ++x 执行后x的值相同。( )
【答案】√
【解析】单独语句执行后x都增加1,都是11。
四、填空题(共10小题,每小题1分,共10分)
1、以下程序模拟实现 strcat 函数的功能,将字符串src连接到dest末尾。请填空。( )
void myStrcat(char *dest, const char *src) {
while(*dest) dest++;
while(*src) {
*dest = *src;
dest++;
________;
}
*dest = '\0';
}
【答案】src++
2、以下程序使用指针在数组中查找值为key的元素,返回下标(未找到返回-1)。请填空。( )
int search(int *arr, int n, int key) {
int *p = arr;
while(p < arr + n) {
if(________ == key) return p - arr;
p++;
}
return -1;
}
【答案】*p
3、以下函数递归计算两个正整数的最大公约数(辗转相除法)。请填空。( )
int gcd(int a, int b) {
if(b == 0) return a;
return ________;
}
【答案】gcd(b, a % b)
4、以下程序使用指针交换两个整型变量的值。请填空。
void swap(int *p, int *q) {
int t = ________;
*p = *q;
*q = t;
}
【答案】*p
5、对于结构体定义:
struct Date { int year, month, day; };
struct Student { char name[20]; struct Date birth; } stu;
请写出访问 stu 的出生年份的表达式:( )。
【答案】stu.birth.year
6、定义一个宏 ABS(x),返回x的绝对值(假设x为整型表达式)。请填空。( )
#define ABS(x) ________
【答案】((x)>=0?(x):-(x))
7、以下函数模拟 strlen 的功能,返回字符串长度。请填空。( )
int myStrlen(const char *s) {
const char *p = s;
while(________) p++;
return p - s;
}
【答案】*p
8、以下程序将数组a中的前n个元素逆序存放,使用指针操作。请填空。( )
void reverse(int *a, int n) {
int *p = a, *q = a + n - 1;
while(p < q) {
int t = *p;
*p = *q;
________ = t;
p++; q--;
}
}
【答案】*q
9、以下程序调用函数指针进行两个数的加法运算。请填空。( )
int add(int a, int b) { return a+b; }
main() {
int (*fp)(int, int) = ________;
int r = fp(3,5);
printf("%d", r);
}
【答案】add
10、以下程序段中,变量a的值为 ______。( )
int a = 0, i;
for(i=1; i<=10; i++) {
if(i%2==0) continue;
if(i>7) break;
a += i;
}
【答案】16
【解析】i=1,3,5,7时累加:1+3+5+7=16。i=9时i>7跳出。
五、简答题(本题共3题,每题5分,共15分)
1、请写出以下程序的运行结果。( )
#include <stdio.h>
int main() {
int i, j, s=0;
for(i=1; i<=3; i++) {
for(j=1; j<=2; j++) {
if(i==j) continue;
s += i*10 + j;
}
}
printf("%d", s);
return 0;
}
【答案】96
【解析】列举:(i=1,j=1跳过),(1,2):10+2=12;(i=2,j=1):20+1=21,(2,2跳过);(i=3,j=1):30+1=31,(3,2):30+2=32。计算:12+21=33,33+31=64,64+32=96。
2、写出以下程序段的输出结果。( )
int a[2][3] = {{1,2},{3,4,5}};
int *p = a[0];
printf("%d %d", *(p+2), *(p+5));
【答案】0 5
【解析】第一行{1,2,0},第二行{3,4,5}。p+2是a[0][2]=0;p+5跨越:p+3是a[1][0]=3,p+4是a[1][1]=4,p+5是a[1][2]=5。输出0 5。
3、以下程序运行后输出结果是什么。( )
void f(int *p, int *q) {
int t = *p;
*p = *q;
*q = t;
}
int main() {
int a=3, b=5, *x=&a, *y=&b;
f(x, y);
printf("%d,%d", a, b);
return 0;
}
【答案】5,3
【解析】交换指针指向的值,a和b交换。
六、编程题(本题共1小题,每小题10分,共10分)
编写函数 double fun(double x, int n),计算并返回下列交错级数的前 n 项和:
要求:
(1) 编写函数 double fun(double x, int n) 实现上述计算。
(2) 主函数中从键盘输入 x 和 n 的值,调用 fun 函数计算级数和,并输出结果(保留 4 位小数)。
示例:
输入:
x = 1.0, n = 5
输出:
0.5403
【参考答案】
#include <stdio.h>
double fun(double x, int n) {
double sum = 1.0; // 第一项:1
double term = 1.0; // 当前项的值,初始为第一项
for (int k = 1; k < n; k++) {
term *= -x * x / ((2 * k - 1) * (2 * k)); // 递推:下一项 = 当前项 * (-x*x) / ((2k-1)*2k)
sum += term;
}
return sum;
}
main() {
double x;
int n;
scanf("%lf %d", &x, &n);
double result = fun(x, n);
printf("%.4f
", result);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(十)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、在C语言中,字符常量 'A' 和字符串常量 "A" 的区别是( )
A. 存储长度不同 B. 前者可以赋值给char变量,后者不能
C. 后者末尾自动添加 '\0' D. 以上都是
2、若有定义 int a=3, b=2; 则表达式 (float)a/b 的值是( )
A. 1 B. 1.5 C. 1.0 D. 1.500000
3、以下程序段输出结果是( )
int a=0, b=0, c=0;
if(++a>0 || ++b>0 && ++c>0) ;
printf("%d,%d,%d", a,b,c);
A. 1,1,1 B. 1,0,0 C. 1,1,0 D. 0,0,0
4、若有定义 int x=2, y=3, z=4; 则表达式 ++x + y-- + --z 的值是( )
A. 9 B. 10 C. 11 D. 12
5、执行 printf("%x,%o", 16, 16); 的输出结果是( )
A. 10,20 B. 10,10 C. 20,10 D. 20,20
6、若有定义 int a[5]={1,2,3,4,5}, *p=a; 则 *(p+4) 的值是( )
A. 1 B. 2 C. 4 D. 5
7、若有定义 int a[5]={10,20,30,40,50}, *p=a+4, *q=a+1; 则 p-q 的值是( )
A. 3 B. 4 C. 1 D. 2
8、以下定义中,表示p是一个指向整型常量的指针的是( )
A. const int *p; B. int const *p; C. int * const p; D. A和B均正确
9、汉诺塔问题中,将n个盘子从A柱移到C柱,需要移动的次数是( )
A. n B. 2ⁿ-1 C. n² D. n!
10、若有定义 int a[3][4]; 则以下表示数组中第2行第3列元素地址的是( )
A. a[2][3] B. *(a+1)+2 C. &a[1][2] D. B和C
11、有以下结构体声明和初始化:
struct student { int id; char name[10]; };
struct student stu[2] = {{101,"Li"}, {102,"Wang"}};
则 stu[1].id 的值是( )
A. 101 B. 102 C. Li D. Wang
12、下面程序的运行结果是( )
for(x=10;x>3;x--)
{
if(x%3)x--;
--x;--x;
printf(“%d”,x);
}
A. 63 B. 74 C. 62 D. 73
13、以下关于 #define PI 3.14 和 typedef float REAL; 的叙述,正确的是( )
A. 都是预处理指令
B. 都会在编译时进行类型检查
C. PI在预处理阶段替换,REAL在编译阶段处理
D. 两者完全等价
14、以下循环结构中,循环体至少执行一次的是( )
A. for B. while C. do-while D. 都需要条件
15、以下条件表达式等价于 if(x>y) z=x; else z=y; 的是( )
A. z = x>y ? x : y; B. z = (x>y) ? x : y;
C. z = x>y ? x, y; D. A和B
16、对于字符数组 char s[20]="Hello";,sizeof(s) 和 strlen(s) 的值分别是( )
A. 20, 5 B. 6, 5 C. 5, 5 D. 20, 6
17、以下函数声明正确的是( )
A. int fun(int a, b); B. int fun(int a, int b);
C. fun(int a, int b); D. int fun(a, b);
18、以下关于全局变量的叙述, 错误的是( )
A. 全局变量定义在所有函数之外
B. 全局变量默认初始化为0
C. 全局变量作用域是整个程序
D. 全局变量与局部变量同名时,优先使用全局变量
19、表达式 (int)(3.14 + 2.71) 的值是( )
A. 5 B. 5.85 C. 6 D. 5.0
20、对数组 int a[5]={5,3,1,4,2}; 进行第一趟选择排序(升序)后,数组内容变为( )
A. 1,3,5,4,2 B. 1,3,5,2,4 C. 1,2,3,4,5 D. 3,1,5,4,2
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于指针运算的叙述,正确的有( )
A. 两个同类型指针可以相减得到元素个数
B. 指针可以加上一个整数
C. 指针可以减去一个整数
D. 两个同类型指针可以相加
2、关于静态局部变量,以下叙述正确的有( )
A. 在函数调用结束后其值保留
B. 若未初始化,默认值为0
C. 作用域仅限于定义它的函数内
D. 生命周期是整个程序运行期间
3、以下关于数组初始化的写法,正确的有( )
A. int a[5] = {0}; B. int b[] = {1,2,3};
C. int c[5] = {1,2}; D. int d[5] = {1,2,3,4,5,6};
4、以下关于字符串处理函数的说法,正确的有( )
A. strcpy(dest, src) 会复制 '\0'
B. strcat(dest, src) 要求 dest 有足够空间
C. strcmp("a", "b") 返回负数
D. strlen("abc") 返回3
5、关于递归与循环,以下说法正确的有( )
A. 递归函数必须有终止条件
B. 递归效率通常低于循环
C. 任何递归都可以用循环实现
D. 递归调用会占用额外的栈空间
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,char str[] = "Hello"; 和 char *str = "Hello"; 完全等价。( )
2、表达式 3/2 的值是1.5。( )
3、在 switch 语句中,若没有 break,则会顺序执行后续 case 分支。( )
4、若有语句:int a[3][4],(*p)[4];p=a;则p+2代表a数组的a[0][2]的值。( )
5、结构体变量作为函数参数时,采用值传递,函数内修改形参不影响实参。( )
6、C语言中,函数的形参如果是指针类型,则在函数内部修改该形参指针的值会影响到调用该函数时传入的实参指针变量。( )
7、宏定义 #define ADD(x,y) x+y 调用 ADD(2,3)*4 的结果是20。( )
8、break 语句只能用在循环和 switch 语句中。( )
9、函数可以没有返回值,此时应定义为 void 类型。( )
10、若有 int x=10; 则 x++ 和 ++x 执行后x的值相同。( )
四、填空题(共10小题,每小题1分,共10分)
1、以下程序模拟实现 strcat 函数的功能,将字符串src连接到dest末尾。请填空。( )
void myStrcat(char *dest, const char *src) {
while(*dest) dest++;
while(*src) {
*dest = *src;
dest++;
________;
}
*dest = '\0';
}
2、以下程序使用指针在数组中查找值为key的元素,返回下标(未找到返回-1)。请填空。( )
int search(int *arr, int n, int key) {
int *p = arr;
while(p < arr + n) {
if(________ == key) return p - arr;
p++;
}
return -1;
}
3、以下函数递归计算两个正整数的最大公约数(辗转相除法)。请填空。( )
int gcd(int a, int b) {
if(b == 0) return a;
return ________;
}
4、以下程序使用指针交换两个整型变量的值。请填空。
void swap(int *p, int *q) {
int t = ________;
*p = *q;
*q = t;
}
5、对于结构体定义:
struct Date { int year, month, day; };
struct Student { char name[20]; struct Date birth; } stu;
请写出访问 stu 的出生年份的表达式:( )。
6、定义一个宏 ABS(x),返回x的绝对值(假设x为整型表达式)。请填空。( )
#define ABS(x) ________
7、以下函数模拟 strlen 的功能,返回字符串长度。请填空。( )
int myStrlen(const char *s) {
const char *p = s;
while(________) p++;
return p - s;
}
8、以下程序将数组a中的前n个元素逆序存放,使用指针操作。请填空。( )
void reverse(int *a, int n) {
int *p = a, *q = a + n - 1;
while(p < q) {
int t = *p;
*p = *q;
________ = t;
p++; q--;
}
}
9、以下程序调用函数指针进行两个数的加法运算。请填空。( )
int add(int a, int b) { return a+b; }
main() {
int (*fp)(int, int) = ________;
int r = fp(3,5);
printf("%d", r);
}
【答案】add
10、以下程序段中,变量a的值为 ______。( )
int a = 0, i;
for(i=1; i<=10; i++) {
if(i%2==0) continue;
if(i>7) break;
a += i;
}
五、简答题(本题共3题,每题5分,共15分)
1、请写出以下程序的运行结果。( )
#include <stdio.h>
int main() {
int i, j, s=0;
for(i=1; i<=3; i++) {
for(j=1; j<=2; j++) {
if(i==j) continue;
s += i*10 + j;
}
}
printf("%d", s);
return 0;
}
2、写出以下程序段的输出结果。( )
int a[2][3] = {{1,2},{3,4,5}};
int *p = a[0];
printf("%d %d", *(p+2), *(p+5));
3、以下程序运行后输出结果是什么。( )
void f(int *p, int *q) {
int t = *p;
*p = *q;
*q = t;
}
int main() {
int a=3, b=5, *x=&a, *y=&b;
f(x, y);
printf("%d,%d", a, b);
return 0;
}
六、编程题(本题共1小题,每小题10分,共10分)
编写函数 double fun(double x, int n),计算并返回下列交错级数的前 n 项和:
要求:
(1) 编写函数 double fun(double x, int n) 实现上述计算。
(2) 主函数中从键盘输入 x 和 n 的值,调用 fun 函数计算级数和,并输出结果(保留 4 位小数)。
示例:
输入:
x = 1.0, n = 5
输出:
0.5403
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$