Язык программирования Турбо Паскаль

advertisement
1
2
3
4
5
Содержание
Содержание .................................................................................................. 1
Алфавит языка ..................................................................................................... 3
1.1 Символы, используемые в идентификаторах ........................................... 3
1.2 Разделители .................................................................................................. 3
1.3 Специальные символы ................................................................................ 4
1.4 Знаки пунктуации ........................................................................................ 4
Структура программы. ........................................................................................ 5
Типы данных........................................................................................................ 5
3.1 Классификация типов данных .................................................................... 6
3.2 Простые типы данных ................................................................................. 7
3.2.1 Целые типы ........................................................................................ 7
3.2.2 Логический тип ................................................................................. 7
3.2.3 Символьный тип ................................................................................ 7
3.2.4 Перечисляемый тип .......................................................................... 7
3.2.5 Тип-диапазон ..................................................................................... 8
3.2.6 Вещественные типы .......................................................................... 8
Выражения ........................................................................................................... 8
4.1 Переменные ................................................................................................. 9
4.2 Константы .................................................................................................... 9
4.2.1 Целые константы ............................................................................. 10
4.2.2 Вещественные константы ............................................................... 10
4.2.3 Строковые и символьные константы ............................................ 10
4.2.4 Константные выражения ................................................................ 10
4.2.5 Типизированные константы ........................................................... 11
4.3 Стандартные функции .............................................................................. 11
4.3.1 Арифметические функции ............................................................. 11
4.3.2 Функции преобразования типа ...................................................... 12
4.4 Арифметические операции ....................................................................... 12
4.5 Логические операции ................................................................................ 13
4.6 Операции отношения ................................................................................ 13
4.7 Порядок вычисления выражений ............................................................. 13
Операторы языка ............................................................................................... 15
5.1 Простые операторы ................................................................................... 15
5.1.1 Оператор присваивания .................................................................. 15
5.1.2 Оператор безусловного перехода. Использование меток ............ 16
5.1.3 Пустой оператор .............................................................................. 16
5.1.4 Оператор вывода ............................................................................. 16
5.1.5 Оператор ввода данных. ................................................................. 17
5.2 Структурированные операторы ............................................................... 18
5.2.1 Составной оператор ........................................................................ 18
5.2.2 Условный оператор ......................................................................... 18
5.2.3 Оператор выбора. ............................................................................ 23
5.2.4 Оператор цикла с предусловием. ................................................... 25
5.2.5 Оператор цикла с постусловием. ................................................... 27
5.2.6 Оператор арифметического цикла ................................................. 29
1
6 Структурированные типы данных ................................................................... 31
6.1 Массивы ..................................................................................................... 31
6.2.1. Одномерные массивы. .................................................................... 31
6.2.2. Двумерные массивы ........................................................................ 34
6.3. Строки. ....................................................................................................... 36
6.4 Множества ................................................................................................. 40
6.5 Записи ......................................................................................................... 42
6.6 Файлы. ........................................................................................................ 45
6.6.1 Текстовые файлы ........................................................................... 48
7 Подпрограммы................................................................................................... 49
7.1 Подпрограммы-процедуры ....................................................................... 49
7.2 Подпрограммы-функции .......................................................................... 50
2
1
Алфавит языка
Алфавит - совокупность допустимых в языке символов (или групп символов,
рассматриваемых как единое целое). В языке Turbo Pascal все компоненты
формируются из множества символов стандарта ASCII.
Элементы алфавита можно условно разбить на четыре группы:
 символы, используемые в идентификаторах;
 разделители;
 специальные символы;
 неиспользуемые символы.
1.1 Символы, используемые в идентификаторах
Идентификатор - имя любого объекта программы - может включать буквы,
цифры и символ подчеркивания.
В качестве букв можно использовать 26 латинских букв (прописных и строчных) от А до Z и от а до z. Помимо идентификаторов буквы могут использоваться в
шестнадцатеричных числах для обозначения цифр от 10 до 15 (буквы от А до F и от
а до f), строковых константах, служебных словах и комментариях. Следует иметь в
виду, что прописные и строчные буквы в идентификаторах, числах и служебных
словах не различаются: так, например, NAME, Name или nAmE будут идентичны.
Однако в строках символов и комментариях строчные и прописные буквы
различаются и не преобразуются при компиляции друг в друга.
В качестве цифр допустимо использовать 10 арабских цифр от 0 до 9. В идентификаторах они могут присутствовать в любой позиции, кроме первой. Цифры
используются также в изображении числовых констант (например, 157 или 12.8).
Символ подчеркивания может находиться в любой позиции.
Длина идентификатора может быть любой, но значимыми являются только
первые 63 символа, и по этим символам все идентификаторы должны быть уникальными.
1.2 Разделители
Разделители используются для отделения друг от друга идентификаторов, чисел, зарезервированных слов. В качестве разделителей можно использовать:
 пробел;
 любой управляющий символ (коды от 0 до 31), включая символ возврата
каретки (код 13);
 комментарий.
В любом месте программы, где можно поместить один разделитель, их можно
поместить любое количество и в любом сочетании. Это позволяет более наглядно
представить структуру программы.
Комментарии заключаются либо в скобки { }, либо в скобки вида (* *) и могут
занимать любое число строк. Комментарий, в котором за открывающей скобкой
идет знак $, является директивой компилятора. Во время компиляции программы
все комментарии, за исключением директив компилятора, игнорируются.
3
1.3 Специальные символы
Специальные символы, выполняющие в языке определенные функции, можно
разделить на три категории:
1. знаки пунктуации;
2. знаки операций;
3. зарезервированные слова.
1.4 Знаки пунктуации
Допустимые знаки пунктуации и их назначение представлены в табл. 1.
Таблица 1.
Знаки пунктуации языка
{}
Скобки комментария
(* *)
Скобки комментария
[]
Выделение индексов массивов, элементов множеств, размера строки
()
Выделение выражений, списков параметров
‘
Апостроф для выделения символа или строковой константы
;
Разделение предложений программы (операторов и объявлений)
:
Отделение переменной или типизированной константы от типа, метки от
оператора
,
Запятая для разделения элементов списка
..
Разделение границ диапазона
.
^
@
Обозначение конца программы, отделение целой части от дробной в
вещественном числе, отделение полей в записи, отделение идентификатора от
имени модуля или объекта, в котором он находится
Обозначение типа-указателя, значения величины по ее указателю или
управляющего символа (коды от 0 до 31)
Обозначение адреса переменной, типизированной константы, подпрограммы,
метода
#
Обозначение символа по его коду
$
Обозначение директивы компилятора или знак шестнадцатеричного числа
1.1.1. Знаки операций
Знаки операций предназначены для обозначения тех или иных арифметических, логических или других действий. Они бывают двух типов: состоящие из небуквенных символов (например, + - * и т. д.) и буквенные операции (например, not,
div, mod и т. д.), представляющие собой зарезервированные слова. Подробнее о
знаках операций см. п. 4.4.
4
1.1.2. Зарезервированные слова
Зарезервированные слова включают служебные слова (например, begin, end,
div и т. д.) и имена директив (например, external, forward и т. д.). Служебные слова
можно использовать только по своему прямому назначению и их нельзя
переопределять. Директивы также имеют свое определенное назначение, но в отличие от служебных слов их можно переопределить, однако делать это крайне
нежелательно. Полный перечень зарезервированных слов Turbo Pascal 7.0 приведен
в приложении А.
1.2. Неиспользуемые символы
Некоторые символы кодировки ASCII, такие, как, например, %, &, " и т. д.,
включая буквы русского алфавита, не используются в Turbo Pascal, но их можно
использовать в комментариях и символьных строках.
2
Структура программы.
В программе, написанной на языке Turbo Pascal, могут быть следующие
разделы:
Program
Uses
Label
Const
Type
Var
Procedure
Function
Begin
- заголовок программы
- раздел объявления модулей
- раздел объявления меток
- раздел объявления констант
- раздел объявления типов
- раздел описания переменных
- раздел объявления процедур
- раздел объявления функций
- раздел операторов (основная часть)
End.
Заголовок программы состоит из зарезервированного слова program и имени
программы (со списком параметров, заключенных в круглые скобки).
Завершается заголовок точкой с запятой. Разделы должны обязательно
располагаться в указанном выше порядке.
3
Типы данных
Тип данных определяет то множество значений, которое может принимать
переменная, отнесенная к данному типу.
5
3.1 Классификация типов данных
Типы данных
Простые
Порядковые
Структурированные
Массивы
Целые
Записи
Логический
Множества
Символьный
Файлы
Перечисляемый
Указатели
Диапазон
Процедурный
Вещественные
Объекты
Строки
Среди типов, используемых в языке, есть стандартные (предопределенные) и
определяемые программистом.
К стандартным типам, не требующим предварительного определения, относятся целые типы, вещественные типы, логические типы, символьный тип, тип-строка,
ASCIIZ-строка, текстовый файл, тип-указатель. Все другие используемые типы
данных должны быть определены либо в разделе объявления типов, либо в разделе
объявления переменных или типизированных констант.
Раздел объявления типов начинается зарезервированным словом type, после
которого определяются вводимые типы. Определение каждого нового типа начинается с идентификатора типа. За ним следует знак равенства, а далее - само определение, завершающееся точкой с запятой:
type
<имя типа 1> = <определение типа 1>;
<имя типа 2> = <определение типа 2>;
…………………………………………………………………………………………;
<имя типа N> = <определение типа N>;
6
3.2 Простые типы данных
Простой тип определяет упорядоченное множество значений параметра. В
Turbo Pascal имеются следующие группы простых типов:
 целые типы;
 логический тип;
 символьный тип;
 перечисляемый тип;
 тип-диапазон;
 вещественные типы.
