江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
2007年(春)江苏二级C上机试卷

2007年(春)上机试卷(01)

(考试时间70分钟)

一、改错题(18分)

[程序功能]

    下列程序中函数fun的功能是:

    首先将s数组中的字符串按以下规则复制到t数组:对于下标值为偶数位置上的字符复制n次(n=下标值+1),对于下标值为奇数位置上的字符只复制一次;其次将t数组中的字符串按字符编码从小到大的顺序排序。

[测试数据与运行结果]

s中的字符串为“abcdefg”时,程序运行结果应为“abcccdeeeeefggggggg”

s中的字符串为“136254”时,程序运行结果应为“123455555666”

[含有错误的源程序]*/

#include "stdio.h"

#include "conio.h"

void fun(char *s,char *t)

{int i,j,k,n=0; char temp;

 for(i=0;s[i]!='\0'; ++i)

  if(i%2=0)

   for(k=0;k<i+1;++k)

   {t[n]=s[i]; n++; }

  else  t[n]=s[i];

 t[n]='\0';

 for(i=0;i<n-1;i++)

 {k=i;

  for(j=0;j<n;j++)

   if(t[j]<t[k]) k=j;

  if(k!=i)

  { temp=t[i]; t[i]=t[k]; t[k]=temp; }

 }

}

main()

{char s[20],t[100];

 printf("\nPlease enter string s:"); gets(s);

 fun(s);

 printf("The result is: %s",t);

 getch();

}

/*

二、编程题(22分)

[程序功能]

  验证对于任意一个不超过9位的自然数按下列步骤经过有限次的变换得到的新数最终转换成123并(1)统计该数中偶数数字的个数a0被当作偶数对待),该数中奇数数字的个数b,该数的总位数c

2)用a,b,c按以下规则组成一个新数:当a!=0时,a为百位,b为十位,c为个位;当a=0时,b为百位,a为十位,c为个位。(3)当这个新数不等于123时,对这个新数重复上述操作。经过多次重复,新数最终转换成123。数学上称123为陷阱数。

[编程要求]

1、编写函数int fun(long n,long a[]),对给定的一个长整型数n根据上述规则作变换,直到新生成的数等于123。在转换过程中,把n及转换过程中生成的所有数依次保存到数组a中,函数返回a数组中数据个数。

2、编写main函数,从键盘输入n的值,调用函数fun判断n是否转换成123,将n及转换过程中生成的所有数依次输出到屏幕并用写文件函数保存保存到结果文件myf2.out,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。

[测试数据与运行结果]

n=12345678时输出结果为:

  12345678448303123

  my exam number is :考生本人准考证号字符串

 

2007年(春)上机试卷(02)

(考试时间70分钟)

一、改错题(18)

[程序功能]

找到并输出2~100之间的所有互逆素数对。互逆素数对:若一个素数的反序数也是素数,则称该素数和其反序数为互逆素数对。例如,13是素数,13的反序数31也是素数,故(13,31)是互逆素数对。

算法提示:函数prime的功能是先用筛选法求出保存在a指向的结构数组元素的成员i2~n范围内的所有素数,再从中选出大于11的互逆素数对。存放互逆素数对的方法是:将互逆素数对分别存放于同一结构数组的iflag成员中。例如,1331是互逆素数对,故a[13].i=13a[13].flag=31a[31].i=31a[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<math.h>

#define N 101

struct PR{ int i;int flag; };

void prime(struct PR a[],int n)

{ int i,j;

  for(i=2;i<sqrt(n);i++)

    if(a[i].i)

      for(j=i+1;j<n;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)

    { int k=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()

 { struct PR a[N]=0;int i;

   clrscr();

   for(i=2;i<N;i++) a[i]=i;

   prime(a,N);

   for(i=2;i<N;i++)

     if(a[i].i) printf("%3d",a[i].i);

   printf("\n");

   for(i=10;i<N;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  编写函数void conv(char *ss),其功能是:从左到右依次扫描字符串ss,把小写字母o左边的所有字符移到该串的右边,并把该小写字母o删除,继续扫描字符串ss并做上述操作,直到字符串ss中所有的小写字母o被删除为止。

2  编写main函数,声明一个长度为80的字符数组并用测试数据初始化该数组,调用conv函数对数组中的字符串作上述变换,将变换后的结果字符串输出到屏幕并用写文件函数保存到结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。

[测试数据与运行结果]

测试数据:

You can create an index on any field.

输出结果:

n any field.Yu can create an index

My exam number is: 考生本人准考证号字符串

[要求]

1  源程序文件名必须取为myf2.c,输出结果文件名必须取为myf2.out

2  数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。

3  源程序文件和运行结果文件均须保存在考试盘的根目录下,供阅卷用。

4  不要复制扩展名为OBJEXE的文件到考试盘上。