2009春江蘇計算機上機考試題型解析 |
上機分析典型試題 第一大類:數值類 題型1:素數問題 2009年三月考題: 程序功能:找出7個默森尼數。法國數學家默森尼曾提出下列公式:Mp=2^p-1。當p是素數并且Mp也是素數時,稱Mp為默森尼數,例如,p=5, Mp=2^5-1=31,5和31都是素數,因此31是默森尼數;而Mp=2^11-1=2047,11是素數,2047不是素數,因此2047不是默森尼數. [編程要求] 1.編寫函數void Mersenne(long a[ ],int m),其功能是求出前m個默森尼數并以此將它們保存到a指向的數組中, 2.編寫main函數,調用Mersenne函數并保存前7個默森尼數,將運行結果輸出到屏幕及結果文件myf2.out中,最后將考生的考號也保存到結果文件myf2.out中 【測試數據與運行結果】 3 7 31 127 8191 131071 524287 #include <stdio.h> #define N 7 int prime(long n) /*本函數的功能是判定素數*/ {long i; for(i=2;i<=n/2;i++) /*素數只能被1與自己整除,所以從2開始逐次比較*/ if(n%i==0) return 0; return 1; } void Mersenne(long a[ ],int m) {long f,n,k; int i=0; a[i++]=3; for(n=3;i<m;n+=2) {f=1; for(k=1;k<=n;k++) /*這個for循環實現2^n*/ f*=2; if(prime(n)&&prime(f-1)) /*兩個都是素數則成立*/ a[i++]=f-1; } } void main() {long a[7]; int i;FILE *fp; fp=fopen("myf2.out","w"); /*建立文件myf2.out*/ if(fp==NULL) exit(0); Mersenne(a,N); for(i=0;i<N;i++) {printf("%8ld",a[i]);fprintf(fp,"%8ld",a[i]); } fprintf(fp,"\mMy exam number is:0112400123"); } 題型二:整數拆分 用一組整數驗證命題,任意一個百位數字與個位數字不同的三位正整數n1在經過以下操作后一定會變換到1089:將n1的百位數與個位數字交換得到n2,求n1和n2差的絕對值得到n3,將n3的百位數字與個位數字交換得到n4;求n3與n4的和得到n5,n5一定是1089,若n1、n3是一位數或兩位數,則在高位補0使其成為三位數 例如:n1:123,n2:321,n3:198(321,-123),n4:891,n5:1089(198+891) 【編程要求】 1.編寫函數int fun(int a[ ],int b[ ], int n),其功能是用n指向數組的前n個整數驗證上述命題,將所有符合命題的整數所在數組元素的下標依次保存到b指向的數組中,函數返回b數組中數據的個數 2.編寫main函數,聲明a數組并用測試數據初始化,用a數組作為實參調用fun函數,將a數組中所有符合命題的整數輸出到屏幕及結果文件myf2.out中,最后將考生本人的準考證號字符串也保存到結果文件myf2.out中 【測試數據與運行結果】 測試數據:123 765 1 45 121 1345 131 67 696 3589 運行結果:123 765 1 45 67 #include <stdio.h> #define N 100 int fun(int a[ ],int b[ ], int n) {int i,x,y,z,s,t,m,k=0; for(i=0;i<n;i++) if(a[i]/1000<1) /*判斷是三位正整數*/ {x=a[i]/100;y=a[i]/10%10;z=a[i]%10; /*各位數分離*/ if(x!=z) /*百位數字與個位數字不同*/ {s=z*100+y*10+x; t=s>a[i]?(s-a[i]): (a[i]-s); /*兩者的差*/ x=t/100;y=t/10%10;z=t%10; m=z*100+y*10+x; if(t+m==1089) b[k++]=i; } } return k; } void main() {int a[N]={123,765,1,45,121,1345,131,67,696,3589},b[N],n,i; n=fun(a,b,10); for(i=0;i<n;i++) printf("%5d",a[b[i]]); } 第二大類:字符串類 題型:出現次數問題 函數merge的功能是:合并兩個字符串集合為一個新集合,每個字符串在新集合中僅出現一次,函數返回新集合中字符串的個數 【測試數據與運行結果】 測試數據: s1集合:{“while”,”for”,”switch”,”if”,”break”,”continue”} s2集合:{“for”,”case”,”do”,”else”,”char”,”switch”} 運行結果: while for switch if break continue case do else char #include <stdio.h> #include <string.h> int merge(char s1[ ][10],char s2[ ][10],char s3[ ][10],int m,int n) {int i,j,k=0; for(i=0;i<m;i++) /*這個for循環實現將s1數組值傳遞給s3*/ strcpy(s3[k++],s1[i]); for(i=0;i<n;i++) /*通過遍歷將s1與s2進行比較兩者是否相同*/ {for(j=0;j<m;j++) if(strcmp(s2[i],s1[j])==0) break; if(j==m) /*如果不相同將s2[i]元素拷貝至s3數組中*/ strcpy(s3[k++],s2[i]); } return k; } void main() {int i,j; char s1[6][10]={"while","for","switch","if","break","continue"}, s2[6][10]={"for","case","do","else","char","switch"},s3[20][10]; j=merge(s1,s2,s3,6,6); for(i=0;i<j;i++) printf("%s ",s3[i]); } 第三大類:二維數組類 題型:行列變化問題 已知x數組中存儲的n階矩陣有一個鞍點(鞍點是指該位置上的數是所在行的最大數。同時也是所在列的最小數),程序實現將矩陣中鞍點所在列移動到最右側。 【測試數據與運行結果】 測試數據; 1 3 2 0 4 6 5 -1 7 9 8 0 運行結果; An dian;a[0][1] 1 2 0 3 4 5 -1 6 7 8 0 9 -1 3 2 10 #include<stdio.h> #define N 4 /* 定義常量*/ void exchange(int a[][N]) {int i,j,k,f,t,m,mj; for(i=0;i<N;i++) {m=a[i][0]; mj=0;f=1; for(j=0;j<N;j++) /*這個for循環實現尋找一行的最大數*/ if(a[i][j]>m) {m=a[i][j]; mj=j;} for(k=0;k<N&&f;k++) /*這個for循環實現查找列中是否是最大數*/ if(a[k][mj]<m) f=0; if(k>=N)break; /*尋找到鞍點*/ } if(f) {printf("An dian;a[%d][%d]\n",i,mj); for(i=0;i<N;i++) /*這個for循環實現轉換*/ { t=a[i][mj]; for(j=mj;j<N-1;j++) /*交換元素中的數值,實現數組元素向前移動*/ a[i][j]=a[i][j+1]; a[i][N-1]=t; } } } void main() {int x[N][N]={{1,3,2,0},{4,6,5,-1},{7,9,8,0},{-1,10,3,2}},i,j; for(i=0;i<N;i++) {for(j=0;j<N;j++) printf("%3d",x[i][j]); printf("\n"); } printf("\n"); exchange(x); for(i=0;i<N;i++) {for(j=0;j<N;j++) printf("%3d",x[i][j]); printf("\n"); } } 題型2:矩陣運算 先判斷一個M×N矩陣是否是一個Monge矩陣,再對該矩陣作轉換,判斷變換后的M×N矩陣是否仍是Monge矩陣 如果一個M×N矩陣為Monge矩陣,當且僅當i=1,2,…,m-1和j=1,2,…,n-1時 A[i,j]+A[i+1,j+1]<=A[i,j+1]+A[i+1,j]成立 【編程要求】 1.編寫函數int Monge(int a[ ][5],int n),其功能是判斷a指向的a行5列數組中存儲的矩陣是否是Monge矩陣,若是則函數返回1,否則返回0 2.編寫函數void change(int a[ ][5],int n),其功能是對a指向的n行5列數組中的矩陣作如下轉換,第一行與最后一行交換,第二行與倒數第二行交換,….直到每一行都交換過一次為止 |