printf(“%d,”,y[i]);
}
程序运行后的输出结果是()。
A.2,4,8, B.3,6,9,
C.3,5,7, D.1,3,5,
【解析】B。
fun函数功能是把数组a的每一行的最大值赋给b,a的第一行的最大值是3,第二行的最大值是6,第三行的最大值是9,所以答案是3,6,9。
29.有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数):
#include
#include
main()
{chara[10]="abc",b[10]="012",c[10]="xyz";
strcpy(a+1,b+2);
puts(strcat(a,c+1));
}
程序运行后的输出结果是()。
A.al2xyz B.12yz C.a2yz D.bc2yz
【解析】C。
第一次执行字符串的复制函数后,字符串a中的值是a2,第二次执行的是字符串的连接函数,连接后,a字符串变成了a2yz,再输出,所以运行结果为a2yz。
本题最主要的是了解字符串名加一个整型常量所代表的字符串是什么,比如:
有chara[10]="abc";定义,则字符串a的值是abc;而字符串a+1的值是bc;字符串a+2的值是c;字符串b+3的值是\0,即不空串。
30.以下选项中,合法的是()。
A.charstr3[]={’d’,’e’,’b’,’u’,’g’,’\0’};
B.charstr4;str4="helloworld";
C.charname[10];name="china";
D.charstrl[5]="pass",str2[6];str2=strl;
【解析】A。
选项B不能把一个字符串赋值给一个字符变量str4;选项C和D犯了同样的错误是把字符串赋给了数组名,数组名是一个指针常量,常量是不能被赋值的。
31.有以下程序:
#include
main()
{char*s="[2]34";intk=0,a=0;
while(s[k+1]!
=’\0’)
{k++;
if(k%2==0){a=a+(s[k]-’0’+1);continue;}
a=a+(s[k]-’0’);
printf("k=%da=%d\n",k,a);
}
程序运行后的输出结果是()。
A.k=6a=11B.k=3a=14
C.k=4a=12D.k=5a=15
【解析】C。
输出结果:
k=1a=2
k=2a=4
k=3a=7
k=4a=12
32.有以下程序:
#include
main()
{chara[5][10]={"one","two","three","four","five"};
inti,j;
chart:
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(a[i][0]>a[j][0])
{t=a[i][0];a[i][0]=a[j][0];a[j][0]=t;}
puts(a[1]);
}
程序运行后的输出结果是()。
A.fwo B.fix C.two D.owo
【解析】A。
for循环完成的功能是把二维数组a的第一列的字母按从小到大排序,其他列的字母不变。
排序方法是类冒泡排序。
33.有以下程序:
#include
inta=1,b=2;
voidfunl(inta,intb)
{printf("%d%d",a,b);}
voidfun2()
{a=3;b=4;}
main()
{funl(5,6);fun2();
printf("%d%d\n",a,b);
}
程序运行后的输出结果是()。
A.1256 B.5634
C.5612 D.3456
【解析】B。
funl是输出局部变量的值,fun2是把全局变量的值改成3和4,所以输出的结果是5634。
当全局变量与局部变量同名时,在重叠的作用域中,局部变量起作用(可怜原则,即谁的作用域小谁就在重叠的作用域中起作用)。
34.有以下程序:
#include
voidfunc(intn)
{staticintnum=1;
num=num+n;printf("%d",num);
}
main()
{func(3);func(4);printf("\n");}
程序运行后的输出结果是()。
A.48 B.34 C.35 D.45
【解析】A。
第一调用func函数时输出4,第二次调用func函数时num的值并不会释放,仍然是上次(第一次调用func函数时)修改后的值4,第二次调用结果为8,所以输出结果是48。
本题考的是静态局部变量的作用域与生存期(存放在静态存储区)不一致的情况,第一次调用完后,静态局部变量num的值为4,存放到静态存储区,函数func执行结束,其作用域消失,但存放在静态存储区的num变量的值4还在,但仍然不能拿出来用,只能等下次再进入作用域时,即第二次调用函数func时,又进入静态局部变量num的作用域,此时,变量num又可以拿出来使用,由于已经存在静态存储区,所以不用重新定义该变量,可以直接从静态存储区取出变量num的值(4)来使用,所以第二次调用后,num的值变成了8。
35.有以下程序:
#include
#include
voidfun(int*pl,int*p2,int*s)
{s=(int*)malloc(sizeof(int));
*s=*pl+*p2;
free(s);
}
main()
{inta=1,b=40,*q=&a;
fun(&a,&b,q);
printf("%d\n",*q);
}
程序运行后的输出结果是()。
A.42 B.0 C.1 D.41
【解析】C。
fun函数功能是新开辟内存空间(地址s)存放a和b的值(通过&a、&b将地址复制给p1、p2),q的地址并没有变化,所以应该还是指向地址a。
36.有以下程序:
#include
structSTU{charname[9];charsex;intscore[2];};
voidf(structSTUa[])
{structSTUb={"Zhao",’m’,85,90);
a[1]=b;
}
main()
{structSTUc[2]={{"Qian",’f’,95,92},{"Sun",’m’98,99}};
f(c);
printf(”%s,%c,%d,%d,¨,c[0].name,c[0].sex,c[0].score[0],c[o].score[1]);
printf("%s,%c,%d,%d\n",c[1].name,c[1].sex,c[1].score[o],c[1].score[1]);
}
程序运行后的输出结果是()。
A.Zhao,m,85,90,Sun,m,98,99
B.Zhao,m,85,90,Qian,f,95,92
C.Qian,f,95,92,Sun,m,98,99
D.Qian,f,95,92,Zhao,m,85,90
【解析】D。
f函数是为结构体数组的第二个元素(结构体类型的元素)赋值,数组的第一个元素没有变化,所以正确答案应选D。
37.以下叙述中错误的是()。
A.可以用typedef说明的新类型名来定义变量
B.typedef说明的新类型名必须使用大写字母,否则会出编译错误
C.用typedef可以为基本数据类型说明一个新名称
D.用typedef说明新类型的作用是用一个新的标识符来代表已存在的类型名
【解析】B。
typedef是用来定义新类型,或定义原有类型的别名(新名称)。
用typedef说明的类型不是必须用大写,而是习惯上用大写。
38.以下叙述中错误的是()。
A.函数的返回值类型不能是结构体类型,只能是简单类型
B.函数可以返回指向结构体变量的指针
C.可以通过指向结构体变量的指针访问所指结构体变量的任何成员
D.只要类型相同,结构体变量之间可以整体赋值
【解析】A。
函数返回值类型可以是简单类型和结构体类型。
39.若有定义语句intb=2;,则表达式(b<<2)/(3‖b)的值是()。
A.4 B.8 C.0 D.2
【解析】B。
2的二进制数为010,移两位后的二进制数为01000,转成十制数为8,(3||2)为真即1,8/1=8,所以结果为8。
40.有以下程序:
#include
main()
{FILE*fp;inti,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w+");
for=(i=0;i<6;i++)fpintf(fp,"%d\n",a[i]);
rewind(fp);
for(i=0;i<6;i++)fscanf(fp,"%d",&a[5-i]);
fclose(fp);
for(i=0;i%6;i++)printf("%d,",a[i]);
}
程序运行后的输出结果是()。
A.4,5,6,1,2,3,
B.1,2,3,3,2,1,
C.1,2,3,4,5,6,
D.6,5,4,3,2,1,
【解析】D。
这个是对文件的操作,把数组的数写到文件里,然后再从文件里倒序读出。
所以输出结果为6,5,4,3,2,1。
二、基本操作题(共18分)
str是一个由数字和字母字符组成的字符串,由变量num传入字符串长度。
请补充函数proc(),该函数的功能是:
把字符串str中的数字字符转换成数字并存放到整型数组bb中,函数返回数组bb的长度。
例如,str="abcl23de45f967",结果为:
l234567。
注意:
部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#defineM80
intbb[M];
intproc(charstr[],intbb[],intnum)
{
inti,n=0;
for(i=0;iif(【1】)
{
bb[n]=【2】;
n++;
}
}
return【3】;
}
voidmain()
{
charstr[M];
intnum=0,n,i;
printf("Enterastring:
\n");
gets(str);
while(str[num]) num++;
n=proc(str,bb,num);
printf("\nbb=");
for(i=0;i}
答案:
【1】str[i]>=’0’&&str[i]<=’9’【2】str[i]-’O’【3】n
【解析】题目中要求把字符串str中的数字字符转换成数字并存放到整型数组bb中。
首先,应判断字符串str中每个字符是否是数字字符。
因此,【1】处填“str[i]>=’0’&&str[i]<=’9’”将每一个数字字符转化为数字放在整型数组bb中,因此,【2】处填“str[i]-’0’;由函数proc()可知,变量n中存放整型数组bb中的元素个数,最后要返回到主函数当中,因此,【3】处填’n’。
三、程序改错题(共24分)
下列给定程序中,函数proc()的功能是:
读入一个字符串(长度<20),将该字符串中的所有字符按ASCIl码升序排序后输出。
例如,输入opdye,则应输出deopy。
请修改程序中的错误,使它能得到正确结果。
注意:
不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
//****found****
intproc(charstr[])
{
charc;
unsignedi,j;
for(i=0;ifor(j=i+1;jif(str[i]>str[j])
{
c=str[j]:
//****found****
str[j]=str[i++];
str[i]=c;
}
}
voidmain()
{
charstr[81];
system("CLS");
printf("\nPleaseenteracharacterstring:
");
gets(str);
printf("\nknBeforesorting:
\n%s",str);
proc(str);
printf("\nAftersortingdecendingly:
\n %s",str);
}
(1)错误:
intproc(charstr[])
正确:
voidproc(charstr[])
(2)错误:
str[j]=str[i++];
正确:
str[j]=str[i];
【解析】由主函数中的函数调用可知,函数proc()没有返回值。
因此,“intproc(charstr[])”应改为“voidproc(charstr[])”;由函数proc()可知,if语句块完成将字符串str中的第i个元素与第j个元素相交换。
因此,“str[j]=str[i++];”应改为“str[j]=str[i];”。
四、程序设计题(共18分)
请编写函数proc(),它的功能是计算:
s=(ln
(1)+ln
(2)+ln(3)+…+ln(m))的平方根。
在C语言中可调用log(n)函数求ln(n)。
例如,若m的值为30,则proc()函数值为8.640500。
注意:
部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填人所编写的若干语句。
试题程序:
#include
#include
#include
doubleproc(intm)
{
}
voidmain()
{
system("CLS");
printf("%f\n",proc(30));
}
答案:
doubleproc(intm)
{
inti;
doubles=0.0;/*s是用来存放其和*/
for(i=1;i<=m;i++)
s=s+log(i);/*计算s=ln
(1)+ln
(2)+ln(3)+…+ln(m)*/
returnsqrt(s);/*最后将其开平方的值返回到主函数中*/
}
【解析】由题目中所给表达式可知,表达式的值为m项表达式的和然后开平方。
可以首先通过m次循环求得m项表达式的和,然后将其和开平方并返回到主函数当中。