2008秋江苏省计算机二级C语言上机试卷 |
2008秋季考试试卷分析: 上机试卷1: 一:改错题: [程序功能] 对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序 [测试数据与运行结果] 测试数据: 3 4 2 1 8 7 5 6 12 10 11 9 15 14 16 13 运行结果: 1 2 3 4 8 7 6 5 9 10 11 12 16 15 14 13 含有错误的源程序: #include #define N 4 void swap(int *p1, int *p2) {int p; p=p1;p1=p2;p2=p; } void sort(int a[N][N]) {int i,j,k; for(i=0;i for(j=0;j for(k=j+1;k if(i%2==0?a[i][j]a[i][k]) swap(a[i]+j,a[i]+k); } void main() {int a[N][N]={{3,4,2,1},{8,7,5,6},{12,10,11,9},{15,14,16,13}}; int i,j; sort(a[N][N]); for(i=0;i {for(j=0;j printf(“=”,a[i][j]); printf(“\n”); } } 解析:做本改错题目的时候,首先将题目输入计算机中,然后运行,运行的时候一定会有错误出现,在改错题目中有两种错误:(1)语法错误(2)逻辑错误,在本题目中,运行后会出现3个警告,警告1指向swap函数的p变量,我们可以看到p是变量,p1、p2是指针变量,两者不匹配,所以我们可以得到第一个错误,警告2指向sort(a[N][N]),我们知道在C语言中,调用函数的参数时,如果参数是数组,则只传递数组的名称,所以可以知道第二个错误sort(a[N][N])应改为sort(a),剩下的错误是逻辑错误,在考试中,一定要把a[N][N]数组中的具体数据代入函数sort中,我们可以发现k 错误1: p=p1;p1=p2;p2=p; 应改为: p=*p1;*p1=*p2;*p2=p; 错误2: for(k=j+1;k 错误3: i%2==0?a[i][j]a[i][k] 应改为: i%2==0?a[i][j]>a[i][k]:a[i][j] 错误4: sort(a[N][N]); 应改为: sort(a); 二:编程题: [程序功能]: 找出符合以下条件的Troitsky数,将该数的首位数字移动到末位数字之后得到的数是原数的整数倍 例如:将142857的首位数字1移动到末位之后得到的数是428571,而428571=3*142857,因此142857是Troitsky数 编程要求: 1. 编写函数int Troitsky(long a[]),其功能是求出1 000 000以内的所有Troitsky数,并将它们依次放入a指向的数组中,函数返回找到的Troitsky数的个数. 2. 编写main函数,调用Troitsky函数,将运行结果输出到屏幕及结果文件myf2.out中。 最后将考生的准考证号也保存到结果文件myf2.out中. [测试数据与运行结果] 142857 285714 1.将源文件取名为myf2.c,输出结果文件取名为myf2.out。 2.数据文件的打开、使用和关闭等操作均用C标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均须保存在T:盘的根目录下供阅卷用。 4.不要将myf2.obj、myf2.exe保存到T:盘中。 解析:本题目中主要考察的是如何将一个数转化为另一个数,因为判分标准是按照步骤给分,所以,对文件操作的一定要记住,从FILE *fp开始到结束的格式一定要背过 答案: #include int Troitsky(long a[]) {int count=0,i=0; long n,n1; for(n=1;n<=1000000;n++) {n1=(n0000)*10+n/100000; for(i=1;i<10;i++) if(i*n==n1&&n!=n1) {a[count++]=n; break; } } return count; } void main() {long a[10],i; int k; FILE *fp; fp=fopen("myf2.out","w"); if(fp==NULL) exit(0); k=Troitsky(a); for(i=0;i {printf("ld",a[i]); fprintf(fp,"ld",a[i]); } printf("\n"); fprintf(fp,"\n"); fprintf(fp,"\nmy exam number is:012345678\n"); fclose(fp); } |