C理论自测题及参考答案(第3次)

更新时间:2023-11-23 18:51:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、单选题

1.以下关于函数的叙述中,正确的是 。

A. 在函数体中可以直接引用另一个函数中声明为static类别的局部变量的值 B. 在函数体中至少必须有一个return语句 C. 在函数体中可以定义另一个函数 D. 在函数体中可以调用函数自身

2. 以下关于变量的叙述中,不正确的是 。

A. 一个变量的作用域完全取决于该变量声明的位置 B. 全局变量可以在函数以外的任何位置声明 C. 动态局部变量的生存期仅限于本次函数调用,无法将局部变量的值保存到函数下一次调用 D. 用static声明一个变量是为了限制其他编译单位引用该变量

3. 以下选项是一个自定义函数的头部,其中正确的是 。

A. int fun(int a, b) B. int fun(int a, int a)

C. int fun(int a[],int b) D. int fun(static int a,int b) 4. 关于函数返回值,以下叙述中正确的是 。

A. 函数返回值的类型由函数体内return语句包含的表达式类型决定 B.函数返回值的类型由函数头部定义的函数类型决定

C.若函数体中有多个return语句,则函数返回值是排列在最后的return语句中表达式的值 D.若函数体内没有return语句,则函数没有返回值

5. 以下程序中main函数需要调用fun函数,所给选项中正确的调用语句是 。

A. fun(1,2); B. fun((1,2)); C. f(); D. fun(fun(1)); void fun (int c) { printf(“%d”,c ); } 6. 已知函数f定义如下:

void f(void)

{ printf(“ That’s great!”);}

则调用f函数的正确形式是 。

A. f; B. f(); C. f(void); D. f(1);

7. 已知有函数f的定义如下:

int f(int a, int b)

