close

Вход

Забыли?

вход по аккаунту

?

795.Основы программирования в системе Pascal ABC

код для вставкиСкачать
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ»
ОСНОВЫ ПРОГРАММИРОВАНИЯ
В СИСТЕМЕ PАSCAL ABC
Учебно-методическое пособие для вузов
Составители:
А.В. Копытин,
Д.И. Соломатин,
А.И. Другалев
Издательско-полиграфический центр
Воронежского государственного университета
2009
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Утверждено ученым советом факультета компьютерных наук 26 мая 2009 г.,
протокол № 6
Рецензент канд. техн. наук, доц. И.Е. Воронина
Учебно-методическое пособие подготовлено на кафедре программирования
и информационных технологий факультета компьютерных наук Воронежского государственного университета.
Рекомендуется для студентов дневного и вечернего отделения теоретической и прикладной лингвистики факультета романо-германской филологии
Воронежского государственного университета.
Для специальности 031301.65 – Теоретическая и прикладная лингвистика
2
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
СОДЕРЖАНИЕ
Введение………………………………………………………………………….5
1. Описание интегрированной среды Pascal АВС…………………………...6
2. Основные понятия языка Pascal ABC……………………………………...7
2.1. Структура программы…………………………………………………..7
2.2. Алфавит языка Pascal ABC……………………………………………..9
2.3. Идентификаторы и служебные слова………………………………….9
2.4. Разделы описаний……………………………………………………...10
2.5. Ввод и вывод. Форматы вывода………………………………………11
3. Простые типы данных……………………………………………………..13
4. Операторы………………………………………………………………….17
4.1. Оператор присваивания……………………………………………….17
4.1.1. Задания……………………………………………………………..18
4.2. Составной оператор……………………………………………………20
4.3. Условный оператор……………………………………………………21
4.3.1. Задания……………………………………………………………..22
4.4. Оператор выбора………………………………………………………23
4.4.1. Задания……………………………………………………………..24
4.5. Оператор цикла for…………………………………………………….26
4.5.1. Задания……………………………………………………………..28
4.6. Операторы цикла while и repeat………………………………………29
4.6.1. Задания……………………………………………………………..30
5. Процедуры и функции……………………………………………………..32
5.1. Параметры процедур и функций……………………………………...34
5.2. Локальные и глобальные переменные………………………………..36
5.2.1. Задания………………………………………………………………36
6. Строковый тип данных…………………………………………………….41
6.1. Стандартные процедуры и функции для работы со строками……...42
6.2. Строковые выражения………………………………………………...45
6.2.1 Задания………………………………………………………………46
7. Массивы…………………………………………………………………….49
3
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
7.1. Одномерные массивы………………………………………………….50
7.1.1. Удаление и вставка элементов……………………………………52
7.1.2. Сортировка массива……………………………………………….53
7.1.3. Задания……………………………………………………………..54
7.2. Двумерные массивы…………………………………………………...57
7.2.1. Диагонали квадратной матрицы………………………………….59
7.2.2. Задания……………………………………………………………..59
8. Множества………………………………………………………………….63
9. Записи………………………………………………………………………65
Задания…………………………………………………………………67
10.
Файлы…………………………………………………………………….69
10.1.
Стандартные процедуры и функции для работы с файлами……..69
10.2.
Текстовые файлы…………………………………………………….71
10.2.1. Задания……………………………………………………………..73
10.3.
Типизированные файлы……………………………………………..74
10.3.1. Задания……………………………………………………………..77
Список литературы…………………………………………………………….79
4
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
ВВЕДЕНИЕ
Не так давно в вузах, осуществляющих подготовку специалистовлингвистов, появились дисциплины, связанные с компьютерной обработкой
лингвистических данных. И это не случайно, т. к. на современном этапе развития информатизации всех сфер деятельности человека практически от каждого профессионала требуются умения представления и обработки информации. Этим обусловлено возникновение такой науки, как компьютерная
лингвистика, которая родилась на стыке информатики и языкознания из потребности в общении с компьютером на естественном языке. Лингвистические технологии находят множество областей применения, начиная с несложных, но полезных программ проверки орфографии, до более изощренных алгоритмов, используемых в поисковых системах, программах автоматического реферирования, машинного перевода, экспертных системах и т. д.
Но существует проблема общения программистов и лингвистов, которая
заключается в том, что каждый из них является специалистом в своей области и не стремится понять другого. Целью настоящего пособия является
устранение этой проблемы.
Система Pascal ABC предназначена для обучения программированию на
языке Паскаль и ориентирована на школьников и студентов младших курсов. По мнению разработчиков этой системы, первоначальное обучение
программированию должно проходить в достаточно простых и дружественных средах, в то же время эти среды должны быть близки к стандартным по
возможностям языка программирования и иметь достаточно богатые и современные библиотеки стандартных подпрограмм.
Язык Паскаль признан многими российскими преподавателями как один
из лучших именно для начального обучения. Однако, среда Borland Pascal,
ориентированная на MS DOS, устарела, а среда Borland Delphi с ее богатыми возможностями сложна для начинающего программиста. Так, попытка
5
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
начинать обучение с написания событийной программы в Borland Delphi
вызывает у обучаемого массу сложностей и приводит к ряду неправильно
сформированных навыков.
Система Pascal ABC основана на языке Delphi Pascal и призвана осуществить плавный переход от простейших программ к модульному, объектноориентированному, событийному и компонентному программированию.
Компилятор Pascal ABC является компилятором переднего плана (frontend). Это означает, что он не генерирует исполняемый код в виде .exeфайла, а создает в результате компиляции дерево программы в памяти, которое затем выполняется с помощью встроенного интерпретатора.
1. ОПИСАНИЕ ИНТЕГРИРОВАННОЙ СРЕДЫ
PASCAL АВС
Окна среды Pascal АВС представлены на рис. 1.
Рис. 1. Окна среды Pascal АВС
Под окном редактора расположено окно вывода. Оно предназначено
для вывода данных процедурами write и writeln, а также для вывода сообщений об ошибках и предупреждений во время работы программы.
Окно вывода может быть скрыто. Клавиша F5 и кнопка
показыва-
ют/скрывают окно вывода. Для скрытия окна вывода используется также
клавиша Esc.
6
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Окно вывода обязательно открывается при любом выводе в него.
Для очистки окна вывода следует нажать комбинацию клавиш Ctrl-Del
или кнопку
.
Окно ввода открывается при выполнении процедур read и readln в
ходе работы программы. Ввод данных в окно ввода сопровождается эховыводом в окно вывода (см. рис. 1). После нажатия клавиши Enter данные
из окна ввода попадают в соответствующие переменные, окно ввода закрывается, и программа продолжает работать дальше.
Для запуска программы в текущем окне редактора следует нажать клавишу F9 или кнопку
панели инструментов.
Программа вначале компилируется во внутреннее представление, после
чего, если не найдены ошибки, программа начинает выполняться. При выполнении программы кнопка запуска программы становится неактивной,
кнопка остановки программы, наоборот, активной и в строке статуса отображается информация «Программа выполняется».
Выполнение программы можно в любой момент прервать нажатием
комбинации клавиш Ctrl-F2 или кнопки
. При этом в окне вывода поя-
вится сообщение • Программа прервана пользователем
2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА PASCAL ABC
2.1. Структура программы
Программа на языке Pascal ABC представляет собой файл с расширением .pas следующего вида:
program имя программы;
раздел подключения модулей
раздел описаний
begin
7
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
операторы
end.
Первая строка называется заголовком программы и не является обязательной.
Раздел подключения модулей начинается со служебного слова uses, за
которым следует список имен модулей, перечисляемых через запятую.
Раздел описаний может включать разделы описания переменных, констант, типов, процедур и функций, которые следуют друг за другом в произвольном порядке.
Раздел подключения модулей и раздел описаний могут отсутствовать.
Операторы отделяются друг от друга символом «точка с запятой».
Модули предназначены для разбиения текста программы на несколько
файлов. В модулях описываются переменные, константы, типы, процедуры
и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и основная программа), следует указать имя файла модуля (без расширения .pas) в разделе uses вызывающего
модуля. Файл модуля должен находиться либо в том же каталоге, что и основная программа, либо в подкаталоге Units системного каталога программы Pascal ABC.
Модуль в Pascal ABC представляет собой файл со следующим содержанием:
unit имя модуля;
раздел подключения модулей
раздел описаний
end.
Первая строка обязательна и называется заголовком модуля.
8
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2.2. Алфавит языка Pascal ABC
Алфавит языка Pascal ABC состоит из букв, цифр, специальных символов и неиспользуемых символов.
К буквам относятся большие и малые буквы латинского алфавита. При
этом Pascal ABC не различает одноименные большие и малые буквы, если
только они не входят в символьное или строковое выражение. Буквой является также знак подчеркивания « _ ».
К цифрам относятся арабские цифры от 0 до 9 и шестнадцатеричные
цифры. Чтобы отличить десятичное число от шестнадцатеричного, перед
последним ставят знак доллара $.
Специальные символы включают в себя разделители, знаки пунктуации
и знаки операций. Комментарием называется любая последовательность
символов, заключенная в фигурные скобки: {это комментарий}. Вместо фигурных скобок можно использовать пары символов (* и *). Комментарий во
время выполнения программы игнорируется. Основное назначение комментария – пояснение к тексту программы. Комментарием является также последовательность символов, стоящая после пары символов // и до конца
строки.
Знаки пунктуации:
( ) (* *) [ ] (. .)
{ } “ , . : ; // := .. ^ @ $ #
Знаки операций:
+
–
*
/
=
<> <= >=
2.3. Идентификаторы и служебные слова
Идентификаторы служат в качестве имен программ, модулей, процедур,
функций, типов, переменных и констант. Идентификатором считается любая последовательность латинских букв или цифр, начинающаяся с буквы.
Буквой считается также символ подчеркивания «_».
9
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Например, a1, _h, b123 – идентификаторы, а 1a, ф2 – нет.
Служебные слова необходимы для оформления конструкций языка и не
могут быть использованы в качестве имен. Список всех служебных слов
языка Pascal ABC приведен ниже:
and
break
constructor
do
exit
finalization
goto
initialization
not
program
record
shr
then
until
with
array
case
continue
downto
external
for
if
is
of
property
repeat
sizeof
to
uses
xor
as
class
destructor
else
externalsync
forward
in
label
or
protected
set
string
type
var
begin
const
div
end
file
function
inherited
mod
private
public
shl
unit
while
2.4. Разделы описаний
Раздел описания переменных начинается со служебного слова var, после
которого следуют строки вида
список имен переменных: тип;
Имена в списке перечисляются через запятую. Например:
var
a,b,c: integer;
d: real;
e,f: integer;
s,s1: string;
ch: char;
Раздел описания именованных констант начинается со служебного слова const, после которого следуют строки вида
имя константы = значение;
10
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
или
имя константы: тип = значение;
Например:
const
Pi = 3.14;
Count = 10;
Name = 'Mike';
DigitsSet = ['0'..'9'];
Arr: array [1..5] of integer = (1,3,5,7,9);
Arr2: array [1..2,1..2] of real = ((1,2),(3,4));
Выражения после знака равенства в двух последних строчках называются конструкторами констант-массивов и могут быть использованы только
при описании типизированных констант.
Раздел описания типов начинается со служебного слова type, после которого следуют строки вида
имя типа = тип;
позволяющие программисту создавать собственные типы.
2.5. Ввод и вывод. Форматы вывода
Для вывода в окно вывода используются стандартные процедуры write
и writeln. Они могут вызываться как без параметров, так и со списком параметров. Параметры в списке перечисляются через запятую и должны
иметь простой тип (кроме перечислимого типа и интервального типа, построенного на базе перечислимого), либо тип string, либо тип указателя.
Процедура writeln после вывода своих параметров осуществляет переход
на следующую строку.
В процедурах вывода write и writeln после каждого выводимого значения типа может указываться формат вывода, представляющий собой
двоеточие, после которого следует целое число или выражение. Это число
11
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
или выражение задает ширину поля вывода, то есть количество позиций, отводимых под выводимое значение. Если длина выводимого значения меньше ширины поля вывода, то выводимый текст дополняется слева пробелами
до нужной ширины; в результате выводимое значение выравнивается по
правому краю. Если длина выводимого значения больше ширины поля вывода, то формат вывода игнорируется.
Например, если a, b – целые переменные, то при выполнении операторов
a:=-2437; b:=13555;
writeln(a:6,'Привет!':9);
writeln(b:1);
в окно вывода будет выведен следующий текст:
-2437
Привет!
13555
Для вещественных и комплексных значений можно также использовать
формат :m:n, где m и n – целые значения. Значение m задает ширину поля вывода, а значение n количество знаков после десятичной точки. Например:
writeln(-14.859:10:3); // ___-14.859
writeln(-14.859:10:5); // _-14.85900
writeln(-14.859:10:2); // ____-14.86
writeln(-14.859:10:0); // _______-15
writeln(-14.859:10:7); // -14.8590000
writeln((0,1):10:1);
// _(0.0,1.0)
(здесь символом _ изображены пробелы).
Для ввода с клавиатуры используются стандартные процедуры read и
readln. Они могут вызываться как без параметров, так и со списком пара-
метров. Параметры в списке перечисляются через запятую и должны быть
переменными простого типа (кроме перечислимого типа и интервального
типа, построенного на базе перечислимого) либо типа string. Процедура
readln после ввода пропускает данные до конца текущей строки ввода.
12
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
3. ПРОСТЫЕ ТИПЫ ДАННЫХ
Простыми являются логический и вещественный порядковые типы.
Порядковые типы характеризуются тем, что соответствующие им значения образуют конечное упорядоченное множество и каждое значение имеет
свой порядковый номер. К порядковым типам относятся символьный, перечислимый и интервальный целые типы. Для выражений порядкового типа
определены следующие функции:
1) ord(x) возвращает порядковый номер значения данного выражения.
Для целых типов возвращает само значение x, для символьного – значение в
диапазоне от 0 до 255, для перечислимого – значение в диапазоне от 0 до
65535. Для интервального типа результат зависит от свойств базового порядкового типа;
2) pred(x) возвращает значение, предшествующее значению данного
выражения x;
3) succ(x) возвращает значение, следующее за значением данного выражения x;
и процедуры:
1) inc(x) присваивает переменной x следующее по порядку значение;
2) dec(x) присваивает переменной x предшествующее значение.
Целые типы предназначены для представления целых чисел.
Тип integer (целый). Значения этого типа занимают 4 байта и находятся в диапазоне от –2147483648 до 2147483647. Константа MaxInt хранит
значение 2147483647.
Тип byte (беззнаковый целый). Значения этого типа занимают 1 байт и
находятся в диапазоне от 0 до 255.
Тип word (беззнаковый целый). Значения этого типа занимают 2 байта и
находятся в диапазоне от 0 до 65535.
13
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
При применении к данным целого типа операций *(умножение), div
(частное при делении нацело), mod (остаток при делении нацело), + , –
полученный результат будет также целого типа. То же можно сказать и о
стандартных функциях abs (модуль аргумента) и sqr (квадрат аргумента).
Если в арифметическом выражении используются значения только какогонибудь одного из целых типов, то результат выражения будет иметь такой
же тип. Если же в выражении используются значения разных типов, то результат будет иметь тип integer.
Тип char (символьный). Значения этого типа занимают 1 байт и представляют собой Ansi-символы, используемые в операционных системах семейства Windows. Каждому символу соответствует число – код ANSI, что
расшифровывается как American National Standard Institute. Из 256 имеющихся Ansi-символов, символы с кодами от 0 до 32 являются служебными, т.е.
предназначены не для отображения информации, а для управления отображением информации; от 33 до 127 – цифрами, знаками и буквами латинского
алфавита; от 128 до 255 – знаками и буквами национальных алфавитов.
Стандартная функция Chr(x) возвращает символ с кодом x. Константы
этого типа могут быть записаны в виде #x, где x – целое число от 0 до 255.
Перечислимый тип определяется упорядоченным набором идентификаторов:
type
Season = (Winter,Spring,Summer,Autumn);
DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
Значения перечислимого типа занимают 4 байта. Применение перечислимого типа повышает наглядность программы и позволяет автоматически
контролировать значения переменных, так как они могут принимать только
одно из заданных в описании типа значений.
14
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
При работе с переменными перечислимого типа можно использовать
операторы присваивания, операции отношения, они могут быть параметром
цикла for. Однако в Pascal ABC нельзя непосредственно вводить и выводить
значения перечислимых типов.
Интервальный тип представляет собой подмножество значений целого,
символьного или перечислимого типа и описывается в виде a..b, где a –
нижняя, b – верхняя граница интервального типа:
var
a: 0..10;
c: 'a'..'z';
d: Mon..Thr;
Тип, на основе которого строится интервальный, называется базовым для
этого интервального типа. Значения интервального типа занимают 4 байта.
Тип boolean (логический). Переменные и константы логического типа
занимают 1 байт и принимают одно из двух значений, задаваемых предопределенными константами True (истина) и False (ложь).
В логических выражениях можно использовать логические операции:
not (отрицание), and (логическое И), or (логическое ИЛИ), xor (логическое
исключающее ИЛИ). Результат применения этих операций к операндам логического типа представлен в табл. 1.
Таблица 1
Логические операции
X
Y
X and Y
X or Y
X xor Y
Not X
False
False
False
False
False
True
False
True
False
True
True
True
True
False
False
True
True
False
True
True
True
True
False
False
15
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
При записи логических выражений нужно помнить, что первой выполняется операция not, затем and, потом or и xor. Операции отношения выполняются в последнюю очередь. Рассмотрим пример. Определить значение выражения: (4>=5) or not (6<9) and (1<=3). Сначала выполняются
операции в скобках слева направо: (False) or not (True) and (True).
Затем not, and, or:
False or False and True ⇒ False or False ⇒ False. Таким об-
разом, значение данного выражения – False.
Логические поразрядные операции предназначены для поразрядной обработки целочисленных операндов, представленных в двоичном виде. Такими операциями являются поразрядные отрицание not, и and, или or, исключающее или xor, а также поразрядные сдвиг влево shl и сдвиг вправо shr.
Рассмотрим пример. Пусть переменные a и b типа byte имеют значения
3 и 5 соответственно. В двоичном представлении эти числа будут иметь
вид: 00000011 и 00000101. Вычислим a xor b. Операция xor будет применяться поразрядно, т.е. к каждой паре чисел, стоящих в одинаковых позициях. Результат можно определить при помощи приведенной выше таблицы, если мысленно заменить 0 словом False, а 1 – словом True. Получим
00000110 = 610. Операции shl и shr сдвигают значение переменной влево
или вправо на указанное количество битов (например a shl 1 – сдвиг влево на 1 бит). При этом начальные или конечные биты теряются, а вновь
появившиеся биты содержат нулевые значения. Это эквивалентно умножению на 2 в степени, равной количеству разрядов смещения.
Тип real (вещественный). Значения вещественного типа занимают 8
байт, содержат 15–16 значащих цифр и по модулю не могут превосходить
величины 1.7·10308. Самое маленькое положительное число вещественного
типа равно 5.0·10-324. Константы типа real можно записывать как в форме с
16
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
плавающей точкой, так и в экспоненциальной форме: 1.7, 0.013, 2.5e3
(2500), 1.4e-1 (0.14).
К данным вещественного типа применимы операции *, /, +, – и следующие стандартные функции:
abs(x)
arctan(x)
cos(x)
exp(x)
frac(x)
int(x)
ln(x)
pi
round(x)
sin(x)
sqr(x)
sqrt(x)
trunc(x)
абсолютное значение
арктангенс
косинус
экспонента
дробная часть аргумента
целая часть аргумента
натуральный логарифм
число π
ближайшее целое аргумента
синус
квадрат аргумента
квадратный корень
отсечение дробной части аргумента
4. ОПЕРАТОРЫ
4.1. Оператор присваивания
Оператор присваивания имеет вид:
переменная:=выражение.
Действие его заключается в том, что вычисляется значение выражения,
стоящего справа от знака присваивания «:=», и оно присваивается переменной, стоящей слева от знака присваивания. При этом значение выражения
должно иметь тип либо совпадающий с типом переменной, либо неявно к
нему приводящийся.
Например, типы byte и integer неявно преобразуются друг к другу, а
также к типу real. Интервальный тип и его базовый тип неявно преобразуются друг к другу, неявно преобразуются между собой также интервальные
типы, построенные на основе одного базового типа.
17
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
4.1.1. Задания
Целые типы данных
1. Даны целые положительные числа A и B (A > B). На отрезке длины A
размещено максимально возможное количество отрезков длины B (без наложений). Используя операцию взятия остатка от деления нацело, найти
длину незанятой части отрезка A.
2. Дано двузначное число. Вывести вначале его левую цифру (десятки),
а затем – его правую цифру (единицы). Для нахождения десятков использовать операцию деления нацело, для нахождения единиц – операцию взятия
остатка от деления.
3. Дано двузначное число. Найти сумму и произведение его цифр.
4. Дано двузначное число. Вывести число, полученное при перестановке
цифр исходного числа.
5. Дано трехзначное число. Используя одну операцию деления нацело,
вывести первую цифру данного числа (сотни).
6. Дано трехзначное число. Вывести вначале его последнюю цифру
(единицы), а затем – его среднюю цифру (десятки).
7. Дано трехзначное число. Найти сумму и произведение его цифр.
8. Дано трехзначное число. Вывести число, полученное при прочтении
исходного числа справа налево.
9. Дано трехзначное число. В нем зачеркнули первую слева цифру и
приписали ее справа. Вывести полученное число.
10. Дано трехзначное число. В нем зачеркнули первую справа цифру и
приписали ее слева. Вывести полученное число.
11. Дано трехзначное число. Вывести число, полученное при перестановке цифр сотен и десятков исходного числа (например, 123 перейдет в 213).
12. Дано трехзначное число. Вывести число, полученное при перестановке
цифр десятков и единиц исходного числа (например, 123 перейдет в 132).
18
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Логический тип данных
Во всех заданиях данной группы требуется вывести логическое значение
TRUE, если приведенное высказывание для предложенных исходных данных является истинным, и значение FALSE в противном случае.
1. Дано целое число A. Проверить истинность высказывания: «Число A
является положительным».
2. Дано целое число A. Проверить истинность высказывания: «Число A
является нечетным».
3. Дано целое число A. Проверить истинность высказывания: «Число A
является четным».
4. Даны два целых числа: A, В. Проверить истинность высказывания:
«Справедливы неравенства A > 2 и В < 3».
5. Даны два целых числа: A, В. Проверить истинность высказывания:
«Справедливы неравенства A > 0 или В < -2».
6. Даны три целых числа: A, В, С. Проверить истинность высказывания:
«Справедливо двойное неравенство A < В < С».
7. Даны три целых числа: A, В, С. Проверить истинность высказывания:
«Число В находится между числами A и С».
8. Даны два целых числа: A, В. Проверить истинность высказывания:
«Каждое из чисел A и В нечетное».
9. Даны два целых числа: A, В. Проверить истинность высказывания:
«Хотя бы одно из чисел A и В нечетное».
10. Даны два целых числа: A, В. Проверить истинность высказывания:
«Ровно одно из чисел A и В нечетное».
11. Даны два целых числа: A, В. Проверить истинность высказывания:
«Числа A и В имеют одинаковую четность».
12. Даны три целых числа: A, В, С. Проверить истинность высказывания:
«Каждое из чисел A, В, С положительное».
19
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Вещественный тип данных
1. Дана сторона квадрата a. Найти его периметр P = 4⋅a.
2. Дана сторона квадрата a. Найти его площадь S = a2.
3. Даны стороны прямоугольника a и b. Найти его площадь S = a – b и
периметр P = 2⋅(a + b).
4. Дан диаметр окружности d. Найти ее длину L = π⋅d.
5. Дана длина ребра куба a. Найти объем куба V = a3 и площадь его поверхности S = 6⋅a2.
6. Даны длины ребер a, b, c прямоугольного параллелепипеда. Найти его
объем V = a⋅b⋅c и площадь поверхности S = 2⋅(a⋅b + b⋅c + a⋅c).
7. Найти длину окружности L и площадь круга S заданного радиуса R:
S = π⋅R2.
L = 2⋅π⋅R,
8. Даны два числа a и b. Найти их среднее арифметическое: (a + b)/2.
9. Даны два неотрицательных числа a и b. Найти их среднее геометрическое, то есть квадратный корень из их произведения.
10. Даны два ненулевых числа. Найти сумму, разность, произведение и
частное их квадратов.
11. Даны два ненулевых числа. Найти сумму, разность, произведение и
частное их модулей.
12. Даны катеты прямоугольного треугольника a и b. Найти его гипотенузу c и периметр P.
4.2. Составной оператор
Составной оператор предназначен для объединения нескольких операторов в один. Он имеет вид:
begin
операторы
end
20
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Операторы отделяются друг от друга символом «;». Служебные слова
begin и end, окаймляющие операторы, называются операторными скобка-
ми. Перед end также может ставиться «;». В этом случае считается, что последним оператором перед end является пустой оператор, не выполняющий никаких действий.
4.3. Условный оператор
Условный оператор имеет полную и краткую формы. Полная форма условного оператора выглядит следующим образом:
if условие then оператор1 else оператор2;
В качестве условия указывается некоторое логическое выражение. Если
условие оказывается истинным, то выполняется оператор1, в противном
случае выполняется оператор2. Например, следующий фрагмент находит
максимум значений двух переменных a и b:
if a>b then max:=a else max:=b;
Краткая форма условного оператора имеет вид:
if условие then оператор;
Если условие оказывается истинным, то выполняется оператор, в противном случае происходит переход к следующему оператору программы.
Например, чтобы упорядочить значения переменных a и b по неубыванию,
можно написать:
if a>b then
begin
m:=a;
a:=b;
b:=m
end;
В случае конструкции вида
if условие1 then
if условие2 then оператор1
else оператор2;
21
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
else всегда относится к ближайшему предыдущему оператору if, для ко-
торого ветка else еще не указана. Если в предыдущем примере требуется,
чтобы else относилась к первому оператору if, то необходимо использовать составной оператор:
if условие1 then
begin
if условие2 then оператор1
end
else оператор2;
Для иллюстрации приведем фрагмент программы решения уравнения
ax + b = 0.
if a=0 then
if b=0 then writeln(‘x – любое число’)
else writeln(‘Корней нет’)
else
begin
x:= –b/a;
writeln(‘x = ’,x:8:3)
end;
4.3.1. Задания
1. Дано целое число. Если оно является положительным, то прибавить к
нему 1; в противном случае не изменять его. Вывести полученное число.
2. Дано целое число. Если оно является положительным, то прибавить к
нему 1; в противном случае вычесть из него 2. Вывести полученное число.
3. Дано целое число. Если оно является положительным, то прибавить к
нему 1; если отрицательным, то вычесть из него 2; если нулевым, то заменить его на 10. Вывести полученное число.
4. Даны три целых числа. Найти количество положительных чисел в исходном наборе.
22
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
5. Даны три целых числа. Найти количество положительных и количество отрицательных чисел в исходном наборе.
6. Даны два числа. Вывести большее из них.
7. Даны два числа. Вывести порядковый номер меньшего из них.
8. Даны два числа. Вывести вначале большее, а затем меньшее из них.
9. Даны две переменные вещественного типа: A и B. Перераспределить
значения данных переменных так, чтобы в A оказалось меньшее из значений, а в B – большее. Вывести новые значения переменных A и B.
10. Даны две переменные целого типа: A и B. Если их значения не равны,
то присвоить каждой переменной сумму этих значений, а если равны, то присвоить переменным нулевые значения. Вывести новые значения переменных
A и B.
11. Даны две переменные целого типа: A и B. Если их значения не равны,
то присвоить каждой переменной большее из этих значений, а если равны, то
присвоить переменным нулевые значения. Вывести новые значения переменных A и B.
12. Даны три числа. Найти наименьшее из них.
4.4. Оператор выбора
Оператор выбора выполняет одно действие из нескольких в зависимости от значения некоторого выражения, называемого переключателем. Он
имеет следующий вид:
case переключатель of
список выбора 1: оператор1;
...
список выбора N: операторN;
else оператор
end;
23
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Переключатель представляет собой выражение порядкового типа (целого, символьного, перечислимого или интервального), а списки выбора содержат константы совместимого типа. Как и в операторе if, ветка else может отсутствовать.
Оператор case работает следующим образом. Если в одном из списков
выбора найдено текущее значение переключателя, то выполняется оператор, соответствующий данному списку. Если же значение переключателя не
найдено ни в одном списке, то выполняется оператор по ветке else или, если ветка else отсутствует, оператор case не выполняет никаких действий.
Список выбора состоит либо из одной константы, либо из диапазона
значений вида a..b (константа a должна быть меньше константы b); можно
также перечислить несколько констант или диапазонов через запятую:
case DayOfWeek of
1..5: writeln('Будний день');
6,7: writeln('Выходной день');
end;
Списки выбора не должны пересекаться. Например, следующий фрагмент
case i of
2,5: write(1);
4..6: write(2);
end;
приведет к ошибке компиляции «Пересечение диапазонов меток в операторе case».
4.4.1. Задания
1. Дано целое число K. Вывести строку-описание оценки, соответствующей числу K (1 – «плохо», 2 – «неудовлетворительно», 3 – «удовлетворительно», 4 – «хорошо», 5 – «отлично»). Если K не лежит в диапазоне 1–5, то
вывести строку «ошибка».
24
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2. Дан номер месяца – целое число в диапазоне 1–12 (1 – январь, 2 – февраль и т. д.). Вывести название соответствующего времени года («зима»,
«весна», «лето», «осень»).
3. Арифметические действия над числами пронумерованы следующим образом: 1 – сложение, 2 – вычитание, 3 – умножение, 4 – деление. Дан номер
действия N (целое число в диапазоне 1–4) и вещественные числа A и B (B не
равно 0). Выполнить над числами указанное действие и вывести результат.
4. Единицы длины пронумерованы следующим образом: 1 – дециметр,
2 – километр, 3 – метр, 4 – миллиметр, 5 – сантиметр. Дан номер единицы
длины (целое число в диапазоне 1–5) и длина отрезка в этих единицах (вещественное число). Найти длину отрезка в метрах.
5. Единицы массы пронумерованы следующим образом: 1 – килограмм,
2 – миллиграмм, 3 – грамм, 4 – тонна, 5 – центнер. Дан номер единицы массы (целое число в диапазоне 1–5) и масса тела в этих единицах (вещественное число). Найти массу тела в килограммах.
6. Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, предшествующей указанной.
7. Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, следующей за указанной.
8. Мастям игральных карт присвоены порядковые номера: 1 – пики, 2 –
трефы, 3 – бубны, 4 – червы. Достоинству карт, старших десятки, присвоены номера: 11 – валет, 12 – дама, 13 – король, 14 – туз. Даны два целых числа: N – достоинство (6 < N < 14) и M – масть карты (1 < M < 4). Вывести название соответствующей карты вида «шестерка бубен», «дама червей», «туз
треф» и т. п.
25
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
9. Дано целое число в диапазоне 20–69, определяющее возраст (в годах).
Вывести строку-описание указанного возраста, обеспечив правильное согласование числа со словом «год», например: 20 – «двадцать лет», 32 –
«тридцать два года», 41 – «сорок один год».
10. Дано целое число в диапазоне 10–40, определяющее количество учебных заданий по некоторой теме. Вывести строку-описание указанного количества заданий, обеспечив правильное согласование числа со словами «учебное задание», например: 18 – «восемнадцать учебных заданий», 23 – «двадцать три учебных задания», 31 – «тридцать одно учебное задание».
11. Дано целое число в диапазоне 100–999. Вывести строку-описание данного числа, например: 256 – «двести пятьдесят шесть», 814 – «восемьсот четырнадцать».
12. В восточном календаре принят 60-летний цикл, состоящий из 12-летних подциклов, обозначаемых названиями цвета: зеленый, красный, желтый,
белый и черный. В каждом подцикле годы носят названия животных: крысы,
коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки
и свиньи. По номеру года определить его название, если 1984 год – начало
цикла: «год зеленой крысы».
4.5. Оператор цикла for
Оператор цикла for имеет одну из двух форм:
for переменная:=начальное значение to конечное значение do
оператор
или
for переменная:=начальное значение downto конечное значение do
оператор
Текст от слова for до слова do включительно называется заголовком
цикла, а оператор после do – телом цикла. Переменная после слова for называется параметром цикла. Если в цикле необходимо выполнить группу
26
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
операторов, то ее следует заключить в операторные скобки begin…end. Для
первой формы цикла с ключевым словом to параметр цикла меняется от
начального значения до конечного значения, увеличиваясь всякий раз на
единицу, а для второй формы ключевым словом downto – уменьшаясь на
единицу. Для каждого значения переменной-параметра выполняется тело
цикла. Однократное повторение тела цикла называется итерацией цикла.
Значение параметра цикла после завершения цикла считается неопределенным.
Если для цикла for…to начальное значение его переменной больше конечного значения или для цикла for…downto начальное значение переменной меньше конечного значения, то тело цикла не выполнится ни разу.
Изменение переменной-параметра цикла внутри цикла является логической ошибкой. Например, следующий фрагмент со вложенным оператором
for является ошибочным:
for i:=1 to 10 do
for i:=1 to 5 do write(i);
Переменная-параметр цикла может иметь любой порядковый тип (целый, символьный, перечислимый или интервальный). При этом типы начального и конечного значения должны соответствовать типу параметра
цикла. Например:
var
en: (red,green,blue,white);
c: char;
...
for en:=red to blue do write(Ord(en):2);
for c:='a' to 'z' do write(c);
27
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
4.5.1. Задания
1. Даны два целых числа: A и B (A < B). Вывести в порядке возрастания
все целые числа, расположенные между A и B (включая сами числа A и B), а
также количество N этих чисел.
2. Даны два целых числа: A и B (A < B). Найти сумму всех целых чисел
от A до B включительно.
3. Даны два целых числа: A и B (A < B). Найти произведение всех целых
чисел от A до B включительно.
4. Даны два целых числа: A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.
5. Дано целое число N (> 0). Найти сумму 1 + 1/2 + 1/3 + ... + 1/N.
6. Дано целое число N (> 0). Найти сумму N2 + (N + 1)2 + (N + 2)2 + . . .
+ (2·N)2.
7. Дано целое число N (> 0). Найти квадрат данного числа, используя
для его вычисления следующую формулу: N2 = 1+ 3+ 5 + ... + (2⋅N–1).
8. После добавления к сумме каждого слагаемого выводить текущее
значение суммы (в результате будут выведены квадраты всех целых чисел
от 1 до N).
9. Дано вещественное число A и целое число N (> 0). Найти A в степени N:
AN=A⋅A⋅...⋅A (числа A перемножаются N раз).
10. Дано вещественное число A и целое число N (> 0). Используя один
цикл, вывести все целые степени числа A от 1 до N.
11. Дано вещественное число A и целое число N (> 0). Используя один
цикл, найти сумму 1 + A + A2 + A3 + ...+ AN.
12. Дано вещественное число A и целое число N (> 0). Используя один
цикл, найти значение выражения 1 – A + A2 – A3 + ... + (–1)N AN. Условный
оператор не использовать.
28
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
4.6. Операторы цикла while и repeat
Оператор цикла while имеет следующую форму:
while условие do оператор;
Условие представляет собой логическое выражение, а оператор после do
называется телом цикла. Перед каждой итерацией цикла условие вычисляется, и если оно истинно, то выполняется тело цикла, в противном случае
происходит выход из цикла. Если при первом вычислении значения условия
оно окажется ложным, то тело цикла не выполнится ни разу. В качестве
оператора тела цикла может быть использован составной оператор, заключенный в операторные скобки begin…end.
Если условие всегда оказывается истинным, то может произойти зацикливание:
while 2>1 do write(1);
Пример. Дано натуральное число n (n > 0). Подсчитать количество цифр
данного числа.
var n,count: integer;
begin
read(n); count:=0;
while n>0 do
begin
inc(count);
n:=n div 10
end;
writeln(count)
end.
Оператор цикла repeat имеет следующую форму:
repeat
операторы
until условие;
29
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
В отличие от цикла while условие вычисляется после очередной итерации цикла, и если оно истинно, то происходит выход из цикла. Таким образом, операторы, образующие тело цикла оператора repeat, выполняются по
крайней мере один раз.
Если условие всегда оказывается ложным, то может произойти зацикливание:
repeat
write(1);
until 2=1;
Задача о вычислении количества цифр данного натурального числа n
может быть решена с помощью оператора цикла с постусловием следующим образом:
var n,count: integer;
begin
read(n); count:=0;
repeat
inc(count);
n:=n div 10
until n=0;
writeln(count)
end.
Тело оператора цикла с постусловием можно не заключать в операторные скобки, так как их роль выполняют слова repeat и until.
4.6.1. Задания
1. Даны положительные числа: A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
30
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2. Даны положительные числа: A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество
отрезков B, размещенных на отрезке A.
3. Даны целые положительные числа: N и K. Используя только операции
сложения и вычитания, найти частное от деления нацело N на K, а также остаток от этого деления.
4. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести TRUE, если не является, вывести FALSE.
5. Дано целое число N (> 0), являющееся некоторой степенью числа
2 : N = 2К. Найти целое число K – показатель этой степени.
6. Дано целое число N (> 0). Найти наименьшее целое положительное
число K, квадрат которого превосходит N : K2 > N. Функцию извлечения квадратного корня не использовать.
7. Дано целое число N (> 0). Найти наибольшее целое число K, квадрат
которого не превосходит N : K2 < N. Функцию извлечения квадратного корня
не использовать.
8. Дано целое число N (> 1). Найти наименьшее целое число K, при котором выполняется неравенство 3K > N.
9. Дано целое число N (> 1). Найти наибольшее целое число K, при котором выполняется неравенство 3K < N.
10. Дано целое число N (> 1). Вывести наименьшее из целых чисел K, для
которых сумма 1 + 2 + ... + K будет больше или равна N, и саму эту сумму.
11. Начальный вклад в банке равен 1000 руб. Через каждый месяц размер
вклада увеличивается на P процентов от имеющейся суммы (P – вещественное число, 0 < P < 25). По данному P определить, через сколько месяцев размер вклада превысит 1100 руб., и вывести найденное количество месяцев K
(целое число) и итоговый размер вклада S (вещественное число).
31
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
12. Спортсмен-лыжник начал тренировки, пробежав в первый день 10 км.
Каждый следующий день он увеличивал длину пробега на P процентов от
пробега предыдущего дня (P – вещественное, 0 < P < 50). По данному P определить, после какого дня суммарный пробег лыжника за все дни превысит
200 км, и вывести найденное количество дней K (целое) и суммарный пробег
S (вещественное число).
5. ПРОЦЕДУРЫ И ФУНКЦИИ
Процедура или функция представляет собой последовательность операторов, которая имеет имя, список параметров и может быть вызвана из различных частей программы. Функции в отличие от процедур в результате
своего выполнения возвращают значение. Для единообразия функции и
процедуры называются подпрограммами.
Любая используемая в программе процедура или функция должна быть
предварительно описана в разделе описаний.
Описание процедуры имеет вид:
procedure имя(список формальных параметров);
раздел описаний
begin
операторы
end;
Описание функции имеет вид:
function имя(список формальных параметров):тип возвращаемого
значения;
раздел описаний
begin
операторы
end;
Операторы подпрограммы, окаймленные операторными скобками begin
end, называются телом этой подпрограммы.
32
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Список формальных параметров вместе с окружающими скобками может
отсутствовать. Он состоит из одной или нескольких секций, разделенных
символом ";". Каждая секция состоит из списка переменных, перечисляемых
через запятую, после которого следуют двоеточие и тип. Каждая секция может предваряться служебным словом var, что указывает на то, что параметры передаются по ссылке (см. п. «Параметры процедур и функций»).
Раздел описаний процедуры или функции устроен так же, как и раздел
описаний основной программы. Здесь описываются так называемые локальные переменные и константы, типы а также вложенные процедуры и функции. Все такие локальные объекты доступны лишь внутри данной подпрограммы и не видны извне.
Рассмотрим пример процедуры, меняющей местами значения двух переменных x и y.
procedure swap (var x,y: integer);
var m: integer;
begin
m:=x; x:=y; y:=m
end;
Внутри тела функции имя этой функции можно использовать как специальную переменную, которой необходимо присвоить возвращаемое значение. Например:
function Add(a,b: real): real;
begin
Add:=a+b;
end;
Имя функции может быть использовано с целью возврата значения
только в левой части оператора присваивания. Если имя функции встречается в выражении, то это трактуется как рекурсивный вызов этой функции.
33
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Вместо имени функции внутри тела функции можно использовать другую специальную переменную с именем result. В отличие от имени функции, переменную result можно использовать и в выражениях:
function Factorial(n: integer): integer;
var i: integer;
begin
result:=1;
for i:=1 to n do result:=result∗i;
end;
Если внутри функции не присвоить имени функции или переменной
result некоторое значение, то функция вернет в результате своего вызова
непредсказуемое значение.
5.1. Параметры процедур и функций
Параметры, указываемые при описании подпрограммы, называются
формальными. Параметры, указываемые при вызове подпрограммы, называются фактическими.
Если формальный параметр описан со служебным словом var, то его
называют параметром-переменной и говорят, что он передается по ссылке.
Если же параметр описан без слова var, то его называют параметромзначением и говорят, что он передается по значению.
Если параметр передается по значению, то при вызове подпрограммы
значения фактических параметров присваиваются соответствующим формальным параметрам. Например, пусть имеется следующее описание процедуры:
procedure PrintSquare(i: integer);
begin
writeln(i*i);
end;
34
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Тогда при вызове PrintSquare(5*a–b) значение 5*a–b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.
Если параметр передается по ссылке, то при вызове подпрограммы фактический параметр заменяет собой в теле процедуры соответствующий ему
формальный параметр. В итоге любые изменения формального параметрапеременной внутри процедуры приводят к соответствующим изменениям
фактического параметра. Например, если описана процедура
procedure Mult2(var a: integer);
begin
a:=a*2;
end;
то после вызова Mult(d) значение d увеличится в 2 раза.
В качестве фактического параметра-значения можно указывать любое
выражение, тип которого совпадает с типом формального параметра или
неявно к нему приводится. В качестве фактического параметра-переменной
можно указывать только переменную, тип которой в точности совпадает с
типом формального параметра.
При передаче параметра по ссылке в подпрограмму передается адрес
фактического параметра. Поэтому если параметр занимает много памяти
(массив, запись), то обычно он также передается по ссылке. В результате в
процедуру передается не сам параметр, а его адрес, что экономит память и
время работы.
Параметр может быть также описан со служебным словом const. Это
означает, что он передается по значению, но менять его в подпрограмме запрещено. Например:
procedure PrintSquare1(i: integer);
begin
i:=i*i; // верно
35
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
writeln(i);
end;
procedure PrintSquare2(const i: integer);
begin
i:=i*i; // ошибка!!!
writeln(i);
end;
5.2. Локальные и глобальные переменные
Переменные, описанные в разделе описаний подпрограммы, называются
ее локальными переменными. Переменные же, описанные вне подпрограммы, называются глобальными по отношению к ней.
Параметры подпрограммы считаются ее локальными переменными.
Если имя локальной переменной совпадает с именем глобальной переменной, то локальная переменная скрывает глобальную, так что к глобальной переменной нельзя обратиться внутри подпрограммы. Например:
var i: real;
procedure p;
var i: integer;
begin
// к глобальной переменной i внутри процедуры нельзя обратиться
i:=5; // присваивание локальной переменной i; ...
end;
5.2.1. Задания
1. Описать процедуру PowerA3(A, B), вычисляющую третью степень
числа A и возвращающую ее в переменной B ( A – входной, B – выходной
параметр; оба параметра являются вещественными). С помощью этой процедуры найти третьи степени пяти данных чисел.
36
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2. Описать процедуру PowerA234(A, B, C, D), вычисляющую вторую,
третью и четвертую степень числа A и возвращающую эти степени соответственно в переменных B, C и D ( A – входной, B, C, D – выходные параметры; все параметры являются вещественными). С помощью этой процедуры
найти вторую, третью и четвертую степень пяти данных чисел.
3. Описать процедуру TrianglePS(a, P, S), вычисляющую по стороне a
равностороннего треугольника его периметр P = 3 – a и площадь
S = a 2 3 / 4 (a – входной, P и S – выходные параметры; все параметры являются вещественными). С помощью этой процедуры найти периметры и
площади трех равносторонних треугольников с данными сторонами.
4. Описать процедуру RectPS(x1, y1, x2, y2, P, S), вычисляющую периметр
P и площадь S прямоугольника со сторонами, параллельными осям координат, по координатам (x1, y1), (x2, y2) его противоположных вершин (x1, y1, x2,
y2 – входные, P и S – выходные параметры вещественного типа). С помощью этой процедуры найти периметры и площади трех прямоугольников с
данными противоположными вершинами.
5. Описать процедуру DigitCountSum(K, C, S), находящую количество C
цифр целого положительного числа K, а также их сумму S (K – входной, C и
S – выходные параметры целого типа). С помощью этой процедуры найти
количество и сумму цифр для каждого из пяти данных целых чисел.
6. Описать процедуру InvertDigits(K), меняющую порядок следования
цифр целого положительного числа K на обратный (K – параметр целого
типа, являющийся одновременно входным и выходным). С помощью этой
процедуры поменять порядок следования цифр на обратный для каждого из
пяти данных целых чисел.
7. Описать процедуру AddRightDigit(D, K), добавляющую к целому положительному числу K справа цифру D (D – входной параметр целого типа,
лежащий в диапазоне 0–9, K – параметр целого типа, являющийся одновре37
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
менно входным и выходным). С помощью этой процедуры последовательно
добавить к данному числу K справа данные цифры D1 и D2, выводя результат каждого добавления.
8. Описать процедуру AddLeftDigit(D, K), добавляющую к целому положительному числу K слева цифру D (D – входной параметр целого типа,
лежащий в диапазоне 1–9, K – параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры последовательно
добавить к данному числу K слева данные цифры D1 и D2, выводя результат
каждого добавления.
9. Описать процедуру Swap(X, Y), меняющую содержимое переменных X
и Y (X и Y – вещественные параметры, являющиеся одновременно входными и выходными). С ее помощью для данных переменных A, B, C, D последовательно поменять содержимое следующих пар: A и B, C и D, B и C и вывести новые значения A, B, C, D.
10. Описать процедуру Minmax(X, Y), записывающую в переменную минимальное из значений X и Y, а в переменную Y – максимальное из этих
значений (X и Y – вещественные параметры, являющиеся одновременно
входными и выходными). Используя четыре вызова этой процедуры, найти
минимальное и максимальное из данных чисел A, B, C, D.
11. Описать процедуру SortInc3(A, B, C), меняющую содержимое переменных A, B, C таким образом, чтобы их значения оказались упорядоченными по возрастанию (A, B, C – вещественные параметры, являющиеся одновременно входными и выходными). С помощью этой процедуры упорядочить по возрастанию два данных набора из трех чисел: (A1, B1, C1) и (A2,
B2, C2).
12. Описать процедуру SortDec3(A, B, C), меняющую содержимое переменных A, B, C таким образом, чтобы их значения оказались упорядоченными по убыванию (A, B, C – вещественные параметры, являющиеся одновре38
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
менно входными и выходными). С помощью этой процедуры упорядочить по
убыванию два данных набора из трех чисел: (A1, B1, C1) и (A2, B2, C2).
13. Описать функцию TriangleP(a, h), находящую периметр равнобедренного треугольника по его основанию a и высоте h, проведенной к основанию ( a и h - вещественные). С помощью этой функции найти периметры трех треугольников, для которых даны основания и высоты. Для нахождения боковой стороны b треугольника использовать теорему Пифагора:
b 2 = (a / 2) 2 + h 2 .
14. Описать функцию SumRange(A, B) целого типа, находящую сумму
всех целых чисел от A до B включительно (A и B – целые). Если A > B, то
функция возвращает 0. С помощью этой функции найти суммы чисел от A
до B и от B до C, если даны числа A, B, C.
15. Описать функцию Calc(A, B, Op) вещественного типа, выполняющую
над ненулевыми вещественными числами A и B одну из арифметических
операций и возвращающую ее результат. Вид операции определяется целым
параметром Op: 1 – вычитание, 2 – умножение, 3 – деление, остальные значения – сложение. С помощью Calc выполнить для данных A и B операции,
определяемые данными целыми Nl, N2, N3.
16. Описать функцию Quarter(x, y) целого типа, определяющую номер
координатной четверти, в которой находится точка с ненулевыми
вещеcтвенными координатами (x, y). С помощью этой функции найти номера координатных четвертей для трех точек с данными ненулевыми координатами.
17. Описать функцию IsSquare(K) логического типа, возвращающую
TRUE, если целый параметр K (> 0) является квадратом некоторого целого
числа, и FALSE в противном случае. С ее помощью найти количество квадратов в наборе из 10 целых положительных чисел.
39
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
18. Описать функцию IsPowerN(K, N) логического типа, возвращающую
TRUE, если целый параметр K (> 0) является степенью числа N (> 1), и
FALSE в противном случае. Дано число N (> 1) и набор из 10 целых положительных чисел. С помощью функции IsPowerN найти количество степеней числа N в данном наборе.
19. Описать функцию IsPrime(N) логического типа, возвращающую
TRUE, если целый параметр N (> 1) является простым числом, и FALSE в
противном случае (число, большее 1, называется простым, если оно не
имеет положительных делителей, кроме 1 и самого себя). Дан набор из 10
целых чисел, больших 1. С помощью функции IsPrime найти количество
простых чисел в данном наборе.
20. Описать функцию DigitCount(K) целого типа, находящую количество
цифр целого положительного числа K. Используя эту функцию, найти количество цифр для каждого из пяти данных целых положительных чисел.
21. Описать функцию DigitN(K, N) целого типа, возвращающую N-ю
цифру целого положительного числа K (цифры в числе нумеруются справа
налево). Если количество цифр в числе K меньше N, то функция возвращает
–1. Для каждого из пяти данных целых положительных чисел K1, K2, ..., K5
вызвать функцию DigitN с параметром N, изменяющимся от 1 до 5.
22. Описать функцию IsPalindrom(K), возвращающую TRUE, если целый
параметр K (> 0) является палиндромом (т. е. его запись читается одинаково
слева направо и справа налево), и FALSE в противном случае. С ее помощью
найти количество палиндромов в наборе из 10 целых положительных чисел.
23. Описать функцию Fact(N) вещественного типа, вычисляющую значение
факториала N! = 1 · 2 ·… · N (N > 0 – параметр целого типа; вещественное
возвращаемое значение используется для того, чтобы избежать целочисленного
переполнения при больших значениях N). С помощью этой функции найти
факториалы пяти данных целых чисел.
40
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
24. Описать функцию Fib(N) целого типа, вычисляющую N-й элемент последовательности чисел Фибоначчи FK, которая описывается следующими
формулами: F1 = 1, F2 = 1, FK = FK–1 + FK–2, K = 3, 4,…. Используя функцию
Fib, найти пять чисел Фибоначчи с данными номерами N1, N2, …, N5.
6. СТРОКОВЫЙ ТИП ДАННЫХ
Строка представляет собой набор символов, заключенный в апострофы.
Например,
′ abcdef ′
′ Иванов И.И. ′
′ 10.0 ′
′S=′
Константа типа char представляет собой символьную строку единичной
длины.
Строки в Pascal ABC имеют тип string и состоят не более чем из 255
символов. Каждый символ имеет свой порядковый номер и занимает один
байт. При описании
var s: string;
под переменную s отводится 256 байт, при этом в нулевом байте хранится
длина строки. По номеру символа можно получить доступ к его значению,
указав номер символа в квадратных скобках после имени строки.
Например, для строки s = ′Привет′, получим:
ord(s[0])=6, s[1]=′П′, s[2]=′р′, s[3]=′и′, s[4]=′в′, s[5]=′е′,s[6]=′т′.
Заметим, что длина строки, хранящаяся в нулевом байте, представлена в
символьном виде, поэтому для преобразования в число следует воспользоваться стандартной функцией ord.
Для экономии памяти предусмотрено описание вида
var s1: string[50];
В этом случае под строку отводится 51 байт (нулевой байт – под длину
строки). В случае присваивания переменной s1 строки более чем из 50 символов лишние символы отсекаются, и длина строки s1 полагается равной 50.
41
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
6.1. Стандартные процедуры и функции для работы со строками
Ниже приведены основные стандартные процедуры и функции для работы со строками (см. табл. 1).
Таблица 1
Процедуры и функции для работы со строками
Тип возПроцедура
Типы
вращаемоИмя и параметры или функДействие
параметров
го
ция
значения
Length(s)
функция s – string integer возвращает длину строки s
Copy(s,index, функция s – string, string
возвращает подcount)
строку строки s
index и
длины count,
count – inначиная с позиteger
ции index
Delete(s,inde процедура s – string,
удаляет в строке
x,count)
s count симвоindex и
лов начиная с поcount – integer
зиции index
Insert(subs,s процедура s, subs –
вставляет под,index)
строку subs в
string, index – inteстроку s с позиger
ции index
integer возвращает позиPos(subs,s)
функция s, subs –
цию первой подstring
строки subs в
строке s (или 0
если подстрока
не найдена)
SetLength(s,n процедура s – string,
устанавливает
)
n –
длину строки s
integer
равной n
Str(x,s)
процедура s – string,
преобразует x к
Str(x:n,s)
строковому предx – integer,
Str(x:n:m,s)
ставлению (во
real и n, m –
втором и третьем
integer
42
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Val(s,v,code) процедура s – string,
v – integer,
real, и
code –
integer
Concat(s1,... функция
,sn)
s1,..., sn –
string
IntToStr(i)
функция
i – integer
StrToInt(s)
функция
s – string
FloatToStr(r) функция
r – real
43
случаях согласно
формату вывода,
устанавливаемому n и m) и записывает результат
в строку s
преобразует
строку s к числовому представлению и записывает результат в переменную
v. Если преобразование возможно, то в переменной code возвращается 0, если
невозможно, то в
code возвращается ненулевое
значение
string
возвращает строку, являющуюся
результатом
слияния строк
s1,..., sn. Результат тот же,
что у выражения
s1+s2+...+sn
string
преобразует целое
число к строке
integer преобразует строку в целое число.
Если преобразование невозможно, то возникает
ошибка времени
выполнения
string
преобразует вещественное число к строке
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
StrToFloat(s) функция
s – string real
UpCase(c)
функция
c – char
char
LowCase(c)
функция
c – char
char
UpperCase(s)
функция
s – string string
LowerCase(s)
функция
s – string string
Trim(s)
функция
s – string string
TrimLeft(s)
функция
s – string string
TrimRight(s)
функция
s – string string
44
преобразует
строку в вещественное число.
Если преобразование невозможно, то возникает
ошибка времени
выполнения
возвращает символ c, преобразованный к верхнему регистру
возвращает символ c, преобразованный к нижнему регистру
возвращает строку s, преобразованную к верхнему регистру
возвращает строку s, преобразованную к нижнему регистру
возвращает копию строки s с
удаленными лидирующими и заключительными
пробелами
возвращает копию строки s с
удаленными лидирующими
пробелами
возвращает копию строки s с
удаленными заключительными
пробелами
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Пример. Написать процедуру, заменяющую в строке s все вхождения
подстроки subs1 на подстроку subs2.
Procedure Replace(var s:string; subs1,subs2:string);
var i:integer;
begin
i:=pos(subs1,s); //находим первое вхождение подстроки subs1
if i>0 do
begin
delete(s,i,length(subs1)); //удаляем найденную подстроку
subs1
Replace(s,subs1,subs2) //заменяем следующее вхождение
insert(subs2,s,i); //вставляем подстроку subs2
end;
end;
6.2. Строковые выражения
Над строками определены операции отношения. Строки сравниваются
по кодам символов. При сравнении двух строк последовательно сравниваются коды символов, стоящих в одинаковых позициях. Символы в строках
просматриваются слева направо. Если в очередной паре оказываются различные символы, то большей считается та строка, символ которой имеет
больший код. На этом сравнение прекращается. Если сравниваются строки
разной длины, причем одна строка совпадает с началом другой, то большей
будет более длинная строка.
Например,
′муха′ < ′слон′
′слон′ < ′слоник′
′2′ > ′123′
Кроме операций отношения над строками определена операция сцепления (конкатенации), которая обозначается знаком «+». Например,
′Pascal′ + ′ABC′= ′Pascal ABC′
45
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
6.2.1. Задания
При выполнении заданий на обработку русских букв можно считать, что
буква «ё» в исходных строковых данных отсутствует.
Символы и их коды. Формирование строк
1. Дан символ C. Вывести его код (т. е. номер в кодовой таблице).
2. Дано целое число N (32 ≤ N ≤ 126). Вывести символ с кодом, равным N.
3. Дан символ C. Вывести два символа, первый из которых предшествует символу C в кодовой таблице, а второй следует за символом C.
4. Дано целое число N (1 ≤ N ≤ 26). Вывести N первых прописных (т. е.
заглавных) букв латинского алфавита.
5. Дано целое число N (1 ≤ N ≤ 26). Вывести N последних строчных (т. е. маленьких) букв латинского алфавита в обратном порядке (начиная с буквы «z»).
6. Дан символ C, изображающий цифру или букву (латинскую или русскую). Если C изображает цифру, то вывести строку «digit», если латинскую
букву – вывести строку «lat», если русскую – вывести строку «rus».
7. Дана непустая строка. Вывести коды ее первого и последнего символа.
8. Дано целое число N (> 0) и символ C. Вывести строку длины N, которая состоит из символов C.
9. Дано четное число N (> 0) и символы C1 и C2. Вывести строку длины
N, которая состоит из чередующихся символов C1 и C2, начиная сC1.
10. Дана строка. Вывести строку, содержащую те же символы, но расположенные в обратном порядке.
11. Дана непустая строка S. Вывести строку, содержащую символы строки S, между которыми вставлено по одному пробелу.
12. Дана непустая строка S и целое число N (> 0). Вывести строку, содержащую символы строки S, между которыми вставлено по N символов «*»
(звездочка).
46
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Обработка строк с помощью стандартных функций
1. Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить
из этих строк новую строку, содержащую первые N1 символов строки S1 и
последние N2 символов строки S2 (в указанном порядке).
2. Дан символ C и строка S. Удвоить каждое вхождение символа C в
строку S.
3. Дан символ C и строки S, S0. Перед каждым вхождением символа C в
строку S вставить строку S0.
4. Дан символ C и строки S, S0. После каждого вхождения символа C в
строку S вставить строку S0.
5. Даны строки S и S0. Проверить, содержится ли строка S0 в строке S.
Если содержится, то вывести TRUE, если не содержится, то вывести
FALSE.
6. Даны строки S и S0. Найти количество вхождений строки S0 в строку S.
7. Даны строки S и S0. Удалить из строки S первую подстроку, совпадающую с S0. Если совпадающих подстрок нет, то вывести строку S без изменений.
8. Даны строки S и S0. Удалить из строки S последнюю подстроку, совпадающую с S0. Если совпадающих подстрок нет, то вывести строку S без
изменений.
9. Даны строки S и S0. Удалить из строки S все подстроки, совпадающие
с S0. Если совпадающих подстрок нет, то вывести строку S без изменений.
10. Даны строки S, S1 и S2. Заменить в строке S первое вхождение строки
S1 на строку S2.
11. Даны строки S, S1 и S2. Заменить в строке S последнее вхождение строки S1 на строку S2.
12. Даны строки S, S1 и S2. Заменить в строке S все вхождения строки S1 на
строку S2.
47
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Анализ и преобразование слов в строке
1. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Найти количество слов в строке.
2. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Найти количество слов, которые начинаются и заканчиваются одной и той же буквой.
3. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Найти количество слов, которые содержат хотя бы одну букву «А».
4. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Найти количество слов, которые содержат ровно три буквы «А».
5. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Найти длину самого короткого слова.
6. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Найти длину самого длинного слова.
7. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, разделенные одним символом «.» (точка). В конце строки точку не ставить.
8. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Преобразовать
каждое слово в строке, заменив в нем все последующие вхождения его первой буквы на символ «.» (точка). Например, слово «МИНИМУМ» надо преобразовать в «МИНИ.У.». Количество пробелов между словами не изменять.
9. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, заменив в нем все предыдущие вхождения его последней
48
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
буквы на символ «.» (точка). Например, слово «МИНИМУМ» надо преобразовать в «.ИНИ.УМ». Количество пробелов между словами не изменять.
10. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в обратном порядке.
11. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Вывести строку,
содержащую эти же слова, разделенные одним пробелом и расположенные в
алфавитном порядке.
12. Дана строка-предложение на русском языке. Преобразовать строку
так, чтобы каждое слово начиналось с заглавной буквы. Словом считать набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки. Слова, не начинающиеся с буквы, не изменять.
7. МАССИВЫ
Массив представляет собой упорядоченный набор элементов одного типа, каждый из которых имеет свой номер, называемый индексом (индексов
может быть несколько, тогда массив называется многомерным). Тип массива конструируется следующим образом:
array [тип индекса1, ..., тип индексаN] of базовый тип
Тип индекса обязательно представляет собой интервальный тип и обязательно должен задаваться в виде a..b, где a и b – константные выражения
целого, символьного или перечислимого типа. Например:
type enum=(w1,w2,w3,w4,w5);
var
a1,a2: array [1..10] of integer;
b: array ['a'..'z',w2..w4] of string;
c: array [1..10] of array [1..5] of real;
49
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Базовый тип может быть любым (в частности, он может быть типом
массива, как для переменной c).
Переменные-массивы одного типа можно присваивать друг другу, при
этом будет производиться копирование содержимого одного массива в другой:
a1:=a2;
К элементам массива обращаются при помощи переменных с индексами:
a1[3]:=a2[5];
b['f',w3]:='Hello';
c[3][4]:=3.14
Наиболее часто встречающаяся ошибка при работе с массивами – выход
за границы изменения индекса. В Pascal ABC возникновение этой ошибки
приводит к завершению работы программы.
7.1. Одномерные массивы
Пример. Заполнить одномерный целочисленный массив случайными
числами и найти наибольшее из них.
Максимальное количество элементов массива равно значению константы nmax.
const nmax=100;
type
myarray = array[1..nmax] of integer;
Процедура InitArr заполняет массив случайными числами от 0 до 99:
procedure InitArr(var a: myarray;n: integer);
var i: integer;
begin
randomize;
for i:=1 to n do a[i]:=random(100)
end;
Второй параметр n получает количество элементов массива.
50
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Процедура PrintArr выводит элементы массива в окно вывода:
procedure PrintArr(var a: myarray;n: integer);
var i: integer;
begin
for i:=1 to n do write(a[i]:4)
end;
Функция MaxElem находит максимальный элемент массива:
function MaxElem(var a: myarray;n: integer):integer;
var i: integer;
begin
result:=a[1];
for i:=1 to n do
if a[i]>result then result:=a[i]
end;
Тогда вся программа целиком выглядит следующим образом:
const nmax=100;
type
myarray = array[1..nmax] of integer;
procedure InitArr(var a: myarray;n: integer);
var i: integer;
begin
randomize;
for i:=1 to n do a[i]:=random(100)
end;
procedure PrintArr(var a: myarray;n: integer);
var i: integer;
begin
for i:=1 to n do write(a[i]:4);
writeln
end;
function MaxElem(var a: myarray;n: integer):integer;
var i: integer;
begin
51
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
result:=a[1];
for i:=1 to n do
if a[i]>result then result:=a[i]
end;
var a: myarray;
begin
InitArr(a); PrintArr(a);
writeln('Максимальный элемент равен’,MaxElem(a):4)
end.
7.1.1. Удаление и вставка элементов
Для того, чтобы удалить k-ый элемент массива нужно сдвинуть все элементы, начиная с k + 1, на один элемент влево; количество элементов массива при этом уменьшится на 1.
procedure DelElem (var a: myarray; var n: integer; k: integer);
var i: integer;
begin
dec(n);
for i:=k to n do a[i]:=a[i+1]
end;
Для того, чтобы вставить в массив на k-ое место элемент elem, нужно
сначала все элементы, начиная с k-ого сдвинуть на один элемент вправо, а
затем k-ому элементу присвоить значение elem; количество элементов массива при этом увеличится на 1.
procedure InsElem (var a: myarray; var n: integer; elem,k: integer);
var i: integer;
begin
for i:=n downto k do a[i+1]:=a[i]
a[k]:=elem;
inc(n)
end;
52
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
7.1.2. Сортировка массива
Рассмотрим задачу: упорядочить целочисленный массив по неубыванию
элементов. Процесс упорядочения множества объектов по заданному признаку называется сортировкой.
Процедура Sort1 реализует один из простейших методов сортировки
простым выбором, состоящий в том, что максимальный элемент массива
меняется местами с последним (n-ым) элементом; описанные действия повторяются n–1 раз, каждый раз уменьшая на 1 количество рассматриваемых
элементов.
Procedure Sort1(var a:myarray;n: integer);
var k,i,m,imax: integer;
begin
for k:=n downto 2 do
begin
imax:=1; //начальное значение индекса максимального
элемента
for i:=1 to k do if a[i]>a[imax] then imax:=i
if imax<k then ;//перестановка элементов
begin
m:=a[imax]; a[imax]:=a[k]; a[k]:=m
end;
end;
end;
Процедура Sort2 реализует метод сортировки простым обменом, суть
которого в том, что при очередном просмотре массива соседние элемены
переставляются, если предшествующий элемент больше следующего; количество просмотров равно n-1.
Procedure Sort2(var a:myarray;n: integer);
var k,i,m: integer;
begin
for k:=1 to n-1 do //цикл по номеру просмотра
for i:=1 to n-k do
53
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
if a[i]>a[i+1] then //перестановка элементов
begin
m:=a[i]; a[i]:=a[i+1]; a[i+1]:=m
end;
end;
Данный метод также называют методом «пузырька». Это название происходит от образной интерпретации, при которой в процессе выполнения
сортировки более «легкие» элементы постепенно всплывают на поверхность.
7.1.3. Задания
Анализ элементов массива
1. Дан массив размера N и целые числа K и L (1 ≤ K ≤ L ≤ N). Найти
сумму элементов массива с номерами от K до L включительно.
2. Дан массив размера N и целые числа K и L (1 ≤ K ≤ L ≤ N). Найти среднее арифметическое элементов массива с номерами от K до L включительно.
3. Дан целочисленный массив размера N, не содержащий одинаковых
чисел. Проверить, образуют ли его элементы арифметическую прогрессию.
Если образуют, то вывести разность прогрессии, если нет – вывести 0.
4. Дан массив ненулевых целых чисел размера N. Проверить, образуют
ли его элементы геометрическую прогрессию. Если образуют, то вывести
знаменатель прогрессии, если нет – вывести 0.
5. Дан целочисленный массив размера N. Проверить, чередуются ли в нем
четные и нечетные числа. Если чередуются, то вывести 0, если нет, то вывести
порядковый номер первого элемента, нарушающего закономерность.
6. Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем положительные и отрицательные числа. Если чередуются, то
вывести 0, если нет, то вывести порядковый номер первого элемента, нарушающего закономерность.
54
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
7. Дан массив A размера N. Найти минимальный элемент из его элементов с четными номерами.
8. Дан массив A размера N. Найти максимальный элемент из его элементов с нечетными номерами.
9. Дан массив размера N. Найти номера тех элементов массива, которые
больше своего правого соседа, и количество таких элементов. Найденные
номера выводить в порядке их возрастания.
10. Дан массив размера N. Найти номера тех элементов массива, которые
больше своего левого соседа, и количество таких элементов. Найденные номера выводить в порядке их убывания.
11. Дан массив размера N. Найти номер его первого локального минимума
(локальный минимум – это элемент, который меньше любого из своих соседей).
12. Дан массив размера N. Найти номер его последнего локального максимума (локальный максимум – это элемент, который больше любого из своих соседей).
Изменение элементов массива
1. Дан массив размера N. Поменять местами его минимальный и максимальный элементы.
2. Дан массив размера N (N – четное число). Поменять местами его первый элемент со вторым, третий – с четвертым и т. д.
3. Дан массив размера N (N – четное число). Поменять местами первую
и вторую половины массива.
4. Дан массив размера N. Поменять порядок его элементов на обратный.
5. Дан массив A размера N и целые числа K и L (1 < K < L < N). Переставить в обратном порядке элементы массива, расположенные между элементами AK и AL, включая эти элементы.
55
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
6. Дан массив A размера N и целые числа K и L (1 < K < L < N). Переставить в обратном порядке элементы массива, расположенные между элементами AK и AL, не включая эти элементы.
7. Дан массив размера N. Обнулить элементы массива, расположенные
между его минимальным и максимальным элементами (не включая минимальный и максимальный элементы).
8. Дан массив размера N. Переставить в обратном порядке элементы
массива, расположенные между его минимальным и максимальным элементами, включая минимальный и максимальный элементы.
9. Дан массив размера N. Заменить каждый элемент массива на среднее
арифметическое этого элемента и его соседей.
10. Дан массив размера N . Осуществить сдвиг элементов массива вправо
на одну позицию (при этом A1 перейдет в A2, A2 – в A3,…, AN-1 – в AN,a исходное значение последнего элемента будет потеряно). Первый элемент полученного массива положить равным 0.
Удаление и вставка элементов
1. Дан массив размера N и целые числа K и L (1 < K < L < N). Удалить из
массива элементы с номерами от K до L включительно и вывести размер полученного массива и его содержимое.
2. Дан целочисленный массив размера N. Удалить из массива все нечетные числа и вывести размер полученного массива и его содержимое.
3. Дан целочисленный массив размера N (> 2). Удалить из массива все
элементы с четными номерами. Условный оператор не использовать.
4. Дан целочисленный массив размера N (> 2). Удалить из массива все
элементы с нечетными номерами. Условный оператор не использовать.
5. Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы, оставив их первые вхождения.
56
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
6. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся менее трех раз, и вывести размер полученного массива и его содержимое.
7. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз, и вывести размер полученного массива и его содержимое.
8. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся ровно два раза, и вывести размер полученного массива и его содержимое.
9. Дан массив размера N и целое число K (1 ≤ K ≤ N). Перед элементом
массива с порядковым номером K вставить новый элемент с нулевым значением.
10. Дан массив размера N и целое число K (1 ≤ K ≤ N). После элемента
массива с порядковым номером K вставить новый элемент с нулевым значением.
11. Дан массив размера N. Вставить элемент с нулевым значением перед
минимальным и после максимального элемента массива.
12. Дан массив размера N. Продублировать в нем элементы с четными
номерами. Условный оператор не использовать.
7.2. Двумерные массивы
Массивы, элементы которых имеют два индекса, называют двумерными. Логическая структура такого массива может быть представлена прямоугольной матрицей. Каждый элемент матрицы однозначно определяется
указанием номера строки и номера столбца.
Пример 1. Заполнить двумерный целочисленный массив и найти сумму
элементов произвольного столбца.
57
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Пусть константы m и n определяют количество строк и столбцов соответственно:
const m=10;
n=7;
type
matrix = array[1..m,1..n] of integer;
Процедура InitMatr заполняет массив случайными числами от –50 до 49:
procedure InitMatr(var a: matrix);
var i,j: integer;
begin
for i:=1 to m do
begin
randomize;
for j:=1 to m do a[i,j]:=random(50)-50
end
end;
Процедура PrintMatr выводит элементы массива в окно вывода:
procedure PrintMatr(var a: matrix);
var i,j: integer;
begin
for i:=1 to m do
begin
for j:=1 to n do write(a[i]:4);
writeln
end
end;
Функция Sum находит сумму элементов j-ого столбца:
function Sum(var a: matrix; j:integer):integer;
var i:integer;
begin
result:=0;
for i:=1 to m do result:=result+a[i,j]
end;
58
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Пример 2. Поменять местами строки матрицы с номерами k1 и k2.
Процедура SwapCol меняет местами строки с номерами k1 и k2.
procedure SwapCol(var a: matrix; k1,k2: integer);
var j,m:integer;
begin
for j:=1 to n do
begin
m:=a[k1,j]; a[k1,j]:=a[k2,j]; a[k2,j]:=m
end;
end;
7.2.1. Диагонали квадратной матрицы
Матрица a, количество строк которой совпадает с количеством столбцов
и равно n, называется квадратной матрицей порядка n. Элементы a1,1, a2,2,
a3,3…, an,n образуют главную диагональ, а элементы a1,n, a2,n-1, a3,n-2…, an,1
побочную диагональ матрицы a.
Пример. Дана квадратная матрица порядка n. Обнулить элементы матрицы, лежащие выше побочной диагонали.
const n=10;
type
matrix = array[1..n,1..n] of integer;
Procedure UpNulling (var a: matrix);
var i,j: integer;
begin
for i:=1 to n-1 do
for j:=1 to n-i do a[i,j]:=0
end;
7.2.2. Задания
Анализ элементов матрицы
1. Дана матрица размера M × N и целое число K (1 ≤ K ≤ M). Найти сумму и произведение элементов K-й строки данной матрицы.
59
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2. Дана матрица размера M × N и целое число K (1 ≤ K ≤ N). Найти сумму и произведение элементов K-го столбца данной матрицы.
3. Дана матрица размера M × N. Для каждой строки матрицы найти
сумму ее элементов.
4. Дана матрица размера M × N. Для каждого столбца матрицы найти
произведение его элементов.
5. Дана матрица размера M × N. Для каждой строки матрицы с нечетным номером найти среднее арифметическое ее элементов. Условный оператор не использовать.
6. Дана матрица размера M × N. Для каждого столбца матрицы с четным
номером найти сумму его элементов. Условный оператор не использовать.
7. Дана матрица размера M × N. В каждой строке матрицы найти минимальный элемент.
8. Дана матрица размера M × N. В каждом столбце матрицы найти максимальный элемент.
9. Дана матрица размера M × N. Найти номер ее строки с наибольшей
суммой элементов и вывести данный номер, а также значение наибольшей
суммы.
10. Дана матрица размера M × N. Найти номер ее столбца с наименьшим
произведением элементов и вывести данный номер, а также значение наименьшего произведения.
11. Дана матрица размера M × N. Найти максимальный среди минимальных элементов ее строк.
12. Дана матрица размера M × N. Найти минимальный среди максимальных элементов ее столбцов.
60
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Преобразование матрицы
1. Дана матрица размера M × N и целые числа k1 и k2 ( 1 < k1< k2 < М).
Поменять местами строки матрицы с номерами k1 и k2.
2. Дана матрица размера M × N и целые числа k1 и k2 ( 1 < k1< k2 < М).
Поменять местами столбцы матрицы с номерами k1 и k2.
3. Дана матрица размера M × N. Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке.
4. Дана матрица размера M × N. Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждом столбце.
5. Дана матрица размера M × N. Поменять местами строки, содержащие
минимальный и максимальный элементы матрицы.
6. Дана матрица размера M × N. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.
7. Дана матрица размера M × N. Поменять местами столбец с номером 1 и
последний из столбцов, содержащих только положительные элементы. Если
требуемых столбцов нет, то вывести матрицу без изменений.
8. Дана матрица размера M × N. Поменять местами столбец с номером N и
первый из столбцов, содержащих только отрицательные элементы. Если
требуемых столбцов нет, то вывести матрицу без изменений.
9. Дана матрица размера M × N (М – четное число). Поменять местами
верхнюю и нижнюю половины матрицы.
10. Дана матрица размера M × N (N – четное число). Поменять местами
левую и правую половины матрицы.
11. Дана матрица размера M × N (М и N – четные числа). Поменять местами левую верхнюю и правую нижнюю четверти матрицы.
12. Дана матрица размера M × N (М и N – четные числа). Поменять местами левую нижнюю и правую верхнюю четверти матрицы.
61
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Диагонали квадратной матрицы
1. Дана квадратная матрица A порядка M. Найти сумму элементов ее
главной диагонали.
2. Дана квадратная матрица A порядка M. Найти среднее арифметическое элементов ее побочной диагонали.
3. Дана квадратная матрица A порядка M. Найти сумму элементов каждой ее диагонали, параллельной главной (начиная с одноэлементной диагонали A1,M).
4. Дана квадратная матрица A порядка M. Найти сумму элементов каждой ее диагонали, параллельной побочной (начиная с одноэлементной диагонали A1,1).
5. Дана квадратная матрица A порядка M. Найти среднее арифметическое элементов каждой ее диагонали, параллельной главной (начиная с одноэлементной диагонали A1,M).
6. Дана квадратная матрица A порядка M. Найти среднее арифметическое элементов каждой ее диагонали, параллельной побочной (начиная с
одноэлементной диагонали A1,1).
7. Дана квадратная матрица A порядка M. Найти минимальный элемент
для каждой ее диагонали, параллельной главной (начиная с одноэлементной
диагонали A1,M).
8. Дана квадратная матрица A порядка M. Найти максимальный элемент
для каждой ее диагонали, параллельной побочной (начиная с одноэлементной диагонали A1,1).
9. Дана квадратная матрица порядка M. Обнулить элементы матрицы,
лежащие ниже главной диагонали. Условный оператор не использовать.
10. Дана квадратная матрица порядка M. Обнулить элементы матрицы,
лежащие выше побочной диагонали. Условный оператор не использовать.
62
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
11. Дана квадратная матрица порядка M. Обнулить элементы матрицы,
лежащие на побочной диагонали и ниже нее. Условный оператор не использовать.
12. Дана квадратная матрица порядка M. Обнулить элементы матрицы,
лежащие на главной диагонали и выше нее. Условный оператор не использовать.
8. МНОЖЕСТВА
Множество представляет собой набор элементов одного порядкового
типа. Элементы множества считаются неупорядоченными; каждый элемент
может входить во множество не более одного раза. Тип множества описывается следующим образом:
set of базовый тип
В качестве базового может быть любой порядковый тип с элементами,
для которых функция Ord возвращает значения в диапазоне от 0 до 255. Например:
type
ByteSet = set of byte;
CharSet = set of char;
Digits = set of '0'..'9';
SeasonSet = set of (Winter,Spring,Summer,Autumn);
Переменная типа множество занимает 16 байт и может содержать несколько значений базового типа. Чтобы сконструировать значение типа
множество, используется конструкция вида
[список значений]
где в списке могут перечисляться через запятую либо выражения базового
типа, либо их диапазоны в виде a..b, где a и b – выражения базового типа.
Например:
var
bs: ByteSet;
63
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
bestdays: set of (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
...
bs:=[1,3,5,20..25];
bestdays:=[Wed,Thr..Sun];
Значения в списке могут отсутствовать, тогда множество является пустым:
bs:=[];
Операция in проверяет принадлежность элемента множеству:
if Wed in bestdays then ...
Для множеств определены операции + (объединение), – (разность), *
(пересечение), = (равенство), <> (неравенство), <= (вложено) и и >= (содержит).
Множества с совместимыми базовыми типами неявно преобразуются
одно к другому. При присваивании множеству при необходимости происходит усечение его элементов до значений базового типа. Например:
var st: set of 3..9;
...
st:=[1..5,8,10,12]; // в st попадут значения [3..5,8]
Чтобы вывести значения элементов множества, необходимо перебрать
всевозможные значения в цикле и проверить их на принадлежность множеству с помощью операции in:
for i:=0 to 255 do
if i in st then write(i,' ');
Стандартные процедуры для работы с множествами:
include(s,i) – включает элемент i базового типа в множество s.
exclude(s,i) – исключает элемент i из множества s.
Использование множеств позволяет сделать программы более эффективными за счет уменьшения количества различных проверок.
Пример. Напечатать все слова, входящие в строку (словом называется
любая последовательность русских или латинских букв).
64
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
const letters = [‘a’..’z’,’A’..’Z’,‘а'..'я','А'..'Я'];
var s,word: string;
i:integer;
begin
writeln('Введите строку:');
readln(s);
word:=’’;
for i:=1 to length(s) do
if s[i] in letters then word:=word+s[i] else
if word>’’ then
begin
writeln(word);
word:=’’
end
if word>’’ then writeln(word)
end.
Для проверки того, что очередной символ строки является буквой, используется константное множество letters.
9. ЗАПИСИ
Запись – это структура данных, состоящая из фиксированного числа
компонентов, называемых полями записи. Компоненты (поля) записи могут
быть различного типа.
Описание типа запись:
record список полей end;
Список полей представляет собой последовательность разделов записи,
между которыми ставится точка с запятой. Каждый раздел записи состоит из
одного или нескольких идентификаторов полей, отделенных друг от друга
запятыми. За идентификатором ставится двоеточие и описание типа поля.
Пример. Запись в телефонной книге может быть представлена в виде
следующей структуры данных:
type TPhone = record
number: integer;
65
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
fio: string[80];
adr: string[60]
end;
var m, v: TPhone;
Обращение к значению поля осуществляется с помощью идентификатора
переменной записи и идентификатора поля, разделенных точкой. Например:
m.number; m.fio; m.adr;
Поля записи используются в программе как обычные переменные соответствующего типа. Например, можно написать
m.number:=m.number + 1;
или
m.fio[1]<>′Ф′
Допускается применение оператора присваивания к записи в целом. Например,
v:=m;
После выполнения этого оператора значения полей записи v станут равны значениям соответствующих полей записи m. Логические операции
сравнения для записей не определены. Тип запись нельзя использовать для
описания типа функции.
Обращение к полям записи имеет несколько громоздкий вид. Для решения этой проблемы в языке Pascal ABC предназначен оператор присоединения with, который имеет следующий формат:
with переменная типа запись do оператор;
Один раз указав переменную типа запись в операторе with, можно далее
работать с именами полей без указания перед идентификатором поля имени
записи. Например:
with m do
begin
number:=1364;
66
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
fio:=′Петров′
end;
Пример. Описать функцию поиска телефонного номера по имени абонента в телефонном справочнике. Телефонный справочник представлен в
виде массива записей.
const count=1000;
type
TPhone = record
number: integer;
fio: string[80];
adr: string[60]
end;
TParray = array [1..count] of TPhone;//массив записей
function Pnumber (var list: TParray;fio: string[40]):integer;
var i:integer;
begin
result:=0; i:=0;
repeat
inc(i);
if list[i].fio=fio then result:=list[i].number
until (result>0) or (i=count)
end;
Задания
1. Сведения об ученике состоят из его имени и фамилии, названия класса
(года обучения и буквы), в котором он учится, оценок, полученных за последнюю четверть. Дан массив, содержащий сведения об учениках школы.
a) Выяснить, имеются ли в школе однофамильцы.
b) Выяснить, имеются ли однофамильцы в каких-либо параллельных классах.
67
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
c) Ответить на вопросы a) – b), но в отношении учеников, у которых совпадают и имя, и фамилия.
d) Выяснить, в каких классах насчитывается более 15 учащихся.
e) Выяснить, на сколько человек в восьмых классах больше, чем в
десятых.
f) Собрать все сведения об учениках 9–10-х классов, упорядочив их
по году обучения и букве.
g) Выяснить, сколько учеников школы имеют оценки не ниже четырех.
h) Сформировать массив из лучших учеников школы, т. е. из учеников, не имеющих отметок ниже четырех и по сумме баллов не уступающих другим ученикам своего и параллельных классов.
i) Проверить правильность заполнения массива: всегда ли год обучения лежит в пределах от 1 до 11.
2. Багаж пассажира характеризуется количеством вещей и общим весом
вещей. Дан массив, содержащий информацию о багаже нескольких пассажиров.
a) Найти багаж, средний вес каждой вещи которого отличается не
более чем на 0,3 кг от среднего веса вещей всех пассажиров.
b) Найти число пассажиров, имеющих более двух вещей, и число
пассажиров, количество вещей которых превосходит среднее число вещей.
c) Определить, имеются ли два пассажира, багажи которых совпадают по числу вещей и отличаются по весу не более чем на 0,5 кг.
d) Выяснить, имеется ли пассажир, багаж которого превышает багаж каждого из остальных пассажиров и по количеству вещей, и по весу.
e) Выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом не менее 30 кг.
68
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
f) Дать сведения о багаже, число вещей в котором не меньше, чем
в любом другом багаже, а вес вещей не больше, чем в любом другом багаже
с этим же количеством вещей.
g) Упорядочить сведения о багаже по невозрастанию веса багажа.
h) Удалить сведения о багаже, общий вес вещей в котором меньше, чем 10 кг.
10. ФАЙЛЫ
Файл в Pascal ABC представляет собой последовательность элементов
одного типа, хранящихся на диске. В Pascal ABC имеется два типа файлов –
типизированные и текстовые. Для описания текстового файла используется стандартное имя типа text, а для описания типизированного файла –
конструкция file of тип элементов:
var
f1: file of real;
f2: text;
10.1. Стандартные процедуры и функции для работы с файлами
Работа с файлами заключается в записи и считывании информации. Для
того чтобы указать, с каким элементом будет производиться очередная операция чтения или записи, существует понятие указателя на доступный элемент файла. После каждого чтения или записи указатель перемещается на
следующий элемент файла.
Перед использованием файловой переменной она должна быть связана с
внешним файлом (файлом на диске) с помощью вызова процедуры
Assign(файловая переменная,имя файла);
здесь файловая переменная – имя переменной файлового типа, объявленной в программе; имя файла – символьная строка, содержащая имя файла.
Если файл находится в одной папке с обрабатывающей его программой, то
69
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
достаточно указать только имя файла, в противном случае надо указать
полный путь к файлу, например:
′d:\files\file1.txt′
Когда связь с внешним файлом установлена, его можно открыть для
ввода или вывода информации. Существующий файл можно открыть с помощью процедуры
Reset(файловая переменная);
Процедура reset открывает существующий внешний файл, имя которого было связано с файловой переменной. Если внешний файл с указанным именем отсутствует, то возникает ошибка периода выполнения программы. Если файл уже открыт, то он сначала закрывается, а затем открывается вновь. Файловый указатель устанавливается на элемент файла с порядковым номером 0.
Текстовый файл, открытый процедурой reset, доступен только для
чтения. Для типизированных файлов, открытых процедурой reset, допускается выполнять операции чтения и записи в файл.
Новый файл можно создать и открыть для записи с помощью процедуры
Rewrite(файловая переменная);
Процедура rewrite создает новый файл, имя которого связано с файловой переменной. Если файл с указанным именем уже существует, то он
удаляется и на его месте создается новый пустой файл. Текущая позиция в
файле устанавливается на начало файла, т. е. указатель будет указывать на
элемент с порядковым номером 0.
Если процедура rewrite открывает текстовый файл, то он становится
доступным только для записи. Для типизированных файлов, открытых процедурой rewrite, допускается выполнять операции чтения и записи в файл.
Текстовый файл может быть открыт процедурой
Append(файловая переменная);
70
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Процедура append открывает уже существующий внешний файл, связанный с файловой переменной, для добавления новой информации. Если
файла с указанным именем не существует, то возникает ошибка. Если файл
уже открыт, то он сначала закрывается, а затем открывается заново. Указатель будет указывать на конец файла. В результате обращения к append
текстовый файл становится доступным только для записи.
Когда программа завершает обработку файла, он должен быть закрыт с
помощью стандартной процедуры
Close(файловая переменная);
Процедура close закрывает открытый файл. При этом обеспечивается
сохранение в файле всех новых записей и регистрация файла в папке. Процедура close не разрывает связь файла с файловой переменной, поэтому файл
можно открыть снова без повторного использования процедуры assign.
10.2. Текстовые файлы
Текстовый файл представляет собой последовательность символов,
сгруппированных в строки произвольной длины, где каждая строка заканчивается признаком конца строки, состоящим из двух символов: #13 – конец строки и #10 – возврат каретки. Заканчивается файл символом конца
файла #26.
Чтение данных из произвольного текстового файла можно осуществить с
помощью процедур read и readln. При этом в списке их параметров первой
должна стоять соответствующая файловая переменная. Например, процедура
read(f,x,y,z);
осуществляет чтение из файла, связанного с файловой переменной f, значения переменных x, y, z. Процедура
readln(f,a);
71
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
прочитает из файла, связанного с переменной f, значение переменной a и
перейдет в этом файле к следующей строке.
Вывод данных в текстовый файл производится процедурами write и
writeln, у которых первой в списке параметров указана соответствующая
файловая переменная. Например, процедура
write(f,′ s = ′,s)
осуществляет запись в файл, связанный с переменной f, символьной строки ′ s = ′ и значения переменной s. Процедура
writeln(f)
просто запишет в файл, связанный с переменной f, маркер конца строки.
При работе с текстовыми файлами используются логические функции
eof(файловая переменная) и eoln(файловая переменная). Функция
eof возвращает значение True, если достигнут конец файла, и False в
противном случае. Функция eoln возвращает значение True, если достигнут конец строки в текстовом файле, и False в противном случае.
Пример. Вычислить количество строк из пяти символов данного текстового файла.
var
s: string;
count: integer;
f: text;
begin
assign(f,’file.txt’);
reset(f);
count:=0;
while not eof(f) do
begin
readln(f,s);
if length(s)=5 then inc(count)
end;
72
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
close(f);
writeln(count)
end.
10.2.1. Задания
1. Дано имя файла и целые положительные числа: N и K. Создать текстовый файл с указанным именем и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).
2. Дано имя файла и целое число N (0 < N < 27). Создать текстовый файл
с указанным именем и записать в него N строк: первая строка должна содержать строчную (то есть маленькую) латинскую букву «a», вторая– буквы «ab», третья – буквы «abc» и т. д.; последняя строка должна содержать N
начальных строчных латинских букв в алфавитном порядке.
3. Дано имя файла и целое число N (0 < N < 27). Создать текстовый файл
с указанным именем и записать в него N строк длины N; строка с номером K
(K = 1,...,N) должна содержать K начальных прописных (т. е. заглавных) латинских букв, дополненных справа символами «*» (звездочка). Например,
для N = 4 файл должен содержать строки «A***», «AB**», «ABC*»,
«ABCD».
4. Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).
5. Дана строка S и текстовый файл. Добавить строку S в конец файла.
6. Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.
7. Дана строка S и текстовый файл. Добавить строку S в начало файла.
8. Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла.
73
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
9. Дано целое число K и текстовый файл. Вставить пустую строку перед
строкой файла с номером K. Если строки с таким номером нет, то оставить
файл без изменений.
10. Дано целое число K и текстовый файл. Вставить пустую строку после
строки файла с номером K. Если строки с таким номером нет, то оставить
файл без изменений.
11. Дан текстовый файл. Продублировать в нем все пустые строки.
12. Дана строка S и текстовый файл. Заменить в файле все пустые строки
на строку S.
10.3. Типизированные файлы
Типизированный файл содержит элементы одного типа. Создать и просмотреть такой файл при помощи текстового редактора как текстовый файл
нельзя. Поэтому обработка таких файлов должна осуществляться программным путем. Напомним, что описание файловой переменной, соответствующей типизированному файлу, имеет вид:
var имя файловой переменной: file of тип;
Тип данных может быть любым кроме файлового. Так, например, описание:
const NumSemester=10;
type
TStud = record
FIO
: string[80]; // фамилия имя отчество
DateOfBirth : DateTime;
// дата рождения
MedB : array [1..NumSemester] of real;
// средние оценки за семестр
Year : byte;
// курс
End;
fStud = file of TStud;
объявляет типизированный файл, содержащий записи о студентах.
74
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Для чтения данных из типизированного файла применяется процедура
read. Список ввода процедуры read должен содержать переменные того
же типа, что и элементы файла. Для записи в типизированный файл используется процедура write, список вывода которой должен содержать переменные того же типа, что и элементы файла. Процедуры readln и
writeln для типизированных файлов не применяются.
Доступ к текстовым файлам возможен только последовательно, т. е. когда элемент считывается или записывается, указатель файла перемещается к
следующему по порядку элементу файла. К типизированным файлам можно
организовать прямой доступ с помощью стандартной процедуры
procedure seek(var f; n:integer);
которая перемещает файловый указатель в типизированном файле, связанном с файловой переменной f, на элемент с номером n. Нумерация элементов в файле начинается с нуля. Для определения текущей позиции в
файле используется функция
function filepos(var f):integer;
Для определения размера файла используется функция
function filesize(var f):integer;
Например, для установки файлового указателя на последний элемент
файла f достаточно записать
seek(f,filesize(f)–1);
на первый элемент файла
seek(f,0);
вернуться на один элемент назад
seek(f,filepos(f)–1);
Для удаления всех элементов файла с текущей позиции файлового указателя до конца файла используется процедура
procedure truncate(f);
75
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Применение процедур assign и close для типизированных файлов не
отличается от текстовых файлов. Процедура reset в отличие от текстовых
файлов допускает для типизированных файлов не только чтение, но и запись в файл. Процедура rewrite в отличие от текстовых файлов допускает
не только запись, но и чтение из файла. Процедура append и функция
eoln для типизированных файлов не работают.
Пример. Вывести информацию о самом молодом студенте с указанием
возраста. Использовать типизированный файл c информацией о студентах
Stud.dat со структурой, описанной выше.
Тип записи DateTime описан в модуле Utils следующим образом:
type
DateTime = record
Day, Month, Year, Hour, Minute, Second, Milliseconds: integer;
end;
Функция Diff записывает разность между двумя датами в виде семиразрядного целого числа. Функция CurrentDateTime, описанная в модуле
Utils, возвращает текущую дату.
uses Utils;
const NumSemester=10;
MaxAge:=1000000;
type
TStud = record
FIO
: string[80];
DateOfBirth : DateTime;
MedB : array [1..NumSemester] of real;
Year : byte;
End;
fStud = file of TStud;
function Diff(var date2,date1:datetime):integer;
begin
76
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
result:=10000*(date2.Year-date1.Year)+100*(date2.Monthdate1.Month)+(date2.Day-date1.Day)
end;
var
Stud, YStud: TStud;
age, minage: integer;
begin
assign(fStud,Stud.dat);
reset(fStud);
minage:=maxage;
while eof(fStud) do
begin
read(fStud,Stud);
age:=diff(CurrentDateTime,Stud.DateOfBirth);
if age<minage then
begin
minage:=age;
YStud:=Stud
end;
end;
if minage<maxage then
begin
writeln(‘ФИО: ’,YStud.fio);
writeln(‘Возраст: ’,minage div 10000);
writeln(‘Курс: ’,YStud.year);
end;
end.
10.3.1. Задания
В заданиях использовать типизированный файл c информацией о студентах Stud.dat.
1. Вывести список студентов, для которых дни рождения попадают на
дни текущей недели.
77
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
2. Вывести список студентов, у которых средний балл постоянно увеличивается от семестра к семестру.
3. Вывести список студентов, у которых средний балл постоянно
уменьшается за все время обучения.
4. Вывести информацию о самых молодых студентах с указанием возраста – N человек, начиная с самого молодого, N определяется вводом.
5. Организовать поиск студентов по ФИО, курсу, году рождения.
6. Определить курсы, у которых средний балл ниже среднего по отделению.
7. Вывести информацию о студентах, которые стали учиться хуже, чем
на 1-ом курсе.
8. Упорядочить список студентов по среднему баллу, вывести его.
9. Вывести список студентов, у которых средний балл больше 40.
10. Вывести студента с наибольшим средним баллом на каждом курсе.
11. Вывести студента с наименьшим средним баллом на каждом курсе.
12. Составить список 5-ти студентов с максимальным средним баллом.
78
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
СПИСОК ЛИТЕРАТУРЫ
1. Абрамян М.Э. Задачник по программированию / М.Э. Абрамян. – Ростов н/Д, 2007. – 156 с.
2. Тюкачев Н.А. Основы программирования в Delphi : учебное пособие /
Н.А. Тюкачев, Е.Е. Михайлова, К.С. Рыбак. – Воронеж : Издательскополиграфический центр Воронежского государственного университета,
2007. – 286 с.
3. Архангельский А.Я. Программирование в Delphi 6 / А.Я. Архангельский. – М. : Бином, 2002.
4. Ускова О.Ф. Программирование на языке Паскаль : задачник / О.Ф. Ускова, М.В. Бакланов, О.Д. Горбенко, И.Е. Воронина, Г.Э. Вощинская,
Н.В. Огаркова, В.М. Мельников. – СПб. : Питер, 2002. – 336 с.
79
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Учебное издание
ОСНОВЫ ПРОГРАММИРОВАНИЯ
В СИСТЕМЕ PASCAL ABC
Учебно-методическое пособие для вузов
Составители:
Копытин Алексей Вячеславович,
Соломатин Дмитрий Иванович,
Другалев Александр Иванович
Корректор Е.А. Глаголева
Подписано в печать 08.12.2009. Формат 60×84/16. Усл. печ. л. 4,6.
Тираж экз. Заказ 1603.
Издательско-полиграфический центр
Воронежского государственного университета.
394000, г. Воронеж, пл. им. Ленина, 10. Тел. (факс) +7 (4732) 598-026
http://www.ppc.vsu.ru; e-mail: pp_center@ppc.vsu.ru
Отпечатано в типографии Издательско-полиграфического центра
Воронежского государственного университета.
394000, г. Воронеж, ул. Пушкинская, 3
Документ
Категория
Информатика и программирование
Просмотров
2 618
Размер файла
583 Кб
Теги
abc, 795, система, основы, программирование, pascal
1/--страниц
Пожаловаться на содержимое документа