extracted_text:
бюджетное профессионально образовательное учреждение
Вологодской области
 «Сокольский лесопромышленный политехнический техникум»
ОСНОВЫ
ПРОГРАММИРОВАНИЯ
Учебное пособие для студентов специальности
09.02.03 Программирование в компьютерных системах 2
Сокол
2017 Учебное   пособие   по   дисциплине   «Основы   программирования»   составлено   в
соответствии с требованиями ФГОС  специальности 09.02.03 Программирование
в компьютерных системах и рабочей программой учебной дисциплины.
3
Рассмотрено на заседании
предметной цикловой комиссии
физики, математики, информатики
протокол  № 11  от  «30» июня 2017 г.
Автор –  преподаватель информационных технологий
БПОУ ВО «Сокольский ЛПТ» Н.А. Ефимова ОГЛАВЛЕНИЕ
Введение
Тема 1. Основы программирования на языке Pascal
1. Язык программирования
2. История развития языков программирования
3. Язык программирования Pascal
4. Этапы решения задач по программированию
5. Алфавит языка программирования Рascal
6. Структура программы
7. Переменные
8. Операторы ввода  вывода данных
9. Арифметические стандартные функции паскаль
10. Условные операторы Pascal
11. Циклы в Pascal
Тема 2. Массивы
1. Понятие массива данных
2. Одномерные массивы
3. Двумерные массивы
Тема 3. Стандартные модули языка программирования Pascal
1. Понятие модуля
2. Синтаксис определения и использования модуля
3. Стандартные модули
4. Модуль CRT
5. Модуль GRAPH
Тема 4. Процедуры и функции
1. Понятие подпрограммы
2. Процедуры
3. Достоинства использования подпрограмм
4. Параметры подпрограмм
5. Функции
Тема 5. Строки и множества
1. Строки в паскаль
1.1 Понятие строки
1.2 Описание строк
1.3 Вводвывод строк
1.4 Операции со строками
1.5 Процедуры и функции для обработки строк
2. Множества в паскаль
1.1 Понятие множества
1.2 Описание множества
1.3 Задание множеств
1.4 Операции над множествами
1.5 Преимущества и недостатки множества
Тема 6. Записи в языке программирования Pascal
1. Определение понятия запись.
2. Программы с записями.
Тема 7. Файлы
1. Понятие файла, типы файлов в Pascal
2. Процедуры для работы с файлами
4
4
5
5
5
5
6
7
8
8
9
9
11
14
17
17
17
19
21
21
21
21
22
23
25
25
26
27
28
30
32
32
32
32
32
33
33
35
35
35
36
36
38
39
39
40
42
42
42 3. Текстовые файлы
4. Типизированные файлы
Литература
5
42
43
45 ВВЕДЕНИЕ
6
Настоящее   учебное   пособие   представляет   собой   теоретический   материал   по
дисциплине «Основы программирования».
Программирование является одной из самых интересных областей информатики. Оно
дает широкие возможности по решению различных классов задач, но в тоже время освоение
программирования вызывает наибольшие сложности у студентов.
Одним   из   самых   популярных   языков   программирования   является   –   Паскаль,
разработанный французским математиком Николаусом Виртом.
Паскаль   –   язык   программирования,   созданный   специально   для   обучения
программированию.   Он   характеризуется   чёткой   структурой   программы,   простотой   и
ясностью конструкций. Строгая типизация языка значительно сокращает количество ошибок в
программах.
Целью изучения этой дисциплины является овладение основами программирования на
языке Паскаль.
Язык   Паскаль   –   современный   язык     программирования,   наиболее   подходящий   для
изучения основ  программирования.
Изучение   его   на   начальных   этапах   обучения   программиста   позволяет   осуществить
постепенный переход от простейших программ к модульному, объектноориентированному,
событийному и компонентному программированию.
В пособии изложены основные понятия, конструкции и состав языка Паскаль, а также
методика решения типовых задач программирования с примерами и комментариями.
Основной целью учебного пособия является оказание помощи студентам в освоении
программирования.
В   учебном   пособии   предложена   дополнительная   литература,   пользуясь   которой
обучающийся может расширить знания по дисциплине. 7
ТЕМА 1. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ PASCAL
1. ЯЗЫК ПРОГРАММИРОВАНИЯ
Алгоритм,   представленный   в   виде   блоксхемы   или   в   словесной   форме   (даже   с
использованием   псевдоязыка),   не   пригоден   для   исполнения  процессором  какоголибо
вычислительного  устройства (компьютера, робота и др.). В этом случае нужен абсолютно
формальный   способ   записи,   не   допускающий   даже   малейшей   неточности.   Следовательно,
нужен   особый   язык,   который   позволяет   записывать   алгоритмы   с   использованием
ограниченного   набора   конструкций,   не   допускающих   неоднозначного   толкования.   Такие
языки называются языками программирования.
Таким образом, язык программирования — совокупность средств и правил представления
алгоритма в виде, пригодном для выполнения вычислительной машиной.
2. ИСТОРИЯ РАЗВИТИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Машинный язык
На раннем этапе развития вычислительной техники программы писались на машинном
языке —  в  машинных   кодах,   т. е.   так,   как   их   воспринимает   процессор   компьютера   или
другого цифрового устройства. Для каждой элементарной операции в этом случае требуется
указать ее код и адреса ячеек памяти с данными. Запись выполняется в цифровом виде с
использованием двоичной системы счисления.
Ассемблер
Первоначальный   прогресс   в   технологии   программирования   был   связан   с   идеей
использования   символьных   имен   (названий)   вместо   цифровых   кодов   операций   и   адресов
данных. Язык записи команд, основанный на этой идее, получил название языка Ассемблера.
Использование осмысленных названий вместо кодов операций и адресов памяти существенно
упрощает   процесс   программирования   и   внесения   изменений   в   программу.   К   сожалению,
основной   недостаток   машинного   языка —   зависимость   программы   от   конкретного   типа
процессора при переходе к Ассемблеру не был устранен, но это был только первый шаг в
правильном направлении.
Языки программирования высокого уровня
Следующая ступень развития — это  языки программирования высокого уровня, их
использование позволяет отвлечься от системы команд конкретного типа процессора. Такой
язык содержит правила записи программ, которые, с одной стороны, достаточны и удобны для
описания алгоритмов решения задач, а с другой стороны, толкуются однозначно и могут быть
преобразованы в программы в машинных кодах.
Fortran
Является первым из языков высокого уровня (19541958 г.). В то время
основной сферой применения вычислительных машин (термин "компьютер" вошел в обиход
гораздо позже) были научнотехнические расчеты.
Algol
Опубликован   в   1960 г.   От   языка  Fortran  отличался   значительно   более   строгими
правилами синтаксиса, что позволило выявлять больше ошибок еще на этапе трансляции.
Basic

Появился на свет в 1964 г. и был задуман как очень простой в изучении язык, который
можно использовать как первый язык при обучении программированию. В настоящее время на
его основе создан современный язык Visual Basic
3. ЯЗЫК ПРОГРАММИРОВАНИЯ PASCAL
Паскаль  –   язык   программирования,   созданный   в   конце   60х   годов (19671968
гг.) швейцарским профессором Николаусом Виртом (впоследствии он создал и такие языки 8
  но   они   не   получили   широкого
программирования   как   Модула   и   Оберон,
распространения) специально   для   обучения   программированию.   Стандарт   языка   был
разработан учёным в 1974 г. совместно с Кетлин Дженсен.   Название   языку   было   дано   в
честь выдающегося французского математика.
Язык Паскаль характеризуется чёткой структурой программы, простотой и ясностью
конструкций.   С   момента   создания   Паскаль   был   универсален   и   пригоден   для   решения
широкого круга задач (в отличие от таких языков, как Бейсик, Фортран, Кобол). Строгая
типизация языка значительно сокращает количество ошибок в программах.
Сейчас существует три стандарта языка:
1.     Нерасширенный   Паскаль (Unextended   Pascal) был   разработан   в   1983   году   и
практически полностью совпадает с описанием языка по ДженсенВирту.
2.     Расширенный   Паскаль (Extended   Pascal) содержит   расширения,   затрагивающие
модульное   программирование{отдельная   компиляция   модулей,
  импортэкспорт
подпрограмм,   интерфейсная   часть   и   реализация} и   дополнен   рядом   процедур   и
функций (прямой доступ к файлам, работа со строками и др.).
3.     Объектный   Паскаль (Object   Pascal) принят   в   1993   г.   Он   поддерживает   классы,
обладающие свойствами и методами, наследование классов, переопределение методов у
потомков {полиморфизм} и
объектноориентированного
программирования.
атрибуты
другие

С   появлением   компьютеров,   Паскаль   начал   широко   использоваться   для
программирования.   Для   операционной   системы   MSDOS самое   большое   распространение
приобрела реализация языка Паскаль фирмы Борланд под названием Турбо Паскаль.
Интегрированная   оболочка,   которая   включает   в   себя   редактор,   компилятор,
компоновщик   и   отладчик,   вместе   с   интерактивной   справочной   системой   превратили
разработку программ на Паскале в простое и понятное практически каждому человеку дело.
Но так было не всегда. Например, в начале восьмидесятых годов сначала в редакторе нужно
было   написать   текст   программы,   затем   однопроходный   компилятор   выдавал   код   на
ассемблере,   далее   приходилось   транслировать   его   в   объектный   код,   компоновать   с
системными библиотеками и только после этого запускать программу. Поиск ошибок {без
встроенного отладчика, который сейчас просто показывает вам строку c ошибкой} был делом,
требующим терпения, и большого количества времени.
4. ЭТАПЫ РЕШЕНИЯ ЗАДАЧ ПО ПРОГРАММИРОВАНИЮ
Программа  – это запись алгоритма на языке программировании. Ее можно считать
законченным результатом процесса разработки алгоритма, готовым к использованию.
1. Постановка задачи. Разбираемся с условием задачи, что дано, что нужно найти.
2. Математическое описание задачи. Построение математической модели.
3. Разработка алгоритма решения задачи. Построение блоксхемы.
4. Написание текста программы в окне редактирования на языке программирования.
5. Компиляция   текста  в   машинный   код.   Она   осуществляется   встроенным
компилятором среды.
6. Отладка программы. Исправление ошибок, на которые укажет среда.
7. Запуск отлаженной программы и тестирование.
Тестирование готовой программы бывает двух видов:
   Открытое   –  заключатся   в   том,   что   запуск   программы   осуществляется   специально
подобранным на основе программного кода. Т.е. данные подбираются с учетом потенциально
опасных мест кода.
Основные точки, вызывающие ошибки:
1. Недостаточная инициализация (забыли присвоить начальное значение или завести
переменную). 9
2. Неправильное построение логических высказываний (путаница между «и» и «или»).
3. Не все циклы зациклены (параметризированный выполняется столько раз, сколько
указанно в программе, с пред и пост условием от 0 до бесконечности в зависимости
от условия, с пред может вообще не выполняться с паст хотя бы 1 раз).
 Закрытое –  не смотрим в код. Должно проводиться несколько тестов удовлетворяющих
