内容正文:
《编程语言基础-C语言》(高教版第5版)
期末复习卷(八)解析版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、C语言规定,标识符的命名只能由字母、数字和下划线三种字符组成,且第一个字符必须是( )
A.字母 B.字母或下划线 C.下划线 D.数字
【答案】B
【解析】C语言规定,标识符的命名原则为由数字、字符、下划线组成,且第一个字符不能是数字。
2、下列选项中,均属于不合法的实型常量的是( )
A.3e5.4 0.0 2e5 B.e5 5e2.5 68
C.3.14 2e-4 123e-5 D.0.98 -e-3 1
【答案】B
【解析】实型常量的表示方法包括小数表示法和指数表示法。指数表示法的格式:尾数E/e指数。尾数的小数点两边至少要有一边有数,指数必须为整数。A中3e5.4不合法;B中前两个为不合法实型常量,第三个为整型常量;C中全部合法;D中第三个为整型常量。
3、若有代数式则正确的C语言表达式是( )
A.-b+sqrt(b* b-4*a*c)/2*a B.-b+sqrt(b* b-4* a* c)/(2 *a)
C.(-b+sqrt(b* b-4*a* c))/2*a D.(-b+sqrt(b* b-4 * a* c))/(2* a)
【答案】D
【解析】正确表达形式为(-b+sqrt(b* b-4 * a* c))/(2* a)。
4、关系a≥b≥c对应的正确的C语言表达式为( )
A.a>=b>=c B.(a>=b)&(b>=c)
C.(a>=b)&&(b>=c) D.(a>=b)||(b>=c)
【答案】C
【解析】C语言中不能连续进行比较,所以正确的表达式为(a>=b)&&(b>=c)。
5、若有定义语句float x=5,y=4.6;,表达式x/2+(int)(x+y)%4的值是( )
A.3 B.3.0 C.3.5 D.4.5
【答案】C
【解析】x/2=2.5,(int)(x+y)=9,9 % 4=1,然后计算2.5+1=3.5。
6、若从键盘输入38,以下程序段的输出结果是( )
main(){
int i=0,t=0;
scanf("%d
",&i);
if((i%3==2)&&(i%5==3)) t=1
else t=2;
printf("%d",&t); }
A.0 B.1 C.2 D.无输出
【答案】D
【解析】 scanf输入时,需要按照有格式符的按格式符要求的格式输入,没有格式符的按原样输入。scanf(“%d
”)输入38后需要原样输入
,才能有结果输出,否则无输出。
7、运行以下程序段的输出结果。( )
int x; scanf("%d",&x); if(x<=10) ; else if(x=13) ; printf("%d
",x);
A.不等于13的整数 B.大于10且不等于13的整数
C.小于10的整数或13 D.小于等于10的整数
【答案】C
【解析】当x<=10的时候输出x,当x>10的时候输出13。
8、设所有变量都正确定义,以下switch程序段代码正确的是( )
A.switch(c++){ case'A':k++;break; case'B':k--; }
B.switch(c++){ case A:k++;break; case B:k--; }
C.switch(c++){ case'A',k++;break; case'B',k--; }
D.switch(c++) case'A':k++;break; case'B':k--;
【答案】A
【解析】switch语句的正确格式为:
switch(表达式)
{case 常量表达式1:语句部分1;[break;]
case 常量表达式2:语句部分2;[break;]
...
case 常量表达式n:语句部分n;[break;]
[default:语句部分 n+1;]
}
9. 以下程序段的运行结果是( )
#include<stdio.h>
main() {
int i,j,a=0;
for(i=1;i<=2;i++)
{ for(j=1;j<=4;j++)
{
if(j%2)break;
else continue;
a++;
}
}
printf("%d
",a);
}
A.0 B.2 C.4 D.8
【答案】A
【解析】 j为偶数时,执行countinue语句,a++不执行;当j为奇数时,执行break语句,内层循环结束,a++也不执行。
10、以下程序段的运行结果是( )
main()
{ int a=5,b=1;
switch(a){
case 2:b++;
default:b++;
case 3:b++;
case 4:b++; }
printf("b=%d",b);
}
A.b=1 B.b=2 C.b=3 D.b=4
【答案】D
【解析】 a的值为5,执行default后的语句,因为没有break,顺序执行case3,case4后面的语句。
11、定义变量:int n=10,则下列循环的输出结果是( )
while(n>7){ n--; printf("%3d",n); }
A. 10 9 8 B. 9 8 7 C. 10 9 8 7 D 9 8 7 6
【答案】B
【解析】n的初值为10,进入循环先执行n--,所以输出为 9 8 7。
12、下列程序的运行结果是( )
int x=23; do{ printf("%2d",x--); }while(!x);
A.打印出22 B.打印出23 C.不打印任何内容 D.陷入死循环
【答案】B
【解析】 x初值为23,执行do...while 循环,输出x--的值23,判断循环条件!x为假,循环结束。
13、下列程序的运行结果是( )
main() {
int n[3],i,j,k;
for(i=0;i<=3;i++) n[i]=0;
k=2;
for(i=0;i<=1;i++) {
for(j=0;j<=1;j++) {
n[i]=n[i]+1;
}
}
printf("%d
",n[k]);
}
A.2 B.1 C.0 D.3
【答案】C
【解析】 循环给n[0]n[1]赋值,都累加赋值为2。输出n[2]的值为0。
14、函数调用语句fun((2,3),(4,5+6,7));中,含有实参的个数是( )
A.1 B.2 C.3 D.4
【答案】B
【解析】 参数分别为(2,3)、(4,5+6,7)。
15、下列程序的运行结果是( )
#include<stdio.h>
int a[5]={2,3,4,5,6};
main() {
int *p,i;
i=1;
p=a+1;
printf("%d,%d",a[i],*(p+i));
}
A.2,3 B.3,4 C.4,5 D.5,6
【答案】B
【解析】 输出的是a[1]和a[2]的值。
16、下列程序段的运行结果是( )
#include<stdio.h>
main() {
int a[6][6],i,j;
for(i=1;i<6;i++)
for(j=1;j<6;j++)
a[i][j]=(i/j)*(j/i);
for(i=1;i<6;i++) {
for(j=1;j<6;j++)
printf("%2d",a[i][j]);
printf("
");
}
}
A.11111 B.00001 C.10000 D.00001
11111 00010 01000 01010
11111 00100 00100 00100
11111 01000 00100 01010
11111 10000 00001 10001
【答案】C
【解析】 输出对角线上的元素。
17、下列关于结构体的叙述中,错误的是( )
A.结构体是一种可由用户构造的数据类型
B.结构体中的成员可以具有不同的数据类型
C.结构体中的成员不可以与结构体变量同名
D.结构体中的成员可以是指向自身结构的指针类型
【答案】C
【解析】结构体是用户自定义的数据类型,用于组合不同类型的数据;结构体中的成员可以是不同类型,如整型、浮点型、数组等;结构体成员名与结构体变量名可以相同,因为成员名属于结构体命名空间,变量名属于普通标识符命名空间,二者不冲突;结构体中允许包含指向自身类型的指针(如链表节点中的 next 指针)。
18、以下程序段的运行结果是 ( )
char a[]={"zhijiaogaokao"},*p;
p=a;
while(*p!='o'){
printf("%c",*p-32);
p++;
}
A.ZHIIAOGAOKAO B.zhijiaogaokao C.ZHIJIA D.ZHIIAOgaokao
【答案】C
【解析】 指针p指向字符数组的首地址,利用while循环将数组中的小写字母转换为大写,直到遇到字母o结束。
19、有以下说明和定义语句:
struct student { int age; char num[8]; };
struct student stu={20,"200401"};
则下列选项中,对结构体的描述错误的是( )
A.struct student是结构体类型名
B.age,num都是结构体变量stu的成员
C.变量stu在内存中占10个字节
D.stu.age=12是对变量成员的赋值
【答案】C
【解析】 结构体变量所占内存空间是各成员所需内存量的总和。
20、下列程序段运行后,表达式*(p+4)的值为( )
char a[]=”china”;
char *p;
p=a;
A.存放’n’的地址 B.’a’ C.’n’ D存放’a’的地址
【答案】B
【解析】 p存放的是数组的首地址,p+4指字符串中的第5个字符即’a’。
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言运算符优先级的叙述中,正确的有( )
A. 算术运算符 > 关系运算符 > 逻辑运算符
B. 逻辑非! > 算术运算符
C. 赋值运算符优先级低于关系运算符
D. 逗号运算符优先级最低
【答案】ABCD
【解析】均正确。
2、以下关于数组初始化的叙述中,正确的有( )
A.int a[5] = {0};将所有元素初始化为0
B.int a[] = {1,2,3};数组长度自动为3
C.int a[5] = {1,2};只初始化前两个,其余为0
D.int a[5] = {1,2,3,4,5,6};编译出错
【答案】ABCD
【解析】均正确。
3、以下关于指针运算的叙述中,正确的有( )
A. 指针可以加上一个整数
B. 指针可以减去一个整数
C. 两个同类型指针可以相减
D. 两个同类型指针可以相加
【答案】ABC
【解析】D错误,指针相加无意义。
4、以下关于递归函数的叙述中,正确的有( )
A. 递归函数必须有终止条件
B. 递归函数效率通常低于循环
C. 递归函数每次调用占用新栈空间
D. 所有递归函数都能用循环替代
【答案】ABCD
【解析】D正确,理论上任何递归都可转换为迭代。
5、以下关于字符串处理函数的叙述中,正确的有( )
A.strcpy(s1, s2)会复制字符串结束符
B.strcat(s1, s2)要求s1有足够空间
C.strcmp("abc", "abd")返回负数
D.strlen("abc")返回3
【答案】ABCD
【解析】均正确。
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,int a[5] = {0}; 定义了包含5个元素的整型数组,且所有元素初始化为0。( )
【答案】√
【解析】部分赋值,只赋值一个值0,其它值默认赋值为0。
2、若有定义 int *p; 则 p = 0; 是错误的,因为指针不能赋值为整型常量0。( )
【答案】×
【解析】p = 0; 或 p = NULL; 是合法的,0是空指针常量。
3、在函数内部定义的静态局部变量,其生命周期是整个程序运行期间,但作用域仅限于该函数内部。( )
【答案】√
4、表达式 3 > 2 > 1 的值为1。( )
【答案】×
【解析】3 > 2 为真(1),再比较 1 > 1 为假(0),结果为0)。
5、对于二维数组 int a[3][4];,a[1] 和 *(a+1) 都表示第二行首元素的地址。( )
【答案】√
6、若有 char str[] = "Hello";,则 sizeof(str) 的结果是5。( )
【答案】×
【解析】字符串末尾包含'\0',实际长度为6。
7、在C语言中,函数参数传递时,实参和形参之间是值传递,因此形参的任何修改都不会影响实参。( )
【答案】√
【解析】如果传递的是指针,修改指针指向的内容会影响实参,但形参本身的改变不影响实参指针。
8、使用 #define PI 3.14 后,PI 在预处理阶段被替换为 3.14,因此 PI 是常量,不能通过赋值改变它的值。( )
【答案】√
【解析】宏定义不是变量,无存储空间,自然无法赋值。
9、对于语句 int *p = (int *)malloc(100 * sizeof(int));,如果分配成功,p 指向一块可以存储100个整型变量的连续内存。( )
【答案】√
【解析】malloc动态内存分配。
10、在C语言中,break 语句只能用于循环体(for、while、do-while)内部,不能用于 其它语句。( )
【答案】×
【解析】break 同样可用于 switch 语句中跳出分支。
四、填空题(共10小题,每小题1分,共10分)
1、以下程序功能:递归方式逆序输出字符串。请填空。( )
#include <stdio.h>
void reverse(char *s) {
if (*s == '\0') return;
reverse(s + 1);
printf("%c", ______);
}
int main() {
char str[] = "ABC";
reverse(str);
return 0;
}
【答案】*s
2、以下程序功能:用指针遍历数组,找出最大值。( )
int findMax(int *arr, int n) {
int max = *arr;
for (int *p = arr + 1; p < arr + n; p++) {
if (______ > max) max = *p;
}
return max;
}
main() {
int a[] = {3, 7, 2, 9, 5};
printf("%d", findMax(a, 5));
}
【答案】*p
3、以下程序功能:定义点结构体,计算两点之间距离的平方。请填空。( )
struct Point {
int x, y;
};
int dist2(struct Point p1, struct Point p2) {
int dx = p1.x - p2.x;
int dy = p1.y - p2.y;
return ______;
}
main() {
struct Point a = {0, 0}, b = {3, 4};
printf("%d", dist2(a, b));
}
【答案】dx*dx + dy*dy
4、以下程序功能:用宏实现求两数最大值,并用于比较。请填空。( )
#define MAX(a, b) ______
main() {
int x = 10, y = 20;
printf("%d", MAX(x, y));
}
【答案】((a)>(b)?(a):(b))
5、程序功能:将3×3矩阵转置。请填空。
void transpose(int a[3][3]) {
for (int i = 0; i < 3; i++)
for (int j = i + 1; j < 3; j++) {
int temp = a[i][j];
a[i][j] = a[j][i];
______ = temp;
}
}
main() {
int m[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
transpose(m);
}
【答案】a[j][i]
6、程序功能:将字符串src复制到dst,同时将小写字母转大写(假设src全为小写字母,无其他字符)。
void strcpyUpper(char *dst, const char *src) {
while (*src) {
*dst = *src - 'a' + 'A';
src++;
______;
}
*dst = '\0';
}
main() {
char dest[20];
strcpyUpper(dest, "hello");
puts(dest);
}
【答案】dst++
7、程序功能:递归计算数组前n个元素之和。
int sum(int arr[], int n) {
if (n == 0) return 0;
return ______ + sum(arr, n - 1);
}
main() {
int a[] = {1, 2, 3, 4};
printf("%d", sum(a, 4));
}
【答案】arr[n-1]
8、程序功能:利用位运算判断整数是否为奇数(奇数返回1,偶数返回0)。( )
int isOdd(int x) {
return ______;
}
main() {
printf("%d", isOdd(7));
}
【答案】(x & 1)
9、程序功能:实现冒泡排序,通过函数指针决定升序还是降序。下面代码为升序比较函数。( )
int ascend(int a, int b) { return a > b; }
void bubbleSort(int *arr, int n, int (*cmp)(int, int)) {
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-1-i; j++)
if (cmp(arr[j], arr[j+1])) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
main() {
int a[] = {3,1,4,2};
bubbleSort(a, 4, ______);// 排序后a为{1,2,3,4}
}
【答案】ascend
10、程序功能:统计字符串中数字字符('0'~'9')的个数。( )
int countDigits(const char *str) {
int cnt = 0;
while (*str) {
if (*str >= '0' && *str ______) cnt++;
str++;
}
return cnt;
}
main() {
printf("%d", countDigits("a1b2c3"));
}
【答案】<= '9'
五、简答题(本题共3题,每题5分,共15分)
1、下列程序的运行结果是:( )
main() {
int i,a,t=1,s=0;
for(i=1;i<=101;i+=2) {
a=t*i;
s=s+a;
t=-t;
}
printf("%d
",s);
}
【答案】51
2、下列程序的运行结果是:( )
#include<stdio.h>
int func(int b[]){
int j;
for(j=0;j<4;j++) b[j]=j;
}
main() {
int a[4],i;
func(a);
for(i=0;i<4;i++) printf("%2d",a[i]);
}
【答案】 0 1 2 3
3、当从键盘输入25时,下列程序的运行结果是
#include<stdio.h>
main() {
int x,y,i,a[8],j,u;
scanf("%d",&x);
y=-x;
i=0;
do{
u=y/2;
a[i]=y%2;
i++;
y=u;
}while(--y>=1);
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
}
【答案】-1
六、编程题(本题共1小题,每小题10分,共10分)
题目: 编写一个函数 void moveZeroes(int *arr, int n),使用指针将整型数组中所有的0移动到数组的末尾,并保持非零元素的相对顺序。要求:在原数组上操作,不能使用额外数组。函数内必须使用指针操作,不能使用数组下标。主函数中先输入n(n≤100),再输入n个整数,调用函数,输出移动后的数组,每个数占4位宽度。
示例:
输入:
8
0 1 0 3 12 0 5 0
输出:
1 3 12 5 0 0 0 0
【参考答案】
#include <stdio.h>
void moveZeroes(int *arr, int n) {
int *p = arr; // 读指针
int *q = arr; // 写指针(指向非零元素应放置的位置)
while (p < arr + n) {
if (*p != 0) {
*q = *p;
q++;
}
p++;
}// 剩余位置补0
while (q < arr + n) {
*q = 0;
q++;
}
}
main() {
int arr[100], n, i;
printf("请输入元素个数:");
scanf("%d", &n);
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
scanf("%d", arr + i);
}
moveZeroes(arr, n);
printf("移动后:
");
for (i = 0; i < n; i++) {
printf("%4d", *(arr + i));
}
printf("
");
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
《编程语言基础-C语言》(高教版第5版)
期末复习卷(八)原卷版
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一、单项选择题(本题共20小题,每小题2分,共40分)
1、C语言规定,标识符的命名只能由字母、数字和下划线三种字符组成,且第一个字符必须是( )
A.字母 B.字母或下划线 C.下划线 D.数字
2、下列选项中,均属于不合法的实型常量的是( )
A.3e5.4 0.0 2e5 B.e5 5e2.5 68
C.3.14 2e-4 123e-5 D.0.98 -e-3 1
3、若有代数式则正确的C语言表达式是( )
A.-b+sqrt(b* b-4*a*c)/2*a B.-b+sqrt(b* b-4* a* c)/(2 *a)
C.(-b+sqrt(b* b-4*a* c))/2*a D.(-b+sqrt(b* b-4 * a* c))/(2* a)
4、关系a≥b≥c对应的正确的C语言表达式为( )
A.a>=b>=c B.(a>=b)&(b>=c)
C.(a>=b)&&(b>=c) D.(a>=b)||(b>=c)
5、若有定义语句float x=5,y=4.6;,表达式x/2+(int)(x+y)%4的值是( )
A.3 B.3.0 C.3.5 D.4.5
6、若从键盘输入38,以下程序段的输出结果是( )
main(){
int i=0,t=0;
scanf("%d
",&i);
if((i%3==2)&&(i%5==3)) t=1
else t=2;
printf("%d",&t); }
A.0 B.1 C.2 D.无输出
7、运行以下程序段的输出结果。( )
int x; scanf("%d",&x); if(x<=10) ; else if(x=13) ; printf("%d
",x);
A.不等于13的整数 B.大于10且不等于13的整数
C.小于10的整数或13 D.小于等于10的整数
8、设所有变量都正确定义,以下switch程序段代码正确的是( )
A.switch(c++){ case'A':k++;break; case'B':k--; }
B.switch(c++){ case A:k++;break; case B:k--; }
C.switch(c++){ case'A',k++;break; case'B',k--; }
D.switch(c++) case'A':k++;break; case'B':k--;
9. 以下程序段的运行结果是( )
#include<stdio.h>
main() {
int i,j,a=0;
for(i=1;i<=2;i++)
{ for(j=1;j<=4;j++)
{
if(j%2)break;
else continue;
a++;
}
}
printf("%d
",a);
}
A.0 B.2 C.4 D.8
10、以下程序段的运行结果是( )
main()
{ int a=5,b=1;
switch(a){
case 2:b++;
default:b++;
case 3:b++;
case 4:b++; }
printf("b=%d",b);
}
A.b=1 B.b=2 C.b=3 D.b=4
11、定义变量:int n=10,则下列循环的输出结果是( )
while(n>7){ n--; printf("%3d",n); }
A. 10 9 8 B. 9 8 7 C. 10 9 8 7 D 9 8 7 6
12、下列程序的运行结果是( )
int x=23; do{ printf("%2d",x--); }while(!x);
A.打印出22 B.打印出23 C.不打印任何内容 D.陷入死循环
13、下列程序的运行结果是( )
main() {
int n[3],i,j,k;
for(i=0;i<=3;i++) n[i]=0;
k=2;
for(i=0;i<=1;i++) {
for(j=0;j<=1;j++) {
n[i]=n[i]+1;
}
}
printf("%d
",n[k]);
}
A.2 B.1 C.0 D.3
14、函数调用语句fun((2,3),(4,5+6,7));中,含有实参的个数是( )
A.1 B.2 C.3 D.4
15、下列程序的运行结果是( )
#include<stdio.h>
int a[5]={2,3,4,5,6};
main() {
int *p,i;
i=1;
p=a+1;
printf("%d,%d",a[i],*(p+i));
}
A.2,3 B.3,4 C.4,5 D.5,6
16、下列程序段的运行结果是( )
#include<stdio.h>
main() {
int a[6][6],i,j;
for(i=1;i<6;i++)
for(j=1;j<6;j++)
a[i][j]=(i/j)*(j/i);
for(i=1;i<6;i++) {
for(j=1;j<6;j++)
printf("%2d",a[i][j]);
printf("
");
}
}
A.11111 B.00001 C.10000 D.00001
11111 00010 01000 01010
11111 00100 00100 00100
11111 01000 00100 01010
11111 10000 00001 10001
17、下列关于结构体的叙述中,错误的是( )
A.结构体是一种可由用户构造的数据类型
B.结构体中的成员可以具有不同的数据类型
C.结构体中的成员不可以与结构体变量同名
D.结构体中的成员可以是指向自身结构的指针类型
18、以下程序段的运行结果是 ( )
char a[]={"zhijiaogaokao"},*p;
p=a;
while(*p!='o'){
printf("%c",*p-32);
p++;
}
A.ZHIIAOGAOKAO B.zhijiaogaokao C.ZHIJIA D.ZHIIAOgaokao
19、有以下说明和定义语句:
struct student { int age; char num[8]; };
struct student stu={20,"200401"};
则下列选项中,对结构体的描述错误的是( )
A.struct student是结构体类型名
B.age,num都是结构体变量stu的成员
C.变量stu在内存中占10个字节
D.stu.age=12是对变量成员的赋值
20、下列程序段运行后,表达式*(p+4)的值为( )
char a[]=”china”;
char *p;
p=a;
A.存放’n’的地址 B.’a’ C.’n’ D存放’a’的地址
二、多选题(本题共5小题,每小题3分,共15分)
1、以下关于C语言运算符优先级的叙述中,正确的有( )
A. 算术运算符 > 关系运算符 > 逻辑运算符
B. 逻辑非! > 算术运算符
C. 赋值运算符优先级低于关系运算符
D. 逗号运算符优先级最低
2、以下关于数组初始化的叙述中,正确的有( )
A.int a[5] = {0};将所有元素初始化为0
B.int a[] = {1,2,3};数组长度自动为3
C.int a[5] = {1,2};只初始化前两个,其余为0
D.int a[5] = {1,2,3,4,5,6};编译出错
3、以下关于指针运算的叙述中,正确的有( )
A. 指针可以加上一个整数
B. 指针可以减去一个整数
C. 两个同类型指针可以相减
D. 两个同类型指针可以相加
4、以下关于递归函数的叙述中,正确的有( )
A. 递归函数必须有终止条件
B. 递归函数效率通常低于循环
C. 递归函数每次调用占用新栈空间
D. 所有递归函数都能用循环替代
5、以下关于字符串处理函数的叙述中,正确的有( )
A.strcpy(s1, s2)会复制字符串结束符
B.strcat(s1, s2)要求s1有足够空间
C.strcmp("abc", "abd")返回负数
D.strlen("abc")返回3
三、判断题(本题共10小题,每小题1分,共10分)
1、C语言中,int a[5] = {0}; 定义了包含5个元素的整型数组,且所有元素初始化为0。( )
2、若有定义 int *p; 则 p = 0; 是错误的,因为指针不能赋值为整型常量0。( )
3、在函数内部定义的静态局部变量,其生命周期是整个程序运行期间,但作用域仅限于该函数内部。( )
4、表达式 3 > 2 > 1 的值为1。( )
5、对于二维数组 int a[3][4];,a[1] 和 *(a+1) 都表示第二行首元素的地址。( )
6、若有 char str[] = "Hello";,则 sizeof(str) 的结果是5。( )
7、在C语言中,函数参数传递时,实参和形参之间是值传递,因此形参的任何修改都不会影响实参。( )
8、使用 #define PI 3.14 后,PI 在预处理阶段被替换为 3.14,因此 PI 是常量,不能通过赋值改变它的值。( )
9、对于语句 int *p = (int *)malloc(100 * sizeof(int));,如果分配成功,p 指向一块可以存储100个整型变量的连续内存。( )
10、在C语言中,break 语句只能用于循环体(for、while、do-while)内部,不能用于 其它语句。( )
四、填空题(共10小题,每小题1分,共10分)
1、以下程序功能:递归方式逆序输出字符串。请填空。( )
#include <stdio.h>
void reverse(char *s) {
if (*s == '\0') return;
reverse(s + 1);
printf("%c", ______);
}
int main() {
char str[] = "ABC";
reverse(str);
return 0;
}
2、以下程序功能:用指针遍历数组,找出最大值。( )
int findMax(int *arr, int n) {
int max = *arr;
for (int *p = arr + 1; p < arr + n; p++) {
if (______ > max) max = *p;
}
return max;
}
main() {
int a[] = {3, 7, 2, 9, 5};
printf("%d", findMax(a, 5));
}
3、以下程序功能:定义点结构体,计算两点之间距离的平方。请填空。( )
struct Point {
int x, y;
};
int dist2(struct Point p1, struct Point p2) {
int dx = p1.x - p2.x;
int dy = p1.y - p2.y;
return ______;
}
main() {
struct Point a = {0, 0}, b = {3, 4};
printf("%d", dist2(a, b));
}
4、以下程序功能:用宏实现求两数最大值,并用于比较。请填空。( )
#define MAX(a, b) ______
main() {
int x = 10, y = 20;
printf("%d", MAX(x, y));
}
5、程序功能:将3×3矩阵转置。请填空。
void transpose(int a[3][3]) {
for (int i = 0; i < 3; i++)
for (int j = i + 1; j < 3; j++) {
int temp = a[i][j];
a[i][j] = a[j][i];
______ = temp;
}
}
main() {
int m[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
transpose(m);
}
6、程序功能:将字符串src复制到dst,同时将小写字母转大写(假设src全为小写字母,无其他字符)。
void strcpyUpper(char *dst, const char *src) {
while (*src) {
*dst = *src - 'a' + 'A';
src++;
______;
}
*dst = '\0';
}
main() {
char dest[20];
strcpyUpper(dest, "hello");
puts(dest);
}
7、程序功能:递归计算数组前n个元素之和。
int sum(int arr[], int n) {
if (n == 0) return 0;
return ______ + sum(arr, n - 1);
}
main() {
int a[] = {1, 2, 3, 4};
printf("%d", sum(a, 4));
}
8、程序功能:利用位运算判断整数是否为奇数(奇数返回1,偶数返回0)。( )
int isOdd(int x) {
return ______;
}
main() {
printf("%d", isOdd(7));
}
9、程序功能:实现冒泡排序,通过函数指针决定升序还是降序。下面代码为升序比较函数。( )
int ascend(int a, int b) { return a > b; }
void bubbleSort(int *arr, int n, int (*cmp)(int, int)) {
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-1-i; j++)
if (cmp(arr[j], arr[j+1])) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
main() {
int a[] = {3,1,4,2};
bubbleSort(a, 4, ______);// 排序后a为{1,2,3,4}
}
10、程序功能:统计字符串中数字字符('0'~'9')的个数。( )
int countDigits(const char *str) {
int cnt = 0;
while (*str) {
if (*str >= '0' && *str ______) cnt++;
str++;
}
return cnt;
}
main() {
printf("%d", countDigits("a1b2c3"));
}
五、简答题(本题共3题,每题5分,共15分)
1、下列程序的运行结果是:( )
main() {
int i,a,t=1,s=0;
for(i=1;i<=101;i+=2) {
a=t*i;
s=s+a;
t=-t;
}
printf("%d
",s);
}
2、下列程序的运行结果是:( )
#include<stdio.h>
int func(int b[]){
int j;
for(j=0;j<4;j++) b[j]=j;
}
main() {
int a[4],i;
func(a);
for(i=0;i<4;i++) printf("%2d",a[i]);
}
3、当从键盘输入25时,下列程序的运行结果是
#include<stdio.h>
main() {
int x,y,i,a[8],j,u;
scanf("%d",&x);
y=-x;
i=0;
do{
u=y/2;
a[i]=y%2;
i++;
y=u;
}while(--y>=1);
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
}
六、编程题(本题共1小题,每小题10分,共10分)
题目: 编写一个函数 void moveZeroes(int *arr, int n),使用指针将整型数组中所有的0移动到数组的末尾,并保持非零元素的相对顺序。要求:在原数组上操作,不能使用额外数组。函数内必须使用指针操作,不能使用数组下标。主函数中先输入n(n≤100),再输入n个整数,调用函数,输出移动后的数组,每个数占4位宽度。
示例:
输入:
8
0 1 0 3 12 0 5 0
输出:
1 3 12 5 0 0 0 0
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$