C语言期末复习必备资料1.docx
《C语言期末复习必备资料1.docx》由会员分享,可在线阅读,更多相关《C语言期末复习必备资料1.docx(151页珍藏版)》请在冰豆网上搜索。
C语言期末复习必备资料1
1、函数fun的功能是计算x^n。
doublefun(doublex,intn)
{inti;doubley=1;
for(i=1;i<=n;i++)y=y*x;
returny;
}
主函数中已经正确定义m、a、b变量并赋值,并调用fun函数计算:
m=a^4+b^4-(a+b)^3。
实现这一计算的函数调用语句为______。
答案:
1:
fun(a,4)+fun(b,4)-fun((a+b),3)
评析:
函数fun的功能是计算x的n次方,所以a的4次方的调用函数应当为fun(a,4),b的4次方的调用函数应当为fun(b,4),(a+b)的3次方的调用函数应当为fun((a+b),3),所以,实现m=a^4+b^4-(a+b)^3这一计算的函数458调用语句为:
fun(a,4)+fun(b,4)-fun((a+b),3);。
知识点:
知识点/函数/破函数的正确调用,嵌套调用,递归调用
2、以下sstrcpy()函数实现字符串复制,即将t所指字符串复制到s所指内存空间中,形成一个新字符串s。
请填空。
voidsstrcpy(char*s,char*t)
{while(*s++=______);}
main()
{charstr1[100],str2[]="abcdefgh";
sstrcpy(str1,str2);
printf("%s\n",str1);
}答案:
1:
*t++
评析:
要使sstrcpy()函数实现字符串复制,必须将t字符串中的每个字符逐个拷到s字符串中,所以可以使用*s=*t;s++;t++。
或者可以写成*s++=*t++,本题只有一个空,可以填入*t++。
知识点:
知识点/指针/用指针作函数参数
3、以下程序给指针p分配三个double型动态内存单元,请填空。
#include
main()
{double*p;
p=(double*)malloc(______);
p[0]=1.5;p[1]=2.5;p[2]=3.5;
printf("%f%f%f\n",p[0],p[1],p[2]);
}答案:
1:
3*sizeof(double)
评析:
malloc(size)在内存的动态存储区中分配一个长度为size的连续空间。
此函数的值(即"返回值")是一个指针,它的值是该分配域的起始地址。
如果此函数未能成功地执行,则返回值为0。
本题中要求分配三个double型动态内存单元,所以size处应当为3*sizeof(double)。
知识点:
知识点/指针/各类型的指针及指针变量,通过指针引用各类型数据
4、以下程序运行后的输出结果是______。
main()
{inta,b,c;
a=25;
b=025;
c=0x25;
printf("%d%d%d\n",a,b,c);
}答案:
252137
评析:
本题考查的是格式字符的输出。
变量a、b、c分别为十进制、八进制、十六进制的25,格式字符d所代表的含义是,以带符号的十进制形式输出整数(正数不输出符号),所以本题a=25则输出值为25;b=025转换为10进制:
b=2*8+5=16+5=21,则输出的值为21;c=0x25转换为10进制:
c=2*16+5=32+5=37,则输出的值为37,而且printf中三个%d之用的是空格,所以输出的几个数字之间也必须是空格。
知识点:
知识点/函数/变量的存储类别,变量的作用域和生存期
5、以下程序运行后的输出结果是______。
main()
{chara[]="Language",b[]="Programe";
char*p1,*p2;intk;
p1=a;p2=b;
for(k=0;k<=7;k++)
if(*(p1+k)==*(p2+k))printf("%c",*(p1+k));
}答案:
gae
评析:
本题考查的是字符指针变量与字符数组。
解题过程:
(1)当k=0时,*(p1+0)='L',*(p2+0)='P',L!
=P,所以没有输出
(2)当k=1时,*(p1+1)='a',*(p2+1)='r',a!
=r,所以没有输出
(3)当k=2时,*(p1+2)='n',*(p2+2)='o',n!
=o,所以没有输出
(4)当k=3时,*(p1+3)='g',*(p2+3)='g',g==g,所以输出g
(5)当k=4时,*(p1+4)='u',*(p2+4)='r',u!
=r,所以没有输出
(6)当k=5时,*(p1+5)='a',*(p2+5)='a',a==a,所以输出a
(7)当k=6时,*(p1+6)='g',*(p2+6)='m',g!
=m,所以没有输出
(8)当k=7时,*(p1+7)='e',*(p2+7)='e',e==e,所以输出e
(9)当k=8时结束循环
(10)输出结果为:
gae。
知识点:
知识点/数组的定义和引用/字符串与字符数组
6、以下程序通过函数SunFun和f(x),x=0到10,这里f(x)=x^2+1,由F函数实现,请填空。
main()
{printf("Thesun=%d\n",SunFun(10));}
SunFun(intn)
{intx,s=0;
for(x=0;x<=n;x++)s+F(______);
returns;
}
F(intx)
{return(______);}
答案:
1:
x
2:
x*x+1
评析:
本题考查的是函数的调用。
解题过程:
(1)f(x)的含义为x的平方加上1
(2)所以F(intx)的返回值应该为x*x+1
(3)SunFun(10)的作用是将0到10之间所有的整数相加求和
(4)所以F()的形式参数为x。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
7、以下程序中,函数SumColumMin的功能是:
求出M行N列二维数组每列元素中的最小值,并计算它们的和值。
和值通过形参传回主函数输出。
请填空。
#defineM2
#defineN4
voidSumColumMin(inta[M][N],int*sum)
{inti,j,k,s=0;
for(i=0;i{k=0;
for(j=1;jif(a[k][i]>a[j][i])k=j;
s+=______;
}
______=s;
}
main()
{intx[M][N]={3,2,5,1,4,1,8,3},s;
SumColumMin(______);
printf("%d\n",s);
}答案:
1:
a[k][i]
2:
*sum
3:
x,&s
评析:
本题考查的是函数参数的传送。
解题过程:
(1)执行以i为变量的for语句
1)k=0
2)执行以j为变量的for语句
①当j=1
②比较a[0][0]和a[1][0]的大小,如果a[0][0]大于a[1][0]则k=1;如果a[0][0]大于a[1][0]则k=0
③j=2所以结束循环
3)此时a[k][i]就代表第一列中最小的值,要累计所有列中的最小值的和,应该在第一空内填写a[k][i],用变量s累加。
(2)SumColumMin是一个无返回值的函数,其中形式参数*sum是一个指针类型,所以第二空应该填写*sum,用来将该指针变量指向s
(3)当主函数main调用SumColumMin时,需要两个实际参数,一个代表被操作的数组,一个为指向累计和的指针变量,所以第三个空应该为x,&s,分别代表已经被定义的数组x,和整型变量s的地址。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
8、以下程序的输出结果是。
main()
{
inta=0;
a+=(a=8);
printf("%d\n",a);
}答案:
16
评析:
本题的考查点是表达式。
表达式a+=8相当于a=a+8,对表达式逐步求解过程如下:
a+=(a+8)此时,a的值赋值为8,而不再是0;
a+=8
a=a+8
a=16
故本题答案为16。
知识点:
知识点/函数/形式参数与实在参数,参数值的传递
9、以下程序的输出结果是______。
#defineMAX(x,y)(x)>(y)?
(x):
(y)
main()
{
inta=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
printf("%d\n",t);
}答案:
7
评析:
本题的考查点是宏定义。
宏替换后,表达式t=MAX(a+b,c+d)*10即变为:
t=(a+b)>(c+d)?
(a+b):
(c+d)*10;
由于(a+b)>(c+d)为真,所以t=(a+b),即为7。
故本题答案为:
7。
知识点:
知识点/编译预处理/宏定义:
不带参数的宏定义;带参数的宏定义
10、函数mycmp(char*s,char*t)的功能是比较字符串s和t的大小,当s等于t时返回0,当s>t返回正值,当s请填空。
mycmp(char*s,char*t)
{while(*s==*t)
{if(*s=='\0')return0;
++s;++t;
}
return(______);
}答案:
*s-*t
评析:
本题的考查点是比较字符串的大小。
函数的两个形参是两个字符指针变量,字符串的首地址是指针变量的值,*s和*t表示字符串数组s和t的第一个字符,在while循环中,是通过s和t值的不断变化改变两个串的第一个字符,要返回s和t的第一个不同字符的ASCII码的差值,必须使用"*s-*t"得出。
故本题答案为:
*s-*t。
知识点:
知识点/函数/库函数的正确调用
11、若给fun函数的形参s传送字符串:
"6354abc",则函数的返回值是______。
(字符串中包括空格)
longfun(chars[])
{longn;intsign;
for(;isspace(*s);s++);
sign=(*s=='-')?
-1:
1;
if(*s=='+'||*s=='-')s++;
for(n=0;isdigit(*s);s++)
n=10*n+(*s-'0');
returnsign*n;
}答案:
6354
评析:
本题的考查点是函数的返回值。
这个函数的目的是提取出由函数的形参传送来的字符串中的数字字符,并通过相应各个字符位置计算出它们数值形式的幂,最后返回字符串中的数字字符的数值形式,所以函数的返回值应当是"6354"。
故本题答案为:
6354。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
12、以下程序段的输出结果为______。
char*p;inti,d;
p="PDP1-0";
for(i=0;i<7;i++)
{
d=isdigit(*(p+i));
if(d!
=0)
printf("%c\n",*(p+i));
}答案:
1
评析:
本题的考查点是函数isdigit()。
这段程序的目的是按从左至右的顺序从字符串p中找出阿拉伯数字字符,如果找到,将其打印出来。
最后的输出应当是:
1
0
知识点:
知识点/函数/库函数的正确调用
13、下列程序中字符串中各单词之间有一个空格,则程序的输出结果是______。
#include
main()
{charstr1[]="Howdoyoudo",*p1=str1;
strcpy(str1+strlen(str1)/2,"esshe");
printf("%s\n",p1);
}答案:
Howdoesshe
评析:
本题的考查点是字符串拷贝函数strcpy()。
strlen(str1)是求str1字符串的长度,为13,然后,进行除2运算,结果为6。
strcpy()函数是把字符串"esshe"拷贝到str1后的第6个字符后面,也就是说,拷贝后的结果是"Howdoesshe"。
故本题答案为:
Howdoesshe。
知识点:
知识点/函数/库函数的正确调用
14、下面的函数strcat(str1,str2)实现将字符串str2拼接到字符串str1后面的功能。
请填空使之完整。
char*strcat(str1,str2)
char*str1,*str2;
{char*t=str1;
while(______)str1++;
while(______);
return(t);}
答案:
1:
*str1!
='\0'
2:
*str1++=*str2++
评析:
本题的考查点是字符串连接函数strcat()。
函数strcat(str1,str2)实现将字符串str2连接到字符串str1后面,所以首先要找到字符串str1的串尾,根据C语言的语法规定,一个串的串尾一定是一个隐含字符"\0",而在程序中,对字符串中字符的访问是通过两个指针变量来完成的,因此要找到字符串str1的串尾,要判断*str1是否为"\0",要找到字符串str2的串尾,要判断*str2是否为"\0",程序中必须可以使字符串中字符逐一顺序体现,所以在题中我们应填写"*str1"和"*str1++=*str2++"。
知识点:
知识点/函数/库函数的正确调用
15、以下程序的输出结果是______。
voidfun()
{staticinta=0;
a+=2;printf("%d",a);
}
main()
{intcc;
for(cc=1;cc<4;cc++)fun();
printf("\n");
}答案:
246
评析:
循环for(cc=1;cc<4;cc++)被执行了3次。
在函数fun中,由于a是static型变量,所以函数第1次调用后,a=2;第2次调用后,a=4;第3次调用后,a=6。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
16、若要使指针p指向一个double类型的动态存储单元,请填空。
p=______malloc(sizeof(double));
答案:
(double*)
评析:
函数malloc返回的是void*而不是double类型指针。
所以要使指针p指向一个double类型的存储单元就必须进行强制类型转换。
知识点:
知识点/函数/函数的类型和返回值
17、下列程序段的输出结果是______。
main()
{charb[]="Hello,you";
b[5]=0;
printf("%s\n",b);
}答案:
Hello
评析:
字符串中,数值0或符号'\0'表示字符串的结束。
本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。
因此,只输出前五个字符,即Hello。
知识点:
知识点/数组的定义和引用/一维数组和多维数组的定义、初始化和引用
18、下列程序的输出结果是______。
voidfun(int*n)
{while((*n)--);
printf("%d",++(*n));
}
main()
{inta=100;
fun(&a);
}答案:
0
评析:
在函数fun()中,while((*n)--)是先引用*n的值,再做(*n)--运算,所以循环结束时*n的值为0,再做(*n)--运算后,*n的值为-1;执行++(*n)后,*n的值是0。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
19、以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出每一行上的最大值。
请填空:
#defineN3
#defineM4
voidLineMax(intx[N][M])
{inti,j,p;
for(i=0;i{p=0;
for(j=1;jif(x[i][p]printf("Themaxvalueinline%dis%d\n",i,______);
}
}
main()
{intx[N][M]={1,.5,7,4,2,6,4,3,8,2,3,1};
______;
}答案:
1:
p=j
2:
a[i][p]
3:
LineMax(x)
评析:
LineMax函数中运用了两个循环,外循环来控制数组的行,内循环控制列,在寻找每行最大的元素时,先把每行的第一个元素列下标即0赋给p,然后把后面的数逐一与之比较,如果大于它,则把大的数的列下标重新赋给p。
所以
(1)处应该填p=j;
内循环结束后,便获得了本行中最大的数,即a[i][p],这也就是
(2)处应该填写的答案;
而(3)处,很显然是要调用函数,关键就在于参数怎么写,函数中需要的是整个数组,所以应该把数组名做为实参,传递过去,(3)处的答案应该是LineMax(x)。
注意大小写,C语言中大小写是不等价的。
知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
20、若有如下结构体说明:
structSTRU
{inta,b;charc:
doubled;
structSTRU*p1,*p2;
};
请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。
______t[20]
答案:
structSTRU
评析:
本题主要考查考生对C语言中结构体的掌握。
结构体类型是构造数据类型,是用户自已定义的一种类型。
结构体类型的定义:
struct结构体类型名
{
成员项表;
};
定义结构体变量的的形式为:
struct结构体类型名 变量1,变量2,...
其中变量包括:
一般变量、指针变量、数组变量等。
知识点:
知识点/数组的定义和引用/一维数组和多维数组的定义、初始化和引用
21、以下程序运行后的输出结果是______。
voidfun(intx,inty)
{x=x+y;y=x-y;x=x-y;
printf("%d,%d,",x,y);}
main()
{intx=2,y=3;
fun(x,y);
printf("%d,%d\n",x,y);
}答案:
3,2,2,3
评析:
本题的考查点是交换变量的值。
被调函数fun()实现的功能是交换变量x和y的值并打印,由于该函数无返回值,所以在主函数中打印出的x和y的值仍然为2,3。
故本题答案为:
3,2,2,3。
知识点:
知识点/函数/形式参数与实在参数,参数值的传递
22、下面程序的运行结果是:
______。
#defineN10
#defines(x)x*x
#definef(x)(x*x)
main()
{inti1,i2;
i1=1000/s(N);i2=1000/f(N);
printf("%d%d\n",i1,i2);
}答案:
100010
评析:
本题的考查点是宏定义。
根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*10)=10。
故本题答案为:
1000和10。
知识点:
知识点/编译预处理/宏定义:
不带参数的宏定义;带参数的宏定义
23、下面程序的运行结果是:
______。
voidswap(int*a,int*b)
{int*t;
t=a;a=b;b=t;
}
main()
{intx=3,y=5,*p=&x,*q=&y;
swap(p,q);
printf("%d%d\n",*p,*q);
}答案:
35
评析:
本题的考查点是函数调用。
观察本题的程序可以看出,被调函数swap()实现的功能是交换变量的值,但由于函数不返回任何值,所以在main()函数中打印出的变量的值并没有发生交换,即仍为3和5。
故本题答案为:
3和5。
知识点:
知识点/函数/函数的类型和返回值
24、fun函数的功能是:
首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。
请填空。
#include
#defineN100
intfun(int(*a)[N])
{introw,col,max,min;
for(row=0;row{for(max=a[row][0],col=1;colif(______)max=a[row][col];
if(row==0)min=max;
elseif(______)min=max;
}
returnmin;
}答案:
1:
max2:
max评析:
本题的考查点是求矩阵最大值的算法。
本题中的第一空要求判断出每一行中的最大数,应该填写条件max故本题答案为:
max知识点:
知识点/函数/函数的正确调用,嵌套调用,递归调用
25、以下程序的输出结果是______。
#defineMCRA(m)2*m
#defineMCRB(n,m)2*MCRA(n)+m
main()
{inti=2,j=3;
printf("%d\n",MCRB(j,MCRA(i)));
}答案:
16
评析:
本题的考查点是带参数的宏定义。
带参数的宏定义是这样展开置换的:
在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换。
如果串中包含形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符,则保留。
因此对MCRB(j,MCRA(i))进行宏展开就得到了2*MCRA(j)+MCRA(i),即:
2*2*j+2*i=2*2*3+2*2=16。
故本题答案为:
16。
知识点:
知识点/编译预处理/宏定义:
不带参数的宏定义;带参数的宏定义
26、以下程序的功能是调用函数fun计算:
m=1-2+3-4+…+9-10,并输出结果。
请填空。
intfun(intn)
{intm=0,f=1,i;
for(i=1;i<=n;i++)
{m+=i*f;
f=______;
}
returnm;
}
main()
{printf("m=%d\n",______);}
答案:
1:
-f
2:
fun(10)
评析:
本题的考查点是C程序设计。
根据程序写出运行结果。
考察的知识点主要是函数的调用。
本题利用一个fun函数来完成题目要求的计算。
程序中f起的作用是控制i*f的符号,看的出,偶数位都为负值,所以f的值为(-1