требованиям:
1.   Должны   рассматриваться   краевые   значения   т.е.   минимально   и   максимально
возможные.
2. Работа с упорядоченными и перевернутыми наборами данных.
3. Тесты имитирующие интересные случаи. Подобрать данные так, чтобы под выборку
попадал 1 уникальный элемент или ни одного.
4. Произвольные случайные тесты.
8. Получение и анализ результатов.
5. АЛФАВИТ ЯЗЫКА ПРОГРАММИРОВАНИЯ PASCAL
Основу любого языка составляет алфавит, то есть конечный, фиксированный набор
символов,   используемых   для   составления   текстов   на   данном   языке   (в   нашем   случае
программ).
Алфавит языка программирования Pascal cостоит из 6 групп:
1. Символы используемые для составления идентификатора
Идентификатор   –   это   имя   для   элементов   программы   (переменных,   констант,   процедур   и
функций). К этим символам относятся 26 букв латинского алфавита, арабские цифры от 09 и
символ подчеркивания.
Использование символов первой группы чаще всего вопросов не вызывает, но свои тонкости
здесь имеются.
Вопервых, это употребление заглавных и строчных букв. Большинство существующих
трансляторов не различают  буквы разных регистров. Таким  образом, записи  "progRaM" и
"PROGram" будем считать идентичными.
Вовторых,   некоторые   символы   латиницы   и   кириллицы   совпадают   по   начертанию.
Специальные символы:
Нельзя ли вместо буквы "К" латинской написать "K".
2. Символы разделители: пробел, комментарий \\
3.
   .    конец программы, разделение целой и дробной частей вещественного числа (десятичная
точка), разделение полей в переменной типа Record;
     :    используется в составе оператора присваивания, а также для указания формата вывода
в операторе Writeln;
     ;    отделяет один раздел программы от другого, разделяет операторы;
     '    используется для ограничения строковых констант;
     ( )    ;
     @    имя специального оператора определения адреса переменной, подпрограммы;
     ^    используется для именования динамических переменных;
     {}    ограничение комментариев в программе;
     [ ]    заключают в себе индексы элементов массивов;
     #    обозначение символа по его коду;
     $    обозначение директивы компилятора, обозначение шестнадцатеричного числа.
4. Знаки операций:
а) знаки арифметических операций: +, *, , /, DIV – целая часть от деления, MOD – остаток
от деления. б) знаки отношений: =, ><, >=, <=, <>.
в) логические операции: NOT – не (отрицание), OR – или (сложение), AND – и (умножение).
5. Строчные символы:
:= присваивание,      ..    указание диапазона.
10 11
6. Зарезервированные слова:
And
array
begin
case
const
go to
Do
downto
Else
End
File
For
function
If
In
label
Of
procedure Процедура
Логическое И
Массив
Начало блока
Вариант
Константа
Переход на
Выполнять
Уменьшить до
Иначе
Конец блока
Файл
Для
Функция
Если
В (входит в ...)
метка
Из
program Программа
record
repeat
Set
Shl
Shr
string
then
To
type
unit
until
uses
Var
while
with
Xor
Запись
Повторять
Множество
Сдвиг разрядов влево
Сдвиг разрядов вправо
Строка
То
Увеличивая
Тип
Модуль
До
Использовать
Переменная
Пока
С
Исключающее ИЛИ
6. СТРУКТУРА ПРОГРАММЫ
  Правила языка Паскаль предусматривают единую для всех программ форму основной
структуры:
Program <Имя программы>;
<Раздел описаний>
Begin
<Тело программы>
End.
 Здесь   слова   Program,   Begin   и   End   являются   служебными.   Правильное   и   уместное

употребление этих слов является обязательным.
 Угловые скобки в формате указывают на то, что вместо них при программировании
Имя программы выбирается программистом самостоятельно и должно начинаться с
должно быть подставлено конкретное значение.

латинской буквы.

Все   объекты,   не   являющиеся   зарезервированными   в   Паскале,   наличие   которых
необходимо для решения задачи, перед первым использованием в программе должны быть
описаны.   Это   производится   для   того,   чтобы   компьютер   перед   выполнением   программы
зарезервировал память под соответствующие объекты. Раздел описаний может состоять из
пяти подразделов:
     1. Описание меток (Label).
     2. Описание типов (Type).
     3. Описание констант (Const).
     4. Описание переменных (Var).
     5. Описание процедур и функций (Procedure, Function).
     При отсутствии необходимости в какомлибо виде объектов, соответствующий подраздел
может быть опущен.
7. ПЕРЕМЕННЫЕ 12

Данные, как вы знаете, хранятся в памяти компьютера.
Переменная   в   Паскале      именованный   участок   памяти   для   хранения   данных
определенного   типа.   Значение   переменной     в   ходе   выполнения   программы   может   быть
изменено.
Константами   же   называются   величины,   значение   которых   в   ходе   выполнения
программы   изменено   быть   не   может.   Конкретные   переменные   и   константы   представляют
собой объекты уникальные и отличаются друг от друга именем.
В качестве данных в программах на языке Паскаль могут выступать числа, символы,

целые строки символов.  В соответствии с этими в языке Паскаль введено понятие "Тип"
(TYPE). Тип переменной указывает на то, какие данные могут быть сохранены в этом участке
памяти,   и   в   каких   действиях   эта   переменная   может   участвовать.   Существуют
зарезервированные (базовые) типы в языке Паскаль, но, есть также возможность создавать
свои собственные, определяемые программистом типы переменных.
     К базовым типам относятся:
 тип целых чисел  Integer
 тип "длинных" целых чисел  Longint
 тип действительных (вещественных) чисел (то есть  с дробной частью)  Real
 тип неотрицательных целых чисел от 0 до 255  Byte
 тип неотрицательных целых чисел от 0 до 65535  Word
 символьный тип  Char
 строковый тип  String
 логический тип  Boolean
Описание   констант   и   переменных   происходит   в   описании   разделов   после   слова

программ. Для описания переменных используется слово VAR.
var <список переменных>:<тип>;
Пример: var а,в : integer; x: Boolean;
Для описания констант используется ключевое слово const.
const <имя константы> = <значение>;
Пример:const x=5, y= ‘Pascal’, z = 13,5.
8. ОПЕРАТОРЫ ВВОДА  ВЫВОДА ДАННЫХ
2. Ввод данных
Read (a1, a2, r);  ввод в строку
Readln(a1, b, p);  ввод с переходом к новой строке (в столбец)
3.Вывод данных
Write (a1, a2, r);  вывод в строку
Writeln(a1, a2, r);  вывод с переходом к новой строке (в столбец)
a1, a2, r, p – имена переменных подлежащих вводу\выводу.
Пример:
Writeln(‘введите числа для расчета’);
readln(a,b);
s:=a+b;
writeln(‘сумма=’, s);
9. АРИФМЕТИЧЕСКИЕ СТАНДАРТНЫЕ ФУНКЦИИ ПАСКАЛЬ
Арифметические функции можно использовать только с величинами целого и
вещественного типа.
Функция
abs (x)
Назначение
абсолютное значение аргумента совпадает с типом аргумента
Тип результата 13
sqr (x)
квадрат аргумента
sqrt (x)
квадратный корень аргумента
cos (x)
косинус аргумента
sin (x)
синус аргумента
arctan (x)
арктангенс аргумента
exp (x)
ex
ln (x)
натуральный логарифм
int (x)
целая часть числа
frac (x)
дробная часть числа
Функции преобразования типов
совпадает с типом аргумента
вещественный
вещественный
вещественный
вещественный
вещественный
вещественный
вещественный
вещественный
Эти функции предназначены для преобразования типов величин, например, символа в
целое число, вещественного числа в целое и т.д.
ord (x)
 возвращает порядковый номер аргумента и, таким образом, преобразует
величину порядкового типа в величину целого типа.
 округляет вещественное число до ближайшего целого.
 выдает целую часть вещественного числа, отбрасывая дробную.
round (x)
trunc (x)
Функции для величин порядкового типа
odd (x)
pred (x)
succ (x)
ord (x)
 проверяет аргумент на нечетность. Аргумент функции величина типа longint,
результат true, если аргумент нечетный, false – если четный.
 определяет предыдущее значение величины x.
 определяет последующее значение величины x.
 возвращает порядковый номер величины x.
Пример решения задачи: Найти периметр и площадь прямоугольника если известны
его стороны.
Решение: Площадь прямоугольника вычисляется по формуле S=a*b, а периметр
P=2*(a+b).
В Паскале в каждой задаче для каждой величины нужно завести соответствующую
переменную т.е. букву латинского алфавита и для нее задать тип данных.
В этой задаче получается 4 переменные, две для сторон прямоугольника a и b,  S для
вычисления площади и P для вычисления периметра (в принципе их можно назвать любыми
буквами), для того чтобы задача была универсальной возьмем их все типа real.
В общем виде структура программы выглядит так:
Program Имя программы; //Имя программы обязательно на английском языке и должно
начинаться с буквы, например Z1,abc3, этот раздел необязателен
//перечисляются переменные и их типы данных, если несколько
переменных одного типа то через запятую, например var x,c:
integer; f:real;)
//начало программы
//это оператор вывода, выводит на экран сообщение например
«введите числа»
//это оператор ввода, вводит в программу числа для вычисления
Var
Begin
//Ввод значений переменных
writeln(….);
readln(…..);
//Формулы для вычисления
//Вывод результатов вычисления
writeln(….);
end.
Program z1; 14
var a, b, S, P :real;
begin
writeln(‘введите стороны прямоугольника a и b’);
readln(a,b);
S:=a*b;     // вычисляем площадь
P:=2*(a+b); //вычисляем периметр
writeln(‘S=’, S); // выводим значение площади на экран
writeln(‘P=’, P); // выводим значение периметра
end.
10. УСЛОВНЫЕ ОПЕРАТОРЫ PASCAL
Бывает, что в процессе выполнения программы требуется реализовать разный набор
команд в зависимости от произошедших до этого событий. В языках программирования это
достигается с помощью специальных конструкций – условных операторов.
Условный   оператор  реализует   «ветвление»,   т.е.   изменяет   порядок   выполнения
операторов   в   зависимости   от   истинности   или   ложности   некоторого   условия.   Условный
оператор может иметь две формы (структуры)полную или неполную.
Чаще всего в качестве условного оператора в языках программирования используется
конструкция ifelse или ее сокращенный вариант if. Также существует оператор выбора case,
который имеет более специфичное применение.
Условные   операторы  позволяют   выбирать   для   выполнения   те   или   иные   части
программы в зависимости от некоторых условий. Если, например, в программе используются
вещественные переменные x и z, и на какомто этапе решения задачи требуется вычислить
z=max(x, y), то желаемый  результат получается  в результате выполнения  либо  оператора
присваивания z:=x, либо оператора присваивания z:=y. Поскольку значения переменных x и y
заранее   неизвестны,   а   определяются   в   процессе   вычислений,   то   в   программе   необходимо
предусмотреть оба эти оператора присваивания. Однако на самом деле должен выполниться
один из них. Поэтому в программе должно содержаться указание о том, в каком случае надо
выбирать для исполнения тот или иной оператор присваивания.
Это указание естественно сформулировать с использованием отношения x>y. Если это
отношение   при   текущих   значениях   x   и   y   справедливо   (принимает   значение   true),   то   для
исполнения должен выбираться оператор z:=x; в противном случае для исполнения должен
выбираться   оператор   z:=y   (при   x=y   безразлично,   какой   оператор   выполнять,   так   что
выполнение оператора z:=y в этом случае даст правильный результат).
Для задания подобного рода разветвляющихся  вычислительных  процессов в языках
программирования существуют условные операторы.
 ОПЕРАТОР IFELSE
Когда выполнение основной ветки программы доходит до условного оператора ifelse,
то в зависимости от результата логического выражения в его заголовке выполняются разные
блоки кода. Если логическое выражение вернуло true, то выполняется один блок (в Паскале
начинается со слова then), если false – то другой (начинается со слова else). После
выполнения одного из вложенных блоков кода, ход программы возвращается в основную
ветку. Другой вложенный блок не выполняется.
Формат оператора
if B then S1 else S2.
Здесь  if  (если),  then  (то)   и  else  (иначе)   являются   служебными   словами,  В  –   логическое
выражение, а S1 и S2 – операторы. 15
Выполнение такого условного оператора в Паскале сводится к выполнению одного из
входящих в него операторов S1 или  S2: если заданное в операторе условие  выполняется
(логическое выражение В принимает значение true), то выполняется оператор S1, в противном
случае выполняется оператор S2.
Алгоритм решения упомянутой выше задачи вычисления z= max( x, y) можно задать в
виде условного оператора Паскаля:
if x>y then z:= x else z:= y.
Правило выполнения сокращенного  условного оператора  достаточно очевидно:  если
значение   логического   выражения   В   есть   true,  то  выполняется   оператор   S;   в  противном
случае никаких иных действий не производится.
В языке программирования Паскаль в условном операторе между then и else, а также
после else по синтаксису может стоять только один оператор. Если же при выполнении (или
невыполнении) заданного условия надо выполнить некоторую последовательность действий,
то их надо объединить в единый, составной оператор, т.е. заключить эту последовательность
действий в операторные скобки begin... end.
Если,   например,   при   x<   y   надо   поменять   местами   значения   этих   переменных,   то
условный оператор  будет записан следующим образом в Паскале:  if  x Do <оператор>;

       Пока   истинно   условие,   выполнять   оператор.   Здесь,   так   же   как   в   формате   условного
