Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке высокого уровня Паскаль. Учебное пособие для СПО
.pdf
Выражения должны быть совместимы по присваиванию с
переменной цикла (о правилах совместимости мы поговорим в конце
третьей лекции), оператор — простым или составным. Циклы с
параметром обычно применяются при работе с массивами.
Пример 1. Программа выводит на экран числа от 10 до 1 и
подсчитывает их сумму:
var i, sum : integer;
begin
sum := 0;
for i := 10 downto 1 do begin
writeln(i); inc(sum, i)
end;
writeln('Сумма чисел: ', sum);
end.
В этом цикле переменная i автоматически уменьшается на 1.
Пример 2. Программа выводит на экран символы от 'a' до 'z' :
var ch : char;
begin
for ch := 'a' to 'z' do write(ch:2)
end.
Здесь счетчик цикла ch символьного типа поочередно принимает
значение каждого символа от 'a' до 'z'.
ВНИМАНИЕ Если в теле цикла необходимо выполнить более одного
оператора, необходимо заключить их в блок с помощью ключевых слов
begin и end.
Выражения, определяющие начальное и конечное значения счетчика,
вычисляются один раз до входа в цикл. Цикл for реализован в
Паскале как цикл с предусловием.
После нормального завершения цикла значение счетчика не
определено. Фактически оно равно первому значению, для которого
выполняется условие выхода из цикла, но использовать это в
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
41

программах не рекомендуется. Также не следует изменять значение
счетчика внутри цикла вручную, например:
for i := 1 to 10 do begin inc(i,3); ... end; { плохо! }
Это может привести к зацикливанию программы.
Рекомендации по использованию циклов
Часто встречающимися ошибками при программировании циклов
являются использование в теле цикла переменных, которым не были
присвоены начальные значения, а также неверная запись условия
продолжения цикла. Нужно помнить и о том, что в операторе while
истинным должно являться условие повторения вычислений, а в
операторе repeat — условие их окончания.
Чтобы избежать ошибок, рекомендуется:
не забывать о том, что если в теле циклов while и for
требуется выполнить более одного оператора, нужно заключать их
в блок;
убедиться, что всем переменным, встречающимся в правой части
операторов присваивания в теле цикла, до этого присвоены
значения, а также проверить, возможно ли выполнение других
операторов;
проверить, изменяется ли в теле цикла хотя бы одна переменная,
входящая в условие продолжения цикла;
предусматривать аварийный выход из итеративного цикла по
достижении некоторого предельно допустимого количества
итераций (пример см. в следующем разделе).
Процедуры передачи управления
В Паскале есть несколько стандартных процедур, изменяющих
последовательность выполнения операторов:
break — завершает выполнение цикла, внутри которого
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
42

записана;
continue — выполняет переход к следующей итерации цикла;
exit — выполняет выход из программы или подпрограммы,
внутри которой записана;
halt — немедленно завершает выполнение программы.
Кроме того, для передачи управления используется оператор перехода
goto.
Рассмотрим пример применения процедуры передачи управления.
Пример. Программа вычисления значения функции sin x (синус) с
помощью бесконечного ряда Тейлора с точностью по формуле:
y = x - x3/3! + x5/5! - x7/7! +…
Этот ряд сходится при любых значениях аргумента. Точность
достигается при |Rn| < ε, где Rn —остаточный член ряда, который
для данного ряда можно заменить величиной Cn очередного члена ряда,
прибавляемого к сумме.
Общий алгоритм прост: задать начальное значение суммы ряда, а затем
многократно вычислять очередной член ряда и добавлять его к ранее
найденной сумме, пока абсолютная величина очередного члена ряда не
станет меньше заданной точности.
До выполнения программы предсказать, сколько членов ряда
потребуется просуммировать, невозможно. В цикле такого рода есть
опасность, что он никогда не завершится. Поэтому для надежности
программы необходимо предусмотреть аварийный выход из цикла с
печатью предупреждающего сообщения по достижении некоторого
максимально допустимого количества итераций.
Прямое вычисление члена ряда по приведенной выше общей формуле,
когда х возводится в степень, вычисляется факториал, а затем
числитель делится на знаменатель, имеет два недостатка, которые
делают этот способ непригодным: большая погрешность вычислений и
их низкая эффективность. При вычислении очередного члена ряда
предыдущий уже известен, поэтому следует воспользоваться
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
43