Все простые типы, за исключением вещественных, называются порядковыми
типами.
3.2.1
Целые типы
В Turbo Pascal есть пять стандартных типов целых чисел (таблица 2).
Тип
Таблица 2
Целые типы данных
Диапазон значений
integer
byte
–32768..32767
0..255
word
0..65535
shortint
–128..127
longint
–2147483648..2147483647
3.2.2 Логический тип
Стандартный логический тип Boolean представляет собой тип данных, любой
элемент которого может принимать лишь два значения: True и False.
3.2.3
Символьный тип
Стандартный символьный тип Char определяет полный набор ASCII-символов.
Сравниваются величины символьного типа по своим кодам.
3.2.4
Перечисляемый тип
Перечисляемый тип не является стандартным и определяется набором идентификаторов, с которыми могут совпадать значения параметра. Список идентификаторов указывается в круглых скобках, идентификаторы разделяются запятыми:
type
<имя типа> = (<идентификатор 1, идентификатор 2,...,
идентификатор N>);
Важно, в каком порядке перечислены идентификаторы при определении типа,
т. к. первому идентификатору присваивается порядковый номер 0, второму - 1 и т. д.
7
Один и тот же идентификатор можно использовать в определении только одного
перечисляемого типа.
Пример. Перечисляемый тип.
type Operat =
(Plus,
Minus,
Mult,
Divide);
Логический тип является частным случаем перечисляемого типа:
type Boolean = (False, True);
3.2.5
Тип-диапазон
В любом порядковом типе можно выделить подмножество значений, определяемое минимальным и максимальным значением, в которое входят все значения
исходного типа, находящиеся в этих границах, включая и сами границы. Такое
подмножество определяет тип-диапазон. Тип-диапазон задается указание
минимального и максимального значений, разделенных двумя точками:
type
<имя типа> = <мин. значение>..<макс. значение>;
Минимальное значение при определении такого типа не должно быть больше
максимального.
Пример. Определение типов-диапазонов.
type
Dozen = 1..12;
{числа от 1 до 12}
AddSub = Plus..Minus; {операции сложения и вычитания}
3.2.6
Вещественные типы
В Turbo Pascal есть пять стандартных вещественных типов (таблица 3).
Тип
Таблица 3
Вещественные типы данных
Диапазон значений
real
single
1,5·10–45 — 3,4·1038
2,9·10–39 — 1, 7·1038
double
5·10–324 — 1,7·10308
extended
3,4·10–4932 — 1,1·104932
4
Выражения
Выражение - это синтаксическая единица языка, определяющая способ
вычисления некоторого значения: Выражения в языке Паскаль формируются в
соответствии с рядом правил из констант, переменных, функций (стандартных и
написанных самостоятельно), знаков операций и круглых скобок. В этом разделе
будут рассмотрены все элементы выражений.
8
4.1 Переменные
Переменными называются параметры программы, значения которых могут изменяться в процессе ее выполнения.
Все используемые в программе переменные должны быть определены с указанием их типов. Переменные определяются:
 в разделе объявления переменных программы;
 в разделе объявления переменных подпрограммы;
 в разделе объявления переменных модуля;
 в заголовке подпрограммы.
Раздел объявления переменных начинается зарезервированным словом var, за
которым следуют объявления конкретных переменных, состоящие из имени переменной (имен переменных, перечисленных через запятую, если они одного типа),
двоеточия и типа переменной (переменных). Каждое объявление завершается
точкой с запятой:
var
<список переменных 1>: <тип 1>;
<список переменных 2>: <тип 2>;
<список переменных N>: <тип N>;
В разделе объявления переменных наряду с предопределенными типами можно использовать типы, объявленные перед этим в разделе объявления типов, а также
новые, вводимые только для конкретных переменных.
В заголовке подпрограммы при определении переменных можно использовать
лишь стандартные или ранее определенные типы.
Пример.
type
Operat=(Plus, Minus, Mult, Divide);
var
X,Y,Z:Real; I,J,К:Integer;
Operator:Operat;
{предопределенный тип}
4.2 Константы
Константами называются параметры программы, значения которых не
изменяются в процессе ее выполнения.
Обычные константы могут быть целого, вещественного, символьного,
логического и строкового типа string, типизированные константы – любого типа,
кроме типа файл.
Для обычных констант задаются их имена и значения, разделенные знаком
равенства:
const
<имя константы 1> = <значение константы 1>;
<имя константы 2> = <значение константы 2>;
………………………………………………………………………………………………………………;
<имя константы N> = <значение константы N>;
9
Значения констант могут задаваться
как конкретными
соответствующего типа, так и константными выражениями.
величинами
4.2.1
Целые константы
В изображении целых констант присутствуют лишь знак и цифры (знак +
можно не указывать), например:
Const
A = 5;
B = 45647;
4.2.2
Вещественные константы
Вещественные константы содержат в своем изображении десятичную точку
и/или показатель степени (символ E или e), например:
Const
X =
Y =
Z =
W =
- 0.5;
1.0;
1E-5;
7.5e+15;
4.2.3
Строковые и символьные константы
Строка символов – это последовательность любого, в том числе и равного
нулю, количества символов из набора ASCII, расположенных на одной строке,
заключенных в апострофы. Максимальный размер строки – 126 символов.
Строка, состоящая из одного символа, называется символьной константой.
Если между апострофами нет ни одного символа, то такая строка называется
нулевой или пустой.
Пример. Строковые и символьные константы.
Const
Symbol = ‘TURBO’;
S = ‘и’;
Stroka = ‘’;
4.2.4
Константные выражения
Константные выражения - это такие выражения, которые могут быть
вычислены на стадии компиляции без запуска программы. Они являются частным
случаем выражений и могут состоять из констант, знаков операций, круглых скобок
и некоторых стандартных функций.
Пример. Константные выражения.
$А00
'А'
Pi/4
10
{выражение, состоящее из константы}
{выражение, состоящее из символьной константы}
{выражение с использованием функции и знака операции}
'TURBO' + '-' + 'PASCAL'
{конкатенация (объединение) строк}
4.2.5
Типизированные константы
Типизированные
константы
фактически
представляют
собой
инициализированные переменные и могут использоваться наравне с обычными
переменными, в том числе и в левой части операции присваивания.
Для каждой такой константы задается ее имя, тип и начальное значение. Тип от
имени отделяется двоеточием, начальное значение от типа - знаком равенства:
const
<имя константы>:<тип константы>=<значение константы>;
Пример.
const
Maximum:Integer=9999;
Rea:Real=-0.5;
Bell:Char=#7;
Правила задания значений типизированным константам структурированных
типов рассмотрены при описании соответствующих типов (п. 6).
Следует иметь в виду, что типизированные константы (в том числе и константы процедур и функций) инициализируются только раз - в начале работы
программы.
Независимо от места объявления типизированных констант в программе все
они размещаются в сегменте данных программы.
4.3 Стандартные функции
В языке Паскаль существует ряд заранее разработанных подпрограмм-функций, которые можно использовать как готовые объекты. В Turbo Pascal их количество увеличено по сравнению со стандартом языка, и все они объединены
стандартные модули. В данном разделе рассмотрены наиболее часто используемые
стандартные функции.
4.3.1 Арифметические функции
Арифметические функции можно использовать только с величинами целого и
вещественного типа. Их перечень приведен в таблице 4.
Таблица 4
Арифметические функции
Функция
Назначение
Тип результата
Абсолютное
значение
аргумента
Abs(X)
Совпадает с типом X
(модуль x)
Arctan(X)
Арктангенс аргумента
Вещественный
Cos(X)
Косинус аргумента
Вещественный
Ехр(Х)
ех
Вещественный
11
Функция
Frac(X)
Int(X)
Ln(X)
Pi
Sin(X)
Sqr(X)
Sqrt(X)
Назначение
Дробная часть числа
Целая часть числа
Натуральный логарифм
Значение величины
Pi=3.1415926535897932385
Синус аргумента
Квадрат аргумента
Квадратный корень аргумента
Тип результата
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
Совпадает с типом X
Вещественный
4.3.2 Функции преобразования типа
Эти функции предназначены для преобразования типов величин; например
символа в целое число, вещественного числа в целое и т. д. К ним относятся следующие функции:
Chr(X) - преобразование ASCII-кода в символ.
Аргумент функции должен быть целого типа в диапазоне (0..255). Результатом
является символ, соответствующий данному коду.
High(X) - получение максимального значения величины.
Аргумент функции - параметр или идентификатор порядкового типа, типа-массива или типа-строки.
Low(X) – получение минимального значения величины.
Аргумент функции - параметр или идентификатор порядкового типа, типа-массива или типа-строки.
Ord(X) – преобразование любого порядкового типа в целый тип.
Аргумент функции - параметр или идентификатор порядкового типа.
Round(X) – округление вещественного числа до ближайшего целого.
Аргумент функции – величина вещественного типа.
Trunc(X) – получение целой части вещественного числа.
Аргумент функции – величина вещественного типа.
4.4 Арифметические операции
Арифметические операции можно использовать только с величинами целого и
вещественного типа. Бинарные арифметические операции и их знаки приведены в
таблице 5.
Таблица 5
Арифметические операции
Знак
Операция
+
Сложение
Вычитание
Умножение
*
Деление
/
div
Деление целых чисел
mod
Остаток от деления целых чисел
12
Пример.
A mod B
C div D
{Если, например, A=10 и B=3, то результат равен 1}
{Если C=10 и D=3, то результат равен 3}
4.5 Логические операции
Логические операции применяются к величинам логического типа. Это
четыре операции: not (отрицание), and (И), or (ИЛИ), xor (исключающее ИЛИ).
Они определяются таблицами истинности 6 и 7.
Таблица 6
Таблица истинности операции Not
X
not X
False
True
True
False
Таблица 7
Таблица истинности операций And, Or, Xor
X
Y
X And Y
X or Y
X xor Y
False
False
False
False
False
False
True
False
True
True
True
False
False
True
True
True
True
True
True
False
4.6 Операции отношения
Операции отношения предназначены для сравнения двух величин. Результат
сравнения имеет логический тип. Операции отношения следующие:
= - равно;
< > - не равно;
< - меньше;
<= - меньше или равно;
> - больше;
>= - больше или равно.
4.7 Порядок вычисления выражений
Вычисление значений выражений выполняется в определенном порядке.
Приоритеты всех действий приведены в таблице 8.
Таблица 8
Приоритеты действий при вычислении выражений
13
Группа
1
2
3
4
5
6
Тип действий
Вычисления в круглых скобках
Вычисления значений функций
Унарные операции
Операции типа умножения
Операции типа сложения
Операции отношения
Операции или элементы
()
Функции
@, not, унарный +, унарный *, /, div, mod, and
+, -, or, xor
=,<>, <, >, ,=, >=, in
Задание 1.
1. Найти среди приведённых ниже последовательностей символов те, которые
могут быть именами переменных:
a) A;
г) 1B_C;
ж) B1_C;
к) hello;
б) ABS(x);
д) a*4;
з) 1 + 5;
л) Arctan;
в) !!;
е) ?P;
и) A_1Pro; м) _B1 .
2. Указать неправильные записи чисел (с точки зрения языка Паскаль):
а) 0006;
д) Е-1;
б) 2/3;
е) 7,0;
в) 0Е-4;
ж) 2*Е5;
г) .3;
з) +0.3.
3. Определить типы, в диапазон которых могли бы входить следующие
значения:
а) -5;
г) '5.3'; ж) -3.501; к) -32769;
б) 32768; д) '1';
з) '*';
л) true;
в) 250;
е) 0;
и) -32768; м) 1.0
4. Укажите ошибочные записи в описании переменных:
а) Var
б) Vav
a,b,c:integer;
ch,hc:shar;
x,c,y:read;
sa,df,j;boolean;
в) Var
p,q,r: bite;
g,r,tit: real;
5. Запишите на языке Паскаль следующие формулы:
2
а) (a  b  c)  2 ab ;
ab
bc
3
б) (1  x)  1  x  y
x y
x
xy
14
4
3
в) ( x  y )  z  x  y  z ;
x yz
( x  y  z) 5
г)
pq  1
p
3
3
 q2

