📄 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 + -