Алгоритмы, реализуемые с помощью циклов типа ДЛЯ



Циклы типа для применяются, когда число повторений цикла известно к началу его выполнения.
 

Язык
Пример
Величина шага
Школьный АЯ
  нц  для  от  1  до 
     тело цикла 
  кц
Всегда 1
Pascal
  For  i := 1  to do 
     тело цикла ;
  1
  For  i := N  downto  1  do 
     тело цикла ;
-1
Basic
  FOR  I  = 1  TO  STEP 
     тело цикла 
  NEXT
Шаг Н произвольный 
(по умолчанию равен 1)
 
Пример 2.1. Вычислить сумму элементов числового массива   A = (a1 , a2 , ... , aN ).
 
 
Тест
Данные
Результат
N=5
A=(3, 5, -2, 6, 3)
S=15.0
 
Демонстрация
Школьный АЯ 
алг Сумма (арг цел N, арг вещ
           таб A[1:N], рез вещ S)
  дано N>0
нач цел i
  S:=0
  нц для i от 1 до N
    S := S + A[i]
  кц
кон
Исполнение алгоритма
i
S
  0 
1 0 + a1 = 0+3 = 5 
2
a1 + a2 = 3+5 = 8 
3
a1+a2+a3 = 8-2 = 6 
4
a1+a2+a3+a4 = 6+6 = 12 
5 a1+a2+a3+a4+a5 = 12+3=15
 
 
Turbo Pascal 
Program Summa;
  Uses Crt;
  Type Mas = Array [1..20] of Real;
  Var A    : Mas;
      i, N : Integer;
      S    : Real;
BEGIN
  ClrScr;    {очистка экрана }
  Write('Введите N = ');
  ReadLn(N); {ввод значения N}
  For i := 1 to N dо {цикл по элементам массива}
    begin
      Write('A [ ', i , ' ] = ');
      ReadLn(A[i])   {ввод элементов массива}
    end;
  S := 0; {присваивание начального значения}
  For i := 1 to N do S := S+A[i]; {суммирование}
  WriteLn;
  WriteLn('Сумма равна ', S : 5 : 1);
  ReadLn
END.
Блок-схема 
 
Результаты работы Pascal-программы 
 
  Введите N = 5 <Enter>  
  A[1] =  3   <Enter>  
  A[2] =  5   <Enter>  
  A[3] = -2   <Enter>  
  A[4] =  6   <Enter>  
  A[5] =  3   <Enter>  

  Сумма равна  15.0

 
QBasic
CLS
INPUT "N = " ; N :  DIM A(N)
FOR i = 1 TO N
  PRINT "A(" ; i ; ")=" ;
  INPUT A(i)
NEXT i

S = 0
FOR i = 1 TO N
    S = S + A(i)
NEXT i

PRINT "Сумма = " ; S
END
 
Пример 2.2. Найти наибольший элемент числового массива A = (a1, a2 , ..., aN ) и его номер.
 
Тест
 
Данные
Результаты
N=4
A=(3, -1, 10, 1)
Amax=10
K=3
 
Демонстрация
 
Школьный АЯ 
алг МаксЭлемент (арг цел N, арг вещ таб A[1:N],
                 рез вещ Amax, рез цел k)
нач цел i
  Amax := A[1]; k := 1
  нц для i от 2 до N
    если A[i] > Amax
      то Amax:=A[i]; k := i
    все
  кц
кон
Исполнение алгоритма 
 
i
A[i] > Amax
Amax
k
2
3
4
-
+
-
3
10
 
1
3
 
 
Блок-схема 
Turbo Pascal
Program MaxElem;
  Uses Crt;
  Type Mas = Array [1..20] of Real;
  Var A    : Mas;
      i, N : Integer;
      k    : Integer;
      Amax : Real;
BEGIN
  СlrScr;
  Write('Введите N = ');
  ReadLn(N);
  For i := 1 to N do {Ввод значений элементов массива А}
    begin
      Write('A [ ', i, ' ] = '); ReadLn(A[i])
    end;
  Amax := A[1]; k:=1; {Поиск максимального элемента}
  For i := 2 to N do
    If A[i] > Amax then
      begin
        Amax := A[i]; k := i
      end;
  WriteLn; WriteLn('Наибольший элемент' , k , '-й');
  WriteLn('Его значение ', Amax : 5 : 1); ReadLn
END.
 
QBasic
CLS
INPUT "N = "; N : DIM A(N)
FOR i = 1 TO N ' Ввод массива А
  PRINT "A("; i; ") = ";
  INPUT A(i)
NEXT i
Amax = A(1) : k = 1    ' Поиск максимального элемента
FOR i = 2 TO N
  IF A(i) > Amax THEN Amax = A(i) : k=i
NEXT i
PRINT "Наибольший элемент" ; k ; "-й"
PRINT "Его значение" ; Amax
END
 
Пример 2.3. В баскетбольную команду могут быть приняты ученики, рост которых превышает 170 см. Составьте список кандидатов в команду из учеников класса.
 
Система тестов
 
Номер 
теста
Проверяемый 
случай
Число 
учеников
Фамилии
Рост
Результаты
1
Есть 
кандидаты
3
Кулов 
Чехин 
Уваров
171
165
178
Кулов 
Уваров
2
Нет 
кандидатов
2
Ершов 
Иванов
170
165
Нет 
кандидатов
 
Демонстрация
Школьный АЯ
алг Баскетбол (арг цел N, арг лит таб Фам[1:N], арг вещ
               таб Рост[1:N], рез лит таб Канд [1:N] )
нач цел i, k
  k:=0
  нц для i от 1 до N | запись фамилий кандидатов в таблицу Канд
    если Рост[i]>170
      то k:=k+1; Канд [k] := Фам [i]
    все
  кц
  если k=0
    то вывод "В КЛАССЕ НЕТ КАНДИДАТОВ В КОМАНДУ."
    иначе нц для i от 1 до k
            вывод Канд [i]
          кц
 все
кон
Исполнение алгоритма
 
N теста
i
Рост[i] > 170
K
Кондидаты в команду
1
1
2
3
+
-
+
0
1
2
Кулов  
Уваров
2
1
2
-
-
0
-
 
TurboPascal
Program BascetBall;
  Uses Crt;
  Var
     SurName : Array [1..30] of String;  { фамилии учеников }
     Height  : Array [1..30] of Real;    { рост учеников }
     Cand    : Array [1..30] of String;  { фамилии кандидатов }
     NPupil, i, K : Integer;             { NPupil - число учеников,
                                           K - количество зачисленных}
BEGIN ClrScr;
  Write('В КОМАНДУ ЗАЧИСЛЯЮТСЯ УЧЕНИКИ, ');
  WriteLn('РОСТ КОТОРЫХ ПРЕВЫШАЕТ 170 СМ.'); WriteLn;
  Write('Сколько всего учеников ? ');
  ReadLn(NPupil);
  WriteLn('Введите фамилии и рост учеников :');
  For i := 1 to NPupil do
    begin Write(i, '. Фамилия - '); ReadLn(SurName[i]);
          Write('     Рост - ');    ReadLn(Height[i]);
    end; WriteLn;
  K:=0; { Составление списка команды }
  For i := 1 to NPupil do
    If Height[i]>170 then
      begin K:=K+1; Cand[K] := SurName[i] end;
  If K=0 then WriteLn('В КЛАССЕ НЕТ КАНДИДАТОВ В КОМАНДУ.')
    else
      begin WriteLn('КАНДИДАТЫ В БАСКЕТБОЛЬНУЮ КОМАНДУ :');
            For i := 1 to K do WriteLn( i, '. ' , Cand[i]);
      end;
  ReadLn
END.
 
QBasic
CLS : PRINT "В КОМАНДУ ЗАЧИСЛЯЮТСЯ УЧЕНИКИ, ";
PRINT "РОСТ КОТОРЫХ ПРЕВЫШАЕТ 170 СМ." : PRINT
INPUT "Сколько всего учеников ? " , NPupil
DIM SurName$(NPupil), Height(NPupil), Cand$(NPupil)
PRINT "Введите фамилии и рост учеников :"
FOR i = 1 TO NPupil
  INPUT "Фамилия - " , SurName$(i)
  INPUT "Рост - " , Height(i)
NEXT i : PRINT
K = 0
FOR i = 1 TO NPupil
  IF Height(i) > 170 THEN K = K + 1 : Cand$(K) = SurName$(i)
NEXT i
IF K = 0 THEN
    PRINT "В КЛАССЕ НЕТ КАНДИДАТОВ В КОМАНДУ."
  ELSE
    PRINT "КАНДИДАТЫ В БАСКЕТБОЛЬНУЮ КОМАНДУ :"
    FOR i = 1 TO K
      PRINT i ; ". " ; Cand$(i)
    NEXT i
END IF
END
 
Пример 2.4. Для заданного x вычислить
 
Здесь n! = 1. 2. 3 .... n (читается как "n-факториал").
 
Тест
 
Данные
Результат
X=1
n=3
 
Демонстрация
Школьный АЯ
алг Сумма Ряда (арг вещ х, арг цел n, рез вещ S)
нач цел i, вещ P     | P - очередное слагаемое
  S := 1; P := 1
  нц для i от 1 до n
    P := - P*x /i    | получение очередного слагаемого
    S := S + P
  кц
кон
Turbo Pascal 
Program SumUp;
  Uses Crt;
  Var x, S, P : Real; 
                {P - очередное слагаемое}
      i, n : Integer;
BEGIN ClrScr;
  Write('Введите n = ');  ReadLn(n);
  Write('Введите x = ');  ReadLn(x); WriteLn;
  S := 1; P := 1;
  For i := 1 to n do
    begin
      P := - P*x /i; {получение очередного слагаемого}
      S := S + P
    end;
  WriteLn('О т в е т : S = ', S : 7 : 3 ); ReadLn
END. 
Блок-схема 
 
QBasic 
CLS
INPUT "Введите n = ", n
INPUT "Введите x = ", x
S = 1 : P = 1
FOR i = 1 TO n
  P = -P * x / i
  S = S + P
NEXT i
PRINT : PRINT "О т в е т : S = " ; S
END 
  Результат работы  
QBasic-программы 
 
Введите n = 3   <Enter>  
Введите x = 1   <Enter>  

Ответ:  S =  .3333333

 
Пример 2.5. Дан массив X(N). Получить новый массив Y(N) такой, что в нем сначала идут положительные числа, затем нулевые, и затем отрицательные из X.
 
Тест
 
Данные
Результат
N=7 
X=(-1, 2, 0, 4, -3,-2,0) 
Y=(2, 4, 0, 0, -1, -3, -2)
 
Демонстрация
Школьный АЯ
алг Новый Порядок (арг цел N, арг вещ таб Х[1:N], рез вещ таб Y[1:N])
нач цел i, k   | k - индекс массива Y
  k := 0
  нц для i от 1 до N | Занесение в Y положительных чисел из X
    если X[i] > 0
       то k := k+1; Y[k] := X[i]
    все
  кц
  нц для i от 1 до N | Занесение в Y чисел, равных нулю, из X
    если X[i] = 0
      то k := k+1; Y[k] := X[i]
    все
  кц
  нц для i от 1 до N | Занесение в Y отрицательных чисел из X
    если X[i] < 0
      то k := k+1; Y[k] := X[i]
    все
  кц
кон
Turbo Pascal 
Program NewOrder;
  Uses Crt;
  Var N, i, k : Integer;
      X, Y    : Array [1..20] of Real;
BEGIN
  ClrScr;
  Write('Введите N = '); ReadLn(N);
  For i := 1 to N do
    begin
      Write('X[ ', i, ' ] = '); ReadLn(X[i])
    end;
  k:=0;
  For i := 1 to N do
    If X[i]>0 then
      begin k:=k+1; Y[k]:=X[i]
      end;
  For i := 1 to N do
    If X[i]=0 then
      begin k:=k+1; Y[k]:=X[i]
      end;
  For i := 1 to N do
    If X[i]<0 then
      begin k:=k+1; Y[k]:=X[i]
      end;
  Write('О т в е т : полученный массив');
  For i := 1 to N do Write(Y[i] : 5 : 1);
  WriteLn; ReadLn
END.
Блок-схема
(фрагмент)
QBasic
CLS : INPUT "N = "; N : DIM X(N), Y(N)
FOR i = 1 TO N
  PRINT "X("; i; ") = "; : INPUT X(i)
NEXT i
k = 0
FOR i = 1 TO N
  IF X(i) > 0 THEN k = k + 1 : Y(k) = X(i)
NEXT i
FOR i = 1 TO N
  IF X(i) = 0 THEN k = k + 1 : Y(k) = X(i)
NEXT i
FOR i = 1 TO N
  IF X(i) < 0 THEN k = k + 1 : Y(k) = X(i)
NEXT i
PRINT "О т в е т : полученный массив" ;
FOR k = 1 TO N
  PRINT Y(k) ;
NEXT k : PRINT
END


Задачи для самостоятельного решения

2.1. [Pascal | C | Basic] Подсчитайте число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).

2.2. [Pascal | C | Basic] Заданные векторы X(N) и Y(N) преобразуйте по правилу: большее из xi и yi примите в качестве нового значения xi , а меньшее — в качестве нового значения yi .

2.3. [Pascal | C | Basic] Элементы заданного массива B(N) перепишите в новый массив A(N) в обратном порядке.

2.4. [Pascal | C | Basic] Из заданного вектора A(3N) получите вектор B(N), очередная компонента которого равна среднему арифметическому очередной тройки компонент вектора А.

2.5. [Pascal | C | Basic] В заданном массиве Х(N) замените нулями все отрицательные компоненты, непосредственно предшествующие его максимальной компоненте (первой по порядку, если их несколько).

2.6. [Pascal | C | Basic] Вычислите значения
  а) sin x  +  sin2x +  ... +  sinnx ;
  б) sin x  +  sin x2 +  ...  +  sin xn ;
  в) sin x  +  sin2x2  +  ...  +  sinnxn;
  г) sin x  +  sin sin x  +  ...  +  sin sin...sin x (n раз).

2.7. [Pascal | C | Basic] Вычислите сумму квадратов всех элементов заданного массива X(N), за исключением элементов, кратных пяти.

2.8. [Pascal | C | Basic] Вычислите значения функции z = (a + b + ci  )  / i, если  a  изменяется от 0 с шагом 1,  b  изменяется от 5 с шагом 1,  ci  является элементом массива  C(N) . При этом  a  и  b  изменяются одновременно с  i.

2.9. [Pascal | C | Basic] В заданном массиве A(N) поменяйте местами наибольший и наименьший элементы.

2.10. [Pascal | C | Basic] В заданном массиве A(N) определите количество элементов, которые меньше заданного значения.

2.11. [Pascal | C | Basic] Осуществите циклический сдвиг компонент заданного вектора  A(N)  влево на одну позицию, то есть получите вектор А  =  (a2 ,  a3 ,  ...,  aN ,  a1 ).

2.12. [Pascal | C | Basic] Осуществите циклический сдвиг компонент заданного вектора  A(N)  вправо  на две позиции, то есть получите вектор A  =  (aN-1 ,  aN  ,  a1  ,  a  ,  ...  ,  aN-2 ).

2.13. [Pascal | C | Basic] Дан массив A(N). Получите массив B(N)i-й элемент которого равен среднему арифметическому первых  элементов массива А:   bi =  (a1  +  a2  +  ...  +  a ) / i.

2.14. [Pascal | C | Basic] Вычислите значения многочленов:
  P =  an xn  +  an-1  xn-1  +  ...  +  a x  +  a0 ;
  Q = a0 xn  +  a1  xn-1  +  ... +  an-1  x  +  an,
используя формулу Горнера. Коэффициенты многочленов заданы в виде вектора   A = (a0 , a1 ,  ...  ,  a).

2.15. [Pascal | C | Basic] Запишите подряд в массив A(N) элементы заданного массива В(2N), стоящие на чётных местах, а элементы, стоящие на нечетных местах, запишите в массив С(N).

2.16. [Pascal | C | Basic] Выведите на печать номера элементов заданного массива Y(N), удовлетворяющих условию 0 < yi < 1.

2.17. [Pascal | C | Basic] Выведите на печать номера точек, лежащих в круге радиусом  R с центром в начале координат. Координаты точек заданы массивами  X(N)  и  Y(N).

2.18. [Pascal | C | Basic] В заданном массиве  A(N)  вместо a1  запишите наибольший элемент массива, а вместо aN — наименьший элемент массива.

2.19. [Pascal | C | Basic] В заданном массиве A(N), все элементы которого попарно различны, найдите:
   а) наибольший элемент из отрицательных;
   б) наименьший элемент из положительных;
   в) второй по величине элемент.

2.20. [Pascal | C | Basic] В заданном массиве A(N) определите число соседств:
   а) двух положительных чисел;
   б) двух чисел разного знака;
   в) двух чисел одного знака, причем абсолютная величина первого числа должна быть больше второго числа;
   г) чётного числа и нечётного c нечётным индексом.

2.21. [Pascal | C | Basic] В заданном массиве   A(N)  положительные элементы уменьшите вдвое, а отрицательные замените на значения их индексов.

2.22. [Pascal | C | Basic] В заданном массиве A(N) вычислите среднее геометрическое и среднее арифметическое значения для положительных элементов.

2.23. [Pascal | C | Basic] Вычислите P = 1 . 2  +  2 . 3 . 4  +  3 . 4 . 5 . 6  +  ... +  N . (N+1) . ... . 2N.

2.24. [Pascal | C | Basic] Образуйте массив B, состоящий из положительных элементов заданного массива A(N), больших пяти. Выведите на печать образованный массив и число его элементов.

2.25. [Pascal | C | Basic] Из заданных векторов X(N) и Y(N) получите вектор Z(2N ) c элементами (x1 ,  y1 ,  x2 ,  y2 ,  ...,  xN ,  yN) .

2.26. [Pascal | C | Basic] Для заданного вектора X(2N ) вычислите Y = x1  -  x2  +  x3  -  ...  -  x2N .

2.27. [Pascal | C | Basic] Дан вектор A(N). Найдите порядковый номер того из элементов, который наиболее близок к какому-нибудь целому числу (первому по порядку, если таких несколько).

2.28. [Pascal | C | Basic] Элементы заданного массива X = (x1 , x2, ...,xN ) переупорядочите следующим образом:  X = (x,  xN-1 ,  ...,  x).

2.29. [Pascal | C | Basic] Для заданного набора коэффициентов  a,  b,  c,  d  найдите наименьшее значение функции y  =  a x3  +  b x2  +  cx  +  d  и значение аргумента, при котором оно получено. Значение х изменяется от 0 до 2 с шагом 0,2.

2.30. [Pascal | C | Basic] Дано натуральное N. Вычислите сумму тех элементов серии  i 3 -3 . i . N + Ni = 1,  2,  ...,  N, которые являются удвоенными нечётными числами.

2.31*. [Pascal | C | Basic] Сожмите заданный массив A(N) отбрасыванием нулевых элементов.

2.32. [Pascal | C | Basic] Дан массив A(2N). Постройте массивы с элементами, соответственно равными:
   а) a,  aN+1 ,  a2,  aN+2  ,  ... ,  aN ,  a2N ;
   б) a2N,  a1 ,  a2N-1 ,  a2  ,  ... ,  aN+1 ,  aN .

2.33. [Pascal | C | Basic] Дана матрица A(3, N), элементы которой положительны. Определите, какие из троек a1i , a2i  , a3i (i = 1, ..., N) могут служить сторонами треугольника.   Выведите массив b1 ,  ... ,  bN  ,  состоящий из нулей и единиц. Если тройка a1i  ,  a2i ,  a3i  может служить сторонами треугольника, то bi  =  1, если нет, то bi  =  0.

2.34. [Pascal | C | Basic] У кассы аэрофлота выстроилась очередь из N человек. Время обслуживания кассиром i-го клиента равно Ti (i = 1, ..., N).
  а) Определите время пребывания в очереди каждого клиента;
  б) Укажите номер клиента, для обслуживания которого кассиру потребовалось больше всего время.

2.35. [Pascal | C | Basic] В соревнованиях по фигурному катанию N судей независимо выставляют оценки спортсмену. Затем из объявленных оценок удаляют самую высокую (одну, если самую высокую оценку выставили несколько судей). Аналогично поступают с самой низкой оценкой. Для оставшихся оценок вычисляется среднее арифметическое, которое и становится зачетной оценкой. По заданным оценкам судей определите зачетную оценку спортсмена.

2.36. [Pascal | C | Basic] Несколько однотипных спасательных катеров, находящихся в акватории в точках с координатами (xi , yi ), i = 1, 2, ..., N, получили сигнал SOS от судна, находящегося в той же акватории в точке с координатами (x0 , y0 ). Определите, какой из катеров быстрей других сможет оказать помощь?

2.37. [Pascal | C | Basic] По данным о расписании движения пригородных поездов определите значение наибольшего интервала времени между отправлениями поездов.

2.38. [Pascal | C | Basic] Учитель объявил результаты контрольной работы. Определите пpоцентное содеpжание выставленных им "пятерок", "четверок", "троек" и "двоек".

2.39. [Pascal | C | Basic] Фунт стерлингов, денежная единица Великобритании, до 1971 г. равнялся 20 шиллингам или 240 пенсам. С проходящего корабля в порту Ливерпуля сошли N путешественников, каждый из которых имел по одной десятифунтовой купюре. Они купили сувениры на сумму p1 , p2 , ..., pn, соответственно. Сколько фунтов, шиллингов и пенсов сдачи получил каждый из путешественников?

2.40. [Pascal | C | Basic] О каждом учащемся класса известны его пол, год рождения, рост и вес. Определите, сколько в классе мальчиков и сколько девочек. Найдите средний возраст мальчиков и средний возраст девочек. Определите, верно ли, что самый высокий мальчик весит больше всех в классе, а самая маленькая девочка является самой юной среди девочек.