计算机二级C语言上机题库及答案解析.docx
《计算机二级C语言上机题库及答案解析.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言上机题库及答案解析.docx(25页珍藏版)》请在冰豆网上搜索。
计算机二级C语言上机题库及答案解析
2013年计算机二级C语言上机题库及答案解析
填空题
给定程序中,函数fun的功能是:
对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符数组中,形成一个新串。
例如,形参s所指的字符串为:
baawrskjghzlicda,执行后p所指字符数组中的字符串应为:
aachjlsw。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
voidfun(char*s,char*p)
{inti,j,n,x,t;
n=0;
for(i=0;s[i]!
='\0';i++)n++;
for(i=1;i<=""p="">
___1___;
for(j=___2___+2;j
if(s[t]>s[j])t=j;
if(t!
=i)
{x=s[i];s[i]=s[t];s[t]=x;}
}
for(i=1,j=0;i
/
p[j]=___3___;
}
main()
{chars[80]="baawrskjghzlicda",p[50];
printf("\nTheoriginalstringis:
%s\n",s);
fun(s,p);
printf("\nTheresultis:
%s\n",p);
}
解题思路:
第一处:
取外循环的控制变量,所以应填:
t=i。
第二处:
内循环的起始变量,应该是i+2,所以应填:
i。
第三处:
新字符串处理完后应添加字符串结束符,所以应填:
'\0'。
改错题
给定程序MODI1.C中函数fun的功能是:
用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止:
π111
┄┄≈1-┄┄+┄┄-┄┄+...
4357
例如,程序运行后,输入0.0001,则程序输出3.1414。
请改正程序中的错误,使它能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
floatfun(floatnum)
{ints;
floatn,t,pi;
t=1;pi=0;n=1;s=1;
while(t>=num)
{
pi=pi+t;
n=n+2;
s=-s;
t=s%n;
}
pi=pi*4;
returnpi;
}
main()
{floatn1,n2;
printf("Enterafloatnumber:
");
scanf("%f",&n1);
n2=fun(n1);
printf("%6.4f\n",n2);
}
解题思路:
第一处:
要判断t的最后一项绝对小于指定的数,由于t是实数,那么应改为while(fabs(t)>=num)。
第二处:
t是s除以n的值,而不是取余数,所以应改t=s/n;。
编程题
请编写一个函数voidfun(chara[],charb[],intn),其功能是:
删除一个字符串中指定下标的字符。
其中,a指向原字符串,删除指定字符后的字符串存放在b所指的数组中,n中存放指定的下标。
例如,输入一个字符串:
World,然后输入3,则调用该函数后的结果为:
Word。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include
#include
#defineLEN20
voidfun(chara[],charb[],intn)
{
}
main()
{charstr1[LEN],str2[LEN];
intn;
printf("Enterthestring:
\n");
gets(str1);
printf("Enterthepositionofthestringdeleted:
");
scanf("%d",&n);
fun(str1,str2,n);
printf("Thenewstringis:
%s\n",str2);
NONO();
}
解题思路:
本题是利用字符串拷贝和字符串连接来生成新的字符串。
参考答案:
voidfun(chara[],charb[],intn)
{
strncpy(b,a,n);
b[n]=0;
strcat(b,a+n+1);
}
填空题
给定程序中,函数fun的功能是:
统计出带有头结点的单向链表中结点的个数,存放在形参n所指的存储单元中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#defineN8
typedefstructlist
{intdata;
structlist*next;
}SLIST;
SLIST*creatlist(int*a);
voidoutlist(SLIST*);
voidfun(SLIST*h,int*n)
{SLIST*p;
___1___=0;
p=h->next;
while(p)
{(*n)++;
p=p->___2___;
}
}
main()
{SLIST*head;
inta[N]={12,87,45,32,91,16,20,48},num;
head=creatlist(a);outlist(head);
fun(___3___,&num);
printf("\nnumber=%d\n",num);
}
SLIST*creatlist(inta[])
{SLIST*h,*p,*q;inti;
h=p=(SLIST*)malloc(sizeof(SLIST));
for(i=0;i<="">
{q=(SLIST*)malloc(sizeof(SLIST));
q->data=a[i];p->next=q;p=q;
}
p->next=0;
returnh;
}
voidoutlist(SLIST*h)
{SLIST*p;
p=h->next;
if(p==NULL)printf("ThelistisNULL!
\n");
else
{printf("\nHead");
do
{printf("->%d",p->data);p=p->next;}
while(p!
=NULL);
printf("->End\n");
}
}
解题思路:
本题是要求统计出带有头结点的单向链表中结点的个数。
第一处:
对n所指的存储单元进行初始化,所以应填:
*n。
第二处:
指向p的下一个结点,所以应填:
next。
第三处:
函数调用,在主函数中已经给出了head,所以应填:
head。
改错题
给定程序MODI1.C中函数fun的功能是:
求出s所指字符串中最后一次出现的t所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。
例如,当字符串中的内容为:
"abcdabfabcdx",t中的内容为:
"ab"时,
输出结果应是:
abcdx。
当字符串中的内容为:
"abcdabfabcdx",t中的内容为:
"abd"时,则程序输出未找到信息:
notbefound!
。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
char*fun(char*s,char*t)
{
char*p,*r,*a;
a=Null;
while(*s)
{p=s;r=t;
while(*r)
if(r==p)
{r++;p++;}
elsebreak;
if(*r=='\0')a=s;
s++;
}
returna;
}
main()
{
chars[100],t[100],*p;
printf("\nPleaseenterstringS:
");scanf("%s",s);
printf("\nPleaseentersubstringt:
");scanf("%s",t);
p=fun(s,t);
if(p)printf("\nTheresultis:
%s\n",p);
elseprintf("\nNotfound!
\n");
}
解题思路:
第一处:
指向空指针错误,Null应NULL。
第二处:
比较指针位置的值是否相等,所以应改为:
if(*r==*p)。
编程题
函数fun的功能是:
将s所指字符串中除了下标为偶数、同时ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为:
"ABCDEFG123456",其中字符A的ASCII码
值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为
奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶数,因此不应当删除,其它依此类推。
最后t所指的数组中的内容应是:
"246"。
注意:
部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
voidfun(char*s,chart[])
{
}
main() www.Examda.CoM
{
chars[100],t[100];
printf("\nPleaseenterstringS:
");scanf("%s",s);
fun(s,t);
printf("\nTheresultis:
%s\n",t);
NONO();
}
解题思路:
本题是从一个字符串按要求生成另一个新的字符串。
我们使用for循环语句来解决这个问题。
参考答案:
voidfun(char*s,chart[])
{
inti,j=0;
for(i=0;i if(s[i]%2==0)t[j++]=s[i];
t[j]=0;
}
填空题
给定程序中,函数fun的功能是:
在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。
ss所指字符串数组中共有N个字符串,且串长小于M。
程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有,为非0。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#defineN5
#defineM15
voidfun(char(*ss)[M],char*substr)
{inti,find=0;
for(i=0;i<__1__;i++)
if(strstr(ss[i],__2__)!
=NULL)
{find=1;puts(ss[i]);printf("\n");}
if(find==__3__)printf("\nDon'tfound!
\n");
}
main()
{charx[N][M]={"BASIC","Clangwage","Java","QBASIC","Access"},str[M];
inti;
printf("\nTheoriginalstring\n\n");
for(i=0;i printf("\nEnterastringforsearch:
");gets(str);
fun(x,str);
}
解题思路:
本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。
第一处:
利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:
N。
第二处:
查找子串,子串由形参substr传递,所以应填:
substr。
第三处:
试题要求,若没有找到,函数值为0,所以应填:
0。
改错题
给定程序MODI1.C中函数fun的功能是:
求三个数的最小公倍数。
例如,给主函数中的变量x1、x2、x3分别输入15112,
则输出结果应当是:
330。
请改正程序中的错误,使它能得出正确结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
fun(intx,y,z)
{intj,t,n,m;
j=1;
t=j%x;
m=j%y;
n=j%z;
while(t!
=0||m!
=0||n!
=0)
{j=j+1;
t=j%x;
m=j%y;
n=j%z;
}
returni;
}
main()
{intx1,x2,x3,j;
printf("Inputx1x2x3:
");scanf("%d%d%d",&x1,&x2,&x3);
printf("x1=%d,x2=%d,x3=%d\n",x1,x2,x3);
j=fun(x1,x2,x3);
printf("Theminimalcommonmultipleis:
%d\n",j);
}
解题思路:
第一处:
函数中形参的定义不正确,应改为:
fun(intx,inty,intz)。
第二处:
程序中三个数的最小公倍数是用j处理的,所以应返回j的值。
编程题
假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。
形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。
在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:
****A*BC*DEF*G*******,删除后,字符串中的内容应当是:
A*BC*DEF*G。
注意:
部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include
voidfun(char*a,intn,inth,inte)
{
}
main()
{chars[81],*t,*f;intm=0,tn=0,fn=0;
printf("Enterastring:
\n");gets(s);
t=f=s;
while(*t){t++;m++;}
t--;
while(*t=='*'){t--;tn++;}
while(*f=='*'){f++;fn++;}
fun(s,m,fn,tn);
printf("Thestringafterdeleted:
\n");puts(s);
NONO();
}
解题思路:
本题是考察对字符串的操作。
1.求出字符串的长度。
2.利用循环把字符串中字符按要求仍存放在原字符串首址开始的位置上。
参考答案:
voidfun(char*a,intn,inth,inte)
{
char*p=a;
intj=0,len=0;
while(*p){p++;len++;}
while(j a[j]=a[h+j];
j++;
}
a[j]=0;
}
填空题
给定程序中,函数fun的功能是建立一个N×N的矩阵。
矩阵元素的构成规律是:
最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值
全部为3,…依次类推。
例如,若N=5,生成的矩阵为:
11111
12221
12321
12221
11111
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#defineN7
voidfun(int(*a)__1__)
{inti,j,k,m;
if(N%2==0)m=N/2;
elsem=N/2+1;
for(i=0;i<=""p=""i++)="">
for(j=__2__;j<="">
a[i][j]=a[N-i-1][j]=i+1;
for(k=i+1;k<="">
a[k][i]=a[k][N-i-1]=__3__;
}
}
main()
{intx[N][N]={0},i,j;
fun(x);
printf("\nTheresultis:
\n");
for(i=0;i<="">
{for(j=0;j<="">
printf("\n");
}
}
解题思路:
第一处:
建立一个N×N的矩阵,所以应填:
[N]。
第二处:
j的起始变量值应i。
第三处:
也应该填写i+1。
改错题
给定程序MODI1.C中函数fun的功能是:
将十进制正整数m转换成k(2≤k≤9)进制数,并按高位到低位顺序输出。
例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示是1000)。
请改正fun函数中的错误,使它能得出正确的结果。
注意:
不要改动main函数。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
voidfun(intm,intk)
{
intaa[20],i;
for(i=0;m;i++)
{
aa[i]=m/k;
m/=k;
}
for(;i;i--)
printf("%d",aa[i]);
}
main()
{
intb,n;
printf("\nPleaseenteranumberandabase:
\n");
scanf("%d%d",&n,&b);
fun(n,b);
printf("\n");
}
解题思路:
第一处:
应该取模而不是整除,所以应为:
aa[i]=m%k;。
第二处:
输出aa的位置不正确,所以应为:
printf("%d",aa[i-1]);。
编程题
编写一个函数,从num个字符串中找出最长的一个字符串,并通过形参指针max传回该串地址。
(注意:
主函数中用****作为结束输入的标志,函数fun中给出的语句仅供参考。
)
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include
#include
fun(char(*a)[81],intnum,char**max)
{
inti,k=0,len,maxlen;/*k为a数组中最长串所在元素的下标,初始为0,maxlen为其串
长*/
maxlen=strlen(a[k]);
for(i=1;i
{
/*以下完成查找最长串*/
}
*max=a[k];
}
main()
{
charss[10][81],*ps;
intn,i=0;
printf("输入若干个字符串:
");
gets(ss[i]);
puts(ss[i]);
while(!
strcmp(ss[i],"****")==0)
{
i++;
gets(ss[i]);
puts(ss[i]);
}
n=i;
fun(ss,n,&ps);
printf("\nmax=%s\n",ps);
NONO();
}
解题思路:
本题是考察考生怎样从已输入的字符串中找出长度最大的字符串。
求字符串的长度可以使用strlen函数。
参考答案:
fun(char(*a)[81],intnum,char**max)
{
inti,k=0,maxlen;/*k为a数组中最长串所在元素的下标,初始为0,maxlen为其串长*/