1. Оператор цикла предназначен для выполнения большого количества однотипных вычислений, отличающихся только значениями переменных, входящих в формулу. Например, вычисление значений формулы y=sin(x) для х=1..10 с шагом 1. 2. В языке Паскаль существуют циклы: с параметром (FOR), с предусловием (WHILE..DO), с постусловием (REPEAT...UNTIL). 3. Оператор FOR для примера п.1 имеет вид: FOR K:= 1 TO 10 DO Y[K]:=SIN(K). Если в теле цикла будет несколько операторов, то они заключаются в операторных скобки BEGIN...END. 4. Во время исполнения этого оператора переменной Y[K] (элементам маccива Y) последовательно присваиваются значения SIN(K). 5. Оператор FOR применяется в тех случаях, когда число повторений заранее известно (К=1..10). 6-9. Циклы WHILE и REPEAT применяются, когда число повторений заранее неизвестно, например, для вычисления суммы ряда с заданной точностью, но их можно применять и для расчета по предыдущему примеру. K:=0; WHILE K<11 DO BEGIN K:=K+1; Y[K]:=SIN(K) END; или для цикла REPEAT: K:=0; REPEAT K:=K+1; Y[K]:=SIN(K} UNTIL K>10; Для вычислений эти циклы равносильны, но есть одно (иногда решающее) отличие - цикл WHILE не будет выполнен ни разу, если условие сразу ложно, а цикл REPEAT сначала выполнит одну операцию, а потом, если условие окажется ложным, остановится.
begin var (n, k) := ReadInteger2('n,k->'); var p := ArrGen(n, t -> t + 1); var m := new integer[k, n div k]; var sum := p.Sum div k; for var i := 0 to k - 1 do begin var m_sum := sum; m[i, 0] := p[0]; m_sum := m_sum - m[i, 0]; p := p[1:]; for var j := 1 to (n div k) - 1 do begin if m_sum - p.Last > 0 then begin m[i, j] := p.max; m_sum := m_sum - p.Max; p := p[:p.IndexMax]; end else begin if p.Where(t -> t = m_sum).Count = 1 then m[i, j] := m_sum; p := p.Where(t -> t <> m_sum).ToArray; end; end; end; var t := true; for var i := 0 to m.RowCount - 2 do if (m.Row(i).sum <> m.Row(i + 1).Sum) or (p.Length <> 0) then begin t := false; break; end; if t then m.Println else 0.Println; end.
2. В языке Паскаль существуют циклы: с параметром (FOR), с предусловием (WHILE..DO), с постусловием (REPEAT...UNTIL).
3. Оператор FOR для примера п.1 имеет вид: FOR K:= 1 TO 10 DO Y[K]:=SIN(K). Если в теле цикла будет несколько операторов, то они заключаются в операторных скобки BEGIN...END.
4. Во время исполнения этого оператора переменной Y[K] (элементам маccива Y) последовательно присваиваются значения SIN(K).
5. Оператор FOR применяется в тех случаях, когда число повторений заранее известно (К=1..10).
6-9. Циклы WHILE и REPEAT применяются, когда число повторений заранее неизвестно, например, для вычисления суммы ряда с заданной точностью, но их можно применять и для расчета по предыдущему примеру.
K:=0;
WHILE K<11 DO
BEGIN
K:=K+1;
Y[K]:=SIN(K)
END;
или для цикла REPEAT:
K:=0;
REPEAT
K:=K+1;
Y[K]:=SIN(K}
UNTIL K>10;
Для вычислений эти циклы равносильны, но есть одно (иногда решающее) отличие - цикл WHILE не будет выполнен ни разу, если условие сразу ложно, а цикл REPEAT сначала выполнит одну операцию, а потом, если условие окажется ложным, остановится.
//Версия 3.3, сборка 1634 (14.02.2018)
begin
var (n, k) := ReadInteger2('n,k->');
var p := ArrGen(n, t -> t + 1);
var m := new integer[k, n div k];
var sum := p.Sum div k;
for var i := 0 to k - 1 do
begin
var m_sum := sum;
m[i, 0] := p[0]; m_sum := m_sum - m[i, 0];
p := p[1:];
for var j := 1 to (n div k) - 1 do
begin
if m_sum - p.Last > 0 then begin m[i, j] := p.max; m_sum := m_sum - p.Max; p := p[:p.IndexMax]; end
else
begin
if p.Where(t -> t = m_sum).Count = 1 then m[i, j] := m_sum;
p := p.Where(t -> t <> m_sum).ToArray;
end;
end;
end;
var t := true;
for var i := 0 to m.RowCount - 2 do
if (m.Row(i).sum <> m.Row(i + 1).Sum) or (p.Length <> 0) then begin t := false; break; end;
if t then m.Println else 0.Println;
end.
Пример(1):
n,k-> 8 2
1 8 7 2
3 6 5 4
Пример(2):
n,k-> 6 3
1 6
2 5
3 4