оператора,   подразумевается   выполнение   только   одного   оператора.   Если   необходимо
выполнить   несколько   действий,   то   может   быть   использован   составной   оператор.   Тогда
формат оператора принимает такой вид:
While <условие> Do
Begin
<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .
End;
Цикл "ДО"

Этот вид цикла отличается от предыдущего тем, что проверка условия повторения
тела   цикла   находится   не   перед   ним,   а   после.   Поэтому   цикл   "До"   называют   циклом   "с
постусловием", а "Пока"  "с предусловием".

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

Когда условие цикла изначально истинно, тело цикла все равно будет выполнено хотя
бы один раз. Именно это отличие "до" от "пока" привело к тому, что в программировании они
не подменяют друг друга, а используются для решения задач, к которым они более подходят.

Repeat
<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .
Until <условие>;

Читается так: "Выполнять оператор #1, оператор #2. : до выполнения условия".
Формат цикла на языке Pascal: Здесь не требуется использование составного оператора, потому, что сами слова

Repeat и Until являются операторными скобками.
19 20
Здесь   И.П.      имя   переменнойпараметра,   Н.З.      его   начальное   значение,   К.З.
Цикл "С ПАРАМЕТРОМ"

В   данном   случае   параметром   будет   являться   целочисленная   переменная,   которая
будет изменяться на единицу при каждой итерации цикла. Таким образом, задав начальное и
конечное значения для такой переменной, можно точно установить количество выполнений
тела цикла.
     Форматов у этого вида цикла предусмотрено два:
    For <И.П.>:=<Н.З.> To <К.З.> Do <оператор>;
    For <И.П.>:=<Н.З.> Downto <К.З.> Do <оператор>;

соответственно конечное значение параметра. В качестве начального и конечного значений

Читается данная структура так: "Для переменной (далее следует ее имя) от начального
значения до конечного выполнять оператор (являющийся  телом цикла)". В первом случае
параметр с каждой итерацией увеличивается на единицу, во втором  уменьшается.

    1. переменнойпараметру присваивается начальное значение;
    2. выполняется тело цикла;
    3. переменнаяпараметр автоматически увеличивается на 1 (в первом случае формата);
    4. если параметр превышает конечное значение, то происходит выход из цикла, иначе
переход к пункту 2.

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

когда известно необходимое количество выполнений тела цикла.

Примечание: при использовании Downto параметр автоматически уменьшается на 1, а
Выполняется этот цикл по следующему алгоритму:
Таким образом, в отличие от первых двух видов цикла, этот цикл используется тогда,
Пример:  Найти сумму квадратов всех натуральных чисел от 1 до 100. Решим эту
задачу с использованием всех трех видов циклов.
1. С использованием цикла "Пока".
Program Ex1;
Var
   A : Integer;
   S : Longint;
Begin
A:=1; S:=0;
While A<=100 Do
Begin
S:=S+A*A;
A:=A+1
End;
Writeln(S)
End.
2. С использованием цикла "До".
Program Ex2;
Var
    A : Integer;
    S : Longint;
Begin
A:=1; S:=0;
Repeat
S:=S+A*A;
A:=A+1 21
Until A>100;
Writeln(S)
End.
3. С использованием цикла "С параметром".
Program Ex3;
Var
    A : Integer;
    S : Longint;
Begin
S:=0;
For A:=1 To 100 Do S:=S+A*A;
Writeln(S)
End. ТЕМА 2. МАССИВЫ
22
1. ПОНЯТИЕ МАССИВА ДАННЫХ
Массив  –   это   именованная   группа   однотипных   данных,   хранящихся   в
последовательных ячейках памяти.
Выделяют одномерные, двумерные и многомерные массивы. На практике последние
используют достаточно редко.
Одномерный массив   это фиксированное количество элементов одного и того же
типа,  объединенных  одним  именем,  где  каждый  элемент  имеет  свой  номер.  Обращение  к
элементам массива осуществляется с помощью указания имени массива и номеров элементов.
Двумерный   массив  представляет   собой   массив,   в   котором   положение   элементов
определяется 2мя индексами. Фактически, двумерный массив – это обычный (одномерный)
массив, элементами которого являются другие одномерные массивы.
Массивы состоят из ограниченного числа компонент, причем все компоненты массива
имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив
может состоять из элементов типа integer , real или char , либо других однотипных элементов.
Из  этого, правда,  не следует  делать вывод,  что компоненты массива  могут иметь только
скалярный тип.
Другая   особенность   массива   состоит   в   том,   что   к   любой   его   компоненте   можно
обращаться произвольным образом.
Номер элемента массива называется индексом.
Индекс – это значение порядкового типа, определенного, как  тип индекса  данного
массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и
логический и символьный.
2. ОДНОМЕРНЫЕ МАССИВЫ
Одномерный массив   пронумерованная последовательность однотипных данных, с
точки зрения геометрии это вектор.
Для одномерного массива индекс определяет порядковый номер элемента.
В памяти компьютера все элементы массива занимают одну непрерывную область.
Индекс элемента массива – это константа или переменная целого типа.
Описание типа линейного массива выглядит так:
    Type     <Имя типа>=Array [<Диапазон индексов>] Of <Тип элементов>;
 В   качестве   индексов   могут   выступать   переменные   любых   порядковых   типов.   При
указании   диапазона   начальный   индекс   не   должен   превышать   конечный.   Тип   элементов
массива может быть любым (стандартным или описанным ранее).

разделе описания переменных:
Описать переменнуюмассив можно и сразу (без предварительного описания типа) в
Var     <Переменнаямассив> : Array [<Диапазон индексов>] Of <Тип элементов>;
Примеры описания массивов:
Var
S, BB : Array [1..40] Of Real;
N : Array ['A'..'Z'] Of Integer;
R : Array [20..20] Of Word;
T : Array [1..40] Of Real;
Теперь переменные S, BB и T представляют собой массивы из сорока вещественных
чисел; массив N имеет индексы символьного типа и целочисленные элементы; массив R может
хранить в себе 41 число типа Word. 23
Единственным   действием,   которое   возможно   произвести   с   массивом   целиком
присваивание. Для данного примера описания впоследствии допустима следующая запись:

 S:=BB;
Однако,   присваивать   можно   только   массивы   одинаковых   типов.   Даже   массиву   T
присвоить массив S нельзя, хотя, казалось бы, их описания совпадают, произведены они в
различных записях раздела описания.
Никаких   других   операций   с   массивами   целиком   произвести   невозможно,   но   с
элементами   массивов   можно   работать   точно   также,   как   с   простыми   переменными
соответствующего   типа.   Обращение   к   отдельному   элементу   массива   производится   при
помощи   указания   имени   всего   массива   и   в   квадратных   скобках      индекса   конкретного
элемента. Например:
R[10]  элемент массива R с индексом 10.
Фундаментальное отличие компонента массива от простой переменной состоит в том,
что для элемента массива в квадратных скобках может стоять не только непосредственное
значение индекса, но и выражение, приводящее к значению индексного типа. Таким образом,
реализуется косвенная адресация:
BB[15]  прямая адресация;
BB[K]  косвенная адресация через переменную K, значение которой будет использовано в
качестве индекса элемента массива BB.
Такая   организация   работы   с   такой   структурой   данных,   как   массив,   позволяет
использовать цикл для заполнения, обработки и распечатки его содержимого.
Способы заполнения массивов
Рассмотрим несколько способов заполнения массивов и вывода их содержимого на
экран. В основном мы будем пользоваться числовыми типами компонент, но приведенные
примеры будут справедливы и для других типов (если они допускают указанные действия).
1. Заполнение массива присваивание
Program M1;
Var
     A : Array [1..20] Of Integer;
Begin
A[1]:=7; {Заполняем массив значениями (отдельно каждый компонент)}
A[2]:=32;
A[3]:=70;
.............. {Трудоемкая задача?}
A[20]:=56;
Writeln(A[1],A[2],A[3], ?,A[20])
End.
Как бы ни был примитивен приведенный пример, он все же иллюстрирует возможность
непосредственного   обращения   к   каждому   элементу   массива   отдельно.   Правда,   никакого
преимущества массива перед несколькими простыми переменными здесь не видно.
2. Заполнение массива с клавиатуры
Program M2;
Var
A : Array [1..20] Of Integer;
I : Integer;
Begin
For I:=1 To 20 Do {Организуем цикл с параметром I по всем возможным}
Readln(A[I]); {значениям индексов и вводим A[I] с клавиатуры }
For I:=20 Downto 1 Do {Распечатываем массив в обратном порядке}
Write(A[I],'VVV') End.
Эта   программа   вводит   с   клавиатуры   20   целых   чисел,   а   затем   распечатывает   их   в
обратном порядке. Теперь попробуйте написать такую же программу, но без использования
структуры массива. Во сколько раз она станет длиннее? Кстати, введение язык Паскаль цикла
с   параметром   было   обусловлено   во   многом   необходимостью   обработки   информационных
последовательностей, т. е. массивов.
24
3. Заполнение массива с помощью датчика случайных чисел
Формирование   массива   из   случайных   значений   уместно,   если   при   решении   задачи
массив   служит   лишь   для   иллюстрации   того   или   иного   алгоритма,   а   конкретные   начения
элементов   несущественны.   Для   того   чтобы   получить   очередное   случайное   значение,
используется   стандартная   функция  random(N),   где   параметром  N  передается   значение
порядкового типа. Она вернет случайное число того же типа, что тип аргумента и лежащее в
диапазоне от 0 до N1 включительно. Например, оператор вида a[1]:=random(100); запишет в
a[1] случайное число из диапазона [0,99].
Для того чтобы при каждом запуске программы цепочка случайных чисел была новой, перед
первым вызовом  random  следует вызвать стандартную процедуру  randomize;, запускающую
генератор   случайных   чисел.   Приведем   пример   заполнения   массива   из   20   элементов
случайными числами, лежащими в диапазоне  от 10 до 10:
var a:array [1..20] of integer;
i:integer;
begin
randomize;
for i:=1 to 20 do begin
a[i]:=random(21)10;
write (a[i]:4);end; end.
Пример: Составить программу нахождения максимального элемента произвольного
одномерного массива.
{Описание переменных }
program maximum;
const n = 7;
var x: array [1..n] of real;
max: real;
 i: integer;
begin
for i:=1 to n do read (x[i]);  {Заполнение массива}
 max:=x[1];
 for i:=2 to n do
 if (x [i]>max) then
 max:= x [ i ];
 writeln('max = ',max);
  end.
{Оператор условия}
{Вывод ответа на экран}
{Блок поиска максимального элемента}
3. ДВУМЕРНЫЕ МАССИВЫ
Очень   часто   в   математике   мы   встречаемся   с   такими   структурами   как   матрицы,
благодаря матрицам решаются различные задачи практической направленности.
Язык программирования Паскаль содержит средства для работы с матрицами которые
представляют собой двумерные массивы.
Двумерный массив  – это пронумерованная  последовательность чисел одинакового
типа, обозначается одним именем. 25
Представьте себе таблицу, состоящую из нескольких строк. Каждая строка состоит из
нескольких ячеек. Тогда для точного определения положения ячейки нам потребуется знать
не   одно   число   (как   в   случае   таблицы   линейной),   а   два:   номер   строки   и   номер   столбца.
Структура   данных   в   языке   Паскаль   для   хранения   такой   таблицы   называется   двумерным
массивом.
Элементы матрицы
Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже
состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца.
Таким образом, номер элемента определяется пересечением строки и столбца. Например, a 21
– это элемент, стоящий во второй строке и в первом столбце.
Примеры:
А[1,1],
X[2,1].
Описание двумерных массивов
Описать такой массив можно двумя способами:
I. Одномерный массив, каждый элемент которого в свою очередь тоже одномерный
массив
Var
    A : Array [1..20] Of Array [1..30] Of Integer;