рекуррентной формулой получения последующего члена ряда через
предыдущий C
n+1
= Cn *T, где T — некоторый множитель. Подставив в
эту формулу Cn и C
n+1
, получим выражение для вычисления Т:
Текст программы с комментариями приведен в (пример 2.4).
program ch;
const MaxIter = 500; { максимальное количество итераций }
var x, eps : double; { аргумент и точность }
c, y : double; { член ряда и его сумма }
n : integer; { номер члена ряда }
done : boolean; { признак достижения точности }
begin
writeln('Введите аргумент и точность:');
readln(x, eps);
done := true;
c := x; y := c; { первый член ряда и нач. значение суммы }
n := 0;
while abs(c) > eps do begin
c :=- c * sqr(x) /(2 * n + 2)/(2 * n + 3); { очередной член ряда }
y := y + c; { добавление члена ряда к сумме }
inc(n);
if n > MaxIter then begin { аварийный выход из цикла }
writeln('Ряд расходится!');
done := false; break
end
end;
if done then
writeln('Для аргумента ', x, ' значение функции: ', y, #13#10,
'вычислено с точностью', eps, ' за ', n, ' итераций');
readln;
end.
Листинг 2.4. Вычисление суммы бесконечного ряда
Оператор перехода goto
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
44

Этот оператор имеет простой синтаксис: в точке программы, из которой
требуется организовать переход, после слова goto через пробел
записывается имя метки, например goto 1 или goto error. При
программировании на Паскале необходимость в применении оператора
перехода возникает, как правило, в двух случаях:
1. принудительный выход вниз по тексту программы из нескольких
вложенных циклов или операторов выбора;
2. переход из нескольких мест программы в одно (например, если
перед выходом из программы необходимо всегда выполнять какиелибо действия).
Во всех остальных случаях следует преобразовать алгоритм так, чтобы
он мог быть записан с помощью базовых конструкций.
1)
Рекуррентной называется формула, в которой новое значение
переменной вычисляется с использованием ее предыдущего значения. .
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
45

Типы данных, определяемые программистом
Описываются одномерные и двумерные массивы, строки, записи,
множества и файлы.
Презентацию к данной работе Вы можете скачать здесь скачать:
http://old.intuit.ru/department/pl/prinpas/3/Pascal_3.zip.
Информация, которую требуется обрабатывать в программе, имеет
различную структуру. Для ее адекватного представления используются
типы данных, которые программист определяет сам в разделе описания
типов type. Типу дается произвольное имя, которое можно затем
использовать для описания программных объектов точно так же, как и
стандартные имена типов.
type имя_типа = описание_типа
...
var имя_переменной : имя_типа
Можно задать тип и непосредственно при описании переменных:
var имя_переменной : описание_типа
Перечисляемый тип данных
При написании программ часто возникает потребность определить
несколько связанных между собой именованных констант, имеющих
различные значения. Для этого удобно воспользоваться перечисляемым
типом данных, все возможные значения которого задаются списком
констант.
type имя_типа = (список имен констант)
Константы в списке перечисляются через запятую, например:
type Menu = (READ, WRITE, EDIT, QUIT)
Переменным перечисляемого типа можно присвоить либо значение
одной из перечисленных констант, либо значение другой переменной
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
46

того же типа, например:
var m, n : Menu;
…
m := READ; n := m;
Перечисляемый тип относится к порядковым типам данных. Константы
в списке нумеруются с нуля. Например, Ord(READ) даст в результате
0, Succ(EDIT) — QUIT. Попытка получения значения, следующего
за последним, приведет к ошибке.
Использовать перечисляемый тип в операциях ввода-вывода нельзя.
Имена констант в пределах области их описания (программы или
подпрограммы) должны быть уникальными.
Интервальный тип данных
С помощью интервального типа задается диапазон значений какоголибо типа.
type имя_типа = константа_1 .. константа_2
Константы должны быть одного и того же порядкового типа. Тип, на
котором строится интервал, называется базовым. Константа_1
должна быть меньше или равна константе_2. Примеры описания
интервальных типов:
type Hour = 0 .. 23;
Range = –100 .. 100;
Letters = 'a' .. 'z';
Actions = READ .. EDIT;
Как и для других типов, определяемых программистом, интервальный
тип можно задать прямо при описании переменной, например:
var r : –100 .. 100;
С переменной интервального типа можно делать все, что допустимо
для ее базового типа. Ее значение должно находиться в указанном
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
47

