Лекция

Тема: «Реализация алгоритмов цикла в программах на Turbo Pascal»

 

План

1. Операторы цикла с известным числом повторений 

2. Операторы цикла с неизвестным числом повторений 

3. Примеры

4. Использование символов псевдографики

 

Нередко при написании программ нужно выполнить повтор одного и того же действия несколько раз.  Такой процесс повторений называется циклом, а для осуществления таких  операций  используют операторы цикла.

Для реализации циклов в Паскале предусмотрены три оператора.

 

1. Операторы цикла с известным числом повторений

Если число повторений известно заранее, то целесообразнее всего применять цикл FOR...DO.

Идентификатор оператора FOR определяет управляющую переменную цикла, называемую также счетчиком цикла. Эта переменная фиксирует количество повторений операторов в цикле.

Управляющая переменная принимает значения, начиная с первого (им является выражение после символа ":=") и кончая последним (им является выражение после ключевых слов TO или DOWNTO). При каждом новом значении управляющей переменной выполняется оператор (или составной оператор), следующий за ключевым словом DO. Типы управляющей переменной и выражения должны совпадать. Управляющая переменная должна быть целого или символьного типа. Если используется ключевое слово TO, значение управляющей переменной возрастает в ходе выполнения цикла на 1, если используется ключевое слово DOWNTO, значение управляющей переменной убывает на 1.

Оператор  работает  следующим  образом:

Оператор имеет вид:

 

FOR счетчик цикла:= начало диапазона TO конец диапазона DO 

оператор;

 

FOR счетчик цикла:= конец диапазона DOWNTO начало диапазона DO

оператор; 

 

Если в цикле должно выполниться несколько операторов, то эти операторы берут в операторные скобки:

 

FOR счетчик цикла:= начало диапазона TO конец диапазона DO

BEGIN

         список операторов;

END;

 

FOR счетчик цикла:= конец диапазона DOWNTO начало диапазона DO

BEGIN

         список операторов;

END; 

 

Пример. Написать программу вычисления факториала числа

 

{Подключаем модуль работы с экраном}

Uses Crt;

{Описываем переменные}

Var F,I,N: Integer;

Begin

{Очищаем экран}

ClrScr;

{Вводим исходные данные}

Write ('Введите число: ');

Readln (N);

{Вначале факториал = 0}

F:=1;

{В цикле перемножаем все цифры}

For i:=1 To N Do

F:=F*I;

{Выводи результат}

Writeln ('Факториал числа ',N,' равен ',F);

{Пауза для просмотра ответа}

Readln;

End.

 

Пример. Распечатать последовательность латинских букв от 'А' до 'Z' в обратном порядке

 

{Подключаем модуль работы с экраном}

Uses Crt;

{Описываем переменные}

Var i: CHAR;

Begin

{Очищаем экран}

ClrScr;

{В цикле с отрицательным шагом выводим в строку символы, разделяя их пробелом}

For i:='Z' Downto 'A' Do

Write (I,' ');

{Пауза для просмотра результата}

Readln;

End.

 

Пример. Написать программу для табулирования значений функции Y=sin(x)+cos(x) на отрезке [0,П/2] в заданном количестве точек.

 

{Подключаем модуль работы с экраном}

Uses Crt;

{Описываем переменные}

Var I, N: Integer;

A, B, X, H, REZ: Real;

Begin

{Очищаем экран}

ClrScr;

{Вводим исходные данные}

Write ('Введите число точек: ');

Readln (N);

{Задаем начало отрезка}

A:=0;

{Задаем конец отрезка}

B:=PI/2;

{Вычисляем шаг}

H:=(B-A)/N; 

X:=0;

{В цикле в каждой точке считаем значение функии

{и печатаем на одной строке значение точки и значение функции}}

For I:=1 To N+1 Do

Begin

REZ:=Sin(X)+Cos(X);

Writeln (X:5:2; REZ:5:3);

X:=X+H;

End;

{Пауза для просмотра результата}

Readln;

End.

Пример.  Найти значение функции Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc05_1.gif

 

Uses Crt;

Var x, y: Real; i: Integer;

Begin

ClrScr;

Write (‘x = ’);

ReadLn (x);

{Вначале сумма равна 0}

Y: = 0

{В цикле подсчитываем сумму}

For i: = 1 To 5 Do

Y: = y + (Exp(i*Ln(x))+2);

{Выводим ответ}

