二级C上机题库 南开100题.docx
《二级C上机题库 南开100题.docx》由会员分享,可在线阅读,更多相关《二级C上机题库 南开100题.docx(16页珍藏版)》请在冰点文库上搜索。
二级C上机题库南开100题
2008年二级C上机题库南开100题(9)
2011-08-3114:
04
61、给定程序modi.c中函数fun的功能是:
为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:
不要改动main函数,
#include
#include
voidfun(inta,int*b,int*c)
{inti,j,d,y;
for(i=3;i<=a/2;i=i+2){
/**************found**************/
y=0;
for(j=2;j<=sqrt((double)i);j++)
if(i%j==0)y=0;
if(y==1){
/**************found**************/
d=i-a;
for(j=2;j<=sqrt((double)d);j++)
if(d%j==0)y=0;
if(y==1)
{*b=i;*c=d;}
}
}
}
main()
{inta,b,c;
do
{printf("\nInputa:
");scanf("%d",&a);}
while(a%2);
fun(a,&b,&c);
printf("\n\n%d=%d+%d\n",a,b,c);
}
首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错误的重要前提。
程序中的重要思想如下:
1、首先,要了解素数的意思,素数是指只能被1和它自身整除的数;
2、题目中要求为一个偶数寻找两个素数,这两个素数之和等于该偶数。
本题中的第一个错误:
由下面的程序"if(i%j==0)y=0;"可知,如果不为素数,y值为0,所以应当开始给y赋值为1,做找到标志;
本题中的第二个错误:
根据上下文及题意思可知,a为偶数,*b与*c为所求的两个素数,而*b与*c由"{*b=i;*c=d;}"得出,所以a=i+d,即"d=a-i;"。
62、给定程序modi.c中函数fun的功能是:
判断一个整数m是否是素数,若是返回1,否则返回0。
在main()函数中,若fun返回1输出YES,若fun返回0输出NO!
。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数。
#include
#include
intfun(intm)
{intk=2;
while(k<=m&&(m%k))
/************found************/
k++
/************found************/
if(m=k)
return1;
elsereturn0;
}
main()
{intn;
clrscr();
printf("\nPleaseentern:
");scanf("%d",&n);
if(fun(n))printf("YES\n");
elseprintf("NO!
\n");
}
本题的考核点是素数的判断。
素数即只能被1及其本身整除的数。
C语言中,分号是语句的组成部分,各语句间以分号作为分隔。
源程序中"k++"语句是错误的,应改为"k++;"或相同作用的语句。
C语言中,判断变量或表达式相等用"=="。
源程序中"if(m=k)"语句是错误的,应改为"if(m==k)"或相同作用的语句。
63、下列给定程序中,函数fun()的功能是计算并输出high以内的素数之和。
high由主函数传给fun()函数。
若high的值为100,则函数的值为1060。
请改正程序中的错误,使它能得到正确结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
intfun(inthigh)
{intsum=0,n=0,j,yes;
while(high>=2)
{yes=1;
for(j=2;j<=high/2;j++)
/**********************found***********************/
ifhigh%j==0
{
yes=0;
break;
}
/**********************found***********************/
if(yes==0)
{
sum+=high;
n++;
}
high--;
}
returnsum;
}
main()
{
clrscr();
printf("%d\n",fun(100));
}
答案:
(1)错误:
ifhigh%j==0正确:
if(high%j==0)
(2)错误:
if(yes==0)正确:
if(yes)
【解析】错误1:
if语句的两侧要加括号。
错误2:
yes为1时,说明被判断的数为素数,要加入总和。
结构体类:
第64----65题
64、给定程序modi.c中函数fun的功能是:
对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:
不要改动main函数,
#include
#include
#include
#include
#defineN10
typedefstructss
{charnum[10];
ints;
}STU;
STU*fun(STUa[],intm)
{STUb[N],*t;
inti,j,k;
/**********found**********/
*t=calloc(sizeof(STU),m);
for(i=0;ifor(k=0;k{for(i=j=0;iif(b[i].s>b[j].s)j=i;
/**********found**********/
t[k].num=b[j].num;
t[k].s=b[j].s;
b[j].s=0;
}
returnt;
}
outresult(STUa[],FILE*pf)
{inti;
for(i=0;ifprintf(pf,"No=%sMark=%d\n",a[i].num,a[i].s);
fprintf(pf,"\n\n");
}
main()
{STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},
{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}};
STU*pOrder;
inti,m;
clrscr();
printf("*****TheOriginaldata*****\n");
outresult(a,stdout);
printf("\nGivethenumberofthestudentswhohavebetterscore:
");
scanf("%d",&m);
while(m>10)
{printf("\nGivethenumberofthestudentswhohavebetterscore:
");
scanf("%d",&m);
}
pOrder=fun(a,m);
printf("*****THERESULT*****\n");
printf("Thetop:
\n");
for(i=0;iprintf("%s%d\n",pOrder[i].num,pOrder[i].s);
free(pOrder);
}
本题的考核点是按学习成绩找出前m名学生。
提示思路:
1、首先开辟存储空间存放m名学生的信息;
2、通过循环,计算出前m名学生的成绩,并将这些学生的数据放入动态分配的存储区中。
程序中的第一个错误:
malloc(size)在内存的动态存储区中分配一个长度为size的连续空间。
此函数的值是一个指针,它的值是该分配域的起始地址。
calloc(n,size)在内存的动态区存储中分配n个长度为size的连续空间。
函数返回分配域的起始地址。
程序中的第二个错误:
C语言中不能整体给字符数组赋值。
65、文件modi.c中程序的功能是:
读入一个整数m(1≤m≤20)和m位学生的学号、数学课考分和计算机课考分,并从中查找第一个数学课考分<80且计算机课考分<70的学生,若有则输出他的学号和两门课分数,否则输出"Notfound!
"。
例如,
若输入"4"和1019186|若输入"5"和1019186
2138775|2138775
3457967|3457981
4208387|4208387
|5376577
则输出Theonefound:
|则输出Notfound.
3457967|
请改正程序中的错误或在横线处填上适当的内容(并把横线删除),使它能计算出正确的结果。
#include
#include
#defineM10
structstudent{intnum;intmath;intcmpt;};
intFind(intn,structstudentss[])
{inti;
for(i=0;iif((ss[i].math<80)&&(ss[i].cmpt<70))
break;
/*************found************/
____________________
}
main()
{inti,m;
structstudenttt[M];
clrscr();
printf("\nPleaseenternumberofstudents:
");
scanf("%d",&m);
printf("\nPleaseentertheirnumandmarksofmathandcmpt:
\n");
/*************found************/
for(i=0;iscanf("%d%d%d",tt[i].num,tt[i].math,tt[i].cmpt);
printf("\nThestudents'numandmarksentered:
");
for(i=0;iprintf("\n%3d%3d%3d",tt[i].num,tt[i].math,tt[i].cmpt);
if((i=Find(m,tt))==-1)
printf("\nNotfound!
\n");
else
{printf("\nTheonefound:
");
printf("\n%3d%3d%3d\n",tt[i].num,tt[i].math,tt[i].cmpt);
}
}
本题的考核点是C语言中循环语句和常用函数的使用。
从主函数中可以看出,如果Find函数没有找到符合条件的记录,返回-1,否则返回相应的记录号。
Find函数的for循环用来寻找符合条件的记录,如果找到则中断循环,此时循环变量的值即为符合条件的记录号。
所以原程序横线处应填入"return((i==n)?
-1:
i);"或相同作用的语句。
另外,在使用scanf函数时,应该把要输入的数据的地址作为参数传入函数,所以应该把程序中的"scanf("%d%d%d",tt[i].num,tt[i].math,tt[i].cmpt);"语句改为"scanf("%d%d%d",&tt[i].num,&tt[i].math,&tt[i].cmpt);"。
二维数组类:
第66题
66、给定程序modi.c中,fun函数的功能是:
先从键盘上输入一个3行3列矩阵的各个元素的值,然后输出主对角线元素之积。
请改正程序中的错误,或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
注意:
不要改动main函数,
#include
intfun()
{inta[3][3],sum;
inti,j;
/************found************/
_______;
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
/************found************/
scanf("%d"a[i][j]);
}
for(i=0;i<3;i++)
sum=sum*a[i][i];
printf("Sum=%d\n",sum);
}
main()
{fun();}
本题的考核点是C语言的基本语句的使用。
由题意可知,程序中通过sum变量累计对角线元素的积,在初始化时需先为sum赋初始值,所以应在横线处填入:
"sum=1;"。
根据scanf语句的语法规则,格式控制与输入项地址表之间需用逗号分隔,所以"scanf("%d"a[i][j]);"应改为"scanf("%d,",&a[i][j]);"或相同作用的语句。
删除类:
第67----68题
67、给定程序modi.c的功能是:
删除w数组中下标为k的元素中的值。
程序中,调用了getindex、arrout和arrdel三个函数,getindex用以输入所删元素的下标,函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为止。
arrout用以输出数组中的数据,arrdel进行所要求的删除操作。
请改正程序中的语法错误,使它能得出正确的结果。
注意:
不要改动main函数,
#include"conio.h"
#include"stdio.h"
#defineNUM10
/************found************/
arrout(intw,intm)
{intk;
/************found************/
for(k=0;kprintf("%d"w[k]);
printf("\n");
}
arrdel(int*w,intn,intk)
{inti;
for(i=k;in--;
returnn;
}
getindex(intn)
{inti;
do
{printf("\nEntertheindex[0<=i<%d]:
",n);
scanf("%d",&i);
}while(i<0||i>n-1);
returni;
}
main()
{intn,d,a[NUM]={21,22,23,24,25,26,27,28,29,30};
n=NUM;
clrscr();
printf("Outputprimarydata:
\n");arrout(a,n);
d=getindex(n);n=arrdel(a,n,d);
printf("Outputthedataafterdelete:
\n");arrout(a,n);
}
本题的考核点是C语言中函数入口参数的用法和常用函数的使用。
从主函数中可以看出,w是一个字符串,因此在arrout函数的参数表中应将w改为字符指针或字符数组,即把"arrout(intw,intm)"语句改为"arrout(int*w,intm)"或相同作用的语句。
printf函数的一般格式为:
printf(格式控制,输出表列);,因此,"printf("%d"w[k]);"应改为"printf("%d",w[k]);"或相同作用的语句。
68、给定程序modi.c中函数fun的功能是:
删除字符串s中的所有空白字符(包括Tab字符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
注意:
不要改动main函数,
#include
#include
#include
fun(char*p)
{inti,t;charc[80];
/************found************/
For(i=0,t=0;p[i];i++)
if(!
isspace(*(p+i)))c[t++]=p[i];
/************found************/
c[t]="\0";
strcpy(p,c);
}
main()
{charc,s[80];
inti=0;
printf("Inputastring:
");
c=getchar();
while(c!
='#')
{s[i]=c;i++;c=getchar();}
s[i]='\0';
fun(s);
puts(s);
}
本题着重考察考生对C语言中的语法以及一些简单算法的掌握情况。
C语言中,大小写的字母含意不同。
源程序中"For(i=0,t=0;p[i];i++)"是错误的,"For"应为小写,程序应改为"for(i=0,t=0;p[i];i++)"或相同作用的语句。
C语言中,一对双引号括起来的字符序列表示字符串常量,一对单引号括起来的表示字符常量。
转义字符'\0'作为字符串常量的结束标志。
源程序"c[t]="\0";"是错误的,应改为"c[t]='\0';"。
互质、公倍、公约类:
第69----71题
69、给定程序modi.c中,函数fun的功能是:
求三个数的最小公倍数。
例如,给变量x1、x2、x3分别输入15112,则输出结果应当是:
330。
请改正程序中的错误,使它能得出正确结果。
注意:
不要改动main函数,
#include
fun(intx,inty,intz)
{intj,t,n,m;
/************found************/
j=0;
t=j%x;
/************found************/
m=t%y;
n=j%z;
while(t!
=0||m!
=0||n!
=0)
{j=j+1;
t=j%x;
/************found************/
m=t%y;
n=j%z;
}
returnj;
}
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);
}
本题着重考察考生对C语言中一些简单算法的掌握情况。
本题中的第一个错误:
由程序可知,应从1开始穷举数的最小公倍数,即j的初始值应为1,所以程序中的语句"j=0;"应改为"j=1;";
本题中的第二和第三个错误:
变量j中存放的即为要求的最小公倍数,即j能够整除x、y、z,所以程序中的语句"m=t%y;"应改为"m=j%y;"。
70、给定程序modi.c中,函数fun的功能是:
求出两个非零正整数的最大公约数,并作为函数值返回。
例如,若给num1和num2分别输入49和21,则输出的最大公约数为7;若给num1和num2分别输入27和81,则输出的最大公约数为27。
请改正程序中的错误,使它能得出正确结果。
注意:
不要改动main函数,
#include
intfun(inta,intb)
{intr,t;
if(a
{t=a;b=a;a=t;}
r=a%b;
while(r!
=0)
{a=b;b=r;r=a%b;}
/************found************/
return(a);
}
main()
{intnum1,num2,a;
printf("Inputnum1num2:
");scanf("%d%d",&num1,&num2);
printf("num1=%dnum2=%d\n\n",num1,num2);
a=fun(num1,num2);
printf("Themaximuncommondivisoris%d\n\n",a);
}
提示思路:
当a与b的余数为零时,即可求得a、b的最大公约数。
当余数为零时,最大公约数放在除数变量中,即变量b,即应返回变量b的值,所以程序中的语句"return(a);"应改为"return(b);"或相同作用的语句。
71、文件modi.c中程序的功能是:
判断两个整数m和n是否互质(即是否有公共的因子)(m≠1,n≠1)。
方法是:
用2到t(t取m和n中较小的那个数)之间的数分别去除m和n,若m和n能同时被某个数除尽,则m和n不互质;否则它们互质。
例如,若输入187和85,则应输出No(表示它们不互质,它们有公因子17)。
若输入89和187,则应输出Yes(表示它们互质)。
请改正程序中的错误,使它能计算出正确的结果。
注意:
#include
#include
intIsThat(intm,intn)
{intk,t,mk=1;
t=m;
if(m>n)t=n;
/************found**********/
fo