logo资料库

电子科技大学复试c题库(最全无重复修正版)_20200618090240.pdf

第1页 / 共155页
第2页 / 共155页
第3页 / 共155页
第4页 / 共155页
第5页 / 共155页
第6页 / 共155页
第7页 / 共155页
第8页 / 共155页
资料共155页,剩余部分请下载后查看
电子科技大学c语言复试试题
电子科技大学 c 语言复试试题 前言:本文为个人在准备 2020 研究生复试所总结。参考了王道群里的各种回忆版试题。感 谢各位前辈的贡献。下文除了参考各位前辈所写,还加入了一些个人理解。如有错误还望 指正。---------------------------------20 我还活着 20 烟酒僧 一 选择题 1.下面程序的输出结果是( int x = 3; do{ printf(“%d\n”,x -= 2); }while(!(-- x)); ) 解析:x 初始值为 3,第一次循环中运行 printf 函数,参数 x -= 2 的值为 1,输出 1,此时 x = 1,进行判断!(-- x),x 先自减 1,为 0,取非为 1(真),进行第二次 循环,x 先减 2,输出-2,此时 x=-2,判断!(-- x),x 先自减 1 为-3,取非为 0(假), 结束循环。所以输出结果为: 1 -2 2.下面程序的输出结果是( void main(){ ) int a[]={1,7,12,15}; int *p1=a,*p2 = p1++; *p1 += *p2++; printf(“%d %d”,*p1,*p2); 解析:首先定义指针 p1 指向数组 a 首地址,然后定义指针 p2,也指向数组首地 址,然后 p1 自加,也就指向了数组第二个元素。*p1 += *p2++;语句先将 p2 指向 的第一个元素的值加到 p1 指向的第二个元素的值上,也就是第二个元素值为 8, 然后 p2 自加,指向第二个元素(*p2++,*与++优先级相同,从右自左结合,先 与++结合,表示语句执行完后 p2 指向下一个元素,然后与*结合,表示 p2 现在 所指向的第一个元素的值),所以最后输出结果为:8 8 3.下面程序的输出结果是( int func(int *p){ ) return (*p-- = 3) - 1;//(*p-- = 3)可以拆成两步,*p=3; p--; } } void main(){ int arr[]={10,7,5};
int *p = arr + 1; printf(“%d”,func(p) + *p); } 解析:p 指针首先指向数组 arr 的第二个元素,首先调用 func 函数,将实参指针 p 指向的地址传递给函数形参 p,形参执行*p-- = 3,使得 p 指向的数组第二个元 素值为 3,然后形参 p 自减指向第一个元素,但是实参 p 不变,还是指向第二个 元素,此时 func 返回的值为 3 - 1 = 2,然后 2 + *p,这里实参 p 指向第二个元素, 值为 3,所以结果为:5 4.下面程序的输出结果是( void main(){ int i = 1; switch(i){ ) printf("hello "); case 1:printf("Hi "); case 2:printf("Bye "); } } 解析:i 的值为 1,所以直接从 case 1 后面的语句开始执行,输出 Hi ,由于这里 没有 break;不会跳出 switch 语句,所以继续往下执行,输出 Bye ,所以最后结 果为:Hi Bye 5.下面程序的输出结果是( void main(){ ) int a,b = 0; static int c[10]={9,2,3,4,5,6,7,8,0,1}; for(a = 0;a < 10;a ++) b += c[a]; printf("%d",b); } 解析:程序遍历数组 c,将 c 的每个元素的值累加到 b 上,所以最后结果为:45 ) 6.运行以下程序后文件的内容为( void main() { char str[100]; FILE *p1,*p2; gets(str); p1 = fopen(str,”w”); p2 = fopen(str,”w”); fputc(‘A’,p1);
fputc(‘B’,p2); fclose(p1); fclose(p2); } 解析:文件指针 p1,p2 分别打开文件,先使用 p1 往文件输出 A,p2 此时指向文 件头,所以用 p2 往文件输出 B,覆盖了原本的 A,所以文件中的内容为 B。 7.下面程序的输出结果是( long fib(int n) { ) if(n > 2) return (fib(n - 1) + fib(n - 2)); else return 1; } void main(){ } printf(“%d\n”,fib(3)); 解析:调用 fib(3),由于 3>2,所以返回 fib(2)+fib(1),fib(2)和 fib(1)都返回 1,所 以最后结果为:2 8.下面程序的输出结果是( void main() { ) char c = 48; int i,mark = 01; for(i = 0;i < 5;i ++) { printf(“%c”,c|mark); mark = mark << 1; } } 解析:C=48 转换成二进制数就是 110000,mark 初始为八进制 1,循环执行 5 次, 每次先输出 c|mark(按位或运算)对应的 ASCII 字符,然后 mark 左移 1 位,即 乘以 2。第一次循环 c 为 110000,mark 为 1,c|mark 为 110001,即十进制 49, 对应 ASCII 字符‘1’,然后 mark 左移为 10;第二次循环 c|mark 为 110010,即 十进制 50,对应 ASCII 字符‘2’,然后 mark 左移为 100,以此类推,最后输出 为 12480。 9 程序如下,输出结果为:
输出结果:9 10 //这个题有些地方记不清,50 60 70 是我随便写的,不过不影响做题,考运算符优先级 struct Stu{ Int num; Int score; }; void main(){ struct Stu stu[3] = {{50,50}, {60,60}, {70,70}}; struct Stu *p; p = stu[0]; } 问哪个选项是不对的? 选*p.num= 50,因为.的优先级高于*,而.是直接取值,改为(*p).num 11 程序如下: swap(int *a, int *b) { int t = *a; *a = *b; *b = *a; } 主函数中定义整型变量 x,y,则下⾯函数调⽤⽅式正确的是( )。 A. swap(&x, &y); B. swap(x, y); C. swap(*x, *y); D. swap(y, x) 答案:A 12 以下程序片段: int i, j, k; i = 5; j = 10; k = 1; printf("%d;%d\n", k>iii || i
13 以下程序片段: int main() { char *point[] = {"one", "two", "three", "fourth"}; point[2] = point[3]; point[2] += 2; printf("%s", point[2]++); return 0; } 输出结果为( )。 A. ee B. rth C. ree D. urth 答案 D 解析:首先从 point 处开始,先与[]结合,因为其优先级[ ]比*高,所以 point 是一 个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 char 结合, 说明指针所指向的内容的类型是字符的,所以 point 是一个由返回字符串型数据 的指针所组成的数组。再看题,point[2] = point[3];就是让 point[2]指针指向 point[3]指向的元素即为 fourth。然后 point[2] += 2;也就是指针移动两个地址。 指向 fourth 中的 u,最后 printf("%s", point[2]++);先输出 point[2]指向的字符串, urth,再地址+1。 14 下列⼀维数组定义中,错误的是( )。 A. int dat[] = {1, 2, 3}; B. int len = 5, dat[len]; C. int dat[5]; D. int dat[5] = {1, 2, 3}; 答案:B(其实按照新标准 B 没错) 15 long fib(int n) { return (fib(n - 1) + fib(n - 2)); if (n > 2) { } else { } return (2); } void main() { printf("%d", fib(3)); } 输出结果为( )。
A. 2 B. 4 C. 6 D. 8 答案:B 16 以下能正确计算 s=1*2*3*4*5*6*7*8*9*10 的程序段是( )。 A. do {i = 1; s = 1; s = s * i; i++;} while(i <= 10); B. do {i = 1; s = 0; s = s * i; i++;} while(i <= 10); C. i = 1; s = 1; do {s = s * i; i++;} while(i <= 10); D. i = 1; s = 0; do {s = s * i; i++;} while(i <= 10); 答案:C 17 下列程序执⾏后的输出结果是( )。 void reverse(int a[], int n) { int i, t; for (i = 0; i < n; i++) { t = a[i]; a[i] = a[n - 1 - i]; a[n - 1 - i] = t; } } int main() { int b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i, s = 0; reverse(b, 8); for (i = 6; i < 10; i++) { s += b[i]; } return 0; } A. 22 B. 24 C. 26 D. 28 本题题⽬出错,⽆论选什么选项均得分 注:本题 reverse 函数的原意是反转指定长度的部分数组,但是 for 循环终⽌条 件写错,导致本道题出错。 怎么改正确呢!把 reverse 函数 for 循环的 n 改成 n/2,然后主函数,加一个 printf(“%d”,s)答案就为 22 了选 A 18 下列程序执⾏后的输出结果是( )。 void func(int *a, int b[]){ b[0] = *a + 6; } void main() {
int a, b[5] = {0}; a = 0; b[0] = 3; func(&a, b); printf("%d\n", b[0]); } B. 7 A. 6 答案:A C. 8 D. 9 19 int i, j; i = 3 / 2 + 7 / 2 == 5; j = 45 % 11 + (((7 > 8) ? 15 : 14) == 14); 后变量 i, j 的值应为( )。 A. i = 0 j = 1 答案:C B. i = 1 j = 1 C. i = 0 j = 2 20 执⾏下列程序段后,输出的结果是( )。 int x = 9; do{ printf("%d", x--); }while (!x); B. 9 A. 8 C. 不输出任何内容 D. 陷⼊死循环 D. i = 1 j = 2 C. 7 B. 8 答案:B 21 设 i、j 和 k 都是 int 型变量,且 i = 7,j = 8,k = 9,则表达式(i * j) / k + 6 - 15 % k 的值是( )。 A. 9 D. 6 答案:D 解析:原式 = 56/9+6-6=6 22 把 316 表⽰为两个加数的和,使两个加数分别能被 13 和 11 整除。 void main() { int i = 0, j, k; do{ i++; k = 316 - 13 * i; } while ( j = k / 11; printf("316 = 13 * %d + 11 * %d\n", i, j); );
C. 6 D. 0 B. 5 B. k % 11 D. k % 11 == 0 C. k / 11 == 0 } A. k / 11 答案:B 23 如果 char cc[] = "12345", 则 strlen(cc)的值应为( )。 A. 7 答案:B 24 若有以下定义和语句: struct student { int age; int num; }; struct student stu[3] = { {15, 100}, {16, 90}, {15, 80} }; void main() { struct student *p = stu; ... } 则以下不正确的是( )。 A. (p + 1) -> num = 200; B. p++ C. *p.num = 200; D. p = stu; 答案:C,应该(*p).num = 200; 25 关于 C 程序的叙述,错误的说法是() A. C 程序总是从主函数开始执行 B. C 程序中定义的第一个函数是主函数 C. 在主函数中可以调用其他函数 D. 一个 C 程序可以包括多个函数 答案:B 26 设 a、b 和 c 都是 int 型变量,且 a=7,b=8,c=9,则表达式(a*b)/c+6-14%c 的值是() A.6 B.7 答案:B C.8 D.9 27 下列一维数组说明中,错误的是() A. int a[]={1,2,3}; B. int a[5]; C. int n=5, a[n]; D. int a[5]={1,2,3}; 答案:C 28 设有定义 int a,*p;下列赋值语句中,正确的是() A. p=a; D.*p=&a; B.p=&a; C.p=*a;
分享到:
收藏