II. Стандартный способ
Var
    A : Array [1..20,1..30] Of Integer;
В обоих случаях описан двумерный массив, соответствующий таблице, состоящей из 20 строк
и 30 столбцов. Приведенные описания совершенно равноправны.
III. Двумерный массив так же можно описать в разделе создания новых типов:
Type
Vector = array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;
В данном случае создаются отдельные типы данных «Vector» и «Matrix», которые затем
задаются в блоке описаний.
Вводвывод двумерных массивов
С клавиатуры 26
program 2masк;
var i,j:integer;
    x:array[1..5,1..4] of integer;
    begin
  for i:=1 to 5 do
    for j:=1 to 4 do  begin
    Write(‘x[’ ,i, ’, ’j, ’]=’);
    readln(x[i,j]);   end;
    end.
С помощью датчика случайных чисел
program 2masR;
var i,j:integer;
    x:array[1..5,1..4] of integer;
 begin
 Randomize;
  for i:=1 to 5 do
        begin
         for j:=1 to 4 do
             begin
              x[i,j]:=Random(100);
               write(x[i, j]:4);
              end;
            writeln;
               end;
          readln;
        end. 27
ТЕМА 3. СТАНДАРТНЫЕ МОДУЛИ ЯЗЫКА ПРОГРАММИРОВАНИЯ
ПАСКАЛЬ
1. ПОНЯТИЕ МОДУЛЯ
Реальные   программы   содержат   многие   тысячи   строк   кода.   Работать   сразу   со   всем
текстом такой программы очень трудно. Поэтому текст большой программы разбивают на
отдельные фрагменты, которые записывают в разные файлы. В  Pascal  внесены дополнения,
позволяющие отдельно транслировать такие файлы, контролируя непротиворечивость этих
фрагментов   между   собой.   Такие   файлы,   содержащие   фрагменты   одной   программы,
оформляются как модули.
При  длительном  программировании  у  каждого   разработчика   накапливаются   тексты
процедур и функций, которые используются в разных программах. Библиотеки таких часто
используемых процедур и функций также оформляются как модули.
В   состав   системы  Turbo  Pascal  входит   набор   модулей,   содержащих   полезные   и   удобные
процедуры и функции, для использования в новых разработках. Будем называть такие модули
стандартными.
2. СИНТАКСИС ОПРЕДЕЛЕНИЯ И ИСПОЛЬЗОВАНИЯ МОДУЛЯ
Модуль составляют:
заголовок модуля;
•
• интерфейсная секция модуля;
• исполнительная секция модуля;
•
секция инициализации.
Все разделы модуля, за исключением секции инициализации, являются обязательными.
Заголовок модуля имеет вид unit <имя>;
Имя модуля должно быть уникальным в программе. Обычно имя модуля совпадает с именем
файла, содержащим данный модуль.
В интерфейсной секции модуля описываются модули, константы, типы, переменные,
заголовки процедур и функций, которые могут быть использованы в программе или другом
модуле   при   присоединении   данного   модуля.   Интерфейсная   секция   начинается
зарезервированным   словом  interface.   Имена   используемых   модулей   перечисляются   через
запятую после слова uses. Остальные описания записываются по правилам Паскаля.
Исполнительная   секция   модуля  начинается   словом  implementation.  Далее   могут
быть   указаны   используемые   модули,   локальные   константы,   локальные   типы,   локальные
переменные,   локальные   процедуры   и   функции,   которые   необходимы   для   реализации
объявленных   в   интерфейсной   секции   процедур.   Все   локальные   описания   из   этой   секции
недоступны за её пределами. В исполнительной секции обязательно даются полные описания
процедур и функций, объявленных в интерфейсной части.
Секция инициализации  предназначена для выполнения начальных действий в данном
модуле   при   запуске   программы.   Эти   действия   выполняются   до   операторов   главной
программы, использующей модуль. Секция инициализации начинается словом begin.
Модуль заканчивается словом end и точкой.
3.СТАНДАРТНЫЕ МОДУЛИ
В состав  Pascal     входят следующие  стандартные модули   их состав меняется в
зависимости от версий:
System     основная   библиотека   процедур   и   функций   без   которых   не   может   быть
выполнена   ни   1   программа.   Такие   как   проц.   ввода/вывода,   работа   со   строками,
математические операции и фи и т.д. 28
Модуль  System  используется   автоматически   любым   модулем   или   программой   и
никогда не указывается в предложении USES.

считаются встроенными.
Он   подключается   автоматически   поэтому   входящие   в   него   процедуры   и   функций
Dos   для организации взаимодействия с  DOS. Модуль  DOS  реализует ряд полезных
программ операционной системы и обработки файлов. Ни одна из программ модуля Dos не
определена стандартом Паскаля и поэтому они размещены в собственном модуле.

CRT  работа с клавиатурой и монитором в текстовом режиме;
Graph  графическая библиотека;
Printer  работа с принтером.
За исключением модуля System, который присоединяется к программе автоматически,
необходимые стандартные модули перечисляются в начале программы в директиве uses.
4. МОДУЛЬ CRT
 CRT
Модуль
содержит   константы,   переменные,   процедуры   и   функции,
предназначенные   для   работы   с   клавиатурой   и   дисплеем   в   текстовом   режиме,     звуковым
генератором и чтения клавиатуры..
В   режиме   текстового   вывода   используются   следующие   координаты   экрана:   левый
верхний   угол   экрана   имеет   координаты   1,1;   горизонтальная   координата   возрастает   слева
направо,   вертикальная      сверху   вниз.   Если   на   экране   определено   окно,   все   координаты
определяются   относительно   границ   окна.   Исключением   являются   координаты   процедуры
Window установки границ окна, которые всегда задаются относительно границ экрана.
Экран  монитора  состоит  из  строк,  а каждая   строка   из   отдельных   знакомест  или
позиций, в которые могут быть выведены символы. Для текстовых режимов можно установить
различное количество строк и знакомест в экранной строке, а также указать тип монитора
цветной или чернобелый.
Текстовый   режим   устанавливается   вызовом   процедуры   TextMode   (Mode),   где
Mode(константа целого типа  Word)  один из кодов режимов. Например, TextMode(C080);
установит цветной текстовый режим, 80 символов в 25 строках.
Управление цветом
Для каждой позиции на экране можно установить цвет символа и цвет фона, которые
  Структура
символа.
записываются   в   байт   атрибутов
байта атрибутов следующая:
5
7 6
0
b R G B L R G B
4
3
2
1
Цвет на экране получается при смешивании синей, зеленой и красной компоненты.
первые 4 бита опр. цвет символа. Если бит 0 (В) установлен в 1, то в цвете символа присут
ствует синяя компонента, бит 1 (G) отвечает за зеленый цвет, бит 2 (R) — за красный. Третий
бит   (L)   —   бит   яркости;   если   он   установлен   в   1,   то   цвет   символа   будет   более   ярким.
Последние4 бита  определяют цвет фона. Синяя, зеленая и красная компоненты цвета фона
задаются битами 4 (В), 5 (G), 6 (R). Если бит 7 (b) установлен в 1, то символ мерцает.
В модуле CRT определены константы, имеющие значения кодов цветов. Для чтения
клавиатуры   используются   две   функции      KeyPressed   и   ReadKey.   Функция   KeyPressed
определяет факт нажатия на любую клавишу и не приостанавливает дальнейшее исполнение
программы. Функция ReadKey читает расширенньш код нажатой клавиши. Если к моменту
обращения к функции не была нажата ни одна клавиша, программа приостанавливает свою
работу, ожидая действий пользователя.
Управление   звуковым   генератором   строится   по   схеме   Sound   Delay      NoSound.
Процедура Sound включает звуковой генератор и заставляет его непрерывно генерировать
звук нужного тона. Процедура Delay приостанавливает работу программы на заданное число
миллисекунд реального времени. Процедура NoSound отключает звуковой генератор. Процедуры модуля CRT для работы с цветом
TextBackGround(Color:Byte)    устанавливает цвет  фона.
TextColor(Color: Byte)   устанавливает цвет  символов.
HighVideo    устанавливает высокую  интенсивность символов.
LowVideo   включает низкую интенсивность  символов.
NormVideo   выбирает первоначальное значение  атрибута текста.
 Пример 1. Программа бегущая строка