диапазоне, в противном случае произойдет ошибка времени
выполнения 'Constant out of range'.
Интервальный тип используется в программах как самостоятельно, так
и внутри определения массива.
Массивы
При использовании простых переменных каждой области памяти,
предназначенной для хранения какого-либо значения, соответствует
свое имя. Если с группой величин одинакового типа требуется
выполнять однообразные действия, им дают одно имя, а различают по
порядковому номеру (индексу). Это позволяет компактно записывать
множество операций с помощью циклов.
Конечная именованная последовательность однотипных величин
называется массивом. Чтобы описать массив, надо определить, какого
типа его элементы и каким образом они пронумерованы (какого типа
его индекс).
type имя_типа = array [тип_индекса] of
тип_элемента
Здесь array и of — ключевые слова, тип индекса задается в
квадратных скобках. Примеры описания типа:
type mas = array [1 .. 10] of real;
Color = array [byte] of mas;
Active = array [Menu] of boolean;
В первом операторе описан тип массива из вещественных элементов,
которые нумеруются от 1 до 10. Во втором операторе элементами
массива являются массивы типа mas, а нумеруются они в пределах,
допустимых для типа byte, то есть от 0 до 255. В третьей строке в
качестве индекса использовано имя типа из раздела 'Перечисляемый
тип данных', а сами элементы могут принимать значения true или
false.
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
48

Тип элементов массива может быть любым, кроме файлового, тип
индексов — интервальным, перечисляемым или byte. Чаще всего для
описания индекса используется интервальный тип данных.
ВНИМАНИЕ Размещение массива в памяти происходит до выполнения
программы, поэтому при описании индекса можно применять только
константы или константные выражения.
Обычно при описании массива верхняя граница его индекса задается в
виде именованной константы, например:
const n = 6;
type intmas = array [1 .. n] of integer;
После задания типа массива переменные этого типа описываются
обычным образом:
var a, b : intmas;
С массивами в целом можно выполнять только одну операцию:
присваивание. При этом массивы должны быть одного типа:
b := a;
Все остальные действия выполняются с отдельными элементами
массива. Для обращения к элементу массива после имени массива
указывается номер элемента в квадратных скобках:
a[4] b[i]
С элементом массива можно делать все, что допустимо для переменных
того же типа.
При обращении к элементу массива автоматический контроль выхода
индекса за границу массива не производится. Для включения режима
автоматического контроля необходимо добавить в любое место
программы, предшествующее обращениям к элементу, ключ компиляции
{$R+} или установить соответствующий режим в оболочке.
Инициализация массивов.Элементам массива можно присвоить
значения до начала выполнения программы. Это делается так же, как и
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
49

для простых переменных, — в разделе описания констант, например:
const a : intmas = (0, 5, –7, 100, 15, 1);
Количество констант должно точно соответствовать числу элементов
массива. Массивы, описанные в разделе var главной программы,
обнуляются автоматически.
Рассмотрим задачу поиска максимального элемента массива. Очевидно,
что для отыскания самого большого элемента нужно сравнить между
собой все элементы массива. Элементы выбираются попарно. При
каждом сравнении из двух чисел выбирается наибольшее. Поскольку его
надо где-то хранить, в программе описывается переменная того же
типа, что и элементы массива. После окончания просмотра массива в
ней окажется самый большой элемент. Перед началом просмотра в эту
переменную заносится какой-либо элемент массива.
Сформулируем алгоритм поиска максимума.
1. Принять за максимальный первый элемент массива.
2. Просмотреть массив, начиная со второго элемента.
3. Если очередной элемент оказывается больше максимального,
принять его за максимальный.
Программа приведена в пример 3.1.
program max_elem;
const n = 20;
var a : array [1 .. n] of real;
i : integer;
max : real;
begin
writeln('Введите ', n, ' элементов массива');
for i := 1 to n do read(a[i]);
max := a[1]; { принять за максимальный первый элемент массива }
for i := 2 to n do { просмотреть массив, начиная со второго элемента }
if a[i] > max then max := a[i]; { при необходимости обновить максимум }
writeln('Максимальный элемент: ', max:6:2)
end.
Программирование на я зыке высокого уровня ПаскальТ.А. Павловская
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
