|
作者: 时间:2001-9-24 15:26:11 来自: 责任编辑: 阅读次数: | |
 |
为了使近似值达到指定精度EPS,程度中采取了逐步扩大n 的方法。
[程序]
PARAMETER (PI=3.14159265)
EXTERNAL F
____(1)____
REAL EPS, S, X, X1
WRITE (*.*) 'Please enter EPS:'
READ (*,*)EPS
X=0.0
N=2
10 N=2*N
X1=X
CALL ____(2)____
X=S/PI
CALL ____(3)____
X=X+S
IF(____(4)____)GOTO 10
WRITE (*,20)X
20 FORMAT (1X, 'X= ',F10.7)
END
FUNCTION F(X)
____(5)____=1.0/(3.0+2.0*X)
END
SUBROUTINE SIMPSO(A,B,N,G,S)
H=(B-A)/2/N
S=G(A)-G(B)
DO 10 J=____(6)____
S=S+4.0*G(A+J*H)+2.0*G(A+(J+1)*H)
10 CONTINUE
S=S*H/3.0
END
试题三
阅读以下程序说明和C程序,将应填入程序中 (n) 处的字句,写在答卷的对应栏内。
[程序说明]
本程序将自然数1,2,……,N2按蛇形方式逐个顺序存入N阶矩阵。
例如,当N = 3和4时分别如图3.1和图3.2。
7 13 14 16
6 7 9 6 8 12 15
2 5 8 2 5 9 11
1 3 4 1 3 4 10
图3.1 图3.2
从an0开始到a0n为止(n = N-1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。
[程序]
#include
#define SIXE 10
int a[SIZE] [SIZE], k;
main()
{ int I, j, n, N;
for (N=3;N<=SIZE; N++)
{ k = 1;
makeArray (n=N+1);
printf ("\nN=%d;\n",n+1);
for (i=0;i<=n; i++)
{ for (j=0; j<=n; j++)printf("%4d",a[i][j]);
printf ("\A");
}
}
}
makeline (int row_start, int col_start, int row_end)
{ /*完成矩阵一条斜线的整数填写*/
int i, j, sign = ____(1)____;
for (i=row_start, j=col_start;____(2)____ >=0; i +=sign,j +=sign)
a[i][j] = k++;
}
makeArray (int n)
{ /* 完成矩阵每条斜线的整数填写*/
int d;
for (d = 1; d <= ___(3)___; d++)
if (d%2) makeline (____(4)____); else makeline(____(5)____);
else
if (d%2) makeline (____(6)____); else makeline(____(7)____);
}
试题四
阅读以下程序说明和FORTRAN程序,将应填入程序中 (n) 处的字句,写在答卷的对应栏内。
[程序说明]
子程序ORDER根据N(N<100)位选手的成绩
A ( I ) ( I = 1, 2, …, N )
将每人的名次存入数组B的对应元素B (I) 中。成绩高的选手名次在前,成绩相同的选手名次相同。若有K位选手名次相同,则下一外名次增加K。例如,若8位选手的成绩依次为
35,36,35,40,38,37,38,34
则其名次依次为
6, 5, 6, 1, 2, 4, 2, 8
其中有两位并列第2,其下一个名次为4,没有第3名。
程序首先找出与成绩最高的一位或几位选手对应的下标,并将B数组的对应元素置为第1名。然后,检查是否还有名次未定的选手,如有,找出这些选手中成绩最高的一位或几位,将其名次存入B数组的对应元素,继续同样步骤,直到排定全部选手的名次。
[程序]
SUBROUTINT ORDER (A,B,N)
INTEGER A(N),B(N),T(100)
DO 10 I=1,N
10 B(I)=0
NUM=1
DO 50 I=1,N
60 IF(____(1)____)THEN
MAX=A(I)
K=1
T(K)=I
DO 30 J=I+1,N
IF ((B(J).EQ.0).AND.(A(J).GE.MAX))THEN
IF(A(J).GT.MAX)THEN
MAX=A(J)
____(2)____
ENDIF
____(3)____
____(4)____
ENDIF
30 CONTINUE
DO 40 J=1,K
40 ____(5)____=NUM
NUM=____(6)____
____(7)____
ENDIF
50 CONTINUE
END
试题五
阅读以下程序说明和C程序,将应填入程序中 (n) 处的字句,写在答卷的对应栏内。
[程序说明]
将A、B、C、D、E、F 6个变量排成如图5.1所示的三角形,这6个变量分别取[1,6]上的整数,且互不相同。本程序找出使三角形三条边上的三个数之和相等的所有可能解。图5.2表示其中1个解。
A 1
B F 6 4
C D E 3 2 5
图5.1 图5.2
程序采用试探法,即A、B、C、D、E、F的顺序试探找数。例如,已为A、B确定了数,就在尚未使用过的4个数中找一个数给C。当为F找到乘下的1个数时,程序就测试它们是否满足要求。满足要求的是解,将它们输出。当处理完一组数后,应回溯去找下一组可能的解。例如,处理完一组数值(1,2,4,6,5,3)后就回溯。
1 2 4 6 5 3(←表示回溯)
← ← ←
下面便处理1 2 5 ……(例如1 2 5 3 4 6等)。上述试探法求解实际上是穷尽了6个数的所有排列。
[程序]
#define N 6
int A,B,C,D,E,F;
int *pt[ ] = {&A,&B,&C,&D,&E,&F};
main( )
{ int b[N+1], j, k, c=0; /* c为找到的解的计数器 */
for (j=1;j<=N,j++) b[j] = 0;/* 预置6个数均未被选用标志 */
k = 0; j = 1;
while (1)
{ if (!b[j] )
{ b[ ___(1)___ ] = 1; /* 登录选定的数,并置该数已被选用标志 */
if (k < N-1)
{ /* 准备为第 k+1 个数选择整数 */
k++; j = 1;
continue;
}
if (A+B+C == C+D+E && A+B+C == E+F+A)
{ /* 测试6个数是否满足要求,满足是解,就输出 */
printf ("%d\n\t\t%6d\n\t\t%4d%4d\n\t\t%2d%4d%4d\n\n",
++c,A,B,F,C,D,E);
scanf ("%*c"); /* 输出一个解后,按回车输出下一个解 */
}
do { /* 回溯 */
b[*pt[___(2)___]] = 0;
if (k<0) ___(3)___;
for (j=*pt[k]+1; ___(4)___; j++); /* 寻找第k个数的可用数 */
if (____(5)____) break;
} while (1);
if ( k < 0 ) break /* 已穷尽所有可能的选择 */
b[*pt[ ____(6)____ ]] = 0 /* 清除原先所选用的数的标志 */
j = ____(7)____; /* 调整第k个数可选用的数 */
}
else
while (++j<=N&&b[j]); /* 调整 */
< 一九九六年度程序员级上午试卷 共有5页 第 1 2 3 4 5 页
|
|
|
|
中华网校依法保护知识产权,如果我们的文章有涉及或侵犯您的有关权益,请即时与我们
联系,
注明网址及文章,我们会即时处理或删除,感谢您的合作!中华网校email
中华网校由广州市中六电脑城智锐计算机专业培训学院及中华网校技术中心提供网络支持未经本站许可任何个人网站、书刊报社一律不得私自复制,转载本站内容! |
|
 | |