29
5. МОДУЛЬ GRAPH
Модуль  GRAPH  представляет   собой   мощную   библиотеку   графических   подпрограмм
универсального   назначения,   рассчитанную   на   работу   с   наиболее   распространенными
графическими адаптерами IBMсовместимых ПК.
Подпрограммы   модуля   GRAPH   обеспечивают   различные   режимы   работы
многорежимных адаптеров, полностью используют их цветовые возможности и разрешающую
способность.
При исполнении графических программ требуется автономный драйвер графического
адаптера   (BGIфайл).   Он   содержит   программу   для   управления   работой   дисплейного
адаптора. Если программа использует штриховые шрифты, то кроме того нужен один или
несколько шрифтовых файлов (CHRфайлы). При необходимости драйвер и шрифты могут
быть включены в тело программы еще на этапе компиляции.
Среда   Паскаль   использует   текстовый   режим   работы   адаптера,   поэтому   любая
программа,   использующая   графические   средства   компьютера   должна   выполнить
переключение   в   графический   режим.   Загрузка   графического   драйвера   и   инициализация
графики осуществляется с помощью InitGraph. Процедура CloseGraph выгружает драйвер из
памяти и восстанавливает текстовый режим работы адаптера. Подпрограммы модуля Graph
позволяют  адресоваться к любому элементу (пикселю)  растрового графического экрана и
управлять светимостью этого элемента.
Для указания пикселя  используется  следующая система  координат: верхний левый
угол   графического   экрана   имеет   координаты   (0,0);   горизонтальная   координата  X
увеличивается слева направо, вертикальная координата Y увеличивается сверху вниз.
Некоторые   графические   подпрограммы   используют   понятие   текущего   указателя.
Указатель   содержит   координаты   того   пикселя,   начиная   с   которого   будет   строиться
изображение   подпрограммами  LineТо,  LineRel,  OutText  и   др.   В   этом   смысле   указатель
подобен  текстовому   курсору,  но,  в  отличие   от  него,  не  имеет   видимого  изображения   на
экране. 30
Для вывода текстовых сообщений на графический экран модуль Graph предоставляет
один матричный и 4 штриховых шрифтов. Каждый символ матричного шрифта на экране
реализуется  в виде  матрицы  из  8x8 пикселей.  Штриховые  шрифты  для каждого  символа
определяют   набор   штрихов   (векторов),   с   помощью   которых   на   экране   создается
(вычерчивается) соответствующий символ. Штриховые шрифты позволяют изменять размеры
текстовых надписей в широких пределах без существенного ухудшения качества изображения
символов. Однако стандартные штриховые шрифты не содержат символы кириллицы.
В   модуле  Graph  имеется   несколько   процедур   для   рисования   элементарных
графических фигур  точек, линий, окружностей, дуг и т.п. При необходимости замкнутые
фигуры могут быть закрашены различными цветами и стилями (образцами закраски).
Процедура  SetViewPort  создает на экране графическое окно. Если окно определено,
весь дальнейший графический вывод осуществляется относительно координат этого окна и
отсекается его границами.
В модуле имеются средства сохранения и выдачи изображений, работы с несколькими
графическими страницами, установки необходимых цветов. ТЕМА 4. ПРОЦЕДУРЫ И ФУНКЦИИ
31
1. ПОНЯТИЕ ПОДПРОГРАММЫ
Пример 1. Найти повторы
Программа вычисления площади и периметра
program pr;
uses wincrt;
var a,b:integer; p:real;
begin
{Вычисление площади прямоугольного треугольника}
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
readln(a,b);
writeln('площадь прямоугольного треугольника:', 0.5*a*b:2:1);
{}
{Вычисление площади равностороннего треугольника}
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
readln(a,b);
p:=(a+a+b)/2;
writeln('площадь равностороннего треугольника: ', sqrt(p*(pa)*(pa)*(pb)) :2:2);
{}
{Вычисление периметра прямоугольника}
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
readln(a,b);
writeln('периметр прямоугольника:', 2*a*2*b);
{}
{Вычисление площади прямоугольника}
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
readln(a,b);
writeln('площадь прямоугольника:', a*b);
{}
end.
Иногда в разных местах программы приходится выполнять практически одни и те же
последовательности действий с разными исходными данными.
Такие   последовательности   действий   можно   оформить   в   виде   так   называемых
подпрограмм  (от англ,  subroutine) –  сгруппировать операторы в блок, к которому можно
обратиться по имени, причем неоднократно.
Подпрограммы   сокращают   текст   программы,   существенно   уменьшают   время   их
исполнения, облегчают жизнь программистам, которые могут создавать программы модульно,
т. е. собирая сложную программу из законченных кусочков более простых составляющих.
Подпрограммы делятся на процедуры и функции.
Встроенные (стандартные) процедуры и функции  являются  частью  языка и могут
вызываться по имени без предварительного описания. Например, abs, sqrt, ln, sin… функции
(возвращают результат), readln, write… – процедуры (не возвращают результат). Их наличие 32
существенно   облегчает   разработку   прикладных   программ.   Однако   в   большинстве   случаев
некоторые  специфичные  для   данной   программы   действия   не   находят   прямых   аналогов   в
библиотеках Pascal, и тогда программисту приходится разрабатывать свои  нестандартные
процедуры и функции.
2. ПРОЦЕДУРЫ
Процедуры  пользователя  пишутся  самим  программистом   в   соответствии   с
синтаксисом языка в разделе описания подпрограмм.
Структура   процедуры  повторяет   структуру   программы,   это   «программа   в
миниатюре» — она также представлена заголовком и телом.
Заголовок  состоит из зарезервированного слова  procedure, идентификатора  (имени)
процедуры.
VAR … // раздел описания переменных главной программы
procedure ИмяПроцедуры;
var …
begin
….//тело процедуры
end;
begin
//тело главной программы
end.
Вызов процедуры для последующего выполнения записывается в теле главной
программы.
Пример 2. Программа вычисления площади и периметра
Оформим повторяющуюся часть программы в виде процедуры (программа внутри главной
программы).
program pr;
uses wincrt;
var a,b:integer; p:real;
{***Вычисление****}
procedure tx;
begin
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
end;
{*******************}
begin
{Вычисление площади прямоугольного треугольника}
tx;
readln(a,b);
writeln('площадь прямоугольного треугольника:', 0.5*a*b:2:1);
{Вычисление площади равностороннего треугольника}
tx;
readln(a,b);
p:=(a+a+b)/2;
writeln('площадь равностороннего треугольника: ', sqrt(p*(pa)*(pa)*(pb)) :2:2);
{Вычисление периметра прямоугольника}
tx;
readln(a,b);
writeln('периметр прямоугольника:', 2*a*2*b); 33
{Вычисление площади прямоугольника}
tx;
readln(a,b);
writeln('площадь прямоугольника:', a*b);
end.
При вызове процедуры работа главной программы  приостанавливается и  начинает
выполняться  вызванная   процедура.  Когда   процедура   выполнит   свою   задачу,   программа
продолжится с оператора, следующего за оператором вызова процедуры.
Т.е. мы “научили” ПК новой команде tx. Ею можно пользоваться только в этой программе и,
причем, много раз.
3. ДОСТОИНСТВА ИСПОЛЬЗОВАНИЯ ПОДПРОГРАММ
 Программы, написанные с участием подпрограмм, легче тестировать и
отлаживать, у них более четкая логическая структура.
 Самостоятельный характер подпрограмм позволяет поручать их составление
различным программистам. Так осуществляется разделение работы по
программированию и, тем самым, ускоряется ее завершение;
procedure pl (c,d:
integer);
var S:integer;
begin
S:=c*d;
 Использование подпрограмм позволяет экономить память. Память для хранения
переменных, использующихся в подпрограмме, выделяется только на время ее работы
и высвобождается, как только ее выполнение заканчивается.
Пример 3. Пользователь вводит две стороны трех прямоугольников. Вывести их
площади.
Можно решить задачу так:
for i:=1 to 3 do
begin
writeln(‘Введите a и b:’);
readln(a,b);
writeln(‘Площадь=’,a*b);
end;
Хорошим стилем программирования считается использование процедур. Необходима
процедура, которая будет вычислять площадь прямоугольника. Вот как схематично будет
выглядеть главная программа:
текст
readln (a,b);
вычисление
текст
readln (a,b);
вычисление
текст
readln (a,b);
вычисление
Процедура текста уже есть (см пример1).
Создадим вторую процедуру, которая вычисляет площадь. Но для того чтобы
вычислить S, надо знать 2 стороны, поэтому процедуре надо показать какие стороны она
должна перемножать. writeln(‘площадь прямоугольника со сторонами ’,c, ‘ ‘ ,d, ‘=‘,S);
end;
34 35
4. ПАРАМЕТРЫ ПОДПРОГРАММ
Параметр – это переменная, которой присваивается некоторое значение.
Существуют  формальные параметры, определенные в заголовке подпрограммы, и
фактические параметры  – выражения, задающие конкретные значения при обращении к
подпрограмме.
Процедура выполнится, если вызвать ее по имени и указать фактические параметры,
отделенные друг от друга запятыми и заключенных в круглые скобки:
pl(4,5);
pl(a,b);
Фактические параметры должны совпадать по типу и количеству с формальными.
Главная программа:
for i:=1 to 3 do
begin
tx;
readln(a,b);
pl(a,b);
end;
Замечание.  При   решении   этой   задачи   необходимо   проверять   введенные
пользователем   числа   (они   не   должны   быть   отрицательными,   иначе   работа   программы
прервется).
Составим процедуру проверки:
procedure error (f,g:integer);
begin
if (f<0) or (g<0) then begin
writeln(‘стороны прямоугольника не могут быть отрицательными’);
halt; //прерывание программы
end;
end;
Итоговая программа
program pr;
uses wincrt;
var a,b:integer; p:real;  i:integer;
{Текст}
procedure tx;
begin
writeln;
writeln('Вычисление: ');
write('Введите стороны a, b: ');
end;
{Площадь}
procedure pl(c,d:integer);
var S:word;
begin
S:=c*d;
writeln('площадь прямоугольника со сторонами ',с, ' и ', d, ' = ',S);
end;
{Ошибка}
procedure error (f,g:integer); 36
begin
if (f<0) or (g<0) then begin
                          writeln ('Стороны прямоугольника могут быть только
положительными!');
                          halt;
                       end;
end;
{Главная программа}
begin
for i:=1 to 3 do
begin
     tx;
     readln(a,b);
     error(a,b);
     pl(a,b);
end;
end.
Формат процедуры:
Procedure <имя> (формальные параметры);
Const ...;
Type ...;
Var ...;
Begin
<операторы>;
end;
Пример 4. Составить программу обмена местами двух чисел с=5 и d=7.
program obmenDan;
var c,d:integer;
{обмен}
procedure obmen ( a,b:integer);
var m:integer;
begin
m:=a; a:=b; b:=m;
writeln(a,b);
end;
begin
writeln ('Введите 2 числа: ');
readln(c,d);
obmen(c,d);
writeln(c,' ',d);
end.
После запуска программы видно, что поменялись местами формальные параметры (в
процедуре), а фактические  (которые используются в лавной программе) – не поменялись.
Рассмотрим рисунок, на котором приведена часть оперативной памяти:
1) при вызове процедуры obmen с двумя параметрами 5 и 7, в переменные a и b помещаются
тоже числа 5 и 7 соответственно: 2) далее в процедуре осуществляется перестановка значений ячеек памяти a и b:
37
3) но в переменных c и d данные не поменялись, т.к. они находятся в других ячейках памяти.
Для того чтобы переменные c и d, a и b ссылались на одни и те же ячейки памяти (если
изменятся   значения   a   и   b,   то   изменятся   значения   и   c,   d)   необходимо   при   описании
формальных параметров, перед нужными переменными добавить слово VAR:
procedure obmen (var a,b:integer);
Измените программу obmenDan:
obmen (1,4);
ошибка изза var. Числа – константы, которые нельзя изменять в процедуре.
5. ФУНКЦИИ
Функция аналогична процедуре, но имеются два отличия.
 Функция   передает   в   программу   результат   своей   работы   –   единственное   значение,
носителем которого является имя своей функции.
 Имя функции может входить в выражение как операнд. Функция возвращает результат
в точку своего вызова.
Например, sqr(x) – возведет в квадрат значение х и возвратит в точку вызова вычисленное
значение квадрата числа х: y:=sqr(x);
Функция,   определенная   пользователем,   состоит   из   заголовка   и   тела   функции.   Тело
функции   по   структуре   аналогично   программе.   Описание   меток,   констант,   типов   и   т.д.
действительны только в пределах данной процедуры.
Формат:
Function <имя> (формальные параметры) : <тип результата>;

Const ...;
Type ...;
Var ...;
Begin
<операторы>;
end;
В   разделе   операторов   должен   находиться   хотя   бы   один   оператор,   присваивающий
имени функции значение. В точку вызова возвращается результат последнего присваивания.
Пример 5. Найти площадь круга используя функцию
function circle (r:real): real;
begin
circle:=pi*r*r;
end;
вызов:
a:=circle(5); (ОБЯЗАТЕЛЬНО присваиваем) 38
или
e:=circle(a);
writeln(e);
Пример 6. Найти 1!+2!+…+n!
Используем функцию нахождения факториала, т.к подаем на вход и получаем результат.
function fact (a:integer): integer;
var i: integer;
begin
fact:=1;
for i:=1 to a do
fact:=fact*I;
end;
В   строке  fact:=fact*I;   компилятор   найдет   ошибку,   т.к   fact   должна   вызываться   с
параметрами.  Поэтому обычно вводят дополнительную переменную, в которую помещают
результат. А потом в переменную fact присваивают этот результат:
program factorial;
uses wincrt;
var sum,n,j: integer;
function fact (a: integer): integer;
var i,d: integer;
begin
d:=1;
for i:=1 to a do
d:=d*i;
fact:=d;
end;
begin
sum:=0;
readln(n);
for j:=1 to n do
sum:=sum+fact(j);
writeln(sum);
end.
ВЫВОД
В   данное   время   процесс   программирования   превращается   в  промышленное
изготовление   программ  на   основе
 технологий   программирования.   Большинство
специалистов   придерживаются   точки   зрения,   что  метод   нисходящего   проектирования
программ  наиболее удобен для решения сложных проблем. Cначала задача определяется в
общих чертах, затем происходит постепенное уточнение ее структуры. На очередном шаге
каждая подзадача, в свою очередь, разбивается на ряд других. Решение отдельного фрагмента
сложной задачи представляет собой самостоятельный программный блок – подпрограмму. 39
ТЕМА 5. СТРОКИ И МНОЖЕСТВА
1. СТРОКИ В ПАСКАЛЬ
1.1 Понятие строки
Строки  в   Паскале   –   это   данные   типа  string.   Они   используются   для   хранения
последовательностей символов.
В Паскале длина стандартной строки ограничена 255 символами. Под каждый символ
отводится по одному байту, в котором хранится код символа. Кроме того, каждая строка
содержит еще дополнительный байт, в котором хранится длина строки.
Если заранее известно, что длина строки будет меньше 255 символов, то программист
может сам задать максимальную длину строки, для экономии системных ресурсов.
1.2 Описание строк
Строки можно описывать в разделах type или const
Примеры описания строк:
type

