二级C上机题库 南开100题.docx

上传人:b****8 文档编号:12940654 上传时间:2023-06-09 格式:DOCX 页数:16 大小:25.68KB
下载 相关 举报
二级C上机题库 南开100题.docx_第1页
第1页 / 共16页
二级C上机题库 南开100题.docx_第2页
第2页 / 共16页
二级C上机题库 南开100题.docx_第3页
第3页 / 共16页
二级C上机题库 南开100题.docx_第4页
第4页 / 共16页
二级C上机题库 南开100题.docx_第5页
第5页 / 共16页
二级C上机题库 南开100题.docx_第6页
第6页 / 共16页
二级C上机题库 南开100题.docx_第7页
第7页 / 共16页
二级C上机题库 南开100题.docx_第8页
第8页 / 共16页
二级C上机题库 南开100题.docx_第9页
第9页 / 共16页
二级C上机题库 南开100题.docx_第10页
第10页 / 共16页
二级C上机题库 南开100题.docx_第11页
第11页 / 共16页
二级C上机题库 南开100题.docx_第12页
第12页 / 共16页
二级C上机题库 南开100题.docx_第13页
第13页 / 共16页
二级C上机题库 南开100题.docx_第14页
第14页 / 共16页
二级C上机题库 南开100题.docx_第15页
第15页 / 共16页
二级C上机题库 南开100题.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

二级C上机题库 南开100题.docx

《二级C上机题库 南开100题.docx》由会员分享,可在线阅读,更多相关《二级C上机题库 南开100题.docx(16页珍藏版)》请在冰点文库上搜索。

二级C上机题库 南开100题.docx

二级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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2