计算机二级考试VC部分试题及答案讲解.docx
《计算机二级考试VC部分试题及答案讲解.docx》由会员分享,可在线阅读,更多相关《计算机二级考试VC部分试题及答案讲解.docx(57页珍藏版)》请在冰豆网上搜索。
计算机二级考试VC部分试题及答案讲解
第一套
一、改错题
1.题目要求
下列给定程序中函数fun的功能是:
计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。
其中x和y的值不相等,z和y的值不相等。
例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
#include
#include
#include
/************found************/
#defineFU(m,n)((m/n))
floatfun(floata,floatb,floatc)
{floatvalue;
value=FU(a+b,a-b)+FU(c+b,c-b);
/************found************/
Return(Value);
}
main()
{floatx,y,z,sum;
printf("Inputxyz:
");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if(x==y||y==z){printf("Dataerror!
\n");exit(0);}
sum=fun(x,y,z);
printf("Theresultis:
%5.2f\n",sum);
}
2.算法分析
①#defineFU(m,n)((m/n))错误这样定义FU(m,n)造成语句value=FU(a+b,a-b)+FU(c+b,c-b)执行为value=(a+b/a-b)+(c+b/c-b),所以应该将语句#defineFU(m,n)((m/n))改为#defineFU(m,n)(m)/(n)
②语句Return(Value);错误C语言中大小写字母有不同的含义,此处希望执行返回value的值的操作,所以应该改为return(value);
二、填空题
1.题目要求
下列给定程序中,函数fun的功能是:
有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。
例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
计算后结果为
1 0 0
6 5 0
10 14 9
请在程序的下划线处填入正确的内容并把下划线删除。
使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得改程序的结构!
#include
#defineN4
voidfun(int(*t)___1___)
{inti,j;
for(i=1;i{for(j=0;j
{
___2___=t[i][j]+t[j][i];
___3___=0;
}
}
}
main()
{
intt[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10},i,j;
printf("\nTheoriginalarray:
\n");
for(i=0;i{for(j=0;jprintf("\n");
}
fun(t);
printf("\nTheresultis:
\n");
for(i=0;i{for(j=0;jprintf("\n");
}
}
2.算法分析
①[N]
形参t被定义为行数组指针变量,它指向包含N个元素的一位数组。
②t[i][j]
以主对角线为对称线,对称元素相加的值应该赋予左下三角元素的t[i][j]。
③t[j][i]
根据题意,为零的应该是右上三角元素的值。
三、编程题
1.题目要求
规定输入的字符串中只包含字母和*号。
编写函数fun,其功能是:
将字符串中的前导*号全部删除,中间和尾部的*号不删除。
例如,字符串中的内容为:
*******A*BC*DEF*G****,删除后字符串中的内容应当是:
A*BC*DEF*G****。
编写函数时,不得使用C语言提供的字符串函数。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
voidfun(char*a)
{
}
main()
{chars[81];
voidNONO();
printf("Enterastring:
\n");gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");puts(s);
NONO();
}
voidNONO()
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。
*/
FILE*in,*out;
inti;chars[81];
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(in,"%s",s);
fun(s);
fprintf(out,"%s\n",s);
}
fclose(in);
fclose(out);
}
2.算法分析
(1)主要数据结构
char*a
(2)算法描述
①记录第一个非*的符号的地址;
②将包括第一个在内的非*字符串全部赋予另一个数组。
3.实现代码
voidfun(char*a)
{
char*p=a;
while(*p=='*')p++;
for(;*p!
='\0';p++,a++)
*a=*p;
*a='\0';
}
4.程序调试及测试结果
经运行程序调试,将出现的错误分析如下:
(1)编译错误
(2)连接错误
(3)运行错误
经过修改程序测试结果正确,符合要求。
第二套
一、改错题
1.题目要求
下列给定程序中,函数fun的功能是:
依次取出字符串中所有的数字字符,形成新的字符串,并取代原字符串。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
#include
#include
#include
voidfun(char*s)
{inti,j;
for(i=0,j=0;s[i]!
='\0';i++)
if(s[i]>='0'&&s[i]<='9')
/*************found**************/
s[j]=s[i];
/*************found**************/
s[j]=”\0”;
}
voidmain()
{charitem[80];
system("CLS");
printf("\nEnterastring:
");gets(item);
printf("\n\nThestringis:
%s\n",item);
fun(item);
printf("\n\nThestringofchangingis:
%s\n",item);
}
2.算法分析
①语句s[j]=s[i];错误。
程序在这里应该执行将是数字的字符赋予s[j]并将j自加1,所以这里应该改为s[j++]=s[i]
②语句s[j]=”\0”;错误。
这里应该是将字符‘\0’赋予s[j],而非字符串,所以应该改为s[j]=‘\0’
*二、填空题
1.题目要求
给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
#include
voidfun(char*s,inta,doublef)
{
/**********found**********/
__1__fp;
charch;
fp=fopen("file1.txt","w");
fprintf(fp,"%s%d%f\n",s,a,f);
fclose(fp);
fp=fopen("file1.txt","r");
printf("\nTheresult:
\n\n");
ch=fgetc(fp);
/**********found**********/
while(!
feof(__2__))
{
putchar(__3__);
ch=fgetc(fp);
}
putchar('\n');
fclose(fp);
}
main()
{chara[10]="Hello!
";intb=12345;
doublec=98.76;
fun(a,b,c);
}
2.算法分析
①FILE*易知这里是为了定义文件指针fp,因此这里应该填FILE*;
②fp这里是为了对该文件类型数据进行操作,因此填写fp;
③ch为了实现用字符方式从此文本文件中逐个读入并显示在终端屏幕上,此处应该填写ch。
三、编程题
1.题目要求
请编写函数fun,该函数的功能是:
将M行N列的二维数组中的字符数据,按列的顺序依此放到一个字符串中。
例如,若二维数组中的数据为
WWWW
SSSS
HHHH
则字符串中的内容应是:
WSHWSHWSHWSH。
注意:
部分源程序在文件PROG1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include
#defineM3
#defineN4
voidfun(char(*s)[N],char*b)
{
}
voidmain()
{
FILE*wf;
chara[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};
inti,j;
printf("Thematrix:
\n");
for(i=0;i{for(j=0;jprintf("%3c",w[i][j]);
printf("\n");
}
fun(w,a);
printf("TheAstring:
\n");
puts(a);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s",a);
fclose(wf);
/*****************************/
}
2.算法分析
(1)主要数据结构
char(*s)[N],char*b
(2)算法描述
将原数组行列互换后逐一记录至另一个以为数组,记录完成后将另一个数组的最后加上结束标志’\0’。
3.实现代码
voidfun(char(*s)[N],char*b)
{
inti,j,k=0;
for(i=0;ifor(j=0;jb[k++]=s[j][i];
b[k]='\0';
}
4.程序调试及测试结果
经运行程序调试,将出现的错误分析如下:
(1)编译错误
(2)连接错误
(3)运行错误
经过修改程序测试结果正确,符合要求。
第三套
一、改错题
1.题目要求
下列给定程序中函数fun的功能是:
用冒泡法对6个字符串进行升序排列。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构!
#include
#include
#defineMAXLINE20
fun(char*pstr[6])
{inti,j;
char*p;
for(i=0;i<5;i++)
{
/**************found**************/
for(j=i+1,j<6,j++)
{
if(strcmp(*(pstr+i),*(pstr+j))>0)
{
p=*(pstr+i);
/**************found**************/
*(pstr+i)=pstr+j;
*(pstr+j)=p;
}
}
}
}
main()
{inti;
char*pstr[6],str[6][MAXLINE];
for(i=0;i<6;i++)pstr[i]=str[i];
printf("\nEnter6string(1stringateachline):
\n");
for(i=0;i<6;i++)scanf("%s",pstr[i]);
fun(pstr);
printf("Thestringsaftersorting:
\n");
for(i=0;i<6;i++)printf("%s\n",pstr[i]);
}
2.算法分析
①语句for(j=i+1,j<6,j++)错误。
for语句中的各语句之间应该用“;”号隔开,而非“,”号,所以此处应该改为for(j=i+1;j<6;j++)。
②语句*(pstr+i)=pstr+j;错误。
根据题意,这里程序想执行的是将数组的第j个元素赋予数组的第i个元素,而非将数组的第j个元素的地址赋予数组的第i个元素,所以这里应该改为*(pstr+i)=*(pstr+j);。
二、填空题
1.题目要求
下列给定程序中,函数fun的功能是:
将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的次序。
例如,s所指的字符串为def35adh3kjsdf7,执行后结果为defadhajsdf3537。
请在程序的下划线处填入正确的内容把下划线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
voidfun(char*s)
{inti,j=0,k=0;chart1[80],t2[80];
for(i=0;s[i]!
='\0';i++)
if(s[i]>='0'&&s[i]<='9')
{
/**********found**********/
t2[j]=s[i];___1___;
}
elset1[k++]=s[i];
t2[j]=0;t1[k]=0;
/**********found**********/
for(i=0;i/**********found**********/
for(i=0;i<___3___;i++)s[k+i]=t2[i];
}
main()
{chars[80]="ba3a54j7sd567sdffs";
printf("\nTheoriginalstringis:
%s\n",s);
fun(s);
printf("\nTheresultis:
%s\n",s);
}
2.算法分析
①j++使j自加一,当下一次条件再一次满足条件时,能够把对应s[i]的元素记录到数组t2中的下一个元素中;
②s[i]=t1[i]将非数字的元素组成的数组t1
逐个地把它的元素赋给数组s;
③j将由数字组成的数组t2中的元
素在t1后逐个赋给数组s中第
k后的元素。
三、编程题
1.题目要求
编写函数fun,其功能是:
求ss所指字符串中指定字符的个数,并返回此值。
例如,若输入字符串123412132,输入字符为1,则输出3。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#defineM81
intfun(char*ss,charc)
{
}
main()
{chara[M],ch;
voidNONO();
printf("\nPleaseenterastring:
");gets(a);
printf("\nPleaseenterachar:
");ch=getchar();
printf("\nThenumberofthecharis:
%d\n",fun(a,ch));
NONO();
}
voidNONO()
{/*本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
*/
inti;
FILE*rf,*wf;
chara[M],b[M],ch;
rf=fopen("in.dat","r");
wf=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(rf,"%s",a);
fscanf(rf,"%s",b);
ch=*b;
fprintf(wf,"%c=%d\n",ch,fun(a,ch));
}
fclose(rf);
fclose(wf);
}
2.算法分析
(1)主要数据结构
char*ss,charc
(2)算法描述
①得出字符数组的所包含的字符数的值并
赋给m;
②逐一比较数组中与特定字符相同的字符,若有数组中有一个成立,就让j加上1,最后返回j的值,j的值就是所要求的数组中与特定字符相同的字符个数。
3.实现代码
intfun(char*ss,charc)
{
inti,j=0,m;
m=strlen(ss);
for(i=0;iif(ss[i]==c)j++;
returnj;
}
4.程序调试及测试结果
经运行程序调试,将出现的错误分析如下:
(1)编译错误
(2)连接错误
(3)运行错误
经过修改程序测试结果正确,符合要求。
第四套
一、改错题
1.题目要求
下列给定程序中函数fun的功能是:
删除s所指字符中所有的小写字母c。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
#include
voidfun(char*s)
{inti,j;
for(i=j=0;s[i]!
='\0';i++)
if(s[i]!
='c')
/************found************/
s[j]=s[i];
/************found************/
s[i]=0;
}
main()
{chars[80];
printf("Enterastring:
");gets(s);
printf("Theoriginalstring:
");puts(s);
fun(s);
printf("Thestringafterdeleted:
");puts(s);printf("\n\n");
}
2.算法分析
①语句s[j]=s[i];错误。
当数组中的元素部位c是则记录下该元素并将它赋给元素s[j],同时让j自加1,方便记录下下一个不是c的元素,所以这里应该改为s[j++]=s[i];
②语句s[i]=0;错误。
根据题意,程序在这里想将所记录的最后一个不是c的元素的后面一位赋予结束符号“\0”,所以这里应该改为s[j]=’\0’。
二、填空题
1.题目要求
程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。
函数fun的功能是:
将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。
例如,a所指变量中的学号、姓名和三门课的成绩依次是:
10001、"ZhangSan"、95、80、88,则修改后输出b中的数据应为:
10002、"LiSi"、95、80、88。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent{
longsno;
charname[10];
floatscore[3];
};
voidfun(structstudenta)
{structstudentb;inti;
/**********found**********/
b=__1__;
b.sno=10002;
/**********found**********/
strcpy(__2__,"LiSi");
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",b.sno,b.name);
/**********found**********/
for(i=0;i<3;i++)printf("%6.2f",b.__3__);
printf("\n");
}
main()
{structstudents={10001,"ZhangSan",95,80,