WriteLn (‘y = ’, y);

{Пауза для просмотра результата}

Readln;

End.

Пример. Найти значение функции Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc05_2.gif

 

Uses Crt;

Var x, y: Real; i: Integer;

Begin

ClrScr;

Write (‘x = ’);

ReadLn (x);

{Если Х больше 0, то считаем сумму}

If x > 0 Then

Begin 

{Вначале сумма равна 0}

Y: = 0;

{В цикле считаем сумму}

For i: = 1 To 5 Do

Y: = y + Sin ((x + i)*Pi/180);

End

{Иначе, если Х не больше 0, то считаем произведение}

Else

Begin 

{В начале произведение равно 1}

Y: = 1;

{В цикле считаем произведение}

For i: = 1 To 5 Do

Y: = y * Cos ((x - i)*Pi/180);

End;

{Выводим ответ}

WriteLn (‘y = ’, y);

{Пауза для просмотра результата}

Readln;

End.

2. Операторы цикла с предусловием

Чаще всего при написании программ невозможно точно определить количество раз выполнения цикла. Для реализации таких циклов, называемых итеративными, в Паскале есть два оператора.

Оператор While Do

Оператор имеет следующий вид:

 

While логическое выражение Do 

оператор;

 

Действие оператора   цикла   с   предусловием    While    состоит    в следующем:

Если в теле цикла выполняется несколько операторов, то эти операторы нужно брать в операторные скобки Begin...End.

 

While логическое выражение Do

Begin

    список операторов;

End; 

 

Оператор Repeat...Until

Оператор имеет следующий вид:

 

Repeat

оператор или список операторов;

Until логическое выражение;

 

Действие оператора с постусловием Repeat заключается в следующем:

В случае использования в цикле нескольких операторов, операторные скобки Begin...End не нужны. Если значение выражения истинно, то выполнение указанных операторов прекращается.

 

3. Примеры

Пример. Составить программу, находящую сумму четных чисел на произвольном отрезке, при условии, что начало отрезка четное число.

Решим задачу с помощью оператора WhileDo.

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем переменные}

Var a, b, sum, i: Integer;

Begin

{Очищаем экран}

ClrScr;  

{Вводим отрезок}

Write (‘Введите диапазон чисел: ’);

    ReadLn (a, b);

{Первое число для суммирования равна началу отрезка}

i: = a;

{Вначале сумма равна 0}

sum: = 0;

{Пока не достигнут конец отрезка}

While i <= b Do

              Begin

        {Суммируем текущее число}

        s: = s + I;

        {Переходим к следующему четному числу}

        i: = i + 2;

    End;

    {Выдаем результат}

WriteLn (‘Сумма = ’, sum);

{Делаем паузу для просмотра}

Readln;

End.

 

Можно усовершенствовать программу для любого начала отрезка.

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем переменные}

Var a, b, sum, i: Integer;

Begin

{Очищаем экран}

ClrScr;  

{Вводим отрезок}

Write (‘Введите диапазон чисел: ’);

    ReadLn (a, b);

{Если начало отрезка нечетное, то делаем его четным}

If  a Mod 2 <> 0 Then

         i: = a + 1

{Иначе оставляем его равным началу отрезка}

Else

         i: = a;

{Вначале сумма равна 0}

sum: = 0;

{Пока не достигнут конец отрезка}

While i <= b Do

    Begin

        {Суммируем текущее число}

        s: = s + I;

        {Переходим к следующему четному числу}

        i: = i + 2;

    End

{Выдаем результат}

WriteLn (‘Сумма = ’, sum);

{Делаем паузу для просмотра}

Readln;

End.

 

Решим данную задачу с помощью цикла Repeat…Until

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем переменные}

Var a, b, sum, i: Integer;

Begin

{Очищаем экран}

ClrScr;  

{Вводим отрезок}

Write (‘Введите диапазон чисел: ’);

    ReadLn (a, b);

{Если начало отрезка нечетное, то делаем его четным}

If  a Mod 2 <> 0 Then

         i: = a + 1

{Иначе оставляем его равным началу отрезка}

Else

         i: = a;

{Вначале сумма равна 0}

sum: = 0;

         Repeat

        {Суммируем текущее число}

        sum: = sum + i;

        {переходим к следующему четному числу}

        i: = i + 2;

    Until a > b;

    {Выдаем результат}

    WriteLn (‘Сумма = ’, sum);

    {Делаем паузу для просмотра}

    Readln;

