
- •ПРЕДИСЛОВИЕ
- •1.1. История и классификация языков программирования высокого уровня
- •1.2. Первое (знакомство с Паскалем
- •Задания
- •Лекция 2
- •2.1. Некоторые сведения о системе ТУрбо-Паскаль
- •2.2. Способы описания языка программирования
- •Лекция 3
- •3.2. Типы данных
- •4.1. Структура Паскаль-программы
- •4.2. Арифметические операции, функции, выражения Арифметический оператор присваивания
- •Форматы процедуры write
- •Задания
- •1. Что будет напечатано программой
- •если последовательно вводятся три числа: 36, -6, 2345?
- •5.2. Функции, связывающие различные типы данных
- •Задания
- •Теперь посмотрим, как это программируется наТЛаскале.
- •Здесь
- •<параметр цикла>::= <имя простой переменной порядкового типа>
- •Задания
- •7.1. Подпрограммы-процедуры
- •7.2. Подпрограммы-функции
- •7.4. Рекурсивные подпрограммы
- •8.1. Что такое рекуррентная последовательность
- •8.2. Программирование вычислений рекуррентных последовательностей
- •Задания
- •Задания
- •6. Вывод результата.
- •Теперь будем составлять подпрограммы.
- •Задания
- •12.2. Операции над множествами
- •12.3. Примеры использования множеств
- •Красивая программа! К сожалению, ею нельзя воспользоваться для
- •В этой программе использована функция определений размера файла:
- •.Fiiesize(<HMH файловой переменной>);
- •Задания
- •14.2. Работа с файлами записей
- •Задания
- •15.2. Связанные списки
- •Лекция 16
- •16.1. Организация внешних подпрограмм
- •16,2. Создание и использование модулей
- •распечаткой текста программы с подробными комментариями.
- •выполнения следующих операции над обыкновенными дробями вида -q
- •(Р — целое, Q — натуральное):
- •1) сложение;
- •2) вычитание;
- •3) умножение;
- •4) деление;
- •5) сокращение дроби;
- •7) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Примеры логических операторов присваивания:
1)d := true;
2)b := (х > у) and (k <> 0);
3)с := d or b and not(odd(k) and d).
5.2.Функции, связывающие различные типы данных
Вследующей таблице приводится список стандартных функций, обеспечивающих связь между различными типами данных.
Обращение |
|
|
Таблица 5.2 |
Тип аргумента |
Тип результата |
Действие |
|
ord(z) |
любой поряд |
I |
Порядковый номер зна |
pred(x) |
ковый |
|
чения х в его типе |
любой поряд |
тот же, что |
Предыдущее к х зна |
|
succ(z) |
ковый |
для X |
чение в его типе |
любой поряд |
тот же, что |
Следующее к х зна |
|
chr(x) |
ковый |
для X |
чение в его типе |
I |
char |
Символ с порядко- |
|
|
|
|
ковым номером х |
odd(x) |
I |
boolean |
True, если х — нечетное; |
|
|
|
false, если х — четное |
Функции ord, pred и succ применимы только к порядковым типам. Из простых типов это все, кроме вещественного.
Функция ord, применяемая к целому числу, дает его собственное значение. Например, ord(-35y = -35, ord(128) = 128.
Если аргумент целый, то, например, оператор у := pred(x) экви валентен: у := х - 1, а у := succ(x) эквивалентен: у := х + 1.
Для символьного типа аргумента эти функции дают, соответ ственно, предыдущий и следующий символ в таблице внутрен ней кодировки. Поскольку латинский алфавит всегда упорядочен по
кодам, т.е. o rd O a ') < ordC'b’ ) |
< |
< ordC’ z ') , то, например, |
predC’ b O ^ a ', a s u cc(,b , ) =>c\ |
То же относится и к цифровым ли |
терам: рте<1(,5>) =,4:>; s u cc(,5 , ) = ,6\
Функция сЬг(х) является обратной к функции ord(x), если х — сим вольная величина. Например, для кода ASCII справедливо:
ord (,a, )=97; chr(97)=, a\
Эту их “взаимообратность” можно выразить формулой
chr(ord(x)) = х,
где х — символьная величина.
В некоторых случаях возникает задача преобразования символь ного представления числа в числовой тип. Например, нужно получить из литеры ’5’ целое число 5. Это делается так:
N:= o rd (’ 5’ ) - огсК’ О’ ),
где N — целая переменная. Здесь использован тот факт, что код литеры ’5’ на пять единиц больше кода ’О’.
Булевский тип также является порядковым. Порядок расположения двух его значений таков: false, true. Отсюда справедливы следующие
отношения: |
|
|
ord (fa lse) |
= 0, su cc(fa lse) |
= true, |
ord(true) |
= 1, pred(true) |
= fa lse . |
Вот интересный пример. Пусть х,у, z — вещественные переменные. Как вы думаете, какую задачу решает следующий оператор:
z := х * ord(x >= у) + у * ord(у > х ) ?
Ответ такой: z = max(x, у). Как видите, эту задачу можно решить, не используя условного оператора if..then..else.
Задания
1. Вычислить значения логических выражений:
|
а) К |
mod 7 = К div 5 - 1 |
при К = 15; |
|
|
б) odd(trunc(lO * Р)) |
при Р = 0.182; |
||
|
в) not |
odd(n) |
при п = 0; |
|
|
г) t and (Р |
mod 3 = 0) |
при t = true, Р = 10101; |
|
|
д) (х * у О |
0) and (у > х) |
при х = 2, у = 1; |
|
|
е) a or {not b) |
при а = false, Ъ= true. |
||
2. |
Если а = |
true и х = 1, то какое значение получит логическая |
||
переменная d после выполнения оператора присваивания: |
||||
a) d := х < 2; |
б) d := not a or odd(x); |
в) d := ord{a) <> xl |
||
3. |
Написать оператор присваивания, в результате выполнения ко |
торого логическая переменная t получит значение true, если выполня ется указанное условие, и значение false в противном случае:
а) из чисел х, у, z только два равны между собой; б) х — положительное число;

Лекция 6
6.1. Л огические выражения в управляющих операторах
Алгоритмическая структура ветвление программируется в Паскале с помощью условного оператора. Раньше мы его описывали в таком виде:
if <условие> then соператор 1> else <оператор 2>
Кроме того, возможно использование неполной формы условного опе ратора:
if <условие> then <оператор>
Теперь дадим строгое описание условного оператора в форме син таксической диаграммы:
< условный оператор> |
. |
|
-------------------- |
► if— ► Слогическое выражение>--- |
|
■•then |
-< оператор>- |
|
else |
— ► < оператор> |
|
То, что мы называли раньше условием, есть логическое вы раж е ние, которое вычисляется в первую очередь. Если его значение равно true, то будет выполняться Соператор 1> (после then), если — false, то Соператор 2> (после else) для полной формы или сразу следующий оператор после условного для неполной формы (без else).
П ример 1. По длинам трех сторон треугольника а, Ь, с вычислить его площадь.
Для решения задачи используется формула Герона
S = |
> /р (р -а )(р - Ь)(р - |
с), |
й4- b+ с |
__ |
тт |
где р = ----- ^----- — полупериметр треугольника. Исходные данные дол
жны удовлетворять основному соотношению для сторон треугольника: длина каждой стороны должна быть меньше длин двух других сторон.
Имея возможность в одном условном операторе записывать достаточно сложные логические выражения, мы можем сразу “отфильтровать” все варианты неверных исходных данных.
Program Geron; |
{Example4.pas} |
|
Var А, В, С, P, |
S |
Real; |
Begin |
|
|
WriteLn(’ Введите длины сторон треугольника:*);
WriteC’ a®’ ) ; |
|
|
|
|
ReadLn(A); |
|
|
|
|
WriteOb®’ ); |
|
|
|
|
ReadLn(B); |
|
|
|
|
WriteC’ c®’ ) ; |
|
|
|
|
ReadLn(C); |
|
|
|
|
If (A > 0) And |
(B > |
0) And (C > 0) And |
(A + В > C) |
|
And (В + C > A) And (A + С > B) |
|
|||
Then Begin |
|
|
|
|
|
P :« (A |
+ В |
+ C) / 2; |
|
|
S :* Sqrt(P * (P - A) * (P - В) * (P - C)); |
|||
|
WriteLnC Площадь®’ , S) |
|
||
|
End |
|
|
|
Else |
WriteLnC’ Неверные исходные данные’ ) |
|||
End. |
|
|
|
|
Теперь |
рассмотрим |
синтаксическую |
диаграмму оператора |
“цикл-пока” или “цикл с предусловием” .
«шератор цикла с предусловием>
-------------------------------------------------------► while —► < логическое выражение> — 1-----►do —><оператор> ---- д»
Сначала вычисляется Слогическое выражение>. Пока его значение равно true, выполняется <оператор> — тело цикла. Здесь <оператор> может быть как простым, так и составным.
П ример 2. В следующем фрагменте программы на Паскале вычи сляется сумма гармонического ряда
1 + 5 + 3 + " ' + Т + " '
с заданной точностью е . Суммирование прекращается, когда очеред ное слагаемое становится меньше е или целая переменная г достигает значения Maxlnt.
S := 0; {Example5.pas}
I :® 1;
While (1 / I >= Eps) And (I < Maxlnt) Do
Begin
S := S + 1 / I;
I :« I + 1
End;
Синтаксическая |
диаграмма |
оператора |
цикл-до |
или |
“цикл с постусловием” : |
|
|
|
|
< оператор цикла с постусловием> |
► repeat — > <оператор> |
|
||
-------------------------------- |
|
|
1 > until — ** Слогическое выражение>-- >>
Исполнение цикла повторяется до того момента, когда Слогическое выражение> станет равным true.
Предыдущая задача с использованием цикла с постусловием реша ется так:
S := 0; {Examples.раз}
I := 1;
Repeat
S := S + 1 / I;
I := I + 1
Until (1 / I < Eps) Or (I >■ Maxlnt);
6.2.Цикл по параметру
Рассмотрим следующую простую задачу: требуется вычислить сумму целых чисел от М до N путем прямого суммирования. Здесь М и N — целые числа. Задачу можно сформулировать так:
Ягшгта = ( , ! / ’ |
е а и М ^ > |
10, |
если М > N. |
Алгоритм и программа решения этой задачи с использованием структуры “цикл-пока” будут следующими:
Program |
Adding; |
Integer; |
||
Var |
I, |
M, |
N, Summa |
|
Begin |
|
’); |
|
|
WriteC'M* |
|
|||
ReadLn(M) ; |
|
|||
Write(*N= |
O; |
|
||
ReadLn(N); |
|
|||
Summa |
:= 0; |
|
||
I |
M; |
|
|
While I <= N Do |
|
Begin |
|
Summa := Summa + I; |
|
I :» Succ(I) |
|
End; |
Summa) |
WriteLn(* Сумма равна |
|
End. |
|
А теперь введем новый тип циклической структуры, который будет называться “цикл по параметру” или “цикл-для” Ниже приведены блок-схема и алгоритм на Алгоритмическом языке для решения рас сматриваемой задачи с использованием этой структуры.
Здесь целая переменная I принимает последовательность всех зна чений в диапазоне от М до N. При каждом значении I выполняется тело цикла. После последнего выполнения цикла при / = N происходит выход из цикла на продолжение алгоритма. Цикл выполняется хотя бы один раз, если М < iV, и не выполняется ни разу при М > N.