二级C上机题库 南开100题.docx
- 文档编号:12940654
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:16
- 大小:25.68KB
二级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;i for(k=0;k {for(i=j=0;i if(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;i fprintf(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;i printf("%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;i if((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;i scanf("%d%d%d",tt[i].num,tt[i].math,tt[i].cmpt); printf("\nThestudents'numandmarksentered: "); for(i=0;i printf("\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;k printf("%d"w[k]); printf("\n"); } arrdel(int*w,intn,intk) {inti; for(i=k;i n--; 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级C上机题库 南开100题 二级 上机 题库 南开 100