End.

 

Пример. Найти сумму ряда с точностью E. Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc05_3.gif

 

    {Подключаем модуль по работе с экраном}

    Uses Crt;

    {Описываем переменные}

 

    {e – точность, число меньшее нуля, например, 0.01 или 0.005}

    {y – значение суммы}

    {а – член ряда}

 

    Var   e, y, a: Real;

i: Integer;

    Begin

        {Очищаем экран}

        ClrScr;

        {Вводим точность}

        Write (‘Введите точность: ’);

        ReadLn (e);

    {Вначале сумма равна 0}  

    y:=0;

    {Вначале i равно начальному значению (1)}

    i:=1;

    {Вначале а равно первому элементу ряда при i=1}

    a:=1/(2 + i);

    {Пока очередной член ряда не станет меньше точности}

    While a >= e do

    Begin

        {Суммируем очередной член ряда}

        y:= y + a;

        {выводим промежуточные результаты i, a, y}

        writeln(i:5, a:10:5, y:10:5);

        {Переходим к следующему значению i}

        i:= i + 1;

        {Вычисляем значение элемента ряда для текущего значения i}

        a:= 1/(2 + i);

    End;

    {Выдаем результат}

    WriteLn (‘Сумма = ’, y:4:2);

    {Делаем паузу для просмотра}

    Readln;

End.

 

Решим эту же задачу с помощью RepeatUntil

 

         {Подключаем модуль по работе с экраном}

    Uses Crt;

    Var   e, y, a: Real;

i: Integer;

    Begin

        {Очищаем экран}

        ClrScr;   

        {Вводим точность}

        Write (‘Введите точность: ’);

        ReadLn (e);

    {Вначале сумма равна 0}

    y:=0;

    {Вначале i равно 1}

    i:=1;

    Repeat

        {Вычисляем значение элемента ряда для текущего значения i}

        a:= 1/(2 + i);

        {Суммируем очередной член ряда}

        y:= y + a;

        {выводим промежуточные результаты i, a, y}

        writeln(i:5, a:10:5, y:10:5);

        {Переходим к следующему значению i}

        i:= i + 1;

    Until a < E;

    {Выдаем результат}

    WriteLn (‘Сумма = ’, y:4:2);

    {Делаем паузу для просмотра}

    Readln;

End.

 

 

4. Использование символов псевдографики

 

При построении таблиц в текстовом режиме монитора  используются специальные символы псевдографики, которых нет на клавиатуре, но у которых есть свои ASCII-коды. Для вывода псевдографических элементов используются их коды, которые набираются при нажатии клавиши ALT+код. 

Для определения кода нужного символа можно воспользоваться ASCII-таблицей (второй частью).

 

Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc05_4.jpg

 

Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc05_5.jpg

 

Пример. Затабулировать функцию sinx на произвольном отрезке с заданным шагом и использование символов псевдографики.

 

Uses Crt;

{Описываем переменные}

Var a,b,h,x:real;

Begin

    {Очищаем экран}

    clrscr;

    {Вводим концы отрезка}

    Write ('Введите отрезок (a,b): ');

    ReadLn (a,b);

    {Вводим шаг}

    Write ('Введите шаг: ');

    ReadLn (h);

    {Выводим шапку таблицы}

    Writeln ('╔═════╦══════╗');

    WriteLn ('║  x  ║sin(x)║');

    Writeln ('╠═════╬══════╣');

    {Присваиваем аргументу функции начальное значение}

    x:=a;

    {Организовываем цикл пока аргумент не превысит конец отрезка}

    While x<=b do

    Begin

        {Выводим значение функции при очередном значении аргумента}

        WriteLn ('║',x:5:2,'║',sin(x*pi/180):6:2,'║');

        {Увеличиваем значение аргумента на шаг}

        x:=x+h;

    End;

    {Отчерчиваем нижнюю линию таблицы}

    Writeln ('╚═════╩══════╝');

    {Делаем паузу для просмотра результата}

    Readln;

End.

 

Вопросы для самоконтроля

1.      1.      Запись оператора ветвления. Использование операторных скобок;

2.      2.      Запись вложенных операторов ветвления;

3.      3.      Запись оператора выбора. Принцип его работы;

4.      4.      Назначение и описание меток в программах;

      5.    Запись оператора безусловного перехода.