4

p
2
 q3

1  pq
5
.
6. Вычислить значение выражений:
а) SQRT(4)+5/3-2;
д)2.1 div 3;
б) –ABS(-SQRT(36-32));
е) trunc(1.5)+round(1.5);
в) 8 div 2 – sqr (2);
ж) 7+6 mod 3 + succ(2).
г) 1 mod 1;
7. Записать по правилам языка Паскаль выражение, значением которого
является:
а) площадь квадрата с периметром Р;
б) полусумма площади и периметра прямоугольника со сторонами А и В.
5
Операторы языка
Операторы языка описывают некоторые алгоритмические действия,
которые необходимо выполнить для решения задачи. Тело программы можно
представить как последовательность таких операторов. Идущие друг за другом
операторы программы разделяются точкой с запятой.
Все операторы языка Паскаль можно разбить на две группы: простые и
структурированные.
5.1 Простые операторы
Простыми являются те операторы, которые не содержат в себе других
операторов. К ним относятся:
 оператор присваивания;
 обращение к процедуре;
 оператор безусловного перехода;
 пустой оператор.
Обращение к процедуре будет рассмотрено в п. 7, остальные - в данном
разделе.
5.1.1
Оператор присваивания
С помощью этого оператора переменной или функции присваивается значение
выражения. Для этого используется знак присваивания := , слева от которого
записывается имя переменной или функции, которой присваивается значение,
справа – выражение, значение которого вычисляется перед присваиванием.
Допустимо присваивание значений переменным и функциям любого типа,
исключением типа файл. Тип выражения и тип переменной (или функции
должны быть совместимы для присваивания.
Пример.
X:=Y;
Z:=А+В;
Res:=(I>0) and (I<100);
15
I:=Sqr(J)+I*К;
5.1.2
Оператор безусловного перехода. Использование меток
Оператор безусловного перехода GOTO позволяет изменить стандартный
последовательный порядок выполнения операторов и перейти к выполнению
программы, начиная с заданного оператора. Оператор, на который происходит
переход, должен быть помечен меткой. Эта же метка должна быть указана и в
операторе GOTO.
Метки, используемые в Turbo Pascal, могут быть двух типов:
 целым числом в пределах от 0 до 9999;
 обычным идентификатором.
Все используемые метки должны быть перечислены в разделе объявления меток, начинающемся зарезервированным словом label, например:
label 1,2,Metka;
Одной меткой можно пометить только один оператор. Метка от помеченного
оператора отделяется двоеточием.
Использовать оператор GOTO следует крайне осторожно. Широкое его
применение без особых на то оснований ухудшает понимание логики работы
программы. Безусловный переход можно осуществлять далеко не из каждого места
программы и не в любое место программы. Так, нельзя с помощью этого оператора
перейти из основной программы в подпрограмму или выйти из подпрограммы, не
рекомендуется осуществлять переход внутрь структурированного оператора, т. к. он
может дать неправильный результат, и т. д.
5.1.3
Пустой оператор
Пустой оператор не выполняет никакого действия и никак не отображается в
программе (за исключением, быть может, метки или точек с запятыми, отделяющих
пустой оператор от предыдущих или последующих операторов). Он может
потребоваться для осуществления на него безусловного перехода.
5.1.4 Оператор вывода
Оператор вывода для вывода на экран текстовой информации.
Формат записи оператора вывода:
Write(<список выводимых параметров>);
или
Writeln(<список выводимых параметров>);
Отличие заключается в том, что в первом случае курсор остается в текущей
строке, а во втором – переводится на следующую строку.
Пример.
Write(A);
{Вывод значения переменной A}
Writeln(‘Ответ: Y= ‘,cos(X)); {вывод значения косинуса X
вместе со строкой «Ответ: Y=»}
16
5.1.5
Оператор ввода данных.
Для того чтобы ввести информацию с клавиатуры в языке Паскаль используется
оператор ввода данных.
Формат записи оператора:
Read(<список переменных>);
или
Readln(<список переменных>);
Отличие между операторами read и readln такое же, как и между
операторами вывода write и writeln.
Пример.
Read(A);
{Ввод значения переменной A}
Readln(A1,A2,A3); {Ввод значений переменных A1,A2,A3
с переводом курсора на новую строку}
Задание 2.
1. Найти ошибки в записи заголовка программы.
а) PROGRAM Exam 1
в) PROGRAM Exam3
б) PROGRAMM Exam2;
г) PROGRAM Exam4;
2. Найти ошибки в именах меток.
а) 5;
д) ,
б) 11111;
е) 0;
в) error;
ж) -40;
г) -2;
з) quit;
3. Найти ошибки в разделе описания констант.
Const
A: Integer;
Box=-5;
Pi=3.14;
True=1;
4. Найдите правильно записанные операторы ввода и вывода:
а) writle(a,b);
г) readn (x,y);
б) write(r, ‘ ‘, f); д) writeln(‘нет’,ch);
в) read (g,h);
е) readln(n);
5. Найти ошибки с точки зрения стандарта языка Паскаль.
a) Program Exam1;
б) Program (Input, Output)
Begin
Var
A:Real;
B=array [1..10] of byte
17
Const
Limit:=4;
Number:-5;
Type
A=-3
Lower=6;
Label 'A'; 35.2;
Var
B:=Real
label 4;
Type
Ar: array [1..2] of integer
end.
6. Составить программу нахождения произведения первой и третьей и суммы
второй и четвертой цифр натурального четырехзначного числа, введенного
с клавиатуры.
7. Вычислить периметр и площадь прямоугольного треугольника по заданным длинам
двух катетов А и В.
8. Вычислить длину окружности и площадь круга одного и того же заданного радиуса.
9. Найти произведение цифр заданного трёхзначного числа.
10. Даны два числа. Найти среднее арифметическое кубов этих чисел.
11. Составьте программу вычисления диагоналей параллелограмма по его сторонам и
углу.
5.2 Структурированные операторы
Структурированными являются такие операторы, которые состоят из
других операторов. К ним относятся:
 составной оператор;
 условный оператор;
 оператор выбора;
 операторы цикла;
 оператор над записями.
