C语言上机试题操作.docx
《C语言上机试题操作.docx》由会员分享,可在线阅读,更多相关《C语言上机试题操作.docx(85页珍藏版)》请在冰豆网上搜索。
![C语言上机试题操作.docx](https://file1.bdocx.com/fileroot1/2023-1/27/bd31f3f0-303a-43f0-a8cd-744795f40533/bd31f3f0-303a-43f0-a8cd-744795f405331.gif)
C语言上机试题操作
2007年春C语言上机
(C01)
一、改错题(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++;}
elset[n]=s[i];
t[n]='\0';
for(i=0;i{
k=i;
for(j=0;jif(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\n",t);
getch();
}
【要求】
1.将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3.改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(22分)
【程序功能】
验证对于任意一个不超过9位的自然数按下列步骤经过有限次的变换得到的新数最终收敛到123:
①统计该数中偶数数字的个数a,该数中奇数数字的个数b,该数的总位数c。
②用a、b、c按以下规则组成一个新数:
当a≠0时,a为百位,b为十位,c为个位;当a=0时,b为百位,a为十位,c为个位。
③当这个新数不等于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
当n=13579时,输出结果为:
13579,505,123
myexamnumberis:
考生本人准考证号字符串
C02
一、改错题(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。
【测试数据与运行结果】
运行结果:
2357111317192329313741434753596167717379838997
13,31
17,71
31,13
37,73
71,17
73,37
79,97
97,79
【含有错误的源程序】
#include
#include
#include
#defineN101
structPR{inti;intflag;};
voidprime(structPRa[],intn)
{inti,j;
for(i=2;iif(a[i].i)
for(j=i+1;jif(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;
for(i=2;ia[i]=i;
prime(a,N);
for(i=2;iif(a[i].i)printf("%3d",a[i].i);
printf("\n");
for(i=10;iif(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并做上述操作,直到所有的小写字母o被删除为止。
2.编写main函数,声明一个长度为80的字符数组并用测试数据初始化该数组,调用conv函数对数组中的字符串作上述变换,将变换后的结果字符串输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
【测试数据与运行结果】
测试数据:
Youcancreateanindexonanyfield.
输出结果:
nanyfield.Yucancreateanindex
myexamnumberis:
考生本人准考证号字符串
C03
一、改错题(18分)
【程序功能】
验证:
在72000之间的所有素数中存在这样的两个素数,它们的差恰好是1898。
算法提示:
main函数先将72000之间的所有素数放入a数组中,然后调用fun函数验证命题。
若命题成立,则fun函数将找到的两个素数保存到x和y指向的两个变量中,fun函数返回1,否则返回0。
main函数根据fun函数的返回值或输出满足条件的这两个素数,或输出“notfound!
”。
【测试数据与运行结果】
运行结果为:
1951-53=1898
【含有错误的源程序】
#include"stdio.h"
#include"conio.h"
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;ifor(j=1;jif(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指向的二维数组(该数组中保存了一个n4矩阵的数据)以行作为交换单位,按照下标为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:
考生本人准考证号字符串
C04
一、改错题(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()
{CARstr={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();
}
【要求】
1.将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3.改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(22分)
【程序功能】
求级数的前n项之和。
【编程要求】
1.编写函数doublefun(doubleeps),其功能是计算当第n项的绝对值小于eps时,下列级数前n项的和,函数返回计算结果。
其中:
pi(i=1,2,3…,n)是500以内素数序列中的第i个素数。
500以内素数序列为:
2,3,5,7,11,13,17,…
2.编写main函数,接收键盘输入的eps值,调用函数fun计算级数前n项的和,将计算结果输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。
【测试数据与运行结果】
测试数据:
键盘输入1e-7
输出结果:
s=0.954760
myexamnumberis:
考生本人准考证号字符串
C05
一、改错题(18分)
【程序功能】
下列程序完成对n阶矩阵(n为奇数)的变换,将原矩阵左下角n/2阶子块中的数据与矩阵右上角n/2阶子块中的数据作交换,显示交换过子块后的n阶矩阵。
【测试数据与运行结果】
n=5
原矩阵:
变换后的矩阵:
【含有错误的源程序】
#include
#include
#defineM10
voidswap(intx,inty)
{intt;
t=*x;*x=*y;*y=t;
}
voidchange(inta[][M],intn)
{inti,j,c;
for(i=0;ifor(j=n/2+1;jswap(&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;jprintf("%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;ifor(j=0;ja[i][j]=i*n+j;
print(a,n);
change(a);
print(a,n);
getch();
}
【要求】
1.将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3.改正后的源程序(文件名myf1.c)保存在考试软盘的根目录中供阅卷使用,否则不予评分。
二、编程题(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:
考生本人准考证号字符串
C06
一、改错题(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"stdio.h"
#include"conio.h"
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
c[k++]=b[j++];
}
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");
else
printf("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:
考生本人准考证号字符串
C07
一、改错题(18分)
【程序功能】
下列程序中函数fun的功能是:
在N名学生中按学习成绩从高到低的顺序排出前m名学生(m≤10),并将这些学生的数据存放在一个动态分配的连续存储区中,函数返回此存储区的首地址。
【测试数据与运行结果】
m=5时,输出结果为:
A1091
A0690
A0289
A0487
A0181
【含有错误的源程序】
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#defineN10
typedefstructss{charnum[10];ints;}STU;
STU*fun(STUa[],intm)
{STUb[N],*t;
inti,j,k;
t=(STU*)malloc(m,sizeof(STU));
for(i=0;ifor(k=0;k{
for(i=j=0;iif(b[i]>b[j])j=i;
t[k]=b[j];b[j].s=0;
}
returnt;
}
main()
{STUa[N]={{"A01",81},{"A02",89},{"A03",6