1. <small id="kntrr"><delect id="kntrr"></delect></small>
    2. <sub id="kntrr"></sub>
        1. <form id="kntrr"><listing id="kntrr"></listing></form>
            江蘇省高校計算機等級考試命題研究院 江蘇省高校計算機等級考試輔導
            2009春江蘇計算機上機考試題型解析

            上機分析典型試題

            第一大類:數值類

            題型1:素數問題

            2009年三月考題:

            程序功能:找出7個默森尼數。法國數學家默森尼曾提出下列公式:Mp=2^p-1。當p是素數并且Mp也是素數時,Mp為默森尼數,例如,p=5, Mp=2^5-1=31,531都是素數,因此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,n1n2差的絕對值得到n3,將n3的百位數字與個位數字交換得到n4;n3n4的和得到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++)           /*通過遍歷將s1s2進行比較兩者是否相同*/

             {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

                -1  l0    3    2

            運行結果;

              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-1j=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指向的a5列數組中存儲的矩陣是否是Monge矩陣,若是則函數返回1,否則返回0

            2.編寫函數void change(int a[ ][5],int n),其功能是對a指向的n5列數組中的矩陣作如下轉換,第一行與最后一行交換,第二行與倒數第二行交換,….直到每一行都交換過一次為止

             

            国产在线精品一区二区三区不卡_亚洲第一极品精品无码_永久免费无码网站在线观看_亚洲av综合日韩