5.2.1
Составной оператор
Составной оператор представляет собой совокупность последовательно
выполняемых операторов, заключенных в операторные скобки begin и end:
Begin
< оператор 1>;
< оператор 1>;
…………………………………;
< оператор 1>;
end;
5.2.2
Условный оператор
При решении задач очень часто приходится выполнять различные группы
операторов в зависимости от того, выполнилось или нет какое-либо условие (или
несколько условий одновременно).
18
Для реализации указанных действий в языке Паскаль существует оператор
условия.
Для пояснения принципа работы оператора условия рассмотрим сначала его
запись с помощью блок-схемы.
+
-
условие
действие1
(серия1)
действие2
(серия2)
Если некоторое <условие> выполняется, то выполняется
(серия1), а если нет - <действие2> (серия2).
Запись на языке Паскаль:
<действие1>
IF <условие> THEN
если
то
begin
<серия1>;
end
<действие1>
<действие2>;
ELSE
иначе
begin
<серия2>;
end;
Приведенная запись и блок-схема поясняют принцип работы оператора
условия в полной форме.
<условие> - логическое выражение, запись
которого
содержит
проверяемое условие.
<действие1>, <действие2> - любой один оператор. В самом общем случае в
данном месте может использоваться еще один оператор условия и т.д.
<серия1>, <серия2> - произвольное количество любых
операторов,
записанных по правилам Паскаля.
Следует обратить внимание на то, что после <действия1> или после end в
<серии1> точка с запятой не ставится.
Помимо оператора условия в полной форме, существует еще и
сокращенная (неполная) форма, которая отличается от рассмотренной только тем,
что в записи отсутствует ELSE.
<действие>;
+
действие
(серия)
условие
-
IF <условие> THEN
begin
<серия>;
end;
В отличие от оператора условия в полной форме после <действия> или end
19
<серии> обязательно ставится точка с запятой.
Пример1. Вычислить значение функции:
начало
x  y 2  xy, xy  0

2
z  x  y   x  y , xy  0

