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