str_type = string[12];
const
n = 50;
var

s1: string
 ;
s2, s3: str_type;
s4: string[n];
s5, s6, s7: string[7];
Длина   строки   хранится   в   первом   ее   байте,   индекс   которого   равен   0.
Объявление типизированной константы для типа string осуществляется так:
const
s: string = 'FreePascal'
Существует понятие пустой строки, т.е. строки, которая не имеет элементов. Пустая
строка обозначается двумя рядом стоящими апострофами (например, st := '').
1.3 Вводвывод строк
Имя строки может использоваться в процедурах вводавывода. При вводе в строку
считывается из входного потока количество символов, равное длине строки или меньшее,
если символ перевода строки (который вводится нажатием клавиши Enter) встретится раньше.
При выводе под строку отводится количество позиций, равное ее фактической длине.
readln (s1);
write (s1);
К отдельному символу строки можно обращаться как к элементу массива символов,
например  s1[3].  Символ   строки   совместим   с   типом  char,   их   можно   использовать   в
выражениях одновременно, например:
s1[3] := 'h';
writeln (s2[3] + 'r');
Можно осуществлять коррекцию любого символа строковой переменной, для чего в
соответствующем   операторе   достаточно   указать   имя   переменной   типа  string,   вслед   за
которым в квадратных скобках задается номер ее элемента (например, str[3]:='j').
Элементы строки нумеруются с единицы, т.к. в каждой строковой переменной имеется
элемент с номером 0, в котором в виде символа  хранится длина текущей строки. Чтобы 40
узнать текущую длину, достаточно применить функцию  ord  к нулевому элементу строки.
Например:  writeln(ord(st[0]))
Нулевой   элемент   строковой   переменной   можно   корректировать.   При   этом   будет
изменяться текущая длина строки. Например, выражение str[0]:=#50 устанавливает текущую
длину равной 50.
1.4 Операции со строками
Сложение строк (консолидация)
Строки   можно   складывать   между   собой   посредством   оператора   "+".   Если
результирующая   строка   превысит   максимально   допустимую   для   неё   длину,   то   лишние
символы   будут   просто   отброшены.   Также   для   складывания   строк   можно   использовать
процедуру "concat", в которую может быть передано сразу несколько строк: concat(str1, str2,
str3).
s1 := 'John';
s2 := 'Black';
s1 := s1 + ' ' + s2;
Присвоение строк
Строки можно присваивать друг другу. Если максимальная длина переменной слева
меньше длины присваиваемой строки, то лишние символы справа отбрасываются.
s1 := 'this is text';
s2 := s1;
Сравнение строк
Строки   можно   сравнивать   друг   с   другом   с   помощью  операций   отношения.  При
сравнении строки рассматриваются посимвольно слева направо, при этом сравниваются коды
соответствующих   пар   символов.   Строки   равны,   если   они   имеют   одинаковую   длину   и
посимвольно эквивалентны. В строках разной длины существующий символ всегда больше
соответствующего ему отсутствующего символа. Меньшей будет та строка, у которой меньше
код первого несовпадающего символа (вне зависимости от максимальных и текущих длин
сравниваемых строк).
'abc' > 'ab'  (true)
'abc' = 'abc' (true)
'abc' < 'abc ' (false)
1.5 Процедуры и функции для обработки строк
При   работе   со   строками,   как   правило,   возникает   необходимость   выполнять   их
копирование, вставку, удаление или поиск. Для эффективной реализации этих действий в
Паскале предусмотрены стандартные процедуры и функции.
Для обработки символьных массивов, которыми являются строки, в языке Паскаль
существуют специальные подпрограммы: функция concat, функция copy, pos и length, так же
процедуры,  это процедуры: delete, str, val, insert.
DELETE (S, poz, n)  удаляет из строки S, начиная с позиции poz, подстроку из n
Процедуры для обработки строк
символов.
 S  строковая переменная (в данном случае нельзя записать никакое другое строковое
выражение, кроме имени строковой переменной, т.к. только с именем переменной связана
область памяти, куда будет помещен результат выполнения процедуры); 41
poz, n – любые целочисленные выражения.
Пример 1: Удаляет из строки подстроку «prog».
Program;
var
        stroka: string;
      begin
        stroka := 'program';
        Delete(stroka, 1, 3);
        Writeln(stroka);
        ReadLn;
      end.
INSERT (subS, S, poz)  вставляет в строку S, начиная с позиции poz, подстроку subS.
subS – любое строковое выражение;
S – строковая переменная (именно ей будет присвоен результат выполнения
процедуры);
poz – целочисленное выражение.
Пример 2: Вставляет в строку подстроку «sbp».
Program;
Var
       stroka, prog: string;
      begin
        stroka := 'sbpgram';
        prog := 'pro';
        Insert(prog, stroka, 5);
        Writeln(stroka);
        ReadLn;
      end.
STR (x, S)  преобразует число x в строковый формат.
X  число (либо арифметическое выражение);
S  строковая переменная.
В процедуре есть возможность задавать формат числа x.
Например: str(x: 8: 3, S), где 8 – общее число знаков в числе x, а 3 – число знаков
после запятой.
Пример 3: Синтаксис: str (I: integer; var S: string); str (R: real; var S: string).
Преобразует I или R из числа в строку и записывает эту строку в S, причем R и I могут
записываться форматно, как в процедуре WRITE.
program prak10zad8;
var i:real;
s1:string[20];
begin
i:=12.34;
writeln(i);
str(i,s1);
writeln(s1);
readln;
end. 42
VAL (S, x, kod) преобразует строку символов S в число x.
S  строка, содержащая число;
X  числовая переменная (именно туда будет помещен результат);
kod  целочисленная переменная (типа integer), которая равна номеру позиции в
строке S, начиная с которой произошла ошибка преобразования, если преобразование прошло
без ошибок, то переменная kod равна 0.
Пример 4: Синтаксис: val (S: string; var I, J: integer); val (S: string; var I: real; var
J: integer). Преобразует строковую переменную S в число типа I. Переменная J получает
значение 0, если перевод прошел без ошибок. Если же сделана попытка конвертировать
в число строку, где есть нецифровые символы, то переменная J принимает значение
позиции первого нецифрового символа.
program z4;
var  I, Code : Integer;
begin
Val(ParamStr(1), I, Code);
 if Code <> 0 then