2
( x  y )  1, xy  0
Ввод x, y
+
xy>0
z:= (x+y)2 - xy
+
z:= (x+y)2 -
x y
xy < 0
z:= (x+y)2 +1
Ввод z
конец
Как видно из условия задачи, переменная z может принять одно из трех
возможных значений. Для этого достаточно проверки двух условий. Язык Паскаль
допускает проверку вложенных условий.
Program z;
Var x,y,z:real;
Begin
Readln(x,y);
If x*y>0 then z:=sqr((x+y))-x*y else
if x*y<0 then z:=sqr(x+y)-sqrt(abs(x+y)) else
z:=sqr(x+y)+1;
Writeln(z);
End.
В том случае, если надо проверить одновременно выполнение сразу
нескольких условий в одном операторе, то необходимо каждое из <условий>
отделять от соседних логическими связками AND (и), OR (или).
20
IF (<условие1>) AND (<условие2>) ... AND (<условиеN>)
THEN
<действие1>
begin
<серия1>;
end
<действие2>;
begin
<серия2>;
end;
ELSE
Для корректной работы указанного оператора
дополнительно заключать в круглые скобки.
следует каждое <условие>
Пример2. Дана точка В с координатами х и y. Определить, находится ли она в
заштрихованной части плоскости (рис. 6.2):
y
1
A
B
-1
0
2
x
Вначале определим условия для координат, при которых точка попадет в
заданную область. Очевидно, что это произойдет, если точка будет лежать выше оси
Ox, внутри окружности радиусом 1 с центром в начале координат и ниже прямой
АВ, уравнение которой y = 0,5x + 1, т.е. должны выполняться одновременно три
условия:
x > 0,
x2 + y2 < 1,
y < 0,5x + 1.
Решение задачи может выглядеть так:
начало
Ввод x, y
+
x>0 и
x2 + y2 < 1 и
y < 0,5x + 1
Вывод «точка
принадлежит
плоскости»
Program tochka;
Вывод «точка не
принадлежит
плоскости»
конец
21
Var x,y:real;
Begin
Readln(x,y);
If (x>0) and (sqr(x)+sqr(y)<1) and (y<0.5*x+1) then
writeln(‘точка принадлежит плоскости’) else
writeln(‘точка не принадлежит плоскости’);
End.
Вопросы:
1) Для чего используется оператор условия?
2) Каков формат оператора условия в языке Паскаль?
3) Как условие изображается с помощью блок-схем?
4) Какие формы записи оператора условия вы знаете?
5) Каким образом в языке Паскаль можно записать сложное условие?
Задание 3.
1. Найдите минимальное из двух чисел А и В.
2. Найдите максимальное из трёх чисел А, В, С.
3. При заданном значении Х вычислить значение функции У.
x2 + 4x – 7, при x < -2
1
, при –2  x  2
x2 +4x + 7, при x > 2
У=
4. Возвести данное число в куб, если оно чётное, увеличить на 3, если оно
нечётно.
5. Составьте программу, определяющую вид треугольника по трем его
сторонам A, B, C.
6. Составьте программу, определяющую вид треугольника по двум данным
углам A, B.
7. Дана точка В с координатами х и y. Определить, находится ли она в
заштрихованной части плоскости.
а) y
б)
y
b
a
a
-b
0
a
0
x
-b
22
x
в)
5.2.3
Оператор выбора.
При решении задач очень часто бывает необходимо сделать достаточно много
взаимоисключающих проверок.
Для реализации таких действий можно воспользоваться оператором
варианта (выбора).
Общий вид оператора варианта:
CASE <S> OF
V1: <оператор1>;
V2: <оператор2>;
V3,V4,V5: <оператор3>;
......
Vn:begin
<оператор_n-2>;
<оператор_n-1>;
.....
<оператор_n>;
end;
[ELSE <оператор>;]
END;
где:
<S> - выражение, результат которого является величиной любого
стандартного типа за исключением вещественного;
V1,V2,V3,V4,V5,...,Vn - константы, входящие в диапазон типа,
соответствующего <S>;
<оператор>,<оператор1>,...,<оператор n> - простые или составные
операторы, записанные по всем правилам Паскаля.
В квадратных скобках указан необязательный параметр (он в любом
конкретном случае может отсутствовать).
Выполнение оператора варианта (выбора) начинается с вычисления значения
выражения <S>. После чего полученное значение сравнивается последовательно с
каждой константой V1, V2, и т.д. до тех пор, пока вычисленное значение и
значение одной из констант полностью не совпадут или будет просмотрен весь
список констант, входящих в оператор варианта.
В случае если результат выражения <S> совпал с одной из констант списка
V, то выполняется соответствующий этой константе оператор (или несколько
операторов) и на этом работа оператора варианта заканчивается.
23
Если значение выражения не совпадает ни с одной
константой, то
выполняется оператор, стоящий после ELSE, если он присутствует, либо
оператор варианта просто прекращает свою работу и управление передается на
строку, следующую за ним (последний end;). В этом случае оператор варианта
рассматривается машиной как пустой (сквозной).
Следует заметить, что:
1) каждая из констант списка V должна входить в диапазон значений типа
выражения <S>;
2) в отличие от оператора условия перед ELSE ставится точка с запятой;
3) можно задавать не только одну, две или три константы
перед
соответствующим (-ими) оператором (-ами), но и целый диапазон (например, 1..10
и т.д.).
Пример. Составить блок-схему и программу, определяющую четность
произвольного числа из диапазона от 1 до 10.
начало
ввод x
x=1 или
x=3 или
x=5 или
x=7 или
x=9
+
Вывод
«нечетное»
+
Вывод
«четное»
-
x=2 или
x=4 или
x=6 или
x=8 или
x=10
Вывод
«ошибка»
конец
Program Chisla;
Var
x:integer;
{целое число}
Begin
Readln(x);
{запросим число с клавиатуры}
Case x of
1,3,5,7,9: Writeln('нечетное');
24
2,4,6,8,10: Writeln('четное');
else Writeln('ошибка');
end;
End.
Вопросы:
1) Когда применяют при решении задач оператор варианта?
2) Какого типа должно быть выражение (или переменная), указанное (-ая) за
словом cаse?
3) Что произойдет, если ни одна из перечисленных после of констант не
совпадёт со значением выражения (или переменной), указанного (-ой) за
словом cаse?
Задание 4.
1. Используя оператор выбора, составить блок-схему и программу вывода на
экран названия времени года, соответствующего номеру месяца,
введенному с клавиатуры.
2. Для целого числа K от 1 до 99 вывести на экран фразу: «Мне K лет»,
учитывая при этом, что при некоторых значениях K слово «лет» надо
заменить на слово «год» или «года». Например, 11 лет, 22 года, 51 год и т.д.
3. Составить алгоритм, который по данному натуральному числу от 1 до 12
(номеру месяца) выдает все приходящиеся на этот месяц праздничные дни.
5.2.4
Оператор цикла с предусловием.
Блок- схема.
начальные
присваивания
условие
_
+
тело цикла
Оператор цикла с предусловием на языке Паскаль имеет следующий вид:
<оператор>;
WHILE < U > DO
Begin
<группа операторов>;
End;
- тело цикла
где:
25
< U > - условие выполнения тела цикла.
Выполнение оператора начинается с проверки условия <U>. Если оно
справедливо, то выполняется тело цикла. Затем работа оператора цикла с
предусловием продолжается до тех пор, пока условие <U> станет несправедливым.
В этом случае тело цикла пропускается, и управление передается оператору,
следующему за оператором цикла.
Очевидно, что если условие <U> оказалось несправедливым уже при
первом входе в цикл, то тело цикла не выполнится ни разу.
Замечание: Как видно из принципа работы
оператора
цикла
с
предусловием, в теле цикла должен находиться оператор, который будет
непосредственно влиять на <U>, так как иначе цикл станет бесконечным
(произойдет зацикливание).
Пример. Составить блок-схему и программу, которая вычисляет сумму S
первых N четных чисел.
начало
Ввод N
S:=0
k:=1
i:=2
+
S:=S+i
i:=i+2
k:=k+1
k<=n
-
Вывод S
конец
Program
Summa;
var n,S,i,k : integer;
Begin
readln(n);
{ввод количества чисел}
S:=0;
{обнуление ячейки для суммы этих чисел}
i:=0;
{задание переменной i значения первого
четного числа}
k:=0;
{задание счетчику k первого значения}
26
While k<=n do
{условие выполнения тела цикла: пока
количество суммированных чисел меньше
или равно количеству искомых чисел}
Begin
S:=S+i;
{нахождение суммы чисел}
i:=i+2;
{нахождение следующего четного числа}
k:=k+1;
{увеличение значения счетчика на 1}
End;
Writeln('S=',S);
End.
5.2.5
Оператор цикла с постусловием.
Блок- схема.
начальные
присваивания
тело цикла
-
+
условие
Оператор цикла с постусловием имеет вид:
REPEAT
<оператор_1>;
<оператор_2>;
............;
<оператор_n>;
UNTIL < U >;
тело цикла
где:
<оператор_1>,...,<оператор_n> - любые операторы (простые или составные),
составляющие тело цикла;
< U > - условие выхода из цикла.
Работа цикла с постусловием начинается с последовательного выполнения
операторов, составляющих тело цикла.
27
Затем происходит проверка условия < U >, и, в случае его истинности - выход
из цикла.
Если условие < U > не выполняется (ложно), то управление передается на
первый оператор тела цикла.
Служебные слова REPEAT ... UNTIL
являются
в
данном
случае
своеобразными операторными скобками, ограничивающими тело цикла.
Достоинства и особенности работы, в целом, у оператора
цикла с
постусловием те же, что и у цикла с предусловием. А вот недостаток, который,
правда, можно "обойти" при хорошо продуманном алгоритме решения, есть: тело
цикла всегда выполняется хотя бы один раз.
начало
Ввод N
S:=0
k:=0
i:=0
S:=S+i
i:=i+2
k:=k+1
-
k>n
+
Вывод S
конец
Program
Summa;
var n,S,i,k : integer;
Begin
readln(N);
{ввод количества чисел}
S:=0;
{обнуление ячейки для суммы этих чисел}
i:=0;
{задание переменной i значения первого
четного числа}
k:=0;
{задание счетчику k первого значения}
Repeat
28
S:=S+i;
{нахождение суммы чисел}
i:=i+2; {нахождение следующего четного числа}
k:=k+1;
{увеличение значения счетчика на 1}
Until k>n;
Writeln('S=',S);
End.
5.2.6
Оператор арифметического цикла
Блок- схема.
начальные
присваивания
I:=N, K
Тело цикла
где:
I – - параметр цикла (переменная порядкового типа), которая ведёт подсчёт
числа выполнения действий, входящих в тело цикла,
N – начальное значение параметра,
K – конечное значение параметра.
В языке программирования Pascal для организации арифметического цикла
применяются следующие операторы:
Для цикла с шагом параметра, равным 1:
FOR I:= N ТO K DO < оператор >;
или
BEGIN
< группа операторов >;
END;
Для цикла с шагом параметра, равным -1:
FOR I:= N DOWNTO K DO
< оператор >;
или
BEGIN
< группа операторов >;
END;
29
За служебным словом DO записывается тело цикла, которое может состоять
как из одного оператора, так из последовательности операторов, заключённых в
операторные скобки (BEGIN … END).
Если известны начальные и конечные значения параметра цикла, то
определить число выполнений тела цикла можно по формуле:
(K-N) + 1 для цикла TO
(N-K) + 1 для цикла DOWNTO
Program Summa;
Var N,S,I,B : integer;
Begin
readln(N);
{ввод количества чисел}
S:=0;
{обнуление ячейки для суммы этих чисел}
B:=2;
{задание переменной В значения первого
четного числа}
For I:=1 To N DO
Begin
S:=S+B;
{нахождение суммы чисел}
B:=B+2;
{нахождение следующего четного числа}
End;
Writeln('S=',S);
End.
Задание 5.
1. Гражданин 1 марта открыл счет в банке на 1000 рублей. Через каждый
месяц размер вклада увеличивается на 2% от имеющейся суммы.
Определить:
а) за какой месяц величина ежемесячного увеличения вклада превысит
30 рублей;
б) через сколько месяцев размер вклада превысит 1200 рублей.
2. Последовательно вводят N целых чисел. Найти количество положительных
значений в этой последовательности.
3. Известны оценки по информатике каждого из 20 учеников класса. В начале
списка перечислены все пятерки, затем все остальные оценки. Сколько
учеников имеют по информатике оценку «5»?
4. Последовательно вводят N целых чисел. Определить порядковый номер
наименьшего из них.
5. Составьте программу вычисления значения выражения для данного
натурального числа N: 1² + 2² + 3² + … + N².
6. Составьте программу вывода на экран всех делителей натурального числа
N.
7*. Составьте программу вывода на экран всех простых делителей числа N.
30
Структурированные типы данных
6
6.1 Массивы
Для хранения и обработки таблиц на языке программирования используются
массивы. Массив – это упорядоченная последовательность величин одного типа,
обозначенная одним именем. Упорядоченность заключается в том, что элементы
массива располагаются в последовательных ячейках памяти. Каждый массив имеет
имя и размерность. Имя массива образуется так же, как имя переменной (буква или
буква и цифра).
Существуют одномерные и многомерные массивы.
6.2.1. Одномерные массивы.
Пусть существует таблица, состоящая из одной строки, в которой записаны
только целые числа.
А
1
2
3
4
5
6
7
8
5
-1
6
2
0
-4
-2
6
Для того чтобы использовать данные этой таблицы, нужно обратиться к
конкретной ячейке. Для этого все ячейки последовательно пронумерованы. И, если
таблице присвоить имя, например, А, то при обращении к отдельной ячейке таблицы
следует указать имя таблицы и индекс (порядковый номер) ячейки, например, А3, А7.
В одномерном массиве каждому элементу соответствует не более чем 1
индекс.
Перед использованием массива в программе его нужно описать.
Формат описания одномерного массива:
<имя массива>:array[<нач. номер>..<кон. номер>] of <тип>;
Примеры описания одномерных массивов:
Var
x:array[1..5] of real;
mas:array['a'..'d'] of char;
z: array [1..7] of integer;
x - одномерный массив вещественных чисел из 5 элементов;
mas - одномерный массив 4 символов пронумерованных от 'a' до 'd';
z - одномерный массив целых чисел из 7 элементов;
Примеры обращения к элементам описанных одномерных массивов:
х[3]
x[5]
mas[3]
mas[1] z[7] z[2]
31
Как видно из второго примера, в языке Паскаль в качестве индекса элемента
массива могут быть использованы не только натуральные числа, но и другие
значения порядкового типа, например, латинские буквы.
Существует несколько способов заполнения одномерных массивов.
1) непосредственное присвоение каждому элементу соответствующего
значения;
2) ввод с клавиатуры каждого элемента;
3) с помощью датчика случайных чисел.
1 способ.
var
M: array [1..10] of real;
Begin
m[1]:=1.5;
m[2]:=2.1;
m[3]:=3;
m[4]:=4.1;
m[5]:=5;
m[6]:=6.2;
m[7]:=-3.2;
m[8]:=0;
m[9]:=1;
m[10]:=1.2;
End.
32
2 способ.
var
M: array [1..10] of real;
i:integer;
Begin
for i:=1 to 10 do
readln (m[i]);
End.
3 способ.
Program T_3;
var
M:array [1..10] of real;
i:integer;
Begin
Randomize;
for i:=1 to 10 do
m[i]:=random(100);
End.
Пример 1. Дан произвольный одномерный массив целых чисел. Подсчитать
количество его отрицательных элементов.
начало
Ввод n
i:=1, n
Ввод Xi
k:=0
i:=1, n
_
Xi < 0
+
Вывод k
k:=k+1
конец
Program massiv;
var X: array[1..10] of integer;
i,n,k: integer;
Begin
Readln(n);
{ввод количества элементов}
k:=0;
{присваивание начального значения
переменной-счетчику отрицательных
элементов}
For i:=1 to n do
Read(X[i]);
{ввод элементов массива}
For i:=1 to n do
If X[i]<0 then k:=k+1;
{проверка элементов на
отрицательность}
Writeln(‘количество отрицательных элементов массива
равно ‘,k);
End.
Вопросы:
1) Что называется массивом?
33
2) Какие способы заполнения массивов вы знаете?
3) Как происходит обращение к элементам массива?
Задание 6.
1. Дан произвольный одномерный массив вещественных чисел. Заменить его
отрицательные элементы их абсолютными величинами.
2. В произвольном одномерном массиве подсчитать количество элементов,
значение которых совпадает с их индексом.
3. Дан произвольный одномерный массив вещественных чисел. Сформировать
и вывести на экран второй массив, элементами которого являются номера
положительных элементов исходного массива.
4. Дан произвольный одномерный массив вещественных чисел. Найти в нем
сумму элементов с нечетными номерами.
5*. Составьте программу замены местами в массиве B(N) первого
отрицательного и максимального элементов.
6*. Составьте программу удаления минимального элемента массива C(N).
6.2.2. Двумерные массивы
В двумерном массиве каждому элементу соответствует не более чем 2
индекса. При обращении к отдельной ячейке двумерной таблицы после имени
таблицы нужно указать сначала номер строки, а затем номер столбца, на
пересечении которых находится эта ячейка, например, А3,4 , А5,3 .
А
1
2
3
4
5
1
2
3
4
5
6
-3,4
4
7
3
6
76
9
4
87
-7,4
0
65
-6
2
7
0
4
-2,5
45
5
756
8
0
349
6
5
56
1
7
8
Двумерный массив называется матрицей. Матрица, в которой число строк
равно числу столбцов, называется квадратной.
В
1
2
3
4
1
2
3
4
-3,4
4
7
3
76
9
4
87
0
65
-6
2
0
4
-2,5
45
Для квадратной матрицы существует понятие главной и побочной диагонали.
Главную диагональ матрицы составляют элементы В1,1 , В2,2 , …, Вn,n, т.е. те, у
которых номер строки равен номеру столбца. Вторая диагональ – В4,1 , В3,2 , …, В4,1 –
побочная.
34
Пример. В двумерном массиве размерностью 5X10 элементов найти
среднее арифметическое элементов каждой строки.
начало
i:=1, 5
j:=1, 10
Ввод Xi,j
i:=1, 5
S:=0
j:=1, 10
S:=S+Xi,j
S:= S
10
Вывод S
конец
Program aa1;
var X: array[1..5,1..10] of real;
i,j:integer;S:real;
Begin
For i:=1 to 5 do
For j:=1 to 10 do
{ввод элементов массива }
Readln(X[i,j]);
For i:=1 to 5 do begin
S:=0;
{начальное значение суммы элементов
для каждой строки}
For j:=1 to 10 do
S:=S+X[I,j];
{суммирование элементов в строке}
S:=S/10;
{расчет среднего арифметического
элементов каждой строки
35
Writeln(S);
End;
{вывод среднего арифметического}
End.
Задание 7.
1. Вычислить сумму положительных элементов каждой строки матрицы А
размером 108.
2. Найти сумму элементов k-й строки массива А(N,M).
3. Даны действительная квадратная матрица Х порядка n и натуральное
число k. Из матрицы удалить k-ю строку.
4. Найти значение наибольшего элемента главной диагонали матрицы А
размером 1010.
5. Дана
действительная
матрица
A
размером
ij.
Получить
последовательность d1 ,d2,...dj, где dk - среднее арифметическое
положительных элементов k-го столбца.
6. *Поменять местами строку с минимальным элементом на главной
диагонали со строкой с максимальным элементом на главной диагонали.
7. *Дан массив А(6,10). Включить в массив А массив В(10) в качестве К-й
строки.
6.3. Строки.
При работе с символьными величинами в
языке
Паскаль
может
использоваться специальный тип: тип - строка (тип STRING) - последовательность
произвольных печатных символов. Максимальная длина такой строки составляет
255 символов.
var
stroka=string;
Значением переменной stroka может быть произвольная строка печатных
символов, заключенная в апострофы или выражение, результат выполнения
которого - строка символов.
У типа-строки рядом в квадратных скобках может быть указан его размер
(длина) (от 1 до 255). Если размер строки не указан, то он считается равным 255.
var
stroka1=string [60];
Чтобы поместить в строковую переменную какое-либо значение, можно
воспользоваться одним из способов:
 присвоить переменной какое-либо новое значение;
 считать в эту переменную новое значение при помощи оператора ввода
(например, READ).
36
К каждому элементу строки типа STRING в любой момент можно
обратиться как к элементу массива символьного типа, указав имя переменной и
номер соответствующего элемента в строке.
Например, пусть в переменной S содержится слово «информатика». Структура
этой строки выглядит так:
0
S= 11
1
2
3
4
5
6
7
и
н
ф
о
р
м
а
8
т
9
10
11
и
к
а
Здесь S1 = ’и’, S5 = ’р’. Самый первый байт в строке имеет индекс 0 и содержит
информацию о длине строки.
Над переменными и константами типа STRING определены все операции
отношения. Причем можно сравнивать строки неравной, произвольной длины.
Две переменные-строки равны, если их длины и порядок следования
символов в них совпадают.
Над строками определена также операция склеивания (объединение
нескольких строк с помощью знака +).
Над величинами строкового типа разрешено использовать следующие
функции:
1. CONCAT (S1,S2,...,Sn)
Функция CONCAT объединяет несколько строк в одну (при необходимости
усекает чрезмерно большую строку до 255 символов).
S1,S2,...,Sn - объединяемые строки (выражения типа STRING).
2. LENGTH (S)
Функция LENGTH определяет длину строки S (количество символов в ней).
Результат ее работы - целое число.
3. COPY (St,Ind,Cnt)
Создает подстроку строки St.
St - исходная строка;
Ind - номер первого выделяемого символа строки (если значение Ind
больше размера самой строки, то результатом работы данной функции будет
пустая строка);
Cnt - число выделяемых символов (если всех необходимых символов в
строке нет, то выделяется имеющийся остаток строки).
4. POS (S1,St)
Функция POS осуществляет поиск позиции вхождения подстроки S1 в
строку St. Результат будет равен нулю, если такой подстроки в исходной строке
нет.
Над величинами строкового типа разрешено
основные процедуры:
5. DELETE (St,Ind,Cnt)
использовать
следующие
37
Процедура DELETE удаляет из строки, содержащейся в переменной St,
подстроку.
Ind - номер первого удаляемого символа (если его значение больше длины
самой исходной строки, символы не удаляются);
Cnt - число удаляемых символов (если символов в строке недостаточно,
удаляется остаток символов до конца исходной строки).
6. INSERT (S1,St,Ind)
Помещает подстроку S1 в строку St (если строка получается длинной, то
она усекается до 255 символов).
Ind - номер позиции в исходной строке, начиная с которой помещается
подстрока (наложения символов при этом не происходит, а строка "раздвигается"
на необходимое количество символов подстроки).
7. STR (Ch[:M[:N]],St)
Преобразует число Ch в строку символов, которая затем помещается в
переменную St.
Ch - целое или вещественное число;
St - переменная типа STRING;
M, N - выражения целого типа, которые определяют вид "переводимого"
числа).
8. VAL (St,Ch,Code)
Преобразует строку символов (символьное изображение числа) в число.
St - символьное представление числа;
Ch - переменная целого или вещественного типа, в которую будет
помещено число;
Code - порядковый номер неправильного символа из St, который не может
быть помещен в переменную Ch (Code=0, если в St содержатся "правильные"
символы).
К "ошибочным" символам относятся даже пробелы в конце строки St. Поэтому
все они должны быть удалены до использования процедуры Val.
9. UPCASE (St)
Переводит строчные буквы в прописные
St - исходная строка;
Пример. В заданной последовательности символов подсчитать общее
количество вхождений групп символов "AB".
38
начало
Ввод S
a:=’AB’
k:=0
i:=1,length(a)-1
b:=copy (S,i,2)
_
b=a
+
k=k+1
Вывод k
конец
Program stroka;
Const a:string[2]=’AB’;
Var S:string;
b:string[2]; i,k:integer;
Begin
Writeln('Введите строку');
Readln(S);
{Ввод исходной строки}
k:=0;
For i:=1 to Length (S)-1 do
begin b:=copy (S,i,2);
if b=a then k:=k+1;
end;
Writelen(‘AB входит в заданную строку’,k,' раз');
End.
39
Вопросы:
1) Какие процедуры используются для удаления (вставки) символов в строке?
2) Какие процедуры используются для преобразования строки в число и числа
в строку?
3) В чем основное отличие работы процедуры от функции?
4) Какие данные хранятся в переменной Code после использования процедуры
Val (St,Ch,Code)?
Задание 8.
1. В произвольном предложении, введенном с клавиатуры, подсчитать
количество слов.
2. Дана символьная строка, содержащая цифры от 0 до 9 и символы «+».
Подсчитать результат получившегося арифметического выражения.
3. С клавиатуры последовательно вводят N слов. Вывести на экран только те
из них, которые являются «перевёртышами» (например, шалаш).
4. С клавиатуры последовательно вводят N пар произвольных слов. Вывести
на экран самое короткое слово в каждой паре.
5. С клавиатуры последовательно вводят два слова. Вывести на экран «Да»,
если одно из них является подстрокой другого (одно слово полностью
входит в состав другого).
6. *Дано произвольное предложение. Слова в нём разделены пробелами, а
после последнего – точка. Найти и вывести на экран самое короткое
слово, начинающееся на букву «а».
7. *Дана символьная строка, содержащая слова, разделенные между собой
одним или несколькими пробелами. Определить слова, состоящие только
из одних цифр. Представить эти слова в виде чисел и найти их среднее
арифметическое.
6.4 Множества
Множество – это неупорядоченный, ограниченный набор данных одного
типа. Элементы множества задаются некоторым базовым типом. Базовым типом
может быть любой порядковый тип. Максимальное количество элементов,
составляющих базовый тип, не превышает диапазон 0..255.
Примеры задания множеств:
Var
MN1:set of byte;
MN2:set of char;
MN3:set of Boolean;
MN4:set of (a,b,c,d);
При задании типа множества описывается максимально возможный набор
элементов, входящих в данное множество, но никаких значений в переменных это
не создаёт. Значение множества задаётся в разделе операторов с помощью
конструктора. Конструктор – это набор элементов базового типа, заключённый в
квадратные скобки. Множество может быть пустым. Конструируя множество, его
40
элементами могут быть константы, переменные, выражения, значения которых
принадлежат базовому типу.
Например:
MN1:=[1,3,..5,2,7,2];
MN2:=[’a’,’k’];
Mn3:=[boolean];
Mn4:=[];
Операции над множествами:
Объединение двух множеств есть множество, элементы которого принадлежат
или одному или другому множеству (А+В).
Пересечение двух множеств есть множество, элементами которого являются
элементы первого множества, являющиеся элементами второго множества (А*В).
Разность двух множеств есть множество, элементы которого принадлежат
первому множеству, но не принадлежат второму множеству (А-В).
Вхождение. Логическая операция, с помощью которой можно определить
принадлежность элемента какому-либо множеству (х in A). Если элемент
принадлежит множеству, то результатом выполнения данной операции будет TRUE,
в противном случае результат будет FALSE.
Множества можно сравнивать, для этого используют операции отношения
=, < >, >=, <=.
Два множества называются равными, если каждый элемент первого множества
является элементом другого множества и наоборот.
Множества не равны, когда не каждый элемент первого множества является
элементом второго множества.
Первое множество больше или равно второму множеству, когда все элементы
второго множества входят в первое множество.
Первое множество меньше или равно второму множеству, когда все элементы
первого множества входят во второе множество.
Элементы множества нельзя запросить с клавиатуры с помощью процедур read
или readln, нельзя также элементы множества выводить с помощью write или writeln.
Пример. С клавиатуры вводятся 10 произвольных натуральных чисел из
диапазона 0..255. Сформировать из этих чисел множество чётных чисел и вывести
элементы полученного множества на экран.
Program mno;
Var a:set of byte;I,x:integer;
Begin
a:=[];
For I:=1 to 10 do begin
Readln (x);
If x mod 2 = 0 then a:=a+[x];
end;
For I:=1 to 255 do
41
If I in a then write(i);
end.
Вопросы:
1) Может ли множество содержать элементы различных типов или несколько
одинаковых элементов одного типа?
2) Что называется объединением, пересечением, разностью множеств?
3) Может ли конструктор множества стоять в правой части оператора
присваивания и использоваться в выражении?
Задание 9.
1. Дан текст из цифр и строчных латинских букв. Определить, каких букв –
гласных (a,e,i,o,u) или согласных больше в этом тексте.
2. Дана строка символов. Подсчитать общее количество цифр и знаков (+,-,*),
входящих в эту строку.
3. Составить программу, печатающую в алфавитном порядке все элементы
множества А типа set of ‘a’..’z’.
6.5 Записи
Тип запись – это структура сложных данных, состоящая из фиксированного
числа компонентов разного типа (в том числе и записью – вложенные записи).
Запись представляет собой некую иерархическую структуру, в вершине
которой располагается имя записи, от которого идёт ветвление структуры. Если
компоненты структуры являются записью, то идет дальнейшее ветвление
структуры, до того момента, пока компоненты не распадаются на отдельные
структуры. Нераспадающиеся компоненты записи называются полями записи.
Прежде чем использовать тип запись в программе, её необходимо описать в
разделе описаний. Существуют два способа описания записи:
 Определить этот тип в разделе описания типов;
 Описать в разделе описания переменных.
