谭浩强《C程序设计》(第4版)配套题库【名校考研真题+课后习题+章节题库+模拟试题】(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-01 09:32:13

点击下载

作者:圣才电子书

出版社:圣才电子书

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

谭浩强《C程序设计》(第4版)配套题库【名校考研真题+课后习题+章节题库+模拟试题】

谭浩强《C程序设计》(第4版)配套题库【名校考研真题+课后习题+章节题库+模拟试题】试读:

第一部分 名校考研真题

说明:我们从指定谭浩强《C程序设计》(第4版)为考研参考书目的名校历年考研真题以及相关教辅习题中挑选具有代表性的真题,并对其进行了详细的解答。通过这一部分的练习,可以帮助学员巩固基础知识、夯实专业基础,从而做到全方位备考。

一、选择题

1下列关于C语言文件的叙述中正确的是(  )。

A.文件由一系列数据依次排列组成,只能构成二进制文件

B.文件由结构序列组成,可以构成二进制文件或文本文件

C.文件由数据序列组成,可以构成二进制文件或文本文件

D.文件由字符序列组成,其类型只能是文本文件【答案】C【解析】C语言将文件看作是一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。根据数据的组成形式,可将文件分为两种:①ASCII文件,又称文本(text)文件,它的每一个字节可放一个ASCII码,代表一个字符;②二进制文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以C文件就是一个字节流或一个二进制流。答案选择C选项。

2有以下程序:

#includemain(){  int m=1,n=2,*p=&m,*q=&n,*r;  r=p;  p=q;  q=r;  printf("%d,%d,%d,%d\n",m,n,*p,*q);}

程序运行后的输出结果是(  )。

A.1,2,1,2

B.1,2,2,1

C.2,1,2,1

D.2,1,1,2【答案】B【解析】m和n的值不变,分别是1,2;指针*p和*q交换了指向的位置,即*p=&n,*q=&m,分别为2,1。答案选择B选项。

3有以下程序:

#include #include struct A{  int a;  char b[10];  double c;};struct A f(struct A t);main(){  struct A a={1001,"ZhangDa",1098.0};  a=f(a);  printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}struct A f(struct A t){  t.a=1002;  strcpy(t.b,"ChangRong");  t.c=1202.0;  return t;}

程序运行后的输出结果是(  )。

A.1001,ZhangDa,1098.0

B.1002,ZhangDa,1202.0

C.1001,ChangRong,1098.0

D.1002,ChangRong,1202.0【答案】D【解析】函数f对结构体成员进行修改,并返回新的结构体;main函数先定义了一个结构体变量a并为它赋初值,然后调用函数f修改结构体变量的成员值,最后输出新的结构体变量成员值。答案选择D选项。

4有以下程序:

#include void fun(int p){  int d=2;  p=d++;  printf("%d",p);}main(){  int a=1;  fun(a);  printf("%d\n",a);}

程序运行后的输出结果是(  )。

A.32

B.12

C.21

D.22【答案】C【解析】C语言中函数参数传递满足“单向传递”,实现传递值的功能,实参能传给形参,形参却不能传回给实参。fun函数体内输出p的值为2,并不影响到fun函数外a的值,a的值在main函数内依然为1。答案选择C选项。

5有以下程序:

#include #define f(x) x*x*xmain(){  int a=3,s,t;  s=f(a+1);  t=f((a+1));  printf("%d,%d\n",s,t);}

程序运行后的输出结果是(  )。

A.10,64

B.10,10

C.64,10

D.64,64【答案】A【解析】C语言中带参数的宏可以理解为用参数直接替换定义式中的变量,而不经过任何修改。所以s = f(a+1) = a+1*a+1*a+1 = 3+3+3+1 = 10,t = f((a+1)) = (a+1)*(a+1)*(a+1) = 4×4×4 = 64,所以有无括号的运算结果是不同的。故答案选择A选项。

6有以下程序:

#includemain(){  int a[]={2,3,5,4},i;  for(i=0;i<4;i++)    switch(i%2)    {      case 0:switch(a[i]%2)            {              case 0:a[i]++;break;              case 1:a[i]--;             } break;      case 1:a[i]=0;    }  for(i=0;i<4;i++) printf("%d",a[i]);  printf("\n");}

程序运行后的输出结果是(  )。

A.3344

B.2050

C.3040

D.0304【答案】C【解析】main函数的主体是一个for循环语句,for循环中包含一个switch语句,如果判断条件为0则进入第二个switch语句,如果判断语句为1则执行“a[i]=0”,最后将数组顺序输出。所以程序功能是将数组下标为奇数的项设为0,数组下标为偶数的项,如果对应的元素为偶数则加1,如果对应的元素为奇数则减1。答案选择C选项。

7若有以下程序段:

int r=8;

printf("%d\n",r>>1);

输出结果是(  )。

A.16

B.8

C.4

D.2【答案】C【解析】C语言中,“>>”右移运算符是将变量转换成二进制,然后右移相应位数,将移出的位信息舍去,并在高位补0,将所得的结果再赋值给变量。本题十进制数8转换为二进制数为0000 1000,右移一位得到0000 0100,再转换成十进制数就是4。所以答案选择C选项。

8有以下定义语句,编译时会出现编译错误的是(  )。

A.char a='a';

B.char a='\n';

C.char a='aa';

D.char a='\x2d';【答案】C【解析】本题中a为一个字符型变量,只能为其赋值一个字符常量,A项编译可以通过。C项中'aa'不是字符常量,而是一个字符串,所以会编译错误。BD两项为转义字符,编译可以通过。答案选择C选项。

9下面结构体的定义语句中,错误的是(  )。

A.struct ord{int x;int y;int z;}; struct ord a;

B.struct ord{int x;int y;int z;}struct ord a;

C.struct ord{int x;int y;int z;}a;

D.struct {int x;int y;int z;}a;【答案】B【解析】C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如A项,B项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择B选项。

10有以下程序:

#include #include main(){  char a[10]="abcd";  printf("%d,%d\n", strlen(a), sizeof(a));}

程序运行后的输出结果是(  )。

A.7,4

B.4,10

C.8,8

D.10,10【答案】B【解析】在C语言中,strlen()用来统计字符串中字符的个数(不包含字符串结束标志'\0'),sizeof()用来求分配给数组的存储空间大小。题目中字符串a中字符个数为4,但由于数组a定义含有10个字符,所以所占空间大小为10。所以答案选择B选项。

11以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。

#define MIN -2147483647int fingmax (int x[],int n){  int i,max;  for(i=0;i

造成错误的原因是(  )。

A.定义语句int i,max;中max未赋初值

B.赋值语句max=MIN;中,不应给max赋MIN值

C.语句if(max

D.赋值语句max=MIN;放错了位置【答案】D【解析】本题中for循环中首先将MIN值赋值给max,然后用x[i]与max的值比较。每次都是将MIN值与x[i]值进行比较,所以无论x[i]的值是什么,都不会影响if的判断语句,max=x[i]始终执行。所以函数返回的是数组中最后一个元素的值。程序的错误在于max=MIN的位置,for循环之前应先执行max=MIN。所以答案选择D选项。

12设有定义:

char *c;

以下选项中能够使字符型指针c正确指向一个字符串的是(  )。

A.char str[]="string";c=str;

B.scanf("%s",c);

C.c=getchar();

D.*c="string";【答案】A【解析】B,C选项均为输入函数,其表达意思为输入字符串c。B项中scanf()函数是将c定义为一个字符数组的数组名;C项中是将c定义为一个字符型变量;D项中是需要在指针定义时为它赋值,因此是不合法的,所以BCD三项都不正确。A项定义字符数组str,再将字符数组str的首地址赋给字符型指针c,正确。所以答案选择A选项。

13下列函数的功能是(  )。

fun(char * a,char * b){  while((*b= *a)!='\0')  {    a++;    b++;  }}

A.将a所指字符串赋给b所指空间

B.使指针b指向a所指字符串

C.将a所指字符串和b所指字符串进行比较

D.检查a和b所指字符串中是否有'\0'【答案】A【解析】函数fun中a和b是两个字符型指针,在while语句的表达式中将指针a所指向的字符赋给指针b所指向的内存单元,再判断指针b所指向的字符是不是字符串中的结尾符,若不是,则字符指针a和b分别自增,再执行循环语句,直至b所指向的字符为字符串中的空字符。所以答案选择A选项。

14表达式:(int)((double)9/2)-9%2的值是(  )。

A.0

B.3

C.4

D.5【答案】B【解析】运算符“/”“%”的优先级高于“-”,所以先进行除法和求余运算,再进行减法运算。强制类型转换表达式的形式:(类型名)(表达式)。“9/2”结果为4,转换成double类型再转换成int类型结果依然为4,9%2的结果为1,最后结果为4-1=3。答案选择B选项。

15有以下程序:

#include #includemain(){  char str[][20]={"One*World","One*Dream!"},*p=str[1];  printf("%d,",strlen(p));  printf("%s\n",p);}

程序运行后的输出结果是(  )。

A.9,One*World

B.9,One*Dream!

C.10,One*Dream!

D.10,One*World【答案】C【解析】程序将两个字符串常量赋值给一个二维字符数组,然后p指向第二个字符串。strlen统计字符串中有效字符的个数,可知"One*Dream!"中共有10个字符。所以答案选择C选项。

16有以下程序:

#include int f(int n);main(){  int a=3,s;  s=f(a);  s=s+f(a);  printf("%d\n",s);}int f(int n){  static int a=1;  n+=a++;  return n;}

程序运行以后的输出结果是(  )。

A.7

B.8

C.9

D.10【答案】C【解析】在函数f中,整型变量a为静态变量,所以每次调用函数f时不再为a重新赋值,而且a的值只有在程序结束时才被释放。第一次调用f后n=4,a=2,s=4;第二次调用时,a初值为2,调用后,a=3,n=5,s=4+5=9,所以输出结果为9。答案选择C选项。

17有以下程序:

#include main(){  int c=0,k;  for(k=1;k<3;k++)    switch(k)    {      default:c+=k;      case 2:c++;break;      case 4:c+=2;break;    }  printf("%d\n",c);}

程序运行后的输出结果是(  )。

A.3

B.5

C.7

D.9【答案】A【解析】程序进入for循环后,首先k=1,执行default语句,c变为1。由于default语句之后没有break语句,因此继续执行case 2,c变为2,之后执行break语句跳出本次循环。下次循环k=2,直接执行case 2,c自增为3后跳出本次循环。k=3时for循环结束,最后输出3。答案选择A选项。

18下面是有关C语言字符数组的描述,其中错误的是(  )。

A.不可以用赋值语句给字符数组名赋字符串

B.可以用输入语句把字符串整体输入给字符数组

C.字符数组中的内容不一定是字符串

D.字符数组只能存放字符串【答案】D【解析】C语言中,字符数组可以用来存放单个的字符或者字符串。答案选择D选项。

19若有定义语句:

int a[4][10],*p,*q[4];

且0≤i<4,则错误的赋值是(  )。

A.p=a

B.q[i]=a[i]

C.p=a[i]

D.p=&a[2][1]【答案】A【解析】二维数组名是指向指针的指针,所以a和q都为指向指针的指针,而p为指向int类型的指针,p和a不同类型,故A选项中p=a赋值语句错误。其余选项可以正确赋值,其中D项是用取地址符&返回整数的地址,然后赋值给p。所以答案选择A选项。

20以下程序段中,与语句:

k=a>b?(b>c?1:0):0;

功能相同的是(  )。

A.

if((a>b) && (b>c)) k=1;

else k=0;

B.

if((a>b) || (b>c)) k=1;

else k=0;

C.

if(a<=b) k=0;

else if(b<=c) k=1;

D.

if(a>b) k=1;

else if(b>c) k=1;

else k=0;【答案】A【解析】三元运算符表达式的形式为:表达式1?表达式2:表达式3,当表达式1的值为真时,结果为表达式2的值;当表达式1的值为假时,结果为表达式3的值。首先判断a、b的关系:①如果a>b,执行语句(b>c?1:0);判断b、c的关系,如果b>c,k=1,否则k=0;②如果a≤b,则k=0。综上所述:当a>b且b>c时,k=1,否则k=0,与A项语句功能相同。答案选择A选项。

21若有定义语句:

int x=10;

则表达式x-=x+x的值为(  )。

A.-20

B.-10

C.0

D.10【答案】B【解析】单目加运算符优先级高于赋值运算符,所以先做x+x结果为20,再做x-20,结果为-10,然后赋值给x。所以答案选择B选项。

22有以下程序:

#include main(){  char s[]={"012xy"};  int i,n=0;  for(i=0;s[i]!='\0';i++) if(s[i]>='a'&&s[i]<='z')n++;  printf("%d\n",n);}

程序运行后的输出结果是(  )。

A.0

B.2

C.3

D.5【答案】B【解析】程序中main函数的作用就是判断字符串s中小写字母的个数,显然结果为2。答案选择B选项。

23有以下程序:

#include main(){  char c1,c2;  c1='A'+'8'-'4';  c2='A'+'8'-'5';  printf("%c,%d\n",c1,c2);}

已知字母A的ASCII码为65,程序运行后的输出结果是(  )。

A.E,68

B.D,69

C.E,D

D.输出无定值【答案】A【解析】C语言中每个字符都对应一个ASCII码值,该值可以用来运算。本题中main函数将字符A经过加四和加三运算后分别赋值给c1、c2,则c1='E',c2='D',然后将c1按字符格式输出,c2按整型格式输出。答案选择A选项。

24有以下程序:

#include main(){  int a=1,b=0;  printf("%d,",b=a+b);  printf("%d\n",a=2*b);}

程序运行后的输出结果是(  )。

A.0,0

B.1,0

C.3,2

D.1,2【答案】D【解析】main函数先为a、b赋值,然后做运算a+b结果赋值给b,此时b为1,并将b打印出来。接着做运算2*b结果为2*1=2赋值给a,将a打印出来,所以最终的输出结果为1,2。答案选择D选项。

25以下选项中,能用作用户标识符的是(  )。

A.void

B.8_8

C._0_

D.unsigned【答案】C【解析】标识符是由若干个字符组成的字符序列,用来命名程序的一些实体。C语言定义标识符应遵循以下六种规则:①标识符由字母、数字或下划线组成;②第一个字符必须是字母或下划线;③标识符最多由274个字符组成;④在标识符中严格区分大小写字母;⑤关键字不能作为自定义的标识符在程序中使用。A、D项皆为C语言的关键字,B项第一个字符为数字,错误。答案选择C选项。

26设有以下函数:

void fun(int n,char* s){……}

则下面对函数指针的定义和赋值均是正确的是(  )。

A.void (* pf)();pf=fun;

B.void *pf();pf=fun;

C.void * pf(); *pf=fun;

D.void (* pf)(int,char);pf=&fun【答案】D【解析】函数指针的一般定义形式为:

返回值类型 (* 指针变量名) ([形参列表]);

其中,“返回值类型”说明函数的返回类型,“(* 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

以本题函数和函数指针为例,将函数的首地址赋给指针,可以是pf=fun;或者pf=&fun

选项A,参数列表与题干函数不符,错误。选项B,函数指针定义格式错误。选项C。函数指针定义格式错误,复制格式也错误。答案选择D选项。

27阅读以下程序:

#include main(){  int case;  float printF;  printf("请输入2个数:");  scanf("%d %f",&case,&printF);  printf("%d %f\n",case,printF);}

该程序编译时产生错误,其出错原因是(  )。

A.定义语句出错,case是关键字,不能用作用户自定义标识符

B.定义语句出错,printF不能用作用户自定义标识符

C.定义语句无错,scanf不能作为输入函数使用

D.定义语句无错,printf不能输出case的值【答案】A【解析】在C语言中,关键字又称保留字,它是系统预先定义的,具有特定含义的标识符,故不允许用户重新定义。case为C语言中的关键字,因此用户不能再定义标识符为case的变量。答案选择A选项。

28设有定义:

int a=1,b=2,c=3;

以下语句中执行效果与其他三个不同的是(  )。

A.if(a>b)c=a,a=b,b=c;

B.if(a>b){c=a,a=b,b=c;}

C.if(a>b)c=a;a=b;b=c;

D.if(a>b){c=a;a=b;b=c;}【答案】C【解析】C语言中if语句后面只跟一条语句时,可以省略大括号。即if语句仅作用于紧随其后的那条语句或者是复合语句的内容,所以A项,执行三条语句组成的复合语句;BD两项执行大括号中的三条语句;而C项只执行c=a;。答案选择C选项。

29有以下程序:

#include main(){  int n=2,k=0;  while(k++&&n++>2);  printf("%d %d\n",k,n);}

程序运行后的输出结果是(  )。

A.0 2

B.1 3

C.5 7

D.1 2【答案】D【解析】(表达式1)&&(表达式2)中,如果表达式1为假或0,那么表达式2就不会被执行。程序首先进入while的判断语句,执行k++和n++。k++为零,不满足循环条件,所以n++不会被执行,while循环结束后,k自增为1,n没有进行运算,仍为2。答案选择D选项。

30有以下程序:

#include#define N 4void fun(int a[][N],int b[]){  int i;  for(i=0;i

程序运行的结果是(  )。

A.1,2,3,4,

B.1,0,7,0,

C.1,4,5,9,

D.3,4,8,0,【答案】B【解析】数组x有4列。fun函数中for循环的作用是将二维数组的对角线元素赋给b[0],b[1,b[2],b[3]。在主函数中,二维数组初始化为{{1,2,3},{4},{5,6,7,8},{9,10}},对角线元素为1,0,7,0。答案选择B选项。

31有以下程序:

#includemain(){  char a=4;  printf("%d\n",a=a<<1);}

程序运行的结果是(  )。

A.40

B.16

C.8

D.4【答案】C【解析】移位运算符的优先级比赋值运算符优先级高,故语句“a=a<<1”先进行a的二进制移位运算,左移一位相当于原数乘以2,a<<1结果为4*2=8,没有超过char类型的范围,将8赋值给a,并输出a的值。答案选择C选项。

32有以下程序:

#includestruct st{int x,y;}data[2]={1,10,2,20};main(){  struct st*p=data;  printf("%d,",p->y);  printf("%d\n",(++p)->x);}

程序运行的结果是(  )。

A.10,1

B.20,1

C.10,2

D.20,2【答案】C【解析】程序在定义结构体st的同时定义了结构体数组data。可知data[0]={1,10},data[1]={2,20}。结构体指针p指向数组的首地址data[0],++p则指向data[1],所以输出p->y,(++p)->x即输出data[0].y和data[1].x。从初始化列表中可以看出,这两个值分别是10和2。答案选择C选项。

33有以下程序段

#include main(){  int a,b,c;  a=10;b=50;c=30;  if(a>b)a=b,b=c;c=a;  printf("a=%d b=%d c=%d\n",a,b,c);}

程序的输出结果是(  )。

A.a=10 b=50 c=30

B.a=10 b=50 c=10

C.a=10 b=30 c=10

D.a=50 b=30 c=50【答案】B【解析】C语言中使用分号来作为语句的结束,所以a=b,b=c;是一条含有逗号运算符的语句,是if语句的执行体。因为题中a

34有以下程序:

#includeint fun(int(*s)[4],int n,int k){  int m,i;  m=s[0][k];  for(i=1;im)      m=s[i][k];  return m;}main(){  int a[4][4] = {{1,2,3,4}, {11,12,13,14}, {21,22,23,24}, {31,32,33,34}};  printf("%d\n",fun(a,4,0));}

程序运行的结果是(  )。

A.4

B.34

C.31

D.32【答案】C【解析】在fun函数中,首先将s[0][k]的值赋给m,然后通过for循环,遍历s[1][k]~s[n-1][k]之中的数,将遇到的比m大的数保存到m中。这是搜索最大值的算法,搜索的是s[0][k]~s[n-1][k]之间的最大值。所以,主函数中fun(a,4,0)的功能就是搜索a[0][0]~a[3][0]之间的最大值,这4个值分别是1、11、21、31,所以最终输出结果是31。答案选择C选项。

35有以下程序:

#includemain(){  int i=5;  do  {    if(i%3==1)    if(i%5==2)    {      printf("*%d",i);      break;    }    i++;  }while(i!=0);  printf("\n");}

程序运行的结果是(  )。

A.*7

B.*3*5

C.*5

D.*2*6【答案】A【解析】在do while循环中,总是先执行循环体后判断循环条件,所以循环体至少会被执行一次。在循环中,如果满足(i%3==1)&&(i%5==2),则输出i的值,并执行break;退出do while循环;否则i++,继续判断while条件,如果i==0,则终止do while循环。第1遍循环,5%3==1不成立,执行i++,i变为6,第1遍循环结束,判断(i!=0)为真,继续循环。第2遍循环,6%3==1不成立,执行i++,i变为7,第2遍循环结束,判断(i!=0)为真,继续循环。第3遍循环7%3==1成立,7%3==2成立,执行if子句“printf("*%d",i);break;”,输出*7之后跳出循环。答案选择A选项。

36有以下程序:

#include#includeint fun(int n){  int *p;  p=(int*)malloc(sizeof(int));  *p=n;  return *p;}main(){  int a;  a=fun(10);  printf("%d\n",a+fun(10));}

程序运行的结果是(  )。

A.0

B.10

C.20

D.出错【答案】C【解析】fun函数的功能是申请一个int型指针p,把p指向的存储空间赋值为n,并返回p指向的空间的值,即为n。fun(10)的返回值为10,所以a=fun(10)后a的值为10,a+fun(10)=20。答案选择C选项。

37有以下程序:

#includemain(){  int x=1,y=2,z=3;  if(x>y)    if(y

程序运行的结果是(  )。

A.331

B.41

C.2

D.1【答案】D【解析】else子句总是与前面最近的不带else的if相结合,与书写格式无关,所以程序中的else语句与第二个if语句配对,且if和else都在第一个if的控制范围内。首先判断x>y不成立,退出第一个if语句,执行printf("%d\n",x++)。输出结果为1。答案选择D选项。

38有以下程序:

#includevoid fun(int a,int b){  int t;  t=a;  a=b;  b=t;}main(){  int c[10]={1,2,3,4,5,6,7,8,9,0},i;  for(i=0;i<10;i+=2)fun(c[i],c[i+1]);  for(i=0;i<10;i++)printf("%d,",c[i]);  printf("\n");}

程序运行的结果是(  )。

A.1,2,3,4,5,6,7,8,9,0,

B.2,1,4,3,6,5,8,7,0,9,

C.0,9,8,7,6,5,4,3,2,1,

D.0,1,2,3,4,5,6,7,8,9,【答案】A【解析】在C语言中,函数参数传递的作用是“传值”,形参和实参是两个没有关系的变量。函数fun交换了参数值,但只是交换了形参的值,结果并不会传递给实参。所以数组c没有发生变化,原顺序输出。答案选择A选项。

39有以下程序:

#includevoid fun(int a[],int n){  int i,t;  for(i=0;i

程序运行的结果是(  )。

A.345678

B.876543

C.1098765

D.321678【答案】D【解析】在main()函数中定义了一个有10个元素的数组k,并且赋初值为{1,2,3,4,5,6,7,8,9,10}。执行函数fun(k,5),把k的首地址赋给形参a,把5赋给形参n。在fun()函数中,for循环执行了2次:第一次,i的值为0,循环体中将a[0]与a[4]的值互换;第二次,i值为1,这次是将a[1]与a[3]的值互换。所以,fun()函数执行完后,数组k中的内容为{5,4,3,2,1,6,7,8,9,10}。接下来,循环输出a[2]~a[7]的值,故输出结果是321678。答案选择D选项。

40C源程序中不能表示的数制是(  )。

A.二进制

B.八进制

C.十进制

D.十六进制【答案】A【解析】C语言中整型常量可以用十进制、八进制数、十六进制数来表示。虽然计算机只能识别二进制数,但二进制不能用源程序表示。答案选择A选项。

41有以下程序:

#includeint fun(int a,int b){  if(b==0)return a;  else return(fun(--a,--b));}main(){  printf("%d\n",fun(4,2));}

程序运行的结果是(  )。

A.1

B.2

C.3

D.4【答案】B【解析】fun函数是一个递归函数,其功能是:当b的值为零时,返回此时a的值;否则,返回fun(--a,--b),即a和b的值分别减1后递归调用返回fun函数。当b不断递减时,a也不断递减,直到b为零。执行过程为:执行fun(4,2),b=2,返回fun(3,1),此时b=1,返回fun(2,0),b=0,返回a的值2。答案选择B选项。

42以下叙述中错误的是(  )。

A.用户定义的函数中可以没有return语句

B.用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值

C.用户定义的函数中若没有return语句,则应当定义函数为void类型

D.函数的return语句中可以没有表达式【答案】B【解析】用户定义的函数有两种:①void函数,可以没有return语句,如果有return语句,也不可以返回任何表达式;②指定返回类型函数,至少有一个返回语句。在一个函数内,可以根据需要在多处出现return语句,但无论有多少个return语句,return语句只会被执行一次然后退出函数,并且只能返回一个函数值。AC两项,在没有返回值的函数中可以没有return语句,函数类型定义为void即可;D项,在没有返回值的函数中如果有return语句,该语句必须不带任何表达式;B项,用户定义的函数可以有多个return语句,但是只能返回一个函数值。答案选择B选项。

43若有定义语句:

char s[10]="1234567\0\0";

则strlen(s)的值是(  )。

A.7

B.8

C.9

D.10【答案】A【解析】C语言规定以字符'\0'作为字符串结束的标识符。strlen函数返回的是字符串的长度,不包含字符'\0',所以值是7。答案选择A选项。

44执行以下程序段后,w的值为(  )。

int w='A',x=14,y=15;

w=((x||y)&&(w<'a'));

A.-1

B.NULL

C.1

D.0【答案】C【解析】因为x=14,y=15都是非零整数,因此x||y=1。大写字母的ASCII码值小于小写字母,w<'a'也为真,因此(x||y)&&(w<'a')的值为1。答案选择C选项。

45有以下程序:

#includemain(){  int i,j;  for(i=3;i>=1;i--)  {    for(j=1;j<=2;j++)printf("%d",i+j);    printf("\n");  }}

程序运行的结果是(  )。

A.234<换行>345<换行>

B.432<换行>543<换行>45<换行>

C.23<换行>34<换行>23<换行>

D.45<换行>34<换行>23<换行>【答案】D【解析】外层主循环i从3减到1执行了3次,嵌套的循环j从1增到2,每轮执行2次。每次输出i+j的值,就可以得到3+1,3+2,2+1,2+2,1+1,1+2。但注意每次内循环结束要换行。答案选择D选项。

46以下选项中正确的定义语句是(  )。

A.double a;b;

B.double a=b=7;

C.double a=7,b=7;

D.double,a,b;【答案】C【解析】同一类型变量的定义时,不同变量之间需要用“,”分隔,选项A错误;定义变量时初始化赋值不能用等号连接,选项B错误;变量类型说明后面不能用逗号,而是用空格分离,选项D错误。答案选择C选项。

47以下选项中不能作为C语言合法常量的是(  )。

A.'cd'

B.0.1e+6

C."a"

D.'\011'【答案】A【解析】常量包括整型常量、实型常量、字符常量和字符串常量等。单引号表示字符常量,但不能包含字符串。表达字符串常量时需用双引号。A项,在C语言中,字符常量是用单引号括起来的一个字符,'cd'包含了2个字符;B项,0.1e+6是实型常量的指数形式,代表60.1×10;C项,"\a"是合法的字符串常量,\a是一个非打印的转义字符表示响铃;D项,'\011'是一个字符常量,\011是一个用3位八进制表示的转移字符。答案选择A选项。

48若变量已正确定义为int型,要通过语句scanf("%d,%d,%d",&a,&b,&c);给a赋值1、给b赋值2、给C赋值3,以下输入形式中错误的是(u代表一个空格符)(  )。

A.uuu1,2,3<回车>

B.1u2u3<回车>

C.1,uuu2,uuu3<回车>

D.1,2,3<回车>【答案】B【解析】在输入整数或实数这类数值型数据时,输入的数据之间必须用空格、回车符、制表符(Tab键)等间隔符隔开,间隔符个数不限。在题目中,scanf函数使用通配符逗号,则在输入数据时也要使用通配符逗号,且逗号要紧跟着数据后面。B项,没有输入非格式符“,”。答案选择B选项。

49如有表达式(w)?(-x):(++y),则其中与w等价的表达式是(  )。

A.w==1

B.w==0

C.w!=1

D.w!=0【答案】D【解析】条件表达式形式为<表达式1>?<表达式2>:<表达式3>。表达式1的值为真,结果为表达式2的值;表达式1的值为假,结果为表达式3的值。可见表达式w等价于w!=0。答案选择D选项。

50下面的函数调用语句中func函数的实参个数是(  )。

func(f2(v1,v2),(v3,v4,v5), (v6,max(v7,V8)));

A.3

B.4

C.5

D.8【答案】A【解析】函数在被调用时,传入的实参以逗号分隔,实参可以是一个变量,也可以是一个表达式。在本题中,func()函数传入的参数是被逗号分隔的3个表达式,它们分别是f2(v1,v2)、(v3,v4,v5)和(v6,max(v7,v8)),所以它的实参个数是3。其中,f2(v1,v2)是一个函数调用;(v3,v4,v5)是一个逗号表达式;(v6,max(v7,v8))也是一个逗号表达式,它里面还包含了一个函数调用,但它仍只代表1个实参。答案选择A选项。

51以下不能正确表示代数式的C语言表达式是(  )。

A.2*a*b/c/d

B.a*b/c/d*2

C.a/c/d*b*2

D.2*a*b/c*d【答案】D【解析】*与/优先级相同,采用左结合的方式。D项若改为:2*a*b/(c*d)则为正确。答案选择D选项。

52以下叙述中正确的是(  )。

A.C程序的基本组成单位是语句

B.C程序中的每一行只能写一条语句

C.简单C语句必须以分号结束

D.C语言必须在一行内写完【答案】C【解析】C程序的基本组成单位是函数,A项错误;C程序以分号作为每个语句结尾,一行能写多条语句,也可以将一条语句分几行书写,B、D两项错误;C语言中语句分为简单语句和复合语句。简单语句以分号作为结束。其中简单语句里面又有赋值语句、声明语句、结构化语句、函数调用语句和空语句。复合语句指用花括号{}将简单语句甚至另一些复合包起来,所以就以}作为语句结束的标记。答案选择C选项。

53若有定义语句:int m[]={5,4,3,2,1},i=4;,则下面对m数组元素的引用中错误的是(  )。

A.m[--i]

B.m[2*2]

C.m[m[0]]

D.m[m[i]]【答案】C【解析】在C语言中,数组的下标是从0开始的,所以它的上限是数组元素个数减1。如果超过这个范围来引用数据元素就会溢出,造成运行时错误。本题的数组m有5个元素,所以它的下标范围是0~4。A项,--i的值为3;B项,2*2的值为4;C项,m[0]等于5,超出范围,出现溢出错误;D项,m[i]的值为4,即m[4]的值为1。答案选择C选项。

54有以下程序:

#includemain(){  struct STU  {    char name[9];    char sex;    double score[2];  };  struct STU a={"Zhao",'m',85.0,90.0}, b={"Qian",'f',95.0,92.0};  b=a;  printf("%s,%c,%2.0f,%2.0f\n", b.name, b.sex, b.score[0], b.score[1]);}

程序运行的结果是(  )。

A.Qian,f,95,92

B.Qian,f,85,90

C.Zhao,f,95,92

D.Zhao,m,85,90【答案】D【解析】在C语言中,相同类型的结构体变量可以通过等号直接赋值,它会将对应成员一一对应赋值。所以,本题声明并初始化了两个STU结构体变量a和b,然后将a赋给b,最后逐个输出b的各个成员,其实就是初始化a的内容。答案选择D选项。

55有以下程序:

#includemain(){  FILE*pf;  char*s1="China",s2="Beijing";  pf=fopen("abc.dat","wb+");  fwrite(s2,7,1,pf);  rewind(pf); /*文件位置指针回到文件开头*/  fwrite(s1,5,1,pf);  fclose(pf);}

以上程序执行后abc.dat文件的内容是(  )。

A.China

B.Chinang

C.ChinaBeijings

D.BeijingChina【答案】B【解析】pf是一个文件指针,fopen("abc.dat","wb+");执行后,pf指向可读写的二进制文件abc.dat。语句fwrite(s2,7,1,pf);是将s2的前7*1个字符的内容写入pf中,即Beijing。rewind(pf);是将文件位置指针移回到文件开头,语句fwrite(s1,5,1,pf);是从文件的开头位置,将s1的前5*1个字符的内容写入,替换掉原来位置上的内容,所以结果为Chinang。答案选择B选项。

二、填空题

1请根据以下各小题的要求设计C应用程序(包括界面和代码)。

请补充fun函数,该函数的功能是:计算N×N维矩阵元素的方差,结果由函数返回。维数在主函数中输入。

例如:

的计算结果是14.414。

求方差的公式为:

其中

注意:

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序如下:

#include #include #define N 20/**********found**********/double fun(①______,int n){  int i,j;  double s=0.0;  double f=0.0;  double aver=0.0;  double sd=0.0;  for(i=0;i

①int a[][N]

②s/(n*n)

③sqrt(f)【解析】

根据题目中的方差公式,先要计算矩阵元素的平均值,再求矩阵元素与平均值差的平方的平均值,最后调用库函数求方差。

填空1:根据函数中各变量的使用情况及实参的类型,这里应该是对二维数组a的定义,因为二维数组做形参,可以省略第一维的长度,但不能省略第二维的长度,所以此处应填int a[][N]。

填空2:这里求矩阵元素的平均值,注意元素的个数应该是n*n。

填空3:此处应该调用库函数sqrt()求平方根。

2请根据以下各小题的要求设计C应用程序(包括界面和代码)。

请补充main函数,该函数的功能是:先以只写方式打开文件“out52.dat”,再把字符串str中的字符保存到这个磁盘文件中。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。

试题程序如下:

#include #define N 80main(){  FILE*fp;  int i=0;  char ch;  char str[N]="I'm a student!";  if((fp=fopen(①______))==NULL)  {    printf("cannot open out52.dat\n");    exit(0);  }  while(str[i])  {    ch=str[i];    ②______;    putchar(ch);    i++;  }  ③______;}【答案】

①"out52.dat","w"

②fputc(ch,fp)

③fclose(fp)【解析】

填空1:根据题目的要求需要将文件以“只写”的方式打开,注意文件名是一个字符串,必须加双引号,打开方式也要加双引号。

填空2:while循环的功能是把字符串中的字符保存在磁盘文件中,把单个字符写入文件型指针变量fp所指的文件的表达式是fputc(ch,fp)。

填空3:一定要注意对文件操作完后要关闭文件,所以此处应该填fclose(fp)。

3请根据以下各小题的要求设计C应用程序(包括界面和代码)。

函数fun的功能是:把形参a所指数组中的最大值放在a[0]中,接着求出a所指数组中的最小值放在a[1]中;再把a所指数组元素中的次大值放在a[2]中,把a数组元素中的次小值放在a[3]中;其余依此类推。例如:若a所指数组中的数据最初排列为:1,4,2,3,9,6,5,8,7,则按规则移动后,数据排列为:9,1,8,2,7,3,6,4,5。形参n中存放a所指数组中数据的个数。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序如下:

#include #define N 9/************found************/void fun(int ①______,int n){  int i,j,max,min,px,pn,t;  /************found************/  for(i=0;ia[j])      {        min=a[j];        pn=j;      }    }    if(px!=i)    {      t=a[i];      a[i]=max;      a[px]=t;      if(pn==i)        pn=px;    }    if(pn!=i+1)    {      t=a[i+1];      a[i+1]=min;      a[pn]=t;    }  }}

main(){  int b[N]={1,4,2,3,9,6,5,8,7},i;  printf("\nThe original data:\n");  for(i=0;i

①*a或a[]

②2

③i+1【解析】

填空1:由后边的程序可知,形参a应定义为整型数组,所以此处应填:*a或a[]。

填空2:由于循环每次对两个数组元素进行赋值,所以外for循环每次增量应该加2。

填空3:由题意可知,此处是找出从i+1到n的数的最大值和最小值,所以内for循环的初始值应为:i+1。

4给定程序中,函数fun的功能是:找出100至x(x≤999)之间各位上的数字之和为15的所有整数然后输出;符合条件的整数个数作为函数值返回。

例如,当x值为500时,各位数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492,共有26个。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

试题程序如下:

#include int fun(int x){  int n, s1, s2, s3, t;  /**********found**********/  n=①______;  t=100;  /**********found**********/

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载