⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 98年试卷+答案(高程).txt

📁 软件工程师资料
💻 TXT
📖 第 1 页 / 共 3 页
字号:

  } 

  if(strcmp(fname,"aaaa")==0)break; 

  fscanf(fp,"%d",&ss);/·输入科目号·/s[sp]=ss; 

  for(i=0;s[i]!=ss;i++); 

  if(i<sp) 

  {printf("该科目的成绩已输入,请输入别的科目成绩文件。\n"); 

   continue; 

  } 

  sp++; 

  while(fscanf(fp,"%s%d",no,&mark)==2) 

  {/*在链表中寻找最近输入的学号*/ 

   for(v=h;v!=NULL,&& strcmp(v→no,no)<0;u=v,v=v→next); 

   if(v!=NULL && strcmp(v→no,no)==0) 

   {if (v→cur_s!==ss) 

    {v→score+=mark;v→cur_s=ss; 

    }/*同一科目成绩的重复输入,后输入成绩被忽略*/ 

   }else {p=(NODE*)malloc(sizeof(node);/*一位新的学生*/ 

       strcpy(p→no,no);p→score=mark;p→cur_s=ss; 

       p→next=v; 

       if(v==h) h=p;else u→next=p; 

      } 

  } fclose(fp); 

  printf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",&ans); 

  if(anns=='N'||ans=='n')break; 

 } 

 h=bubblesort(h); 

 printf("名次 总成绩 人数 学号\n");/*以下按格式要求输出*/ 

 v=h;order=1; 

 while(v!=NULL) 

 {for (c=1,u=v→next;u!NULL &&u→score==v→score;c++,u=u→next); 

  printf("%4d%7d%8d ",order,v→score,c); 

  for(order+=c,i=1;_(5)_;v=v→next,i++) 

  {if (i>1 && i%5==1) printf("\n%23c",''); 

   printf("%s",v→no); 

  }printf("\n"); 

 } 

} 
 

试题六 

  阅读以下程序说明和FORTRAN程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 

[程序说明] 

  本程序用以将m+n个元素的数组A中的前m个元素(A(1)-A(m))与后n个元素(A(m+l)-A(m+n))互换位置,并保持其各自原有的内部顺序。 

  程序中把数组的各元素看成首尾相连的序列,并将数组元素分成G组(G为m和n的最大公因子),每组中的元素序列是从数组某元素起由间隔为m的元素组成,再将每组元素依次循环向左传送,即得所需结果。 

  例如原数组A为: 

              
  由m=4,n=2,求得 G=2,将A中的元数分成两组。按上述说明,第一组元素序列依次为A(1)、A(5)、A(3),将它们循环向左传送后的结果为

8
 9
 7
 2
 6
 4
 

  第二组元素序列依次为以A(2)、A(6)、A(4),将它们循环向左传送后的结果为

8
 4
 7
 9
 6
 2
 

即得所需结果。

   INTEGET A(1000), G,H 

   READ(*,*)M,N 

   READ(*,*)(A(1),1=1,M+N) 

   G=M 

   H=N 

20  IF (G,NE,H)THEN 

    IF(G,GT,T)THEN 

     G=G-H 

    ELSE 

     H=H-G 

    ENDIF 

    GOTO 20 

   ENDIF 

   DO 100 I=_(1)_ 

    TEMP=A(1) 

    K=1 

30   J=_(2)_ 

    IF(J,NE,1)THEN 

     A(K)=_(3)_ 

     K=J 

     _(4)_ 

    ELSE 

     A=K=_(5)_ 

    ENDIF 

100  CONTINUE 

   WRITE(*,200)(A(I),I=1,M+N) 

200  FORMANT(1016) 

   END 
 

试题七 

  阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 

[程序说明] 

  本程序的函数 

     sum(int,i int total,int sigma,int rear,int d[],int n) 

用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。 

  函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。 

  函数对元素d[i]有两种可能的选择方案: 

  1.考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total时,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函烽就恢复原来部分元素序列中不包含d[i]的状态。 

  2.考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列时,函数将新序列不包含d[i]也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。

#include 〈stdio.h〉 

#define N 100 

int a[N]; 

int flg[N]; 

sum (int i,int total,int sigma,int rear,int d[],int t) 

{int j; 

 /*考虑元素d[i]被包含在新的部分元素序列中的可能性 */ 

 if(sigma+d[i] total/*如果d[i]与当前序列的和不超过total*/ 

 {flg[i]=1;/*d[i]被考虑在被部分元素序列中 */ 

  if(_(1)_==total) 

  {/*输出解*/ 

   for (j=0;flg[j]==0;j++); 

   printf("%4d=%d",total,d[j]); 

   for(j++;<=i;j++) 

     if (flg[j]) 

       printf("+%d",d[j]); 

   printf("\"); 

  } 

  else /*并且继续考虑后面的元素有可能找到解答时 */ 

  if(i<n-1 &&rear-d[i]+sigma>=total) 

    sum(i+1,total,_(2)_,rear-d[i],d,n); 

  _(3)_; 

 /*考虑元素d[i]不被包含在新的部分元素序列中的可能性。*/ 

 if (i<n-1&&rear-d[i]+tigma>=total) 

     sum(i+1,total,_(4),rear-d[i],d,n); 

} 

main() 

{int i,j,n,total,s,d; 

 printf("输入total!/n");scanf("%d",&total); 

 printf("输入n!/n"); scanf("%d",&n); 

 for (s=i=0;i<n;) 

 {printf ("输入第%d个元素>0且<=%d)\n",i+1,total); 

  scanf ("%d",&d); 

  if( d<1||d>total) 

   {printf("出错,请重新输入!\n"); 

     contnue; 

   } 

   s+=a[i++]=d; 

 } 

 sum(0,total,0,_(5)_,a,n); 

 printf ("\n\n"); 

} 
 

试题八 

  阅读以下程序说明和FORTRAN程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 

[程序说明] 

  本程序用以查找给定数组A的第K小元素。程序执行后,第K小元素存放在数组元素A(K)中。 

  设给定的数组中各元素A(i)=(i=1,2…N)互为不相等。它的第K(1≤k≤N)小元素是指这样的元素;它大于N个元素中的K-1个元素,而小于其余的N-K个元素。假如,假设N=8,数组A为:

44
 94
 12
 50
 55
 6
 18
 67
 

它的第5小元素(即K=5)是50。 

  本程序的处理过程如下: 

  将A(K)的值(此例为A(5),此时值为55)存入X,从左向右扫描,直至遇以第一个不小于X的元素(此时为94),再从右向左扫描,直到遇见第一个不大于X的元素(此时为18),然后交换这两个元素,数且A成为:

44
 18
 12
 50
 55
 6
 94
 67
 

继续这一“扫描与交换”的过程,直到两个方向的扫描在数组中间的某处汇合。此时数组被分成两段,汇合点左边的元素均小于汇合点右边的元素。然后选取存在第K小元素的一段,重复上述扫描、交换和调整扫描范围的处理过程。程序中采用L、R来表示扫描的范围的左右边界。开始时L为1,R为N,以后逐次调整。当变成为L值不小于R值时,A[K]即是第K小元素。

   SUBROUTINT FIND(A,N,K) 

   INTEGET A(N),R,X,W 

   L=1 

   R=N 

20  IF (L,LT,R)THEN 

    X=A(K) 

    I=L 

    J=R 

30   IF(A(1),LT,X)THEN 

     I=I+1 

     GOTO 30 

    ENDIF 

40   IF(___(1)___)THEN 

     ___(2)___ 

     GOTO 40 

    ENDIF 

    IF(I,LE,J)THEN 

     W=A(I) 

     ___(3)___ 

     I=I+1 

     ___(4)___ 

    IF(I,LE,J)___(5)___ 

    ENDIF 

    IF(J,LT,K)L=I 

    IF(___(6)___) R=___(7)___ 

    GOTO 20 

   ENDIF 

   RETURN 

   END 
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -