- •ПРЕДИСЛОВИЕ
- •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) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Begin Eps := 1 / 2; |
|
While 1.0 + Eps > 1.0 Do |
г,Eps) |
Eps := Eps / 2; |
|
WriteLnOМашинный эпсилон* |
|
End. |
|
Задания
1.С помощью приведенной выше программы определите на Вашем компьютере величину машинного эпсилон.
2.Если на Вашем компьютере это возможно, определите машинное
едля удвоенной или повышенной точности представления веществен ных чисел.
3.Составьте программу определения машинного нуля. Проведите численный эксперимент на Вашем компьютере.
4.Результат выполнения следующей программы докапывает некор ректность сравнения на равенство двух вещественных чисел.
Program Test;
Var |
X, |
StepX |
Real; |
Begin |
X := 0; |
||
|
|
StepX |
:= 0 .1; |
|
|
Repeat |
|
|
|
X :* X + StepX |
|
End. |
U ntil |
X = 1E3 |
|
|
|
||
Проведите численный эксперимент, объясните результат. |
|||
5. |
Попробуйте экспериментально доказать, что в “плавающей” |
арифметике на ЭВМ не всегда выполняются законы ассоциативности: (я + у) + z = х + (у + z) и дистрибутивности: (х -f y)z = xz + yz.
6. Проведите эксперимент на исследование целочисленного перепол нения, т.е. установите, что происходит с целой переменной, когда ее значение превышает Maxlnt.
7.1.Подпрограммы-процедуры
Спонятием вспомогательного алгоритма вы уже знакомы. В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпро грамм: процедуры и функции.
Разберем этот вопрос на примере следующей задачи: даны два на туральных числа а и Ь. Требуется определить наибольший общий де
литель трех величин: а 4- 6, \а - Ь|, а •6. Запишем это так: НОД(а -f Ь, \а- Ь|, а •6).
Идея решения состоит в следующем математическом факте'Гесли х\ у, z — три натуральных числа, то НОД(я,?/,г) = НОД(НОД(я,у), z). Иначе говоря, нужно найти НОД двух величин, а затем НОД получен ного значения и третьего числа (попробуйте это доказать).
Очевидно, что вспомогательным алгоритмом для решения поста вленной задачи является алгоритм получения наибольшего общего де лителя двух чисел. Эта задача решается с помощью известного алго ритма Евклида. Запишем его в форме процедуры на алгоритмическом языке.
Процедура Евклид(цел М, N, К); нач
пока М О |
N |
нц |
|
если |
М > N |
то |
М := М - N |
иначе N :■ N - М кв
кц; К := М кон
Здесь М и N являются формальными параметрами процедуры. М и N — параметры-аргументы, К — параметр-результат. Основной алгоритм, решающий исходную задачу, будет следующим:
алг задача; цел а, Ъ, с;
нач ввод(а, Ъ);
ЕвхпидСа + b, |а - b|, с ); Евхшщ(с, a+b, с ); вывод(с)
хон
Основное отличие процедур в Паскале от процедур в Алгоритмиче ском языке (АЯ) состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как ре шение поставленной задачи программируется на Турбо-Паскале.
Program NODI; |
{exaraple9.pas} |
|
||||
Var А, В, C: Integer; |
|
|
||||
Procedure |
Evklid |
(M, N |
Integer; Var К |
In te g e r); |
||
Begin |
|
|
|
|
|
|
While |
M <> N Do |
|
|
|
||
I f |
M > N |
|
|
|
|
|
Then M |
M - |
N |
|
|
||
Else N |
:= |
N - |
M; |
|
|
|
К := M |
|
|
|
|
|
|
End; |
|
|
|
|
|
|
Begin |
|
’ ); |
|
|
|
|
WriteCa* |
|
|
|
|
||
ReadLn(A); |
|
|
|
|
||
Write(>b= |
’ ); |
|
|
|
|
|
ReadLn(B); |
|
|
|
|
||
Evklid(A + B, |
Abs(A - В ), C ); |
|
||||
E vklid(С, |
A * |
В, |
C ); |
|
|
|
W riteLn(’ НОД |
= » , |
C) |
|
|
||
End. |
|
|
|
|
|
|
В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры (формальные-фактические). Существует и другой механизм обмена — через глобальные переменные. Но об этом — чуть позже. А сейчас рассмотрим синтаксическую диаграмму описания процедуры.
<описание процедуры>
------------------------------------><заголовок процедуры>— ; ) — > <блок>—►
< заголовок процедуры>
procedure—►•сСимя процедуры>
-> (^ 0 —»■<список формальных параметров>— К^Т)“
<формальные параметры> ::= <параметры-значения> |<параметры-переменные>
<иараметры - переменные> |
< список переменных> — |
<тип>-> |
|
-------------------------------------i— >■ Var |
|||
<параметры - значения> |
|
— ►<тип>— |
|
►< список переменных> — |
Из диаграммы видно, что процедура может иметь параметры, а может быть и без параметров. Чаще всего аргументы представля ются кая параметры-значения (хотя могут быть и параметрамипеременными). А для передачи результатов используются параметрыпеременные.
Процедура в качестве результата может передавать в вызывающую программу множество значений (в частном случае — одно), а может и ни одного. Теперь рассмотрим правила обращения к процедуре. Об ращение к процедуре производится в форме оператора процедуры.
Соператор процедуры>
►<имя процедуры> - Т
—► < список фактических параметров>—*СТУ~
Есяи описана процедура с формальными параметрами, то и обраще ние к ней производится оператором процедуры с фактическими пара метрами. Правила соответствия между формальными и фактическими параметрами: соответствие по количеству, соответствие по последо вательности и соответствие по типам.
Первый вариант взаимодействия формапъных-фактических параме тров называется передачей по значению: вычисляется значение фак тического параметра (выражения) и это значение присваивается со ответствующему формальному параметру. Второй вариант взаимо действия называется передачей по имени: при выполнении процедуры имя формальной переменной заменяется на имя соответствующей фак тической переменной (в откомпилированной программе имени пере менной соответствует адрес ячейки памяти). В рассмотренном нами примере формальные параметры М и N явлД*°тся параметрамизначениями. Это аргументы процедуры. При обращении к ней Первый раз им соответствуют значения выражений а+Ь и abs(a-b); второй pan
— с и а*Ь. Параметр К является параметром-переменной. В неЙ полу чается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С
f Через эту переменную основная программа получает результат.
Теперь рассмотрим другой вариант программы, решающей ту же задачу. В ней используется процедура без параметров.
Program N0D2; |
Integer; |
|
Var А, В, |
К, М, N |
|
Procedure |
Evklid; |
|
Begin
While M <> N Do
If M > N
Then M :« M - N
Else N := N - M;
К := M
End;
Begin
Write(’a® O;
ReadLn(A);
Write Ob* 0;
ReadLn(B);
M:= A + B;
N:= Abs(A - B); Evklid;
M:= K;
N:* A * B; Evklid;
WriteLnC’HOfl равен 1, K)
End.
Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: обяасть действия описания.
Областью действия описания любого программного объекта (пере менной, типа, константы и т.д.) является тот блок, в котором рас положено это описание. Если данный блок вложен в другой (подпро грамма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока. Описания же, стоящие во внешнем блоке, называются тлобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание.
Впрограмме N0D1 переменные М, iV, К — локальные внутри про цедуры; переменные а, Ь, с — глобальные. Однако внутри процедуры переменные а, Ь, с не используются. Связь между внешним блоком и процедурой осуШествляется через параметры.
Впрограмме N0D2 все переменные являются глобальными. В про цедуре Evklid нет ни одной локальной переменной (нет и параметров).