C语言习题(详细解答) 下载本文

内容发布更新时间 : 2024/5/5 23:47:09星期一 下面是文章的全部内容请认真阅读。

}

程序运行后的输出结果是____。参考答案:123569

【解析】当i=0时,j=0、1、2时满足条件,则打印a[0][0]、a[0][1]、a[0][2];当i=1时,j=1、2时满足条件,则打印a[1][1]、a[1][2];当i=2时,j=2时满足条件,则打印a[2][2],所以打印结果为123569。 7.有以下程序:

#include main()

{ char a[20]=\?\,b[20]; scanf(\,b);printf(\,a,b); }

程序运行时从键盘输入:How are you?<回车> 则输出结果为____。参考答案:How are you? How

【解析】用%s格式输入字符串时,空格和回车都作为输入数据的分隔符,不能被读入,因此数组b的输出结果为How。 第07章 一.选择题 1.有以下程序:

#include main()

{ int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r;

printf(\,%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

【解析】 m和n的值不变,输出结果为1,2。指针*p和*q交换了指向的位置,即*p=&n,*q=&m,输出结果分别为2,1。 2.以下程序段完全正确的是

A)int*p; scanf(\,&p); B)int*p; scanf(\,p);

C)int k,*p=&k; scanf(\,p); D)int k,*p; *p=&k; scanf(\,p);

【解析】A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。B)选项没有指定指针p应该指向的变量,没给变量赋初值。D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。

3.以下定义语句中正确的是。 A)int a=b=0;

B)char A=65+1,b=′b′; C)float a=1,*b=&a,*c=&b; D)double a=0.0;b=1.1;

【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开。因此选项A)和D)错误;在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b;所以正确答案为B)。 4.若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是________。 A)scanf(\,x,y); B)scanf(\,&y);

指针

16

C)scanf(\,px,py); D)scanf(\,x,y);

【解析】 本题考查scanf函数,其格式为:scanf(\控制格式\,地址表列)。其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种,一种是使用取地址符号\,即&x和&y,另一种是使用指针变量,即px和py。选项A)和D)中地址表列表示错误;选项B)中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C)。 5.有以下程序:

#include main()

{ int a[ ]={1,2,3,4},y,*p=&a[3]; --p;y=*p;printf(\=%d\\n\,y); }

程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3

【解析】在程序中指针变量p初始指向a[3],执行p减1后,p指向a[2],语句y=*p的作用是把a[2]的值赋给变量y,所以输出为y=3。正确答案为D)。 6.下列函数的功能是________。

fun(char *a,char *b)

{ while((*b=*a)!='\\0') {a++;b++;}} A)将a所指字符串赋给b所指空间 B)使指针b指向a所指字符串

C)将a所指字符串和b所指字符串进行比较 D)检查a和b所指字符串中是否有'\\0'

【解析】 表达式*b=*a是将a所指的字符赋给b所指的空间,然后,指针a和b依次后移,直到到达指针a所指字符串的结尾。 7.设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是________。 A)char str[]=\;c=str; B)scanf(\,c); C)c=getchar(); D)*c=\;

【解析】 选项B)、D)中,没有为字符串分配空间,因此不能用c指向字符串。选项C)中getchar()函数返回一个字符,不能将字符赋给字符指针c。选项A)中首先定义了字符数组str,然后将str的首地址赋给指针c,这样就使指针c指向了字符串\。 8.有以下程序

#include main()

{ char s[]=\; printf(\,*s+2); }

程序运行后的输出结果是 A)tuv B)字符t的ASCII码值 C)t D)出错

【解析】*s+2 相当于(*s)+2即先取出s所指的数据然后对其加2,s是字符串的首地址,所以*s即s[0]就是字符\,所以在

17

它的ASCII码上加上数字2就变成了字母\的ASCII码,所以以%c格式输出,即为选项C)。 9.下列语句组中,正确的是