{ if (a

在main函数中若调用函数f(2,3),得到的返回值是 。 A. 2 B. 3 C. 2和3 D. 3和2

8. 在以下程序中,需要在fun函数中声明一个int型的变量,所给选项中不能用作该变量名的

是 。

A. x B. y C.a D. fun #include int y; main()

{ int a=1; fun(a); }

int fun(int x)

{ /* int 型变量声明位置*/

1

}

9. 若有程序:

int x;

int f(int y)

{ return 标识符 ; } #include int w; main()

{ int z=2; f(z); }

则在函数f中,return语句后允许出现的标识符是 。

A. x或w B. x或y C. z或w D. NULL 10. 在main函数体内部和外部均允许出现的实体是 。

A. 预处理命令 B. 操作语句 C.另一函数的定义 D.函数形式参数声明 11. 设有下列程序段:

static char b=2; void Y ( )

{ static float d=4;....... } int a=1; void X ( )

{ int c=3; ...... }

关于程序段中各变量的属性,以下叙述中错误的是 。 A. a是全局变量,函数X可以访问,函数Y不能访问 B. b是全局变量,函数X和函数Y都可以访问

C. c是动态局部变量,函数X可访问,函数Y不可访问 D. d是静态局部变量,函数X和函数Y都可以访问

12. 对应main函数中的fun函数调用,以下给出的四个fun函数定义的首部中,错误的是 。

main()

{ int a,n; fun(n,&a); }

A.void fun(int m,int x[]) B.void fun(int s,int h[41]) C.void fun(int p,int *s) D.void fun(int n,int a) 13. 下列全局变量声明中,正确的是 。

A. auto int i=1; B. float a=1, b=0.5, c=a+b; C. char for=1; D. static char ch;

14. 若有数组 A和B的声明“static char A[ ] = \] = { 'A', 'B', 'C', 'D', 'E',

'F'} ;”,则数组A和数组B的长度分别是 。 A. 7,6 B. 6,7 C. 6,6 D. 7,7 15. 以下程序运行后的输出结果是 。

A.2 2 B.7 2 C. 7 5 D.6 2 #include main()

{ char a[7]=\i=sizeof(a); j=strlen(a); printf(\

2

}

16. 假定已有声明“char a[30],*p=a;”,则下列语句中能将字符串\正

确地保存到数组a中的语句是 。

A. a[30]=\B. a=\

C. p= \ D. strcpy(p,\

17. 以下数组声明中正确的是 。

A. int n=10, a[n]; B. int a[];

C. int a[2][3]={{1},{2},{3}}; D. int a[][3]={{1},{2},{3}};

18.若有声明int a[10],b[3][3]; 则以下对数组元素赋值的操作中,不会出现越界访问的

是 。

A. a [-1]=0 B. a[10]=0 C. b[3][0]=0 D. b[0][3]=0 19.已有声明“int S[2][3]”,以下选项中 正确地引用了数组S中的元素。

A. S[1>2][!1]) B. S[2][0] C. S[1] D. S 20. 已知函数fun的定义如下:

void fun(int x[],int y) { int k;

for(k=0;k

若main函数中有声明int a[10]={10};及调用fun函数的语句,则正确的fun函数调用形式是 。

A. fun(a[],a[0]); B.fun(a[0],a[0]); C.fun(&a[0],a[0]); D. fun(a[0],&a[0]); 21.以下单目运算符均只需要一个操作数,其中要求操作数类型必须是指针型的选项

是 。

A. & B. ++ C. ! D. * 22.已有声明“int a[5];”,以下表达式中不能正确取得数组元素a[1]地址的选项是 。 A.&a[1] B.++a C.&a[0]+1 D.a+1 23.已知有声明:“int good=1;”, 若要使得表达式p=\在编译时不出现语法错和警

告,p应当声明为 。

A.char p; B. char *p; C. int p; D. int *p; 24.下列程序段的输出结果是 。

int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1]; for(i=0;i<4;i+=2)

printf(\;

A. 5 2 B. 5 1 C. 5 3 D. 9 7

25.若有以下声明和定义,如果在main函数中需要调用fun函数,以下调用语句中错误

是 。

A. fun(1); B. (*a)(1); C. b=fun; (*b)(1); D. c=a;(*c)(1); void fun (int c) { printf(“%d”,c ); } main ()

{ void (*a)(int)=fun , *b(int), (*c)(int); /*调用fun函数语句位置*/ }

void *b(int c){ }

3

26.若有声明“int a[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1);”,则值为9的表达式是 .

A.p+=3,*p++ B. p+=4,*(p++) C. p+=4,*++p D. p+=4,++*p

27. 已知某程序中有声明int a[4],j;及语句for(j=0;j<4;j++)p[j]=a+j;,则标识符p正确的

声明形式应为 。

A.int p[4]; B.int *p[4]; C.int **p[4]; D.int (*p)[4];

参考答案:

1~5:DDCBB 6~10:BBABA 11~15:DDDAB 16~20:DDDAC 21~25:DBBCC 26~27:BB

二、多选题

1. 在定义一个函数时,下列选项中 (21) 可以缺省。

A. 函数名之前的数据类型 B. 函数名之后一对圆括号 C. 函数名 D. 形式参数声明 E. 函数体中的语句

2. 以下程序中需要在main函数之后定义一个函数,在所给的选项中不能用作该函数名的标识符

是 。

A.x B.y C. p D.a

#define p 1 int y; main() { int a=1; 函数名(a); }

int 函数名(int x) { return x*x; }

3. 若已定义一个无返回值的函数,则以下关于调用该函数的叙述中错误的是 。

A.函数调用可以作为独立的语句存在 B.函数调用可以出现在表达式中 C.函数调用可以作为一个函数实参 D.函数调用可以作为一个函数形参

参考答案:

1.ADE 2. BCD 3.BCD

三、填空题

1. 以下程序运行后输出结果是 。

#include fun (int k) { static int i; int j=0;

return(++k*(++i+(++j))); }

4

main( ) { int i,n;

for (i=0;i<3;i++)

printf(\}

2. 以下程序运行后输出结果是 。

void fun1(int); void fun2(void); main()

{ extern int x;

printf(\ fun1(2); }

int x=1;

void fun1(int x) { printf(\ fun2(); }

void fun2(void) { printf(\ while(1) { int x=5;

printf(\ } }

3. 以下程序运行后输出结果是 。

int x=1; main() { int y,k;

y=f(3); printf(\}

int f(int x) { if(x==3) { int x=2; return x; }

elseb return x;

}

4. 下列程序运行后输出结果是 。

#include trans(int m, int n ) { int q; if(m

5

{ int i,j,k,x;

for(i=0;i

swap(&b[i], (1) );

i=0; j=0; k=0; while(i

{ if( (2) ) { x=a[i]; i++;} else

{ x=b[j]; j++; } c[k]=x ; k++; }

while(k

{ c[k]=b[j] ; k++; j++; } else if(i

{ (3) ; k++; i++;} }

return m+n; }

void main()

{ int i,n,c[9],a[5]={12,10,5,3,1},b[4]={4,6,8,15}; n=sort(a,5,b,4,c); for(i=0;i

printf(\ printf(\}

2.程序功能: 合并两个已经按照升序排列的一维数组。insert函数功能:将m插入x指向的含有n个元素的数组中,数组中n个元素已按升序排列,插入m后的n+1个元素仍保持有序。 void insert(int x[],int n,int m); main()

{ int a[10]={1,3,5,7,9},b[5]={2,4,8,16,32},k; for(k=0;k<5;k++)

{ insert(a, (1) ,b[k]); }

for(k=0;k<10;k++) printf(\}

void insert(int x[],int n,int m) {

int i,j;

if(m>x[n-1])

(2) =m; else

{ for(i=0; (3) ;i++);

11

for(j=n;j>=i;j--)

x[j]= (4) ; x[i]=m; } }

3、 以下程序在已知n个人原始排列顺序的情况下,计算他们按以下规则出列的顺序。

设有n个人站成一个队列,每人有一个惟一的编号I(1≤I≤n),从左往右“1,2,1,2,?”报数,报到“1”的人出列,报到“2”的人立即站到队伍的最右端;报数过程反复进行,直到n个人都出列为止。例如,当n=8时,若初始编号序列为1,2,3,4,5,6,7,8,则出列顺序为1,3,5,7,2,6,4,8。

算法提示:声明数组p[n+1],将n个人的初始编号序列1~n依次存入p[1]~p[n]中,这里把p[0]~p[n]看作是一个循环队列,p[f]为队首元素,p[r]为队尾元素,令队首初始下标f=1,队尾初始下标r=0。反复执行下列操作直到队列为空(f=r):(1)输出队首元素并删除队首元素,(2)把队首元素插到队尾并删除队首元素。

#include #define n 8 void main()

{ int p[n+1] ; int f,r;

for(f=1;f<=n;f++)p[f]=f ; f=1; r=0; do

{ printf(\

f= (1) ; p[r]=p[f];

r= (2) ; f=(f+1)%(n+1) ;

}while( (3) ); }

4. 以下程序中,函数encrypt的功能是对第一个形参指向的字符串做加密处理,函数返回已加

密字符串的首地址。加密算法:判断字符串中每个字符是否为英文字母,若不是字母则保持原字符不变;若是大写字母,则用字母表中该大写字母对应的小写字母之后的第n个小写字母取代原字母;若是小写字母,则用字母表中该小写字母对应的大写字母之后的第n个大写字母取代原字母。大写字母表和小写字母表均被看作是首尾相连的环形表。例如,当n=3时,若原字符是a,则加密后该字符被D取代;若原字符是Y,则加密后该字符被b取代。 #include #include

char *encrypt( (1) , int n) { int i,t;

for(i=0;a[i]!='\\0';i++) { if(isalpha(a[i]))

{ t=(toupper(a[i])-'A'+n)&;

a[i]= (2) ? 'A'+t :'a'+t; } }

12

(3) ; }

void main()

{ char *s[2]={\ printf(\输出Good */ printf(\输出Luck */ }

5. 以下程序的功能是:对于一个长度不超过50的字符串S,按输入的命令进行删除、插入字符的

操作。删除和插入命令的格式如下:

1)删除命令格式:D a (a表示被删除的字符)

命令功能:从字符串S中删除字符a,若S串中有多个a,只删除第一个。 例如:S字符串为“This is a book.”,执行命令“D s”后,S字符串变为“Thi is a book.” 2)插入命令格式:I a1 a2 (a1表示定位字符,a2表示要插入的字符) 命令功能:将字符a2插入到字符串S中最后一个出现的字符a1的前面。 例如:S字符串为“This is a book.”,执行命令“I s d”后,S字符串变为“This ids a

book.”

#include #include

void delete(char s[], char c);

void insert(char s[],char c1,char c2); main()

{ char s[50]=\ int i,p,k;

printf (\ scanf (\&op); switch (op)

{ case 'D': scanf (\

case 'I': scanf(\insert (s,c1[0],c2[0]); break; default: printf (\ }

printf (\}

void delete (char s[], char c) { int i,n=-1;

for (i=0;s[i]!='\\0';i++)

if(s[i]==c){ n=i; (1) ;} if(n==-1)

{ printf (\ for (i=n; s[i]!='\\0'; i++)

s[i]= (2) ; }

void insert (char s[],char c1,char c2) { int i,n=-1,m;

13

for (i=0;s[i]!='\\0';i++)

if (s[i]==c1) n=i; if(n==-1)

{ printf (\ m=strlen(s);

for(i=m;i>n;i--) s[i]=s[i-1];

(3) ; }

参考答案:

1.(1) &b[n-1-i] (2) a[i]>b[j] (3) c[k]=a[i] 2.(1) k+5 (2) x[n] (3) x[i]

3.(1) (f+1)%(n+1) (2) (r+1)%(n+1) (3) f!=r

4.(1) char *a 或 char a[] (2) a[i]>='a'&&a[i]<=’z’或 islower(a[i]) (3) return a 5.(1) break (2) s[i+1] (3) s[n]=c2

14

本文来源:https://www.bwwdw.com/article/68ct.html

Top