Запись начинается с ключевого слова begin и заканчивается словом end.
Пример. Создать запись, содержащую информацию о студенте группы:
фамилия, имя, отчество, рост, размер стипендии.
type
student=record
fam:string[100];
stud
rost:byte;
stip:real;
end;
var
fio
rost
stip
stud:student;
Обращение к полям записи.
42
Обратиться к элементу записи, это, значит, указать название всех частей,
ведущих от вершины записи к конкретному полю, таким образом получаются
составные имена. Существует два способа обращения к элементам записи:
1. Точечная нотация.
<Имя записи>.<имя поля>
Stud.fam:=’Иванов’;
Stud.stip:=45.67;
2.Оператор присоединения.
With <имя записи> do
<оператор, содержащий имя поля записи, указанной в заголовке после with>;
или
Begin
<группа операторов, содержащих имена полей записи,
указанной в
заголовке после with>;
End;
With stud do
begin
fam:=’Иванов’;
Stip:=745;
end;
В пределах одной записи имена всех полей должны быть уникальны. Если
имеется массив, элементами которого является запись, то обращение к
определённому элементу записи осуществляется следующим образом: записывается
имя записи, затем в квадратных скобках записывается индекс массива – номер того
элемента массива, с которым в данный момент времени осуществляется работа.
Var
A:array[1..10]of stud;
Обращение к полям данной записи:
With stud[10] do
begin
fam:=’Иванов’;
Stip:=47.65;
end;
или
For I:=1 to 10 do
With stud [i] do
begin
writeln(fam);
writeln(stip);
43
end;
Пример. Группа учащихся из 5 человек сдавала экзамен по 4 предметам.
Найти и вывести на экран фамилию и средний балл каждого учащегося и
средний балл группы.
Program zapisi;
Type
Student=record
Fam:string[20];
Oz:array[1..4]of 2..5;
Srb:real;
end;
Var stud:array[1..5]of student;
S,I,j:byte; sr:real;
Begin
Sr:=0;
for:=1 to 5 do begin s:=0;
With stud [i] do begin
Readln(fam);
For j:=1 to 4 do begin
Readln (oz[j]);
s:=s+oz[j];
end;
Srb:=s/4;
writeln(fam,srb);
Sr:= sr+srb;
end;
end;
Sr:=sr/5;
writeln(sr);
end.
Вопросы:
1) Дайте определение записи, поля записи, верно ли, что поля записи должны
иметь один и тот же тип?
2) Как обратиться к элементу записи? Какой оператор используют для
упрощения доступа к полям записи?
3) Чем запись отличается от массива? Может ли массив быть типом запись?
4) Могут ли совпадать имена полей различных записей? Одной и той же
записи?
Задание 10.
44
1. Дана ведомость 25 учащихся, состоящая из фамилий учащихся и оценок по
экзаменам (русский язык, математика, физика, информатика). Вывести на
экран имена тех учащихся, которые сдали все экзамены на «отлично».
2. Даны сведения о книгах (фамилия автора, название и год издания).
3. Вывести на экран:
а) название книг данного автора, изданных с 1977 года;
б) сведения о книгах с названием «Информатика».
4. Даны сведения об экспортируемых товарах (наименование товара, страна,
импортирующая товар, страны, в которые экспортируется товар, объём
поставляемой партии в штуках). Вывести на экран название стран с
максимальным импортом товара.
5. Даны сведения о машинах (модель, номер, цвет, фамилия владельца, дата
последнего техосмотра). Вывести на экран:
а) Данные обо всех машинах не прошедших техосмотр в текущем году;
б) Фамилии обо всех владельцах «Волг» чёрного цвета;
в) По введённому с клавиатуры номеру машины вывести всю имеющую
информацию о ней.
6. *На вход программе подаются сведения о номерах школ учащихся,
участвовавших в олимпиаде. В первой строке сообщается количество
учащихся N, каждая из следующих N строк имеет формат: <Фамилия>,
<Инициалы> <номер школы>, где <Фамилия> – строка, состоящая не более
чем из 20 символов, <Инициалы> – строка, состоящая из 4-х символов
(буква, точка, буква, точка), <номер школы> – не более чем двузначный
номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы>
разделены одним пробелом. Пример входной строки:
Иванов П.С. 57
Требуется написать программу, которая будет выводить на экран
информацию, из какой школы было меньше всего участников (таких школ
может быть несколько). При этом необходимо вывести информацию только
по школам, пославшим хотя бы одного участника. Следует учитывать, что
N>=1000.
6.6 Файлы.
При решении многих задач возникает необходимость хранения информации на
внешних носителях. Данные, предназначенные для длительного хранения,
формируются в виде файлов. Файл – это именованная область на носителе.
Файлы делятся на три типа: типизированные, нетипизированные, текстовые.
Также различают файлы по типу доступа к нему:
 файлы прямого доступа,
 файлы последовательного доступа.