WriteLn( ‘Ошибка при преобразовании позиции :', Code)
else WriteLn('Число = ', I);
Readln(I);
end.
LENGTH  –  функция   возвращающая   текущую   длину   строки,   про   подсчете
Функции для обработки строк
учитываются все символы и пробелы.
CONCAT (S1, S2,...,SN) выполняет слияние строк s1, s2,...,sn в одну строку.
Копирование части строки – функция COPY (ST, N,K), где St – исходная строка, n –
начальная позиция, k – количество символов, которые мы будем копировать.
Пример:
St: =’abcdef’;
St1: =copy (St, 2, 3);
Значение строки St1– ‘bcd’.
Поиск подстроки в строке осуществляется с помощью функции POS, k: =pos (St1, St),
где  St1 – подстрока,  St  – строка,  k  – позиция первого вхождения подстроки, либо 0, если
подстрока отсутствует.
Пример:
St: =’      Иванов  Александр  г. Москва ‘
Будем искать подстроку “г. Москва”  в строке St, k: =pos (‘г. Москва’,St);
Ответ:k=18.
2. МНОЖЕСТВА В ПАСКАЛЬ
2.1 Понятие множества
Множество  – это набор элементов одинакового типа, которые рассматриваются как
единое целое.
Элементы   множества   не   пронумерованы,   следовательно,   нельзя   обратиться   к
отдельному элементу множества по его индексу.
Элементы множества могут быть любого типа, но их количество должно быть менее 256. 43
Эти   существенные   ограничения   не   позволяют   использовать   множества   в   серьезных
задачах обработки данных. Все же для ряда задач применение множеств может обеспечить
серьезные преимущества по сравнению с использованием других структур данных – массивов
и строк.
Количество элементов множества иногда называют мощностью данного множества.
2.2 Описание множества
Описание происходит:
1. В блоке описания переменных set. Пример: var a:set of integer;
2. В   разделе  const.   Множества   строятся   с   помощью   специальных   конструкций   множеств,
которые представляют собой [1, 2, 3], в которых через запятую перечислены его элементы.
Пример: const n=[1, 2, 3];
3. Новый   тип  type.  Раздел  type  позволяет   создавать   новый   пользовательский   тип  данных.
Пример: type a=set of 1..4;
2.3 Задание множеств
Чтобы во множестве появились элементы, необходимо выполнить оператор присваивания,
в   левой   части   которого   стоит   имя   переменноймножества,   а   в   правой   —   конструктор
множества или некоторое выражение над множествами.
Конструктор множества — это заключенный в квадратные скобки перечень элементов,
разделенных запятыми. В качестве элементов могут использоваться диапазоны значений:
Пример:
type
var
begin
week_days = (Mon, Tue, Wed, Thu, Fri);
work_days: set of week_days;
lett: set of 'A'..'Z';
work_days := [Mon, Wed, Thu];
lett := ['C', 'E'..'M', 'Z']
end.
Следует помнить, что при задании множества порядок его элементов безразличен, но при
задании диапазона такой порядок важен.
Множество,   в   котором   нет   элементов,   называется   пустым   (или   нульмножеством).   В
языке программирования Паскаль обозначается квадратными скобками, между которыми нет
элементов:
work_days := [ ];
Множество может быть объявлено типизированной константой, для чего в описании после
знака равенства следует указать конструктор множества. Пример:
const lett: set of ['а'..'я'] = ['а', 'е', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я'];
В данном случае оператор описывает множество, элементами которого могут быть буквы
русского   алфавита,   с   записью   в   него   начального   значения,   которое   представляет   собой
множество гласных букв.
Конструируя множества, можно использовать и переменные при условии, что их текущие
значения попадают в диапазон базового типа множества. Так, если ch1 и ch2 имеют тип char,
то допустима следующая последовательность операторов:
ch1:= 'A';
ch2:= 'K'; 44
chs:= [ch1, ch2, 'M'];
В результате получится множество ['A', 'K', 'M'].
Элементы   множества   нельзя   вводить   и   выводить.   Для   организации   вводавывода
элементов   множества   следует   использовать   вспомогательные   переменные.   В   то   же   время
можно использовать множества как элементы типизированных файлов.
2.4 Операции над множествами
1. Операция "равно"(=). Два множества А и В считаются равными, если они состоят из
одних   и   тех   же   элементов.   Порядок   следования   элементов   в   сравниваемых   множествах
значения не имеет.
Пример:
Множество А
[1, 2, 3]
Множество В
[1, 2, 3, 4]
Выражение
A=B
Значение
false
2. Операция "не равно"  (<>).  Два множества А и В считаются не равными, если они
отличаются по мощности или по значению хотя бы одного элемента.
Пример:
Множество А
[1, 2, 3]
Множество В
[1, 2, 3, 4]
Выражение
A<>B
Значение
true
3. Операция "больше или равно" (>=). Операция "больше или равно" используется для
определения   принадлежности   множеств.   Результат   операции   A>=В   равен   true,   если   все
элементы множества В содержатся в множестве А. противном случае результат равен false.
Пример:
Множество А
[1, 2, 3, 4]
Множество В
[2, 3, 4]
Выражение
A>=B
Значение
true
4. Операция "меньше или равно" (<=). Результат выражения А <= В равен True, если
все элементы множества А содержатся в множестве В. В противном случае результат равен
false.
Пример:
Множество А
[1, 2, 3]
Множество В
[1, 2, 3, 4]
Выражение
A<=B
Значение
true
5. Операция   in.  Операция   in   используется   для   проверки   принадлежности   кг   либо
значения указанному множеству. Обычно применяется в условных операторax.
Пример:
Множество А
2
Выражение
If A in [1, 2, 3, 4]
Значение
true
При использовании операции in проверяемое на принадлежим значение и множество в
квадратных скобках не обязательно предварительно описывать в деле описаний. Операция in
позволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда
десятки других операций. Например, выражение
if(x=l)or(x=2)or(x=3)then...
можно заменить более коротким выражением
ifxin[ 1. .3]then ...
Иногда операцию in пытаются записать с отрицанием:
Xnot inM. 45
Такая запись является ошибочной, так как две операции следуют подряд; правильная
инструкция имеет вид
not (XinM) .
6. Объединение   множеств  (+).  Объединением   двух   множеств   является   третье
множество, содержащее элементы обоих множеств.
Пример:
Множество А
[1, 2, 3]
Множество В
[1, 4, 5]
Выражение
A+B
Значение
[1, 2, 3, 4, 5]
7. Пересечение  множеств  (*).  Пересечением  двух  множеств  является  третье  мно
жество, которое содержит элементы, входящие одновременно в оба множества.
Пример:
Множество А
[1, 2, 3]
Множество В
[1, 4, 2, 5, 7]
Выражение
A*B
Значение
[1, 2]
8. Разность   множеств  ().  Разностью   двух   множеств   является   третье   множество,
которое содержит элементы первого множества, не входящие во второе множество.
Пример:
Множество А
[1, 2, 3, 4]
Множество В
[3, 1, 4]
Выражение
AB
Значение
[2]
2.5 Преимущества и недостатки множества
Преимущества:
 Упрощается операция if
 Экономия памяти
 Уменьшение времени выполнения работы
 Увеличивается степень наглядности программы и понимания алгоритма
Недостатки:
 Отсутствие в Паскаль средств вводавывода множеств
Пример использования множества:
Имеются три множества символьного типа, которые заданы своими конструкторами:
Y1=['A','B','D','R','M']; Y2=['R','A','H','D']; Y3=['A','R']; Сформировать новое множество:
X=(Y1*Y2)+(Y1\Y2). Вывести на печать полученное множество x, проверить, включено ли y3
во множество x.
program mnog1;
var y1,y2,y3,x: set of char; 46
c:char;
begin
y1:=['a','b','d','r','m'];
y2:=['r','a','h','d'];
y3:=['a','r'];
x:=(y1*y2)+(y1y2);
write('множество x=');
for c:='a' to 'r' do
if c in x then write(c);
writeln;
if y3<=x then write('y3 включено в x')
else write('y3 не включено в x');
end. ТЕМА 6. ЗАПИСИ В ПАСКАЛЕ
47
1. ОПРЕДЕЛЕНИЕ ПОНЯТИЯ ЗАПИСЬ
При   организации   хранения   информации   на   компьютере   требуется   группировать
данные разного типа, относящиеся к одному объекту.
Для этого в языке Паскаль  используется тип, который называется запись.
Запись   Паскаля   –   структурированный   комбинированный   тип   данных,   состоящий   из
фиксированного числа компонент (полей) разного типа.
Например, сведения о книгах имеет структуру:
АВТОР, НАЗВАНИЕ КНИГИ, ИЗДАТЕЛЬСТВО, ГОД ИЗДАНИЯ, ЕЁ ЦЕНА.
  Первые три элемента относится к строковому типу данных, четвертый к целому, а
цена   к вещественному типу.
Элементами записей могут быть базовые типы, переменные, массивы, указатели, записи
и т.д. Элементы записи вместе с их описанием называются полями записи. Над элементами
записи можно выполнять действия, допустимые для данных этого типа.
Все записи должны быть описаны   в разделе TYPE . Описание записи начинается со
служебного слова  RECORD заканчивается END, между  которыми указывается список имен
и типов полей, выбранных пользователем. Все идентификаторы полей в записи должны быть
различными.
Например, запись Воок можно описать следующим типом card:
TYPE  card = record Author : string [15];    Title: string [20];  Firm: string[10];
year : integer ;   cena  : real End; VAR Book  :  card;
Запись ТС
type TRec = Record
       FIO: String[20];
       TEL: String[7]
     end;
var rec: TRec;
Тип записи  вводит только шаблон записи и с его именем не связан никакой
конкретный объект. Обращение к полю выполняется с помощью составного имени (селектора
записи),  которое состоит из:
ИМЯ_ЗАПИСИ . ИМЯ_ЭЛЕМЕНТА
Например, присвоить значения элементам записи Author и Title можно так:
Book.author:=’Довгаль С.И.’; Book.title:=’Турбо Паскаль V 7.0’;
Ввод цены книги с клавиатуры:  readln (Book.cena);
Для   упрощения   и   сокращения   записи   составных   имен   используется   оператор
присоединения  WITH.   Имя   записи   выносится   в   заголовок   оператора   присоединения,   а   в
блоке используются только имена полей записи.
Общий вид оператора присоединения:
WITH  имя записи  DO оператор;
Предыдущие операторы можно записать проще:
1) With  Book  do  begin author:=’Довгаль С.И.’; title:=’Турбо Паскаль V 7.0’; readln (cena);
end;
2) With rec do begin
              FIO:='Иванов А.А.';
              TEL:='2223322'; end; 48 49
2. ПРОГРАММЫ С ЗАПИСЯМИ
Задача 1.
Написать программу, которая заполняет анкету о студентах (5 записей), выводит на экран
только тех,  кто учится на 2 курсе.
program Za1;
type anketa=record
                fio: string[45];
                datar: string[8];
                adres: string[50];
                curs: 1..5;
                grupp: string[3];end;
var student:array[1..5] of anketa;
i:integer;
begin
for i:=1 to 5 do
begin
writeln ('введите сведения  o  ',i,' студенте');
writeln ('введите фамилию');
readln(student[i].fio);
writeln ('введите дату рождения');
readln(student[i].datar);
writeln ('введите адрес');
readln(student[i].adres);
writeln ('введите курс');
readln(student[i].curs);
writeln ('введите группу');
readln(student[i].grupp);
end;
writeln('ввод закончен');
writeln;
for i:=1 to 5 do
if student[i].curs=2  then
writeln('фамилия студента:',student[i].fio);
readln
end.
Задача 2.
Из ведомости 3х студентов с их оценками ( порядковый  номер,  Ф.И.О. и три оценки)
определить количество отличников и средний бал каждого студента.
Program Za2;
Type wed = record {Тип wed включает 3 поля: n, fio, bal}
n:integer; fio:string[40]; bal:array[1..3] of integer{Поле balмассив из 3 оценок}end;

Var spisok : wed ; {Запись spicok типа wed}
i, j, kol, s: integer;
sr : real;
Begin
 kol:=0; {kol количество отличников}
With spisok do {with присоединяет имя записи spisok ко всем }
For i:=1 to 3 do { полям внутри цикла For по i } 50
begin
n:=i;
Write(' Vvedite FIO # ', i ,' ');
Readln(fio);
s:=0;
For j:= 1 to 3 do
begin
write( 'Vvedite ocenky: ' );
readln( bal [j] );
s := s+ bal [j]; end;
if s=15 then kol:=kol+1; {подсчет количества отличников}
sr := s/3; writeln ( fio, ', Sredniy bal = ', sr:4:1); end;
 writeln ( ' Kolichestvo otlichnikov = ', kol );
 readln;
end.
Результат работы программы: ТЕМА 7. ФАЙЛЫ
51
1. ПОНЯТИЕ ФАЙЛА, ТИПЫ ФАЙЛОВ В ПАСКАЛЕ
Файл
   это   упорядоченная   последовательность   однотипных   компонентов,
расположенных на внешнем носителе.
Файлы предназначены только для хранения информации, а обработка этой информации
осуществляется  программами.
Использование файлов целесообразно в случае:
 долговременного хранения данных;
 доступа различных программ к одним и тем же данным;
 обработки больших массивов данных, которые невозможно целиком разместить
в оперативной памяти компьютера.
В Паскале определены текстовые файлы, типизированные и нетипизированные. Файл,
не содержащий ни одного элемента, называется пустым.
Создается   файл   путем   добавления   новых   записей   в   конец   первоначально   пустого
файла. Длина файла, т.е. количество элементов, не задается при определении файла.
Все файлы должны быть описаны в программе либо в разделе переменных VAR, либо в
разделе типов TYPE.
Чтение   файла     ввод   данных   из   внешнего   файла,   находящегося   на   диске,   в
оперативную память машины.
Запись в файл  вывод результатов работы программы из оперативной памяти на диск
в файл.
2. ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ
Работа с файлами выполняется следующими процедурами:
 Assign  –   устанавливает   связь   между   именем   файла   в   программе   (файловой
переменной) и физическим именем файла, принятым в ОС.
 Reset    открывает существующий файл для чтения.
 Rewrite – создает и открывает новый файл для записи на внешнем устройстве
(если файл ранее существовал, вся предыдущая информация из него стирается).
 Close    закрывает открытый файл.
 Для определения конца файла используется стандартная встроенная функция
EOF  (файловая переменная), которая принимает значение True, если достигнут конец
файла, и значение False в противном случае.
3. ТЕКСТОВЫЕ ФАЙЛЫ
Текстовые файлы – файлы на диске, состоящие из символов ASCII.
Текстовые   файлы   являются   файлами   с   последовательным   доступом.   В   любой   момент
времени доступна только одна запись файла. Другие записи становятся доступными лишь в
результате последовательного продвижения по файлу. Текстовые файлы внутренне разделены
на строки, длины которых различны. Объявляются текстовые файлы переменной типа text.
Обрабатывать их можно только последовательно и с помощью процедур и функций:
 Readln  (f , st ) чтение строки st из файла f и переход на начало следующей;
 Writeln (f, st ) запись строки st в файл f и маркера конца строки ;
 Append (f )  процедура, открывающая файл f для добавления строк в конец файла;  Eoln (st  )   логическая   функция,   результат   выполнения   которой   равен   TRUE,   если
достигнут маркер конца строки st.
52
Пример 1.
Создать текстовый файл, в который записать 3 предложения. Прочитать этот файл, вывести
его содержимое на  экран. Определить длину каждого предложения.
Program File_text;
var f1: text; st : string; n: byte;
begin
assign   (f1, 'file1.txt'); {связать с файлом file1.txt  файловую переменную f1  }
rewrite  (f1); { создать новый файл  с именем file1.txt }
writeln ( f1, 'Очень полезно изучать'); { записать предложения в файл}
writeln ( f1, ' всем  студентам ');
writeln (f1, ' язык  Pascal ');
close (f1);    { закрыть файл для записи }
reset (f1); { открыть файл для чтения }
 while not eof (f1) do { пока не конец файла  f1}
begin readln (f1, st);    {читаем строку из файла f1 }
writeln(st);         { выводим на экран }
n:= length (st);     {определяем длину строки }
 writeln ('  длина =',n);
end; close (f1); { закрыть файл  для чтения}
readln;
end .
4. ТИПИЗИРОВАННЫЕ ФАЙЛЫ
Типизированные   файлы
  состоящие   из   нумерованной
