《C语言程序设计实验指导与习题集》练习题的参考答案中国铁道出版社期末测试题参考答案.docx
《《C语言程序设计实验指导与习题集》练习题的参考答案中国铁道出版社期末测试题参考答案.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计实验指导与习题集》练习题的参考答案中国铁道出版社期末测试题参考答案.docx(15页珍藏版)》请在冰豆网上搜索。
《C语言程序设计实验指导与习题集》练习题的参考答案中国铁道出版社期末测试题参考答案
附录四期末测试题
一、选择题
1.下面对C语言字符数组的描述中错误的是________。
A.字符数组可以存放字符串
B.字符数组的字符串可以整体输入、输出
C.可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值
D.不可以用关系运算符对字符数组中的字符串进行比较
2.在宏定义#definePI3.14159中,用宏名PI代替一个________。
A.常量B.单精度数C.双精度数D.字符串
3.以下有关宏替换的叙述不正确的是________。
A.宏替换不占用运行时间B.宏名无类型
C.宏替换只是字符替换D.宏名必须用大写字母表示
4.若有语句intw[5]={-4,6,0,-1,9};
则以下说法错误的是_________。
A.w是地址的概念B.编译后,数组w占用连续的储存空间
C.表达式w+3是地址的概念D.表达式*(w+1)的值为-4
5.变量的指针,其含义是指该变量的______。
A.值B.地址C.名称D.一个标志
6.若有语句chars[]=“WELCOME”;
为得到字符串中的字符‘w’,如下_______的引用方法是错误的。
A.s[0]B.*(s+1)C.*sD.*(s+0)
7.若有语句int*point,a=4;
point=&a;
下面均代表地址的一组选项是________。
A.a,point,*&aB.&*a,&a,*point
C.*&point,*point,&aD.&a,&*point,point
8.若有赋值语句x=2,y=3;,则x&y的位运算结果是_______。
A.0B.2C.3D.5
9.用feof(fp)函数判断文件是否结束时,如果文件结束,则函数值为________。
A.1B.‘\0’C.0D.NULL
10.对于库函数fread(buffer,size,count,fp),关于参数buffer的描述正确的是_____。
A.buffer是一个整型变量,代表要读入的数据项总和
B.buffer是一个文件指针,指向要读的文件
C.buffer是一个指向某连续存储空间的指针
D.buffer是fread()函数执行成功的返回值
二、填空题
1.在C语言中供用户使用的内存可分为三部分,全局变量应放在静态存储区中。
2.已知A的ASCII码是65,则printf(“%c”,66)的执行结果为___B__。
3.若有以下定义和语句,则通过指针p引用值为98的数组元素的表达式
是_*(P+5)。
intw[10]={23,54,10,33,47,98,72,80,61},*p;
p=w;
4.宏展开是在预编译时进行的。
5.若用数组名作为函数调用的实参,则传递给形参的是地址。
6.若有以下定义,则引用变量stu中的num成员项的引用方式为stu.num。
struct
{intnum;
charname[10];
intscore;}stu;
7.在C语言中对文件的存取是以字节为单位的。
8.若fopen()函数执行不成功,则返回值为NULL或0。
9.如果文件没结束,feof()函数的返回值为0。
10.在对文件进行操作的过程中,若要求文件的位置指针回到文件的开头,应当调用的库函数是rewind()。
三、阅读程序,写出程序的运行结果
1.f(inta[])
{inti=0;
while(a[i]<=10)
{printf(“%d”,a[i]);
i++;}
}
main()
{inta[]={1,5,10,9,11,7};
f(a+1);
}
输出的结果是5109。
2.main()
{char*s=“121”;
intk=0,a=0,b=0;
do
{k++;
if(k%2==0){a=a+s[k]-‘0’;continue;}
b=b+s[k]-‘0’;a=a+s[k]-‘0’;
}
while(s[k+1]);
printf(“k=%d,a=%d,b=%d\n”,k,a,b);
}
输出的结果是k=2,a=3,b=2。
3.main()
{int**pp,*p,a=10,b=20;
pp=&p;
p=&a;
p=&b;
printf(“%d,%d”,*p,**pp);
}
输出的结果是20,20。
4.#defineDOUBLE(r)r*r
main()
{intx=1,y=2,t;
t=DOUBLE(x+y);
printf(“%d\n”,t);
}
输出的结果是5。
5.main()
{intx[]={0,1,2,3,4,5};
ints,i,*p;
s=0;
p=&x[0];
for(i=1;i<6;i+=2)
s+=*(p+i);
printf("sum=%d",s);
}
输出的结果是sum=9。
6.#include“stdio.h”
main()
{union{longa;
intb;
charc;
}m;
printf(“%d\n”,sizeof(m));
}
输出的结果是4。
7.#include“stdio.h”
cp(char*s,char*t)
{inti=0;
while(t[i]!
=’\0’)
{s[i]=t[i];i++;}
s[i]=’\0’;}
main()
{chara[20],b[10];
scanf(“%s”,b);
cp(a,b);
puts(a);
}
输入:
dcba
输出的结果是dcba。
8.structks
{inta;
int*b;
}s[4],*p;
main()
{intn=1,i;
printf(“\n”);
for(i=0;i<4;i++)
{s[i].a=n;
s[i].b=&s[i].a;
n=n+2;}
p=&s[0];
p++;
printf(“%d,%d\n”,(++p)-->a,(p++)-->a);/*提示:
参数从右向左计算*/
}
输出的结果是7,3。
四、完善程序,在程序的___处,填入正确的内容,使其完整正确
1.下面程序通过函数调用,在一维数组中查找最大值,并输出之。
请填空。
intmax_in_array(inta[],intn)
{
inti;
inttemp=a[0];
for(i=1;iif(a[i]>temp)
temp=a[i];
return(temp);
}
main()
{
intt;
intw[5]={-2,10,1,5,3};
t=max_in_array(w,5);
printf("%d",t);
}
2.count函数的功能是统计一个字符串中英文字母(letter)和其它字符(other)的个数。
count(charstr[],int*letter,int*other)
{inti;
for(i=0;str[i]!
='\0';i++)
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
(*letter)++;
else
(*other)++;
}
main()
{chara[20];
intletter=0,other=0;
gets(a);
count(a,*letter,*other);
printf("小写字母为:
%d,大写字母为:
%d.",letter,other);
}
3.下面程序是对输入的两个整数按大小顺序输出,其中swap()函数的功能是交换两个数。
swap(int*p1,int*p2)
{intp;
p=*p1;
*p1=*p2;
*p2=p;
}
main()
{inta,b;
int*pp1=&a,*pp2=&b;
scanf(“%d,%d”,&a,&b);
if(a
printf(“\n%d,%d”,a,b);
}
4.下面程序average函数的功能是计算10名学生1门课成绩的平均分。
floataverage(float*array)
{inti;floataver,sum=array[0];
for(i=1;i<10;i++)sum+=array[i];
aver=sum/10;
returnaver;
}
main()
{floatscore[10],aver;
inti;
for(i=0;i<10;i++)scanf(“%f”,&score[i]);
aver=average(score);
printf(“平均分为:
%f”,aver);
}
5.下面程序将一个磁盘文件上的信息复制到另一个磁盘文件上去,请填空。
#include"stdio.h"
main()
{
FILE*in,*out;
charinfile[20],outfile[20];
printf("Entertheinfilename:
\n");
scanf("%s",infile);
printf("Entertheoutfilename:
\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{printf("Cannotopeninfile\n");exit(0);}
if((out=fopen(outfile,"w"))==NULL)
{printf("Cannotopenoutfile\n");exit(0);}
while(!
feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
五、程序改错,以下每题都有两个错,写出有错误的程序全行及改正后的程序全行。
1.max()函数的功能是求三个数中的最大数。
max(foata,floatb,floatc)=>正确为:
floatmax(foata,floatb,floatc)
{floatm;
m=a>b?
a:
b;
m=b>c?
b:
c;=>正确为:
m=m>c?
m:
c;
return(m);}
main()
{floata,b,c,m;
scanf("%f,%f,%f",&a,&b,&c);
m=max(a,b,c);
printf("\n最大数为:
%f",m);
}
2.下面程序功能是:
将从键盘输入的英文字符串变成大写的,然后输出该字符串。
#include"stdio.h"
main()
{inti=0;
charp[100];
gets(p);
while(p[i]!
=\0)=>正确为:
while(p[i]!
=’\0’)
{
if(p[i]>='a'&&p[i]<='z')
p[i]=p[i]-32;
i++;}
puts(*p);=>正确为:
puts(p);
}
3.下面程序的功能是实现字符串的连接。
例如,若字符串a[80]=“HELLO!
”,字符串b[10]=“Jone”,则连接后,字符串a成为“HELLO!
Jone”。
voidjoin(char*a,*b)=>正确为:
voidjoin(char*a,char*b)
{inti,j;
char*p1,*p2;
p1=a;p2=b;
while(*p1)p1++;
while(*p2)
{
*p1=*p2;
p1++;p2++;
}
*p1='\0';
}
main()
{char*x="HELLO!
";
char*y="jone";
join(x,&y);=>正确为:
join(x,y);
puts(x);
}
4.下面程序将一个磁盘文件上的信息复制到另一个磁盘文件上去。
#include"stdio.h"
main()
{file*in,*out;=>正确为:
FILE
charch,infile[20],outfile[20];
scanf("%s",infile);/*输入要复制的文件名*/
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{printf("Cannotopeninfile\n");exit(0);}
if((out=fopen(outfile,"w"))==NULL)
{printf("Cannotopenoutfile\n");exit(0);}
while(!
feof(in))
fputc(out,fgetc(in));=>正确为:
fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
5.下面程序的功能是:
用命令行方式显示一个文本文件的内容。
#include"stdio.h"
main(intargc,char*argv[])
{FILE*fp;
charline[81];
if((fp=fopen("argv[1]","r"))==NULL)=>正确为:
argv[1]
{printf("文件未找到.");
exit(0);
}
while(fgets(line,80,fp)!
=NULL)
printf("%s",line);
fclose(*fp);=>正确为:
fclose(fp);
}
六、程序设计
1.将一个十进制的正整数转换成二进制数并输出。
参考程序:
main()
{intm,k,a[20],i=0;
printf("\npleaseenterm:
");
scanf("%d",&m);
while(m)
{a[i++]=m%2;
m=m/2;
}
for(i=i-1;i>=0;i--)
printf("%d",a[i]);
getch();
}
2.从键盘输入一行字符串(<20),按ASCII码值由小到大的顺序排序存放,并输出排序后的字符串。
要求:
在主函数中实现数据的输入与输出,在名为sort的函数中实现排序。
参考程序一:
记录下标的选择法排序
sort(charstr[])
{inti,j,k,t,m;
k=strlen(str);
for(i=0;i{m=i;
for(j=i+1;jif(str[m]>str[j])m=j;
t=str[m];
str[m]=str[i];
str[i]=t;}
}
main()
{charss[20];
clrscr();
printf("\n\n请输入一行字符串:
");
gets(ss);
sort(ss);
printf("由小到大排序结果为:
");
puts(ss);
}
参考程序二:
起泡法
sort(charstr[])
{inti,j,k,t;
k=strlen(str);
for(i=0;ifor(j=0;jif(str[j]>str[j+1])
{t=str[j];str[j]=str[j+1];str[j+1]=t;}
}
main()
{charss[20];
clrscr();
printf("\n\n请输入一行字符串:
");
gets(ss);
sort(ss);
printf("由小到大排序结果为:
");
puts(ss);
}
3.有两个磁盘文件,各自存放若干已排好序的字符(如a1.dat中存放“abort”,a2.dat中存放“boy”),要求将两个文件合并,合并后仍然保持有序(如“abboorty”),存放在a3.dat文件中。
参考程序一:
#include"stdio.h"
sort(charstr[])
{inti,j,k,t;
k=strlen(str);
for(i=0;ifor(j=0;jif(str[j]>str[j+1])
{t=str[j];str[j]=str[j+1];str[j+1]=t;}
}
main()
{FILE*fp1,*fp2,*fp3;
charstr1[100],str2[100],str3[200],str[30];
if((fp1=fopen("d:
\\a1.dat","rt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
if((fp2=fopen("d:
\\a2.dat","rt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
if((fp3=fopen("d:
\\a3.dat","wt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
fgets(str1,30,fp1);
while(!
feof(fp1))
{fgets(str,30,fp1);
strcat(str1,str);}
fgets(str2,30,fp2);
while(!
feof(fp2))
{fgets(str,30,fp1);
strcat(str2,str);}
strcpy(str3,str1);
strcat(str3,str2);
sort(str3);
fputs(str3,fp3);
puts(str3);
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
参考程序二:
#include"stdio.h"
main()
{FILE*fp1,*fp2,*fp3;
inti,j,k;
charstr1[100],str2[100],str3[200],str[30];
if((fp1=fopen("d:
\\a1.dat","rt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
if((fp2=fopen("d:
\\a2.dat","rt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
if((fp3=fopen("d:
\\a3.dat","wt"))==NULL)
{
printf("Cannotopeninfile\n");
exit(0);}
fgets(str1,30,fp1);
while(!
feof(fp1))
{fgets(str,30,fp1);
strcat(str1,str);}
fgets(str2,30,fp2);
while(!
feof(fp2))
{fgets(str,30,fp2);
strcat(str2,str);}
for(i=0,j=0,k=0;str1[i]!
='\0'&&str2[j]!
='\0';)
if(str1[i]{str3[k++]=str1[i];i++;}
else
{str3[k++]=str2[j];j++;}
str3[k]='\0';
if(str1[i]=='\0')
strcat(str3,str2+j);
if(str2[j]=='\0')
strcat(str3,str1+i);
fputs(str3,fp3);
puts(str3);
fclose(fp1);
fclose(fp2);
fclose(fp3);
}