Файлы последовательного доступа – это такие файлы, по которым можно
двигаться только последовательно, начиная с первой компоненты. Чтобы добраться
до компоненты с номером К, мы должны просмотреть предыдущую К-1
компоненту.
Прежде чем начинать использовать файлы в программе на языке Паскаль, их
необходимо описать в разделе описания.
45
Type
<Имя типа> = file of <базовый тип>; типизированный
<Имя типа> = file; нетипизированный
<Имя типа> = text; текстовый
var <имя переменной>:<имя типа>;
или
var
<имя типа> = file of <базовый тип>;
<имя типа> = file;
<Имя типа> = text;
При работе с файлами используется понятие текущий указатель – это неявно
описанная буферная переменная, которая указывает на номер элемента файла,
которая указывает на номер элемента файла. Начальный элемент всегда имеет
номер 0.
0
1
2
3
eof
Eof – end of file признак конца файла.
Стандартные процедуры для работы с файлами различного типа.
Процедура для связи файловой переменной с физическим файлом на
диске.
ASSIGN(<имя файловой переменной>,’путь к физическому
файлу’);
Открыть файл для записи:
REWRITE(<имя файловой переменной>);
Открыть файл для чтения:
RESET(<имя файловой переменной>);
После записи или чтения файл надо обязательно закрыть с помощью
процедуры
CLOSE(<имя файловой переменной>);
При записи и чтении файла текущий указатель устанавливается на нулевой
элемент файла.
Процедура для переименования файла
RENAME(<имя файловой переменной,’новое имя’>);
Процедура для уничтожения файла
46
ERASE(<имя файловой переменной>).
Процедуры для работы с типизированными файлами.
Для чтения и записи применяют процедуры READ, WRITE:
READ(<имя файловой переменной, список имен переменных>);
var f:file of integer;
x,x1,x2,x3:integer;
Begin
Read(f,x);
end;
из файла будет считана компонента и передана в х.
var f:file of integer;
x,x1,x2,x3:integer;
Begin
Read(f,x1,x2,x3);
end;
Из файла f компонента будет считана и передана в х1, 2 компонента будет
считана и передана в х2, 3 компонента будет считана и передан в х3.
WRITE(<имя файловой переменной, список имен переменных>);
var f:file of integer;
x,x1,x2,x3:integer;
Begin
Assign(f,’c:\out.dat’);
Rewrite(f);
{открыть файл для записи}
write(f,x); {компонента из х будет записана в файл f}
write(f,x1,x2,x3); {Компоненты из х1,х2,х3 будут
поочередно записываться в файл f}
close(f);
End.
SEEK(<имя файловой переменной, номер элемента>); - процедура,
устанавливающая текущий указатель на нужный элемент файла.
TRUNCATE(<имя файловой переменной>); - процедура, усекающая
файл до текущей позиции, а текущий указатель устанавливается на конце
файла.
Функции для работы с типизированными файлами.
К:=FILEPOS(<имя файловой переменной>); - функция, определяющая
позицию, на которой стоит текущий указатель, К – величина целого типа.
M:=FILESIZE(<имя файловой переменной>);-функция определяющая
размер файла (количество компонент в файле).
47
6.6.1
Текстовые файлы
Текстовый файл – это совокупность строк переменной длины. Доступ к файлу
возможен только последовательный, начиная с первой строки. Текстовый файл
можно создавать с помощью любого редактора, в конце текста необходимо ставить
признак конца строки (обычно это есть нажатие клавиши enter), в конце файла
необходимо ставить признак конца файла.
Признаком конца стоки является функция end of line:
eoln(<файловая переменная>).
Признаком конца файла является функция end of file:
eof(<файловая переменная>).
В текстовый файл данные можно записывать только в конец файла с помощью
процедуры
APPEND(<имя файловой переменной>);
Эта процедура открывает файл для записи, но указатель устанавливает на
номер после последнего элемента файла. Для записи в файл можно применять read и
readln, write и writeln.
Вопросы:
1) Дайте определение текстовому файлу?
2) С помощью каких средств можно создать текстовый файл?
3) В чём разница между текстовым файлом и типизированным или
нетипизированным файлом?
4) Какие стандартные процедуры и функции можно использовать при работе
с текстовыми файлами?
Создать файл из 10 целых чисел. Найти их сумму, вывести её на экран.
Program sum;
Var
f:file of integer;
i,x,sum:integer;
Begin
Assign (f,’text’);
Rewrite(f);
For I:=1 to 10 do write(f,i);
Close(f);
Reset(f);
sum:=0;
While not eof(f) do begin
Read(f,x);
sum:=sum+x; end;
close(f);
writeln(sum);
end.
48
Задание 11.
1. Создайте файл целых чисел. Числа, записываемые в файл должны
вводиться с клавиатуры. Признаком конца ввода является число 9999.
2. Даны два файла целых чисел. Определить, в каком из них больше
положительных, отрицательных и нулевых значений.
3. Создайте текстовый файл. Текст вводится с клавиатуры.
4. Дан текстовый файл. Подсчитать количество пустых строк.
7
Подпрограммы
При разработке программ часто приходится описывать одни и те же
действия, но при различных наборах исходных данных. Эти повторяющиеся
вычисления выделяют в самостоятельную часть программы, которая может быть
использована многократно. Такая автономная часть программы, реализующая
определенный алгоритм и допускающая обращение к ней из различных участков
основной программы, называется подпрограммой. Подпрограммы оформляются в
виде блоков, имеющих четко обозначенный вход и выход.
7.1 Подпрограммы-процедуры
Подпрограмма-процедура предназначена для выполнения законченной
последовательности действий. Любая процедура оформляется аналогично основной
программе, т.е. содержит заголовок, разделы описаний и операторов. В отличие от
основной программы заголовок в процедуре обязателен.
Формат описания процедуры:
Procedure <имя процедуры>(<список формальных параметров>);
Begin
End;
Раздел описаний процедуры может содержать подразделы: метки, константы,
типы, переменные, процедуры и функции. Раздел описаний в процедуре может
отсутствовать.
При работе в программе с процедурами происходит разделение переменных на
глобальные и локальные.
Глобальные переменные - это объявленные в разделе описания основной
программы переменные, для которых память отводится на весь период выполнения
программы.
Локальные переменные – это объявленные в разделе описания подпрограммы
переменные, для которых память отводится только на период выполнения
подпрограммы. Такие переменные не доступны для операторов основной
программы.
Для вызова процедуры из основной программы или другой подпрограммы
следует записать оператор, состоящий из имени процедуры и списка фактических
49
параметров, которые должны совпадать по количеству и типам с формальными
параметрами процедуры. Формат вызова процедуры:
<имя процедуры>(<список фактических параметров>);
Формальные параметры подпрограммы указывают, с какими параметрами
следует обращаться к этой подпрограмме (количество параметров, их
последовательность и типы). Они задаются в заголовке подпрограммы в виде списка
формальных параметров, разбитого на группы, разделенные точкой с запятой. В
группу формальных параметров включаются однотипные параметры одной
категории.
При обращении к подпрограмме формальные параметры заменяются
соответствующими фактическими параметрами вызывающей программы или
подпрограммы.
7.2 Подпрограммы-функции
Подпрограмма-функция предназначена для вычисления
параметра. У этой подпрограммы два отличия от процедуры.
Первое отличие функции в её заголовке.
Формат описания функции:
какого-либо
Function <имя функции>(<список формальных параметров>) : <тип функции>;
Begin
End;
Раздел описаний функции может содержать подразделы: метки, константы,
типы, переменные, процедуры и функции. Раздел описаний в процедуре может
отсутствовать.
Второе отличие заключается в том, что в теле функции хотя бы один раз
имени функции должно быть присвоено значение.
Для вызова функции из основной программы или другой подпрограммы
следует выражение, где необходимо использовать значение функции, указать её имя
со списком фактических параметров, которые должны совпадать по количеству и
типам с формальными параметрами функции.
Пример. Дан четырехугольник со сторонами a, b, c, d и диагональю e. Найти
площадь четырехугольника.
b
a
e
d
50
c
Для решения задачи можно воспользоваться вспомогательным алгоритмом для
нахождения площади треугольника, используя формулу Герона.
начало
Ввод a,b,c,d,e
Вспомогательный алгоритм
«Герон»
k=a, m=b, n=e
начало
Герон(a,b,e)
p
S1:=S
Герон(c,d,e)
S
k mn
2
p( p  k )( p  m)( p  n)
S2:=S
конец
SF=S1+S2
Вывод SF
конец
51
Фактическими параметрами программы являются значения длин сторон
четырехугольника a, b, c, d, диагонали e, площадей треугольников S1 и S2, а также
площадь всей фигуры SF. Формальными переменными являются переменные k, m, n,
и S. Переменная p – внутренняя, используется только в подпрограмме для расчета
полупериметра треугольника.
При написании программы на языке Паскаль можно воспользоваться
подпрограммой-функцией или подпрограммой-процедурой.
Программа на языке Паскаль с использованием подпрограммы-функции:
Program tetragon;
Var a,b,c,d,e,S1,S2,SF:real;
Function Geron(k,m,n:real):real;
Var p:real;
Begin
P:=(k+m+n)/2;
Geron:=sqrt(p*(p-k)*(p-m)*(p-n));
End;
Begin
Readln(a,b,c,d,e);
S1:=Geron(a,b,e);
S2:= Geron(c,d,e);
SF:=S1+S2;
Writeln(SF);
End.
Программа на языке Паскаль с использованием подпрограммы-процедуры:
Program tetragon;
Var a,b,c,d,e,S1,S2,SF:real;
procedure Geron(k,m,n:real; var S:real);
Var p:real;
Begin
p:=(k+m+n)/2;
S:=sqrt(p*(p-k)*(p-m)*(p-n));
End;
Begin
Readln(a,b,c,d,e);
Geron(a,b,e,S1);
Geron(c,d,e,S2);
SF:=S1+S2;
Writeln(SF);
End.
Вопросы:
1) Что такое подпрограмма?
2) Для чего предназначены подпрограммы-процедуры?
52
3)
4)
5)
6)
7)
8)
9)
В чем различия между глобальными и локальными переменными?
В чем различия между формальными и фактическими параметрами?
Как осуществляется вызов процедуры?
Когда используется подпрограмма-функция?
В чем существенные отличия подпрограмм-функций от процедур?
Как осуществляется вызов функции?
В чем отличие применения функции и процедуры для решения одной и
той же подзадачи?
Задание 12
1. Написать программу нахождения суммы наибольшего и наименьшего из
трех чисел.
2. Написать программу вычисления суммы факториалов всех нечетных чисел
от 1 до n.
3. Вычислить площадь правильного шестиугольника со стороной a, используя
подпрограмму вычисления площади треугольника.
4. Написать программу нахождения значения выражения:
3A!
Y = ------------------ + 5 (А+В)!
2B! + 1/C!
53
Download