1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
* В каждом наблюдении есть несколько значений. Нужно найти 3 наибольших в каждом наблюдении.
* Автор: David Marso; размещено в comp.syst-soft.stat.spss 24.03.1998.


data list free / x1 to x10.
begin data.
13 54 23 54 25 12 52 3 51 23
15 41 23 15 42 31 23 12 15 12
51 43 51 36 12 53 6 12 53 12
63 51 23 51 73 51 35 12 35 35
end data.


** ПРЕДПОЛОЖИМ, ЧТО ВСЕ ЗНАЧЕНИЯ ПОЛОЖИТЕЛЬНЫ **.

VECTOR WHAT (3).
loop #=1 to 3.
COMPUTE WHAT(#)=MAX(X1 TO X10).

* Помечаем одинаковые максимальные значения *.
COMPUTE #FOUND=0.
DO REPEAT X=X1 to X10 .
DO IF X=WHAT(#) AND NOT #FOUND.
* Небольшая хитрость чтобы убрать уже раз найденный максимум из поля зрения.
COMPUTE X=-X.
* Таким образом, мы не теряем информацию о повторяющихся максимальных значениях.
COMPUTE #FOUND=1.
END IF.
END REPEAT.
END LOOP.
DO REPEAT X=X1 TO X10.
IF X < 0 X=-X.
END REPEAT.
FORMATS ALL (F2.0).
LIST.



** ДРУГОЙ СПОСОБ ** .
data list free / x1 to x10.
begin data.
13 54 23 54 25 12 52 3 51 23
15 41 23 15 42 31 23 12 15 12
51 43 51 36 12 53 6 12 53 12
63 51 23 51 73 51 35 12 35 35
end data.

* СЧИТАЕМ, ЧТО НУЖНЫЕ ПЕРЕМЕННЫЕ РАСПОЛОЖЕНЫ ВПРИТЫК ДРУГ К ДРУГУ, НО НЕ
	ОБЯЗАТЕЛЬНО СОДЕРЖАТ ПОЛОЖИТЕЛЬНЫЕ ЗНАЧЕНИЯ *.

VECTOR X=X1 TO X10 / #(10) / WHAT (3).
LOOP ##=1 TO 10.
+ COMPUTE #(##)=X(##).
END LOOP.

loop #=1 to 3.
+ COMPUTE WHAT(#)=MAX(X1 TO X10).
+ COMPUTE #FOUND=0.
+ LOOP ##= 1 to 10.
+ DO IF X(##)=WHAT(#).
+ COMPUTE X(##)=$SYSMIS.
+ COMPUTE #FOUND=1.
+ END IF.
+ END LOOP IF #FOUND.
END LOOP .
LOOP ##=1 TO 10.
+ COMPUTE X(##)=#(##).
END LOOP.
LIST.

** ЧТОБЫ ИЗВЛЕЧЬ МАКСИМУМЫ И ИХ РАСПОЛОЖЕНИЕ ** .
*Снова полагаем ,что данные положительны - примеч. перев.

VECTOR WHAT (3) / WHERE(3). /*Суть имён переменных: WHAT - что, WHERE - где, - примеч. перев.*/
loop #=1 to 3.
COMPUTE WHAT(#)=MAX(X1 TO X10).
COMPUTE #FOUND=0.
DO REPEAT X=X1 to X10 / Ind = 1 TO 10.
DO IF X=WHAT(#) AND NOT #FOUND.
COMPUTE WHERE(#)=Ind.
COMPUTE X=-X.
COMPUTE #FOUND=1.
END IF.
END REPEAT.
END LOOP.

DO REPEAT X=X1 TO X10.
IF X < 0 X=-X.
END REPEAT.
FORMATS ALL (F2.0).
LIST.