последовательности объектов (записей) любого типа. Каждая запись файла имеет свой номер,
начиная с 0 и т.д.
–   это   файлы,
Процедуры и функции обработки файлов:
1)   Write   и  Read  записывают  и  читают  информацию  из   указанного  файла   и  перемещают
указатель файла к следующей записи.
2) Seek (файловая переменная, номер записи); процедура перемещения указателя на запись
файла с заданным номером.
3) Truncate (файловая переменная); процедура, усекающая файл по текущей позиции указа
теля файла, т.е. все записи, находящиеся после указателя файла, удаляются.
4) Функция Filesize (файловая переменная);  имеет тип Integer и определяет размер файла, т.е.
число записей.
5) Функция Filepos (файловая переменная); имеет тип Integer и возвращает текущую позицию
указателя файла. Для добавления записей в конец файла используются процедуры: Readln
(a ); Seek (f, filesize (f)); Write (f, a); При этом указатель устанавливается за конец файла, т.к.
нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи.
Открывать файл можно только процедурой Reset (f). Для того, чтобы в режиме произвольного
доступа считать, а затем изменить значение записи, следует выполнить два вызова процедуры
Seek. Один вызов перед операцией Read, а другой  перед операцией Write (т.к. Read после
чтения записи переместит указатель к следующей записи).
Пример 2: 53
Cоздать файл  из списка 10 студентов с их оценками ( номер,  Ф.И.О. и три оценки). Вывести
его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры,
заново прочитать файл.
Program  file;
Type wed  =  record      {Тип wed включает 3 поля: n, fio, bal} n : byte ;       fio : string[15] ; bal :
array [1..3] of byte;   {Поле bal – массив из 3 оценок } end;
Var    spisok : wed ;       {Запись spicok  типа  wed}
sp : file  of wed;  {Файл записей типа wed}
procedure vvod;     { процедура создания файла}
var    i,j:byte;
begin { оператор assing  находится в основной прграмме }
rewrite ( sp);            {открытие файла для записи}
with spisok do For   i:=1  to  10  do
begin n:=i;
writeln (' Введите фамилию   ',  i );
readln (fio);  writeln (' Введите 3 оценки  ', fio );
For  j:= 1 to 3 do  readln ( bal [j] );
write (sp , spisok);     { запись в файл информации о студенте}
 end; close (sp);      { закрытие файла для записи }
end;
procedure    print;  { процедура  чтения   и печати всего файла }
var    j : byte;
begin reset ( sp);               {открытие файла для чтения}
writeln (‘ Список студентов:  ‘);
while not eof (sp) do
with spisok do
begin Read (sp, spisok);   {чтение данных из файла}
write (n,'  ',fio);      {вывод записи на экран}
For  j:= 1 to 3 do  write (' ', bal [j] );
writeln ; end;
 readln; close (sp) ; end;
procedure       work;
var    num: integer;
begin reset ( sp);               {открытие файла для чтения}
writeln ('номер= ');
readln (num);
seek (sp, num1); {поиск записи с указанным номером (нумерация записей с 0)}
 read (sp,spisok);{чтение и перемещение указателя к след. записи}
write ('fio=');
writeln (spisok.fio);
seek (sp,filepos(sp)1); {возвращение к изменяемой записи }
writeln (‘ Введите новую фамилию’  );
readln (spisok.fio); write (sp, spisok);  {запись в файл измененной записи} close (sp); end;
begin      {начало основной программы}
assign (sp,'Vedom.DAT'); {связать файловую перемю  sp с файлом Vedom.dat}
vvod;      print; {процедуры создания и чтения файла}
work;   print;   {корректировка и чтение измененного файла}
readln end. 54
1.
2.
3.
Рапаков Г. Г., Ржеуцкая С. Ю. Turbo Pascal для студентов и школьников. – СПб.:
ЛИТЕРАТУРА
БХВПетербург, 2012. – 352 с.
АлексеевЕ.Р.,   ЧесноковаО.В.,   КучерТ.В.   Free   Pascal   и   Lazarus:   Учебник   по
программированию   /   Е.Р.Алексеев,   О.В.Чеснокова,   Т.В.Кучер   —   М.   :   ALT   Linux   ;
Издательский дом ДМКпресс, 2013. — 440с. : ил. — (Библиотека ALT Linux).
Окулов  С.М.  Основы  программирования  [Электронный   ресурс]/  Окулов  С.М.—
Электрон.   текстовые   данные.—   М.:   БИНОМ.   Лаборатория   знаний,   2012.—   336   c.—
Режим доступа: http://www.iprbookshop.ru/6449.— ЭБС «IPRbooks»

file_name: Учебное пособие Ефимова.doc

description:
2
Сокол
2017

description:
15
Выполнение такого условного оператора в Паскале сводится к выполнению одного из
входящих в него операторов S1 или  S2: если заданное в операторе условие  выполняется
(логическое выражение В принимает значение true), то выполняется оператор S1, в противном
случае выполняется оператор S2.
Алгоритм решения упомянутой выше задачи вычисления z= max( x, y) можно задать в
виде условного оператора Паскаля:
if x>y then z:= x else z:= y.
Правило выполнения сокращенного  условного оператора  достаточно очевидно:  если
значение   логического   выражения   В   есть   true,  то  выполняется   оператор   S;   в  противном
случае никаких иных действий не производится.
В языке программирования Паскаль в условном операторе между then и else, а также
после else по синтаксису может стоять только один оператор. Если же при выполнении (или
невыполнении) заданного условия надо выполнить некоторую последовательность действий,
то их надо объединить в единый, составной оператор, т.е. заключить эту последовательность
действий в операторные скобки begin... end.
Если,   например,   при   x<   y   надо   поменять   местами   значения   этих   переменных,   то
условный оператор  будет записан следующим образом в Паскале:  if  x<y  then  begin r:=x;
x:=y; y:=r end
Наличие   сокращенной   формы  условного   оператора   Паскаля  требует   большой
осторожности при использовании. Например, условный оператор
if B1 then if B2 then S1 else S2.
Бывают неполные формы условных операторов. В таком случае вложенный в if блок
Пример: Программа должна определять, ввел пользователь четное или нечетное число, и
выводить на экран сообщение. Тогда программный код на языке Паскаль может быть таким:
var n:integer;
begin
write(‘Введите целое число:’);
readln(n);
if n mod 2=0 then
write(‘Оно чётное.’);
else write(‘Оно чётное.’);
readln;
end.

кода выполняется только в случая true логическом выражении заголовка. В случае false
выполнение программы сразу передается в основной блок. Понятно, что ветка else в таком
случае отсутствует.
Пример: Дано целое число. Если его  значение меньше нуля, то находится модуль числа. Если
же значение переменной изначально больше нуля, то блок кода при операторе if вообще не
выполняется, т.к. не соблюдено условие (n<0).
var n:integer;
begin
write(‘Введите целое число:’);
readln(n);
if n<0 then n:=abs(n);
write(n);
readln;
end.
В качестве условия может стоять любое выражение, результатом вычисления которого
является одно из булевых значений — true или false.

description:
16
Непосредственно после then может стоять только один оператор. При необходимости
выполнения нескольких операторов они должны быть заключены в операторные скобки begin
end.
Пример:  Если значения переменных различны, то поменять их местами. Блок  if  содержит
четыре выражения, поэтому заключен в beginend.
var
a,b,c: integer;
       begin
write('a=');
readln(a);
write('b=');
readln(b);
       if a <> b then begin
c := a;
a := b;
b := c;
writeln('a=',a,'; b=',b);
end
else
writeln('Введены одинаковые числа');
       readln;
        end.
Допустимо вложение  одного оператора  if  (или  ifelse) в другой.  При этом следует
соблюдать   осторожность,   т.е.   бывает   трудно   определить   какому  if  (внешнему   или
внутреннему) принадлежит ветка else. Рекомендуют использовать вложенную конструкцию if,
только в ветке else. К тому же в языке Паскаль действует следующее правило: каждому then
соответствует ближайшее  else, не задействованное при установлении соответствия с другим
then. Глубина вложенности операторов if может быть сколь угодно большой, но разобраться в
таком коде будет очень сложно.
ОПЕРАТОР CASE (ОПЕРАТОР ВЫБОРА)
Кроме оператора if в языке программирования Паскаль предусмотрен так называемый
переключатель  case.   Его   можно   трактовать   как   некий   вопрос,   имеющий   большое   число
ответов (а не только два, как это имеет место в операторе ifelse). Однако в отличие от if, case
имеет ряд принципиальных ограничений. Его формат следующий:
case селектор of
значение1: оператор1;
значение2: оператор2;
значение3: оператор3;
...
else операторN
end;
В заголовке оператора  case  вместо логического выражения фигурирует переменная,
которую называют селектором. До этого в программе ей присваивается какоелибо значение.
Эта   переменная   может   иметь   только   перечисляемый   тип   (например,   она   не   может   быть
вещественного типа). По ходу выполнения оператора  case, значение переменнойселектора
сравнивается с различными, описанными в нем альтернативами (меткамизначениями). Как
только совпадение будет найдено, то выполняется блок кода при данной метке и происходит
выход в основную ветку программы. Значенияметки являются константами, которые может
принимать селектор. Их тип и тип селектора должны быть совместимы по присваиванию.

description:
17
Если совпадений не будет, то выполняется блок else. Если блок else отсутствует (он является
не обязательным), то никакой блок кода в операторе case не выполняется.
Пример: По введенному номеру класса определить к какой категории он относится.
var n: integer;
begin
    write ('Введите класс школы: ');
    readln (n);

    case n of
        1..4: writeln ('Младшие классы.');
        5..8: writeln ('Средняя школа.');
        9,11: writeln ('Старшие классы. Выпускной.');
        10: writeln ('Старшие классы.');
        else writeln ('Error')
    end;

readln
end.

description:
18
11. ЦИКЛЫ В PASCAL

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

Повторять   одни   и   те   же   действия   можно   и   при   помощи   оператора   безусловного
перехода.   Если  записать   эти  действия   в  программе   одно  за  другим,   а  в  конце  поставить
оператор перехода  к началу  этого блока.  Однако таким образом можно получить только
программу, которая работает вечно (зацикливается).
Существует три вида цикла, имеющих собственные операторы на языке Паскаль для их
записи. Эти виды имеют собственные условные названия: "Пока", "До", "С параметром". Друг
от   друга   они   несколько   отличаются   и   используются   каждый   для   своего   класса   задач.
Цикл "ПОКА"
Цикл с предусловием. Группа операторов, называемая "телом цикла", будет
выполняться пока истинно условие цикла. Выход из цикла произойдет, когда условие
перестанет выполняться.

Если условие ложно изначально, то тело цикла не будет выполнено ни разу.
На языке Pascal структура цикла "Пока" записывается следующим образом:
While <условие> Do <оператор>;

       Пока   истинно   условие,   выполнять   оператор.   Здесь,   так   же   как   в   формате   условного
оператора,   подразумевается   выполнение   только   одного   оператора.   Если   необходимо
выполнить   несколько   действий,   то   может   быть   использован   составной   оператор.   Тогда
формат оператора принимает такой вид:
While <условие> Do
Begin
<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .
End;
Цикл "ДО"

Этот вид цикла отличается от предыдущего тем, что проверка условия повторения
тела   цикла   находится   не   перед   ним,   а   после.   Поэтому   цикл   "До"   называют   циклом   "с
постусловием", а "Пока"  "с предусловием".

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

Когда условие цикла изначально истинно, тело цикла все равно будет выполнено хотя
бы один раз. Именно это отличие "до" от "пока" привело к тому, что в программировании они
не подменяют друг друга, а используются для решения задач, к которым они более подходят.

Repeat
<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .
Until <условие>;

Читается так: "Выполнять оператор #1, оператор #2. : до выполнения условия".
Формат цикла на языке Pascal:

intro:
Учебное пособие представляет собой подробный курс лекций по дисциплине "Основы программирования". Курс базируются на изучении языка программирования Паскаль.
Паскаль - язык программирования созданный специально для обучения программированию и на начальных этапах изучения вызывает сложности, поэтому основная цель данного учебного пособия- помощь обучающимся в освоении основ программирования. Каждая тема содержит примеры с пояснениями, для облегчения понимания теоретической части.

title: Учебное пособие для студентов специальности 09.02.03 Программирование в компьютерных системах "Основы программирования"