江蘇省高校計算機等級考試命題研究院 江蘇省高校計算機等級考試輔導
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,n1n3是一位數或兩位數,則在高位補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列數組中的矩陣作如下轉換,第一行與最后一行交換,第二行與倒數第二行交換,….直到每一行都交換過一次為止

 

彩票30选5开奖结果