春C语言上机考试题8套.docx
《春C语言上机考试题8套.docx》由会员分享,可在线阅读,更多相关《春C语言上机考试题8套.docx(24页珍藏版)》请在冰豆网上搜索。
春C语言上机考试题8套
2007春C语言上机考试题8套
发表时间:
2007-10-19
2007年(春)上机试卷(01)
一、改错题(18分)
[程序功能]
下列程序中函数fun的功能是:
首先将s数组中的字符串按以下规则复制到t数组:
对于下标值为偶数位置上的字符复制n次(n=下标值+1),对于下标值为奇数位置上的字符只复制一次;其次将t数组中的字符串按字符编码从小到大的顺序排序。
[测试数据与运行结果]
当s中的字符串为“abcdefg”时,程序运行结果应为“abcccdeeeeefggggggg”
当s中的字符串为“136254”时,程序运行结果应为“123455555666”
[含有错误的源程序]*/
#include"stdio.h"
#include"conio.h"
voidfun(char*s,char*t)
{inti,j,k,n=0;chartemp;
for(i=0;s[i]!
='\0';++i)
if(i%2=0)
for(k=0;k
{t[n]=s[i];n++;}
else t[n]=s[i];
t[n]='\0';
for(i=0;i {k=i;
for(j=0;j if(t[j] if(k!
=i)
{temp=t[i];t[i]=t[k];t[k]=temp;}
}
}
main()
{chars[20],t[100];
printf("\nPleaseenterstrings:
");gets(s);
fun(s);
printf("Theresultis:
%s",t);
getch();
}
/*
二、编程题(22分)
[程序功能]
验证对于任意一个不超过9位的自然数按下列步骤经过有限次的变换得到的新数最终转换成123并
(1)统计该数中偶数数字的个数a(0被当作偶数对待),该数中奇数数字的个数b,该数的总位数c。
(2)用a,b,c按以下规则组成一个新数:
当a!
=0时,a为百位,b为十位,c为个位;当a=0时,b为百位,a为十位,c为个位。
(3)当这个新数不等于123时,对这个新数重复上述操作。
经过多次重复,新数最终转换成123。
数学上称123为陷阱数。
[编程要求]
1、编写函数intfun(longn,longa[]),对给定的一个长整型数n根据上述规则作变换,直到新生成的数等于123。
在转换过程中,把n及转换过程中生成的所有数依次保存到数组a中,函数返回a数组中数据个数。
2、编写main函数,从键盘输入n的值,调用函数fun判断n是否转换成123,将n及转换过程中生成的所有数依次输出到屏幕并用写文件函数保存保存到结果文件myf2.out,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
当n=12345678时输出结果为:
12345678,448,303,123
myexamnumberis:
考生本人准考证号字符串
2007年(春)上机试卷(02)
一、改错题(18分)
[程序功能]
找到并输出2~100之间的所有互逆素数对。
互逆素数对:
若一个素数的反序数也是素数,则称该素数和其反序数为互逆素数对。
例如,13是素数,13的反序数31也是素数,故(13,31)是互逆素数对。
算法提示:
函数prime的功能是先用筛选法求出保存在a指向的结构数组元素的成员i中2~n范围内的所有素数,再从中选出大于11的互逆素数对。
存放互逆素数对的方法是:
将互逆素数对分别存放于同一结构数组的i和flag成员中。
例如,13和31是互逆素数对,故a[13].i=13,a[13].flag=31;a[31].i=31,a[31].flag=13。
[测试数据与运行结果]
运行结果
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
13, 31
17, 71
31, 13
37, 73
71, 17
73, 37
79, 97
97, 79
[含有错误的源程序]
#include
#defineN101
structPR{inti;intflag;};
voidprime(structPRa[],intn)
{inti,j;
for(i=2;i if(a[i].i)
for(j=i+1;j if(a[j].i&&a[j].i%a[i].i=0)
a[j].i=0;
for(i=12;i<=n;i++)
if(a[i].i)
{intk=i,s=0;
while(k){s=s*10+k%10;k/=10;}
if(a[s].i)
{a[k].flag=i;a[i].flag=k;}
}
}
main()
{structPRa[N]=0;inti;
clrscr();
for(i=2;i prime(a,N);
for(i=2;i if(a[i].i)printf("%3d",a[i].i);
printf("\n");
for(i=10;i if(a[i].flag)printf("%4d,%4d\n",a[i].i,a[i].flag);
getch();
}
要求:
1、将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2、改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3、改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(22分)
[程序功能]
字符串变换
[编程要求]
1. 编写函数voidconv(char*ss),其功能是:
从左到右依次扫描字符串ss,把小写字母o左边的所有字符移到该串的右边,并把该小写字母o删除,继续扫描字符串ss并做上述操作,直到字符串ss中所有的小写字母o被删除为止。
2. 编写main函数,声明一个长度为80的字符数组并用测试数据初始化该数组,调用conv函数对数组中的字符串作上述变换,将变换后的结果字符串输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
测试数据:
Youcancreateanindexonanyfield.
输出结果:
nanyfield.Yucancreateanindex
Myexamnumberis:
考生本人准考证号字符串
[要求]
1. 源程序文件名必须取为myf2.c,输出结果文件名必须取为myf2.out。
2. 数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。
3. 源程序文件和运行结果文件均须保存在考试盘的根目录下,供阅卷用。
4. 不要复制扩展名为OBJ和EXE的文件到考试盘上。
2007年(春)上机试卷(03)
一、改错题(18分)
[程序功能]
验证:
在7~2000之间的所有素数中存在这样的两个素数,它们的差恰好是1898。
算法提示:
main函数先将7~2000之间的所有素数放入a数组中,然后调用fun函数验证命题。
若命题成立,则fun函数将找到的两个素数所在的数组元素下标保存到x和y指向的两个变量中,fun函数返回1,否则返回0。
main函数根据fun函数的返回值,输出满足条件的这两个素数,或输出“notfound!
”。
[测试数据与运行结果]
运行结果为:
1951-53=1898
[含有错误的源程序]
#include
#include
intprime(intn)
{inti;
for(i=2;i<=n/2;i++)
if(n%i==0)return0;
elsereturn1;
}
intfun(inta[],intn,int*x,int*y)
{inti,j;
for(i=0;i for(j=1;j if(a[j]-a[i]==1898)
{x=i,y=j;return1;}
return0;
}
main()
{inta[1000]=0;inti,k=0,flag,m,n;
for(i=7;i<2000;i+=2)
if(prime(i))a[k++]=i;
flag=fun(a,k,m,n);
if(flag)printf("%d-%d=%d\n",a[n],a[m],a[n]-a[m]);
elseprintf("notfound!
\n");
getch();
}
要求:
1、将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2、改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3、改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(22分)
[程序功能]
以矩阵的行作为排序的交换单位,使得排序后的矩阵按指定列的元素值递减有序。
[编程要求]
1.编写函数voidsort(intx[][4],intn,intcol)。
函数功能:
对x指向的二维数组(该数组中保存了一个n×4矩阵)以行作为交换单位,按照下标为col的列元素值做递减排序。
2.编写main函数。
函数功能:
声明一个3行4列二维数组并用测试数据初始化该数组,调用sort函数对该数组中保存的矩阵按第3列(列下标为2)排序,将排序后二维数组中的矩阵输出到屏幕并用写文件函数保存到结果文件myf2.out中。
最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
测试数据:
101 80 60 90
102 70 90 50
103 60 70 80
运行结果(按第3列排序后):
102 70 90 50
103 60 70 80
101 80 60 90
Myexamnumberis:
考生本人准考证号字符串
[要求]
1. 源程序文件名必须取为myf2.c,输出结果文件名必须取为myf2.out。
2. 数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。
3. 源程序文件和运行结果文件均须保存在考试盘的根目录下,供阅卷用。
4. 不要复制扩展名为OBJ和EXE的文件到考试盘上。
2007年(春)上机试卷(04)
一、改错题(18分)
[程序功能]
下列程序中fun函数的功能是:
从键盘接收若干个字符串(不超过10个),将它们依次连接并保存到string数组中,直到输入的字符串为“done”为止(不连接字符串“done”)。
统计连接的字符串个数并存放到n指向的变量中。
main函数中首先将字符串“0422400110”存储到结构变量str的成员number中,然后调用fun函数,把连接的字符串个数存放结构变量str的count成员中,最后将string数组起始地址保存到结构变量str的string成员中。
[测试数据与运行结果]
输入的字符串依次为:
abxyz1234done 代表回车
输出结果为:
0422400110,3
abxyz1234
[含有错误的源程序]
#include"stdio.h"
#include"string.h"
#include"conio.h"
typedefstruct{charnumber[12]; char*string;intcount;}CAR;
charstring[100];
voidfun(int*n)
{charp[10],*strp; intlimit=0;
strp=string;
gets(p);
while(limit<10)
{if(p=="done")break;
strcat(strp,p);
strp+=strlen(p);
*n++;
gets(p);limit++;
}
}
main()
{CAR str={0,0,0};
str.number="0422400110";
fun(str.count);
str.string=string;
printf("%s,%d\n",str.number,str.count); printf("%s\n",str.string);
getch();
}
二、编程题(22分)
[程序功能]
求级数前n项之和
[编程要求]
1、编写函数double(fun(doubleeps),其功能是计算下列正项级数的部分和,当级数某项的值小于eps时,函数返回计算结果。
s=1/2+2/2*3+3/2*3*5+....+n/p1*p2*p3*...*pn
其中:
pi(i=1,2,3,...n)是500以内素数序列中的第i个素数。
500以内素数序列为:
2,3,5,6,11,13,17,...
2、编写main函数,接收键盘输入的eps值,调用函数fun计算级数前n项的和,将计算结果输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
测试数据:
键盘输入1e-7
输出结果:
s=0.954760
myexamnumberis:
考生本人准考证号字符串
[要求]
1、源程序文件名必须取为myf2.c,输出结果文件名为myf2.out。
2、数据文件的打开、使用、关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。
3、源程序文件和运行结果文件均需保存在考试盘根目录中供阅卷使用。
4、不要复制扩展名为obj和exe的文件到考试盘上。
2007年(春)上机试卷(05)
一、改错题(18分)
[程序功能]
下列程序完成对n阶矩阵(n为奇数)的变换,将原矩阵左下角n/2阶子块中的数据与矩阵右上角n/2阶子块中的数据作交换,显示交换过子块后的n阶矩阵。
[测试数据与运行结果]
n=5
原矩阵:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
变换后的矩阵:
0 1 2 15 16
5 6 7 20 21
10 11 12 13 14
3 4 17 18 19
8 9 22 23 24
[含有错误的源程序]
#include
#include
#defineM10
voidswap(intx,inty)
{intt;
t=*x;*x=*y;*y=t;
}
voidchange(inta[][M],intn)
{inti,j,c;
for(i=0;i for(j=n/2+1;j swap(&a[i][j],&a[i+n/2+1][j-n/2+1]);
}
voidprint(inta[][M],intn)
{inti,j;
printf("\n");
for(i=0;i {for(j=0;j printf("%5d",a[i][j]);
printf("\n");
}
}
voidmain()
{inta[M][M],i,j,n=0;
printf("\nINPUTN(N<10):
");
scanf("%f",&n);
if(n>=10||n%2==0)
{printf("Can'tdoit");getch();return;}
for(i=0;i for(j=0;j a[i][j]=i*n+j;
print(a,n);
change(a);
print(a,n);
getch();
}
二、编程题(22分)
[程序功能]
解密
密文由若干个8进制数形式的字符串组成,相邻两个8进制数形式的字符串之间用字符8分隔,每个8进制数形式的字符串对应的8进制数是一个字符的ASCII码,ASCII码对应的字符是解密后的明文字符。
例如:
密文为“10181248124810181038113840810181248408104810181278116”
则明文为“ATTACKATDAWN”
[编程要求]
1、编写函数voidfun(char*s,char*c),其功能是将s指向的密文解密,并将明文保存到c指向的数组中。
2、编写main函数,声明字符数组s和c,用测试数据初始化s数组,调用函数fun对s数组中的密文解密,将解密后得到的明文输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将学生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
测试数据:
10181248124810181038113840810181248408104810181278116
输出结果:
ATTACKATDAWN
myexamnumberis:
考生本人准考证号字符串
2007年(春)上机试卷(06)
一、改错题(18分)
[程序功能]
合并两个整系数多项式,输出合并后的多项式。
main函数中将两个多项式中每一项的系数和指数分别保存于结构数组a和b中,结构的成员a用于存入多项式中某一项的系数,成员n用于存入该项的指数,结构数组a和b存储的数据按降幂次序排列。
merge函数合并存储在a、b数组中的两个多项式,并将合并后多项式中每一项的系数和指数保存于C数组中。
[测试数据与运行结果]
输入两个多项式分别是
5x6-4x4-7x3+1和4x4+3x3+5x2+4x
则输出结果为
+5x^6-4x^3+5x^2+4x^1+1
[含有错误的源程序]
#include
#include
structp{inta;intn;};
intmerge(structp*a,structp*b,structp*c)
{inti=0,j=0,k=0;
while(a[i].a!
=0&&b[j].a!
=0)
{if(a[i].n==b[j].n)
if(a[i].a+b[j].a==0)
{c[k].a=a[i].a+b[j].a;
c[k].n==a[i].n;
k++;i++;j++;
}
elsei++,j++;
if(a[i].n>b[j].n)c[k++]=a[i++];
elseif(a[i].n
}
if(a[i]==0)
while(b[j].a!
=0)c[k++]=b[j++];
else
while(a[i].a!
=0)c[k++]=a[i++];
returnk;
}
main()
{structpa[20]={{5,6},{-4,4},{-7,3},{1,0}};
structpb[20]={{4,4},{3,3},{5,2},{4,1}},c[20]={0};
inti,k;
k=merge(*a,*b,*c);
for(i=0;i {printf("%+d",c[i].a);
if(c[i].n==0)printf("\n");
elseprintf("x^%d",c[i].n);
}
getch();
}
要求:
1、将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2、改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3、改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(22分)
[程序功能]
查找指定范围内的互满数对。
如果数a的真因子之和等于数b,且数b的真因子之和等于数a,则称(a,b)为一对互满数。
例如,(220,284)是一对互满数,因为220的真因子之和为284(1+2+4+5+10+11+20+22+44+55+110=284),且284的真因子之和为
220(1+2+4+71+142=220)
[编程要求]
1.编写函数intampairs(intm,intn,inta[][2]),其功能是找出[m,n]之间的所有互满数对,并将它们依次保存到二维数组a中,函数返回找到的互满数对的个数。
2.编写main函数。
从键盘输入m和n的值,调用函数ampairs查找[m,n]范围内的互满数对,把找到的互满数对输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
[测试数据与运行结果]
测试数据:
m=200,n=10000
输出结果:
(220,284)
(1184,1210)
(2620,2924)
(5020,5564)
(6232,6368)
Myexamnumberis:
考生本人准考证号字符串
[要求]
1. 源程序文件名必须取为myf2.c,