A)char *s;s=\ B)char s[7];s=\C)char *s;s={\ D)char s[7];s={\

【解析】若s被定义为指针,选项A表示将指针s指向一个字符串,选项C表示为指针s赋一个字符串的值,显然选项A正确,选项C错误;若s被定义为数组,且要为该数组直接赋值,则必须在定义时进行,因此选项B和选项D都错误。 二.填空题

1.以下程序的功能是:借助指针变量找出数组元素中的最大值及其元素的下标值。请填空。

#include main() {int a[10],*p,*s;

for(p=a;p-a<10;p++)scanf(\

for(p=a,s=a;p-a<10;p++) if(*p>*s) s=______; printf(\} 参考答案:p

【解析】s指向当前最大的元素,当*p>*s时,表示当前p所指向的那个元素比s指向的元素大,则s应该记录当前最大的元素的地址。 2.有以下程序

#include main()

{ int a[]={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i]; printf(\ i++; } }

程序运行后的输出结果是______。参考答案:135

【解析】当i=0时,k[0]=&a[0];当i=1时,k[1]=&a[2];当i=2时,k[2]=&a[4],则打印结果为135。

3.以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。请在输出语句中填写代表最大值的输出项。

#include main()

{ int a[10],*p,*s;

for(p=a;p-a<10;p++) scanf(\,p); for(p=a,s=a;p-a<10;p++) if(*p>*s) s=p; printf(\=%d\\n\,______ ); }

参考答案:*s

【解析】因为题目中有 if(*p>*s) s=p;语句,可知如果p所指的元素的值比s所指的元素的值大,就把指针p的地址赋予指针s,即s指向当前值最大的元素,所以最后应该输出的元素的值为*s。 第08章 一.选择题

1.以下叙述正确的是。

函数

18

A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用,例如:fun(fun(x)) C)C语言函数不可以单独编译

D)C语言中除了main函数,其他函数不可作为单独文件形式存在

【解析】C语言中只有函数没有过程,故选项A错误;C语言可以嵌套调用,故选项B正确;C语言函数可以单独编译成.dll文件,故选项C错误;C语言中除main函数以外,其他函数可作为单独文件形式存在,故选项D也错误。 2.有以下程序:

#include int fun(int a,int b) { if(b==0) return a;

else return(fun(--a,--b)); } main()

{ printf(\,fun(4,2));} 程序的运行结果是________。 A)1 B)2 C)3 D)4

【解析】该题目考查函数参数传递以及if条件语句。当变量b为0时,将a的值返回给主调函数,因此a进行两次自减1后,将其值返回并输出。

3.下面的函数调用语句中func函数的实参个数是________。

func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8))); A)3 B)4 C)5 D)8

【解析】C语言函数定义中,参数列表之间使用逗号分隔。该题目中func的函数列表中使用两个逗号,将3个参数分隔开。 4.有以下程序:

#include void fun(int *a,int *b) { int *c;

c=a;a=b;b=c; } main()

{ int x=3, y=5, *p=&x, *q=&y; fun(p,q);printf(\,%d,\,*p,*q); fun(&x,&y);printf(\,%d\\n\,*p,*q); }

程序运行后的输出结果是________。 A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3

19

【解析】 子函数fun功能为交换形式参数的值,即交换指针变量a和b的值。但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并且不能影响p和q指针指向的数据,因此第二个printf语句的输出为3,5。 5.有以下程序:

#include int f(int x,int y) {return((y-x)*x);} main()

{ int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(\,d); }

程序运行后的输出结果是________。 A)10 B)9 C)8 D)7

【解析】 将a、b、c的值分别带入f(a,b)和f(a,c)中计算得:f(a,b)=3,f(a,c)=6,再计算f(3,6),算出d=9。 6.有以下程序:

#include int fun(int x,int y) { if(x==y)return(x); else return((x+y)/2); } main()

{ int a=4,b=5,c=6; printf(\,fun(2*a,fun(b,c))) }

则运行结果为。 A)3 B)6 C)8 D)12

【解析】函数fun的功能是求两个整数的平均值,返回值仍为整数。5和6的平均取整后为5,8和5的平均取整后为6。因此,本题答案为B)。 7.有以下程序

#include int f(int X); main()

{ int n=1,m;

m=f(f(f(n)));printf(\,m); } int f(int x) { return x*2;} 程序运行后的输出结果是

A)1 B)2 C)4 D)8

20