Обработка последовательностей чисел — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Случай последовательности, заканчивающейся нулем: + объявление переменной внутри цикла)
Строка 33: Строка 33:
 
   // ...  
 
   // ...  
 
end.</source>
 
end.</source>
 +
 +
== Особенности «досрочного» завершения обработки ==
 +
Рассмотрим задачу:
 +
Дано целое число N (N ≥ 0), а также последовательность из N целых чисел.
 +
Найти номер первого элемента последовательности, кратного 5. Если таких элементов нет, вывести -1.
 +
Например:
 +
    N = 0 >>> -1
 +
    N = 1; 4 >>> -1
 +
    N = 1; 25 >>> 1
 +
    N = 4; 3, 6, 7, 8 >>> -1
 +
    N = 4; 3, 5, 2, 25 >>> 2
 +
 +
Как решать такую задачу? Нас интересует только первое число, удовлетворяющее условию «кратно 5-ти», поэтому первый алгоритм, который приходит в голову, выглядит так:
 +
<source lang="Pascal">
 +
begin
 +
  Write('Input N: ');
 +
  var N := ReadInteger();
 +
  Assert(N >= 0);
 +
 +
  Writeln('Input numbers of sequence: ');
 +
  var resInd := -1;
 +
  var a: integer;
 +
  for var i := 1 to N do
 +
  begin
 +
    a := ReadInteger();
 +
    if a mod 5 = 0 then
 +
    begin
 +
      resInd := i;
 +
      break;
 +
    end;
 +
  end;
 +
  WritelnFormat('Result = {0}', resInd);
 +
end.
 +
</source>
 +
Считываем числа последовательности, пока они не закончатся, либо не найдется подходящий элемент. Если такой элемент нашелся — выходим из цикла.
 +
 +
Действительно, зачем выполнять «лишние» итерации и обрабатывать числа, если ответ на задачу уже известен? Однако
  
 
[[Категория:Основы программирования]]
 
[[Категория:Основы программирования]]

Версия 08:03, 19 октября 2013

Случай последовательности с заданным количеством элементов

begin
  // Предварительные действия
  // ...
  Read(N);
  for var i := 1 to N do
  begin
    // Ввод очередного элемента последовательности
    Read(a);
    // Обработка очередного элемента последовательности
    // ...
  end;
  // Вывод результатов обработки
  // ...
end.


Случай последовательности, заканчивающейся нулем

begin
  // Предварительные действия
  // ... 
  while True do // Бесконечный цикл
  begin
    // Ввод очередного элемента последовательности 
    var a := ReadInteger; // или ReadReal
    if a = 0 then
      break; // Выход из цикла при обнаружении последнего элемента

    // Обработка очередного элемента последовательности
    // ... 
  end;
  // Вывод результатов обработки
  // ... 
end.

Особенности «досрочного» завершения обработки

Рассмотрим задачу:

Дано целое число N (N ≥ 0), а также последовательность из N целых чисел. 
Найти номер первого элемента последовательности, кратного 5. Если таких элементов нет, вывести -1.
Например:
   N = 0 >>> -1
   N = 1; 4 >>> -1
   N = 1; 25 >>> 1
   N = 4; 3, 6, 7, 8 >>> -1
   N = 4; 3, 5, 2, 25 >>> 2

Как решать такую задачу? Нас интересует только первое число, удовлетворяющее условию «кратно 5-ти», поэтому первый алгоритм, который приходит в голову, выглядит так:

begin
  Write('Input N: ');
  var N := ReadInteger();
  Assert(N >= 0);

  Writeln('Input numbers of sequence: ');
  var resInd := -1;
  var a: integer;
  for var i := 1 to N do
  begin
    a := ReadInteger();
    if a mod 5 = 0 then
    begin
      resInd := i;
      break;
    end;
  end;
  WritelnFormat('Result = {0}', resInd);
end.

Считываем числа последовательности, пока они не закончатся, либо не найдется подходящий элемент. Если такой элемент нашелся — выходим из цикла.

Действительно, зачем выполнять «лишние» итерации и обрабатывать числа, если ответ на задачу уже известен? Однако