江苏二级C历年上机.docx
《江苏二级C历年上机.docx》由会员分享,可在线阅读,更多相关《江苏二级C历年上机.docx(26页珍藏版)》请在冰豆网上搜索。
江苏二级C历年上机
2010春C上机真题第一套
(本试卷完成时间为70分钟)
一、改错题(16分)
【程序功能】
验证3(n范围内的任意两个相邻素数的平方之间至少存在4个素数。
例如,5和7是两个相邻素数,5^2(25)与7^2(49)之间存在6个素数:
293137414347。
【测试数据与运行结果】
显示:
inputn:
输入:
10
输出:
3~5 k=5
11 13 17 19 23
5~7 k=6
29 31 37 41 43 47
【含有错误的源程序】
#include
样include
intprime(intn)
{inti,flag=1;
for(i=1;i<=sqrt(n);i++)
if(n%i==0)flag=0;
returnflag;
}
intfun(inta[],intn)
{inti,k=0;
for(i=3;i<=n;i++)
if(prime(i))a[k++]=i;
returnk;
’ voidfun1(intm,intn,intb[])
{ inti,k=0;
if(m>n)return0;
for(i=m*m;i if(prime(i))b[k++]=i;
returnk;
}
voidmain()
{inta[50]={0},b[100]={0},i,m,k,j,n;
printf("inputn:
");
scanf("%d",&n);
m=fun(a,n);
for(i=O;i {k=fun1(a[i],a[i+1],b[O]);
printf("%d~%d k=%d",a[i],a[i+1],k);
if(k<4){printf("false");break;}
for(j=0;j {if(j%10=O)prinff("\n");
printf("%5d",b[j]);
}
printf("\n");
}
getch();
}
【要求】
1.将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3.改正后的源程序(文件名myf1.c)保存在T:
盘根目录中供阅卷使用,否则不予评分。
二、编程题(24分)
【程序功能】
在给定范围内查找k使得用公式k^2+k+17生成的整数满足以下条件:
该数的十进制表示中低3位数字相同,去掉低3位后的整数是回文数。
例如,当k=461时用公式生成的整数
是212999,该数满足所给条件。
【编程要求】
1.编写函数intfindnum(intn1,intn2,longa[][2])实现以下功能:
k依次取n1~n2范围
内的每个整数,分别用每个k及公式k2+k+17生成整数y,若y满足给定条件,则将k值及y
值保存到a指向的数组中,函数返回a数组中k的个数。
2.编写函数main实现以下功能:
声明二维数组a和变量n1、n2,输入两个整数并保存到
n1、n2中,用n1、n2及a数组作实参调用findnum函数,按所给格式输出a数组中的数据到屏
幕及文件myf2.out中。
最后将考生本人的准考证号输出到文件myf2.out中。
【测试数据与运行结果】
输入:
n1=1,n2=10000
输出:
k number
461 212999
586 343999
3839 14741777
【要求】
1.源程序文件名为myf2.c,输出结果文件名为myf2.out。
2.数据文件的打开、使用、关闭均用c语言标准库中缓冲文件系统的文件操作函数实现。
3.源程序文件和运行结果文件均需保存在T:
盘根目录中供阅卷使用。
4.不要复制扩展名为obj和exe的文件到T:
盘中。
参考答案
一、改错题
for(i=1;i<=sqrt(n);i++) 改为i=2
voidfun1(intm,intn,intb[]) 改为int
{k=fun1(a[i],a[i+1],b[0]); 改为b
{if(j%10=0)printf("\n"); 改为j%10==0
二、编程题
#include
intfindnum(intn1,intn2,longa[][2])
{ inti=0,j;
longx1,x2,x3,y,k;
for(k=n1;k<=n2;k++)
{y=k*k+k+17;
x1=x2=y/1000;x3=0;
while(x1>0)
{x3=x3*10+x1%10;x1=x1/10;}
if(x2==x3&&y%10==y/10%10&&y%10==y/100%10)
{ a[i][0]=k;a[i++][1]=y;
}
}
returni;
}
main()
{inti,j;longa[10][2],n1,n2; FILE*fp;
fp=fopen("Myf2.out","w");
scanf("%d%d",&n1,&n2);
j=findnum(n1,n2,a);
printf("\nk\tnumber");
for(i=0;i fprintf(fp,"\nk\tnumber");
for(i=0;i fprintf(fp,"\nMyexamnumberis:
0112400123");
fclose(fp);getch();
}
2009秋江苏计算机等级C上机真题1
改错题:
[程序功能]
输入两个正确日期且年份在1900-9999范围内,计算
并输出两个日期之间间隔的天数,例如:
2008-8-1
和2009-8-1之间间隔的天数为365
提示:
能被4整除并且不能被100整除的年份是闰年,能
被400整除的年份也是闰年,其他年份则是平年
[测试数据与运行结果]
显示:
first date:
输入:
1980-2-1
显示:
seconddate:
2009-8-1
输出:
10774 days
[含有错误的源程序]
#include
#defineleap(inty)((y)%4==0&&(y)%100!
=0||(y)%400==0)
structd
{inty,m,d;};
intdays(structdd1,structdd2)
{intmon[2][13]=
{{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
inti;longtd=0;
for(i=d1.y;i td=leap(i)?
366:
365;
for(i=1;i td-=mon[leap(d1.y)][i];
td-=d1.d-1;
for(i=1;i td+=mon[leap(d2.y)][i];
td+=d2.d-1;
returntd;
}
voidmain()
{structdd1,d2;
longtd;
printf("firstdate:
");
scanf("%d-%d-%d",d1.y,d1.m,d1.d);
printf("seconddate:
");
scanf("%d-%d-%d",d2.y,d2.m,d2.d);
td=days(d1,d2);
printf("%ld",td);
}
2009春江苏计算机上机考试题型解析
上机分析典型试题
第一大类:
数值类
题型1:
素数问题
2009年三月考题:
程序功能:
找出7个默森尼数。
法国数学家默森尼曾提出下列公式:
Mp=2^p-1。
当p是素数并且Mp也是素数时,称Mp为默森尼数,例如,p=5,Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp=2^11-1=2047,11是素数,2047不是素数,因此2047不是默森尼数.
[编程要求]
1.编写函数voidMersenne(longa[],intm),其功能是求出前m个默森尼数并以此将它们保存到a指向的数组中,
2.编写main函数,调用Mersenne函数并保存前7个默森尼数,将运行结果输出到屏幕及结果文件myf2.out中,最后将考生的考号也保存到结果文件myf2.out中
【测试数据与运行结果】
3 7 31 127 8191 131071 524287
#include
#defineN7
intprime(longn) /*本函数的功能是判定素数*/
{longi;
for(i=2;i<=n/2;i++) /*素数只能被1与自己整除,所以从2开始逐次比较*/
if(n%i==0) return0;
return1;
}
voidMersenne(longa[],intm)
{longf,n,k;
inti=0;
a[i++]=3;
for(n=3;i{f=1;
for(k=1;k<=n;k++) /*这个for循环实现2^n*/
f*=2;
if(prime(n)&&prime(f-1)) /*两个都是素数则成立*/
a[i++]=f-1;
}
}
voidmain()
{longa[7];
inti;FILE*fp;
fp=fopen("myf2.out","w"); /*建立文件myf2.out*/
if(fp==NULL) exit(0);
Mersenne(a,N);
for(i=0;i {printf("%8ld",a[i]);fprintf(fp,"%8ld",a[i]);
}
fprintf(fp,"\mMyexamnumberis:
0112400123");
}
题型二:
整数拆分
用一组整数验证命题,任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:
将n1的百位数与个位数字交换得到n2,求n1和n2差的绝对值得到n3,将n3的百位数字与个位数字交换得到n4;求n3与n4的和得到n5,n5一定是1089,若n1、n3是一位数或两位数,则在高位补0使其成为三位数
例如:
n1:
123,n2:
321,n3:
198(321,-123),n4:
891,n5:
1089(198+891)
【编程要求】
1.编写函数intfun(inta[],intb[],intn),其功能是用n指向数组的前n个整数验证上述命题,将所有符合命题的整数所在数组元素的下标依次保存到b指向的数组中,函数返回b数组中数据的个数
2.编写main函数,声明a数组并用测试数据初始化,用a数组作为实参调用fun函数,将a数组中所有符合命题的整数输出到屏幕及结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中
【测试数据与运行结果】
测试数据:
123 765 1 45 121 1345 131 67 696 3589
运行结果:
123 765 1 45 67
#include
#defineN100
intfun(inta[],intb[],intn)
{inti,x,y,z,s,t,m,k=0;
for(i=0;i if(a[i]/1000<1) /*判断是三位正整数*/
{x=a[i]/100;y=a[i]/10%10;z=a[i]%10; /*各位数分离*/
if(x!
=z) /*百位数字与个位数字不同*/
{s=z*100+y*10+x;
t=s>a[i]?
(s-a[i]):
(a[i]-s); /*两者的差*/
x=t/100;y=t/10%10;z=t%10;
m=z*100+y*10+x;
if(t+m==1089)
b[k++]=i;
}
}
returnk;
}
voidmain()
{inta[N]={123,765,1,45,121,1345,131,67,696,3589},b[N],n,i;
n=fun(a,b,10);
for(i=0;i printf("%5d",a[b[i]]);
}
第二大类:
字符串类
题型:
出现次数问题
函数merge的功能是:
合并两个字符串集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串的个数
【测试数据与运行结果】
测试数据:
s1集合:
{“while”,”for”,”switch”,”if”,”break”,”continue”}
s2集合:
{“for”,”case”,”do”,”else”,”char”,”switch”}
运行结果:
while for switch if break continue case do else char
#include
#include
intmerge(chars1[][10],chars2[][10],chars3[][10],intm,intn)
{inti,j,k=0;
for(i=0;i strcpy(s3[k++],s1[i]);
for(i=0;i {for(j=0;j if(strcmp(s2[i],s1[j])==0)
break;
if(j==m) /*如果不相同将s2[i]元素拷贝至s3数组中*/
strcpy(s3[k++],s2[i]);
}
returnk;
}
voidmain()
{inti,j;
chars1[6][10]={"while","for","switch","if","break","continue"},
s2[6][10]={"for","case","do","else","char","switch"},s3[20][10];
j=merge(s1,s2,s3,6,6);
for(i=0;i printf("%s",s3[i]);
}
第三大类:
二维数组类
题型:
行列变化问题
已知x数组中存储的n阶矩阵有一个鞍点(鞍点是指该位置上的数是所在行的最大数。
同时也是所在列的最小数),程序实现将矩阵中鞍点所在列移动到最右侧。
【测试数据与运行结果】
测试数据;
1 3 2 0
4 6 5 -1
7 9 8 0
-1 l0 3 2
运行结果;
Andian;a[0][1]
1 2 0 3
4 5 -1 6
7 8 0 9
-1 3 2 10
#include
#define N 4 /*定义常量*/
voidexchange(inta[][N])
{inti,j,k,f,t,m,mj;
for(i=0;i {m=a[i][0]; mj=0;f=1;
for(j=0;j if(a[i][j]>m)
{m=a[i][j]; mj=j;}
for(k=0;k if(a[k][mj] f=0;
if(k>=N)break; /*寻找到鞍点*/
}
if(f)
{printf("Andian;a[%d][%d]\n",i,mj);
for(i=0;i { t=a[i][mj];
for(j=mj;j a[i][j]=a[i][j+1];
a[i][N-1]=t;
}
}
}
voidmain()
{intx[N][N]={{1,3,2,0},{4,6,5,-1},{7,9,8,0},{-1,10,3,2}},i,j;
for(i=0;i {for(j=0;j printf("%3d",x[i][j]);
printf("\n");
}
printf("\n");
exchange(x);
for(i=0;i {for(j=0;j printf("%3d",x[i][j]);
printf("\n");
}
}
题型2:
矩阵运算
先判断一个M×N矩阵是否是一个Monge矩阵,再对该矩阵作转换,判断变换后的M×N矩阵是否仍是Monge矩阵
如果一个M×N矩阵为Monge矩阵,当且仅当i=1,2,…,m-1和j=1,2,…,n-1时
A[i,j]+A[i+1,j+1]<=A[i,j+1]+A[i+1,j]成立
【编程要求】
1.编写函数intMonge(inta[][5],intn),其功能是判断a指向的a行5列数组中存储的矩阵是否是Monge矩阵,若是则函数返回1,否则返回0
2.编写函数voidchange(inta[][5],intn),其功能是对a指向的n行5列数组中的矩阵作如下转换,第一行与最后一行交换,第二行与倒数第二行交换,….直到每一行都交换过一次为止
江苏计算机二级c2009春上机试题2
2009春第二套
一:
改错题:
程序功能:
函数mergeu的功能是:
合并两个字符集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串的个数
[测试数据与运行结果]
测试数据:
s1集合{“while”,”for”,”switch”,”if”,”continue”}
s2集合{“for”,”case”,”do”,”else”,”char”,”switch”}
运行结果:
while for switch if break continue case do else char
[含有错误的源代码]
#include
#include
intmerge(chars1[][10],chars2[][10],chars3[][10],intm,intn)
{inti,j,k=0;
for(i=0;i s3[k++]=s1[i];
for(i=0;i{for(j=0;j if(strcmp(s2[i],s1[j]))
break;
if(j>m)
strcpy(s3[k++],s2[i]);
}
returnk;
}
voidmain()
{inti,j;
chars1[6][10]={“while”,”for”,”switch”,”if”,”break”,”continue”},
s2[6][10]={“for”,”case”,”do”,”else”,”char”,”switch”},s3[20][10];
j=merge(s1[][10],s2[][10],s3[][10],6,6);
for(i=0;i printf(“%s“,s3[i]);
}
【要求】
1. 将上述程序录入到文件myf1.C中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句.
3. 改正后的源程序(文件名myfl.c)保存在T:
盘根目录中供阅卷使用,否则不予评分。
二:
编程题
[程序功能]
从一个指定的自然数n0开始,按以下公式生成一个数列,直到