Циклы в Паскале. Обработка последовательностей 1. Циклы в Паскале Многократно повторяющийся участок программы называется циклом. Одно повторение цикла называется итерацией. Операторы, выполняющиеся в цикле, называется телом цикла. В языке Паскаль существует три типа циклов: 1) цикл с параметром (цикл for); 2) цикл с предусловием (цикл while); 3) цикл с постусловием (цикл repeat). Оператор цикла с параметром Цикл с параметром используется в тех случаях, когда число повторений цикла известно заранее. Синтаксическая диаграмма цикла for изображена на рис. 1. Рис. 1. Синтаксическая диаграмма цикла с параметром Идентификатор, указанный на диаграмме, называется параметром цикла или счетчиком цикла. Выражения определяют нижнюю и верхнюю границы изменения параметра цикла. Оператор, повторяемый в цикле, называется телом цикла. Выполнение цикла с использованием ключевого слова to происходит в следующем порядке: 1) вычисляются значения нижней и верхней границы; 2) параметру цикла (счётчику) присваивается значение нижней границы; 3) параметр цикла сравнивается со значением верхней границы и, если значение параметра цикла меньше или равно значению верхней границы, то происходит выполнение тела цикла, иначе работа цикла завершается; 4) значение параметра цикла автоматически увеличивается на 1 и происходит возврат к пункту 3. При использовании ключевого слова downto на очередной итерации цикла счётчик автоматически уменьшается на 1 и выход из цикла происходит тогда, когда счётчик станет меньше значения верхней границы. Особенности цикла с параметром: 1) Счетчик цикла инициализируется автоматически значением нижней границы при входе в цикл, никакие другие действия по установке начального значения параметра цикла не требуются. 2) Внутри цикла увеличение или уменьшение параметра происходит автоматически, поэтому его изменение вручную недопустимо (это может привести к непредсказуемым последствия и является семантической ошибкой). 3) Цикл с параметром умеет увеличивать или уменьшать счетчик цикла только с шагом 1. Если требуется увеличение или уменьшение счетчика с иным шагом (например, с шагом 2), то требуется использовать другие типы циклов (с предусловием или с постусловием). 4) Количество повторений цикла определяется значениями верхней и нижней границ, изменение верхней и нижней границ цикла во время работы цикла недопустимо. 5) Возможны случаи, когда тело цикла выполниться ноль раз. 6) В качестве параметра цикла должна использоваться переменная порядкового типа. В частности, тип Real использовать нельзя (семантическая ошибка). 7) Если в цикле должно выполняться более одного оператора, тело цикла оформляется с помощью составного оператора (ведь он является частным случаем оператора в языке Паскаль). Пример 1.1. Выводим квадраты чисел от 2 до 10. Var x:Integer; ... For x:=2 To 10 Do WriteLn(x*x); Пример 1.2. Выводим прописные буквы латинского алфавита. Var ch:Char; ... For ch:='A' To 'Z' Do Writeln(ch); Пример 1.3. Использование цикла с downto. Будут выведены все нечетные двузначные числа в порядке убывания. Var i:Integer; ... For i:=99 Downto 11 Do if i mod 2 = 1 Пример 1.4. 0, функции f(x)= 1 2 x 4 , then WriteLn(i); Использование составного оператора. Вывод значений x2 x2 в точках с целочисленными значениями x на отрезке [1;10]. Var x:Integer; y:Real ... For x:=1 To 10 Do Begin If x=2 Then y:=0 Else y:=1/(2*x–4); WriteLn('f(',x,')=',y:7:5); End; Цикл с параметром очень часто используется для вычисления суммы или произведения элементов некоторой числовой последовательности. Пример 1.5. Вычисление суммы S=1+2+3+…+N, где N – произвольное натуральное число. Var i,N,S:integer; Begin ReadLn(N); S:=0; For i:=1 To N Do S:=S+i; WriteLn(‘S=’,S) End. Начальное значение суммы обычно берется равным 0, а произведения – 1. Но не нужно считать, что этот прием универсален, в некоторых задачах начальное значение суммы или произведения определяется каким-либо условием и «стандартное» начальное значение использовать не получится. При решении задач, требующих выделения цифр целого числа, используются следующие приемы: 1) если число x может быть отрицательным, перед выделением цифр отбрасываем знак числа с помощью функции abs(), определяющей абсолютную величину, например, x:=abs(x); 2) для выделения последней цифры числа используем выражение x mod 10; 3) для того, чтобы «отрубить» от числа последнюю цифру, сделав число на одну цифру короче, используем оператор x:=x div 10; 4) повторяя в цикле приемы 2) и 3) можно выделить все цифры числа. Пример 1.6. Дано целое пятизначное число N, определить произведение цифр этого числа. Var n,p,i:integer; Begin WriteLn(‘Введите целое пятизначное число’); ReadLn(n); n:=abs(n); p:=1; For i:=1 To 5 Do Begin p:=p*(n Mod 10); n:=n Div 10 End; Writeln(‘Произведение цифр Вашего числа - ’,p) End. Пример 1.7. Дано семизначное натуральное число N (1 000 000 ≤ N ≤ 9 999 999). Требуется написать программу для определения, является ли оно палиндромом (палиндромом – это число, которое одинаково читается слева направо и справа налево). Program palindrom; {программа написана в Паскаль ABC} Var n,m,r,i: integer; Begin WriteLn(‘Введите семизначное натуральное число’); ReadLn(n); m:=n; {Делаем копию исходного числа} r:=0; {Получаем «перевертыш» числа} For i:=1 To 7 Do Begin r:=r*10+m Mod 10; m:=m Div 10 End; If r=n {Сравниваем исходное число с «перевертышем»} Then Writeln(‘Число ‘,n,’ является палиндромом’) Else Writeln(‘Число ‘,n,’ палиндромом не является’) End. Построим трассировочную таблицу для N=1253984. Таблица 1. Трассировочная таблица для программы “palindrom” i m r – 1253984 0 1 125398 0*10+1253984 mod 10=4 2 12539 4*10+125398 mod 10=48 3 1253 48*10+12539 mod 10=489 4 125 489*10+1253 mod 10=4893 5 12 4893*10+125 mod 10=48935 6 1 48935*10+12 mod 10=489352 7 0 489352*10+1 mod 10=4893521 Ответ: Число 1253984 палиндромом не является.