?? 98年試卷+答案(高程).txt
字號:
}
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 + -