![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
2008秋江蘇省計算機二級C語言上機試卷 |
2008秋季考試試卷分析: 上機試卷1: 一:改錯題: [程序功能] 對N行N列二維數(shù)組的每一行排序,偶數(shù)行(0當作偶數(shù))由小到大排序,奇數(shù)行由大到小排序 [測試數(shù)據(jù)與運行結果] 測試數(shù)據(jù): 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”); } } 解析:做本改錯題目的時候,首先將題目輸入計算機中,然后運行,運行的時候一定會有錯誤出現(xiàn),在改錯題目中有兩種錯誤:(1)語法錯誤(2)邏輯錯誤,在本題目中,運行后會出現(xiàn)3個警告,警告1指向swap函數(shù)的p變量,我們可以看到p是變量,p1、p2是指針變量,兩者不匹配,所以我們可以得到第一個錯誤,警告2指向sort(a[N][N]),我們知道在C語言中,調用函數(shù)的參數(shù)時,如果參數(shù)是數(shù)組,則只傳遞數(shù)組的名稱,所以可以知道第二個錯誤sort(a[N][N])應改為sort(a),剩下的錯誤是邏輯錯誤,在考試中,一定要把a[N][N]數(shù)組中的具體數(shù)據(jù)代入函數(shù)sort中,我們可以發(fā)現(xiàn)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數(shù),將該數(shù)的首位數(shù)字移動到末位數(shù)字之后得到的數(shù)是原數(shù)的整數(shù)倍 例如:將142857的首位數(shù)字1移動到末位之后得到的數(shù)是428571,而428571=3*142857,因此142857是Troitsky數(shù) 編程要求: 1. 編寫函數(shù)int Troitsky(long a[]),其功能是求出1 000 000以內的所有Troitsky數(shù),并將它們依次放入a指向的數(shù)組中,函數(shù)返回找到的Troitsky數(shù)的個數(shù). 2. 編寫main函數(shù),調用Troitsky函數(shù),將運行結果輸出到屏幕及結果文件myf2.out中。 最后將考生的準考證號也保存到結果文件myf2.out中. [測試數(shù)據(jù)與運行結果] 142857 285714 1.將源文件取名為myf2.c,輸出結果文件取名為myf2.out。 2.數(shù)據(jù)文件的打開、使用和關閉等操作均用C標準庫中緩沖文件系統(tǒng)的文件操作函數(shù)實現(xiàn)。 3.源程序文件和運行結果文件均須保存在T:盤的根目錄下供閱卷用。 4.不要將myf2.obj、myf2.exe保存到T:盤中。 解析:本題目中主要考察的是如何將一個數(shù)轉化為另一個數(shù),因為判分標準是按照步驟給分,所以,對文件操作的一定要記住,從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); } |