Интегрированная среда программирования Turbo Pascal 7.0

advertisement
МОУ «Ангарский лицей №2»
Автор:
Медведева Г. В.
г. Ангарск
2006 г.
Аннотация
Данный курс лекций по языку программирования Turbo Pascal разработан согласно временному
региональному компоненту государственного образовательного стандарта для углубленного изучения
языка программирования и может быть использован для ведения лекций преподавателями колледжей,
лицеев, школ, а также учащимися, как учебное пособие.
Курс лекций содержит основные разделы языка программирования T-Pascal, предусмотренные
образовательным стандартом.
Вы познакомитесь с интегрированной пользовательской оболочкой, типами данных,
выражениями, встроенными функциями, основными командами. Познакомитесь и научитесь работать с
важным инструментом программиста – массивами (одномерными, двумерными). Научитесь работать со
строковыми типами данных. Познакомитесь с графической обработкой данных.
В каждой лекции информация изложена в краткой лаконичной форме, приводятся примеры с
решением и задачи для самостоятельного решения.
2
Содержание
Интегрированная среда программирования Turbo Pascal 7.0 ..................................................................................................... 5
Основные понятия языка Turbo Pascal 7.0 ...................................................................................................................................... 5
Алфавит языка .................................................................................................................................................................................... 5
Структура программы ........................................................................................................................................................................ 6
Раздел объявления меток ............................................................................................................................................................ 6
Раздел объявления констант ....................................................................................................................................................... 6
Раздел объявления типов ............................................................................................................................................................ 6
Раздел объявления переменных ................................................................................................................................................. 7
Раздел объявления процедур и функций .................................................................................................................................. 7
Константы ............................................................................................................................................................................................ 7
Числовые константы.................................................................................................................................................................... 7
Строковые и символьные константы ....................................................................................................................................... 8
Простые типы данных ........................................................................................................................................................................ 8
Выражения ........................................................................................................................................................................................... 9
Арифметические выражения ...................................................................................................................................................... 9
Математические функции .......................................................................................................................................................... 9
Условные выражения и операции отношения ...................................................................................................................... 10
Логические выражения и операции ........................................................................................................................................ 10
Процедуры ввода – вывода информации ....................................................................................................................................... 10
Процедуры ввода информации Read, ReadLn ................................................................................................................................ 10
Процедуры записи Write, WriteLn ................................................................................................................................................... 11
Форматы процедуры вывода Write ......................................................................................................................................... 11
Простые операторы ............................................................................................................................................................................ 12
Оператор присваивания .................................................................................................................................................................... 12
Примеры решения задач ........................................................................................................................................................... 13
Оператор безусловного перехода Goto ........................................................................................................................................... 13
Структурированные операторы ...................................................................................................................................................... 14
Составной оператор .......................................................................................................................................................................... 14
Условный оператор If ....................................................................................................................................................................... 14
Примеры решения задач ........................................................................................................................................................... 15
Условный оператор Case .................................................................................................................................................................. 17
Примеры решения задач ........................................................................................................................................................... 17
Оператор цикла For ........................................................................................................................................................................... 19
Особенности выполнения оператора For ............................................................................................................................... 19
Примеры решения задач ........................................................................................................................................................... 19
Оператор цикла Repeat…Until ......................................................................................................................................................... 21
Особенности выполнения оператора Repeat ......................................................................................................................... 21
Примеры решения задач ........................................................................................................................................................... 21
Оператор повтора While ................................................................................................................................................................... 22
Особенности выполнения оператора While ........................................................................................................................... 22
Примеры решения задач ........................................................................................................................................................... 22
Вложенные циклы ............................................................................................................................................................................. 23
Массивы................................................................................................................................................................................................ 26
Одномерные массивы ....................................................................................................................................................................... 26
Основные понятия ...................................................................................................................................................................... 26
Описание массива ....................................................................................................................................................................... 26
Заполнение массива ................................................................................................................................................................... 26
6.1.4 Примеры решения задач .................................................................................................................................................. 27
6.2 Двумерные массивы ................................................................................................................................................................... 31
6.2.1 Основные понятия ............................................................................................................................................................. 31
6.2.2 Описание массива .............................................................................................................................................................. 32
6.1.3 Заполнение и вывод элементов двумерного массива .................................................................................................. 32
7. Множества ........................................................................................................................................................................................ 39
7. 1 Операции над множествами ...................................................................................................................................................... 39
7.2 Примеры решения задач ........................................................................................................................................................... 41
8. Строки ............................................................................................................................................................................................... 43
8.1 Строковые выражения ................................................................................................................................................................ 43
8.2 Стандартные процедуры и функции для обработки строковых данных ............................................................................... 44
8.3 Примеры решения задач ............................................................................................................................................................ 45
9. Процедуры и функции, определенные пользователем ............................................................................................................ 49
9.1 Процедуры пользователя ............................................................................................................................................................ 50
3
9.2 Функции пользователя ............................................................................................................................................................... 51
9.3 Параметры ................................................................................................................................................................................... 53
9.3.1 Параметры – значения ...................................................................................................................................................... 53
9.3.2 Параметры - переменные ................................................................................................................................................. 53
10 Модуль CRT. Процедуры и функции модуля CRT ................................................................................................................. 63
11 Модуль Graph ................................................................................................................................................................................. 65
11.1 Классификация типов драйверов и видеорежимов ................................................................................................................ 65
11.2 Инициализация графики .......................................................................................................................................................... 65
11.3 Переключение между текстовым и графическим режимами ................................................................................................ 65
11.4 Система координат .................................................................................................................................................................. 66
11.5 Управление текущим указателем ............................................................................................................................................ 66
11.6 Отображение точки на экране .................................................................................................................................................. 67
11.7 Определение параметров пикселов ......................................................................................................................................... 67
11.8 Отображение отрезков прямых линий .................................................................................................................................... 68
11.9 Вычерчивание линий различных стилей ................................................................................................................................ 69
11.10 Построение прямоугольников ............................................................................................................................................... 70
11.10.1 Построение прямоугольника на плоскости .............................................................................................................. 70
11.10.2 Построение закрашенного прямоугольника ............................................................................................................. 70
11.11 Установка стиля заполнения ................................................................................................................................................. 70
11.12 Построение многоугольников ................................................................................................................................................ 72
11.13 Построение заполненных областей изображения ................................................................................................................ 73
11.13.1 Построение заполненного сектора эллипса .............................................................................................................. 73
11.13.2 Построение заполненного эллипса ............................................................................................................................. 73
11.13.3 Построение заполненных сложных геометрических фигур ................................................................................... 73
11.14 Установка цвета ...................................................................................................................................................................... 75
11.14.1 Установка цвета фона ................................................................................................................................................... 75
11.14.2 Установка цвета изображения ..................................................................................................................................... 75
11.15 Заполнение областей изображения ........................................................................................................................................ 75
Список литературы ............................................................................................................................................................................ 76
4
Интегрированная среда программирования Turbo Pascal 7.0
Вход в интегрированную среду - выполнение файла turbo.exe.
Экран интегрированной среды состоит из трех частей: строки главного меню, поля экрана и
строки состояния.
Строка меню:
 File (файл) - позволяет выполнять все основные операции с файлами и содержит опции:
 NEW (новый) - создать новый файл с именем nonameXX.pas;
 OPEN (открыть) - открыть сохраненный ранее файл с расширением *.pas;
 SAVE (сохранить) - сохранить открытый файл на диске;
 SAVE AS (сохранить как) - сохранить открытый файл, но запрашивает имя файла, под которым
будет проведено сохранение;
 SAVE ALL (сохранить все) - сохранить все открытые файлы;
 PRINT (вывести на печать);
 EXIT(выход).
 Edit (редактирование) - позволяет выполнять все операции редактирования текста:
 CUT (вырезать) - вырезает выделенный фрагмент текста и помещает его в буфер
промежуточного хранения;
 СOPY (копировать) - копирует выделенный фрагмент текста и помещает его в буфер
промежуточного хранения;
 PASTE (вставить) - вставляет фрагмент текста из буфера промежуточного хранения;
 СLEAR (очистить) - удаляет выделенный фрагмент текста без записи в буфер промежуточного
хранения.
 RUN (выполнение) - <Ctrl>+<F9> - запуск программы на выполнение.
 COMPILE (компилировать) - управляет процессом компиляции.
 OPTIONS (опции) - устанавливает необходимые параметры интегрированной среды.
В интегрированной среде можно работать с несколькими рабочими окнами. Переход из одного
рабочего окна в другое - клавиша F6. Для перехода в режим выполнения используются клавиши <Alt>+<F5>.
Основные понятия языка Turbo Pascal 7.0
Язык Pascal разработан профессором Виртом в 1969 -1971 г. и назван в честь великого
французского математика и философа - Блеза Паскаля - первого в мире создателя счетно-решающей
машины. Язык Pascal был разработан в первую очередь для обучения учащихся практике
программирования. Благодаря своей стройности, лаконичности, эффективности реализации
большинства научно-технических задач язык Pascal приобрел широкую известность.
Алфавит языка
Алфавит - совокупность допустимых в языке символов.
Элементы алфавита можно разбить на четыре группы:
 символы, используемые в идентификаторах;
 разделители - пробел;
 специальные символы;
 неиспользуемые символы.
Символы, используемые в идентификаторах
Идентификатор - имя любого объекта программы - может включать латинские буквы (прописные
и строчные), арабские цифры (0…9) и символ подчеркивания.
Общие правила написания идентификаторов:
 Идентификатор начинается только с буквы или знака подчеркивания (исключение составляют
метки, которые могут начинаться и цифрой и буквой);
 Между двумя идентификаторами должен быть, по крайней мере, один пробел.
 Длина идентификатора может быть любой, но значимыми являются только первые 63 символа;
 Прописные и строчные буквы в идентификаторах не различаются.
5
Например:
Metka12
1gr
- ошибка
Blok_5
Nomer.data - ошибка
Специальные символы
При написании программ применяются специальные символы: + - * / = > < [ ] ( ) { } . , : '# $
Составные символы, которые воспринимаются как единое целое: := <> .. <= >= (. .) (* *)
Неиспользуемые символы
Буквы русского алфавита не используются в Pascal, но их можно использовать в комментариях и
символьных строках.
Структура программы
Program <имя программы>; {Заголовок программы необязателен}
<Раздел объявления меток>
<Раздел объявления констант>
<Раздел объявления типов>
<Раздел объявления переменных>
<Раздел объявления процедур и функций>
Begin
<раздел операторов>
End.
Раздел объявления меток
Формат
Label
<имя метки, …>;
Например
Label
1, 3, 1A, D;
Метка ставится в теле программы перед оператором и отделяется от него двоеточием.
Раздел объявления констант
Константами называются элементы данных, значения которых известны заранее и в процессе
выполнения программы не изменяются.
Формат
Const
<идентификатор> = <значение константы>;
Например
Const
Max=5600;
Arg=54;
Vxod='Цветок';
Имеется ряд констант, к значениям которых можно обращаться без предварительного определения.
Зарезервированные константы
Идентификатор
Тип
Значение
Описание
Pi
Real
3.1415926536
Число "пи"
True
Boolean
True
"Истина"
False
Boolean
False
"Ложь"
Maxint
Integer
32767
Максимальное число
MaxLongInt
LongInt
214783647
Максимальное число
Раздел объявления типов
В Pascal используются стандартные типы данных, но могут быть объявлены и новые типы.
Формат
Type
6
< имя типа> = (<значение1, значение2, …>);
Например, для объявления типов, соответствующих году, месяцу и дню, можно написать так:
Type
Year=1900..2000;
Month=(jan, feb, mar,…);
Day=1..31;
Раздел объявления переменных
Переменные в отличие от констант могут менять свои значения в процессе выполнения программ.
Формат
Var
< Идентификатор>:<тип>;
Например
Var
I,J:Integer;
L:Real;
STR: Sring;
Раздел объявления процедур и функций
Все используемые процедуры и функции должны быть объявлены до начала входа в основную
программу.
Пример для практического занятия
Program PER;
Const
M=50;
Var
X:Integer;
Y:Real;
BEGIN
X:=M*3;
Y:=X/7;
Write('X=',X,' Y=',Y);
END.
Константы
Числовые константы
В языке Pascal допускается использование чисел в 10 и 16 системах счисления. Если число
представлено в 16 системе счисления, то перед ним без пробела записывается знак $. Диапазон
изменения чисел в 16 системе счисления от $00000000 до $FFFFFFFF.
В 10 системе счисления числа могут записываться двумя способами: с фиксированной и с
плавающей точкой. Вещественные десятичные числа с фиксированной точкой записываются по
обычным правилам арифметики. Целая часть от дробной отделяется точкой. Если точка отсутствует,
число считается целым.
Например
125 - целое десятичное число
$1FF - 16 -е число
124.674 - вещественное число
Вещественные десятичные числа с плавающей точкой представлены в виде: mE+p, где m мантисса (целое или дробное число с десятичной точкой), E - означает "десять в степени", р - порядок
(целое число).
Например
5.18Е +02  5,18*102  518
10Е-03 10*10-3  0,01
7
Строковые и символьные константы
Строка символов - это последовательность любого количества символов (не более 126),
расположенных на одной строке и заключенных в апострофы.
Например
Const
Symb='TURBO';
Простые типы данных
В Turbo Pascal имеются следующие группы простых типов:
 целые типы;
 вещественные типы;
 символьный тип;
 перечисляемый тип;
 тип-диапазон;
 логический тип.
Целые типы.
Тип
Диапазон
Формат
Размер в байтах
Shortint
-128 .. 127
Знаковый
1
Integer
-32768 .. 32767
Знаковый
2
Longint
-2147483648 .. 2147483647
Знаковый
4
Byte
0 .. 255
Беззнаковый
1
Word
0 .. 65535
Беззнаковый
2
Вещественные типы
Тип
Диапазон
Число значащих
Размер в байтах
цифр
Real
2.9*10-39 .. 1.7*1038
11-12
6
Single
1.5*10-45 .. 3.4*1038
7-8
4
-324
308
Double
5.0*10 .. 1.7*10
15-16
8
Extended
3.4*10-4932 .. 1.1*104932
19-20
10
Символьный тип
Стандартный символьный тип Char определяет полный набор ACSII-символов. В программе при
задании символьных значений необходимо использовать апострофы. В памяти занимает 1 байт.
Например
Var
S:Char;
Begin
S:='F';
…
Перечисляемый тип
Перечисляемые типы определяются программистом.
Формат
Type
<имя типа>=(идентификатор 1, идентификатор 2, …,идентификатор N);
Тип-диапазон
Задается начальным и конечным значениями, которые разделяются двумя точками.
Формат
Type
<имя типа>=<минимальное значение>..<максимальное значение>;
Например
Type
Num=-10..10;
Var
A,B:Num;
8
Переменные А и В будут принимать значения в интервале от -10 до 10.
Логический тип
Стандартный логический тип Boolean (размер - 1байт). Эти типы могут принимать только два
значения: True и False.
Выражения
Арифметические выражения
Арифметические выражения формируются из переменных, констант, функций, знаков операций и
круглых скобок. В арифметических выражениях используются следующие арифметические операции:
Выражение
Тип данных
Тип результата
Операция
Пример
Real
Real
Сложение
A+B
Integer
Integer
Real, Integer
Real
Real
Real
Вычитание
A-B
Integer
Integer
Real, Integer
Real
Real
Real
Умножение
A*B
Integer
Integer
Real, Integer
Real
Real
Real
Деление
A/B
Integer
Real
Real, Integer
Real
Integer
Integer
Целочисленное 11 div 5 2
деление
A div B
10 div 33
2 div 30
Integer
Integer
Деление с
11 mod 51
остатком
A mod B
10 mod 31
14 mod 54
Приоритет операций в порядке убывания: /, *, div, mod, -, +
Для изменения приоритета операций используются круглые скобки.
Например:
(A+B)/(A-B)
Математические функции
Функция
Назначение
Тип результата
Abs(X)
Абсолютное значение аргумента
Совпадает с типом Х
Arctan(X) Арктангенс аргумента
Вещественный
Sin(X)
Синус аргумента
Вещественный
Cos(X)
Косинус аргумента
Вещественный
Exp(X)
ex
Вещественный
Ln(X)
Натуральный логарифм
Вещественный
Sqr(X)
Квадрат аргумента
Совпадает с типом Х
Sqrt(X)
Квадратный корень аргумента
Вещественный
Frac(X)
Возвращает число, равное дробной части числа
Вещественный
Int(X)
Возвращает число, равное целой части числа
Вещественный
Round(X) Возвращает число, равное целой части числа
LongInt
(округление – по правилам математики)
Trunc(X) Возвращает число, равное целой части числа
LongInt
(округление – путем отбрасывания дробной
части)
Пример программы с использованием арифметических выражений
Program p2;
Const
9
X=-2;
A=732;
B=3.4;
Var
Z,Y:Real;
BEGIN
Y:=1/(1-1/Sqrt(A+B));
Z:=Arctan(X)/(1-ABS(X));
Write('Ý=',Y,' Z=',Z);
END.
Пример 2. Записать выражение на языке программирования Pascal
√|X-1| • √| Y |
A=
1+X²/2 + Y²/4
=
Условные выражения и операции отношения
Операции отношения выполняют сравнение двух операндов и определяют, истинно значение
выражения или ложно. Они используются для управления циклами и в условных операторах.
Операции отношения
Выражение
Операция
Результат
A=B
Равно
True, если A= B
A<>B
Не равно
True, если A <>B
A>B
Больше
True, если A >B
A<B
Меньше
True, если A <B
A>=B
Больше или равно
True, если A>= B
A<=B
Меньше или равно
True, если A<= B
Операции расположены в порядке убывания приоритета.
Например
Выражение
Результат
12>=12
True
56>10
True
11<=6
False
Логические выражения и операции
Результатом выполнения логического выражения является логическое значение True или False.
Имеется одна унарная логическая операция not (отрицание) и две бинарные операции and
(логическое умножение) и or (логическое сложение).
Таблица истинности
Выражение
Значение А
Значение В
Результат
Not A
True
False
False
True
A and B
True
True
True
True
False
False
False
True
False
False
False
False
A or B
True
True
True
True
False
True
False
True
True
False
False
False
Процедуры ввода – вывода информации
Процедуры ввода информации Read, ReadLn
Процедура ввода обеспечивает ввод числовых данных, символов, строк, и т.д. для следующей их
обработки программой.
10
Формат:
Read(X1, X2,…,Xn);
Значения X1, X2,…,Xn набираются минимум через один пробел на клавиатуре пользователем.
После набора данных для одной процедуры Read нажимается клавиша ввода. Значения переменных
должны вводится в строгом соответствии с синтаксисом языка Pascal. Если соответствие нарушается (
например X1 имеет тип Integer, а при вводе набирается значение типа Char), то возникает ошибка ввода.
Пример:
Var:
I: Real;
J: Integer;
K: Char;
BEGIN
Read(I,J,K);
…
END.
Выполнение программы
I вариант
II вариант
235.47 100 G
G 235.47 100
нет ошибки
есть ошибка
Процедуру Read можно использовать для организации пауз произвольной длины при выполнении
программы. Для этого достаточно записать: Read(Kbd,Ch). Ch- литерная переменная, Kbd – имя
стандартного файла клавиатуры. Программа продолжит работу только после того, как будет нажата
любая клавиша на клавиатуре. Введенный символ на клавиатуре не отобразится.
Для ввода данных можно использовать процедуру ReadLn. Она аналогична процедуре Read.
После выполнения данной процедуры курсор автоматически перейдет на новую строку.
Процедуры записи Write, WriteLn
Процедура производит вывод числовых данных, символов, строк.
Формат:
Write(Y1,Y2,…,Yn);
Например:
Write(234);
Write(A+B-2); {выводится результат выражения}
Write(List,Summa,A1,A2);
Write(List,’Результат вычислений=’,Rez);
После записи каждого выражения можно задать целочисленное выражение, определяющее
ширину поля вывода.
I,p,q – целочисленное выражение
R - выражение вещественного типа
Ch – выражение символьного типа
S – выражение строкового типа.
Форматы процедуры вывода Write
1.
I – выводится десятичное представление величины I, начиная с позиции положения курсора.
Значение I
Выражение
Результат
134
Write(I)
134
287
Write(I,I,I)
287287287
2.
I:p – выводится десятичное представление величины I в крайние правые позиции поля шириной p.
Значение I
Выражение
Результат
134
Write(I:6)
134
1
Write(I:7)
1
70
Write(I+I:4)
140
3.
R – в поле шириной 18 символов выводится десятичное представление R в формате с плавающей
точкой.
11
Значение R
Выражение
Результат
715.432
Write(R)
7.1543200000E+02
-1.919E+01
Write(R)
-1.9190000000E+01
4.
R:p – в крайние правые позиции поля шириной p символов выводится десятичное представление
значения R в формате с плавающей точкой. Если R>=0 минимальная длина поля вывода 7
символов, если R <=0, то минимальная длина поля вывода 8 символов.
Значение R
Выражение
Результат
511.04
Write(R:15)
5.110400000E+02
46.78
Write(-R:12)
-4.67800E+01
5.
R:p:q – в крайние правые позиции поля шириной p символов выводится значение R в формате с
фиксированной точкой, причем после десятичной точки выводится q цифр. Если q> 24, то при
выводе используется формат с плавающей точкой.
Значение R
Выражение
Результат
511.04
Write(R:8:4)
511.0400
-46.78
Write(-R:7:2)
-46.78
6.
Ch – начиная с позиции курсора выводится значение Ch.
Значение Ch
Выражение
Результат
'X'
Write(Ch)
X
‘!’
Write(Ch,Ch,Ch)
!!!
7.
Ch:p – в крайнюю правую позицию поля шириной p выводится значение Ch
Значение Ch
Выражение
Результат
'X'
Write(Ch:3)
X
‘!’
Write(Ch:2,Ch:3)
!!
8.
S – начиная с позиции курсора выводится значение S
Значение S
Выражение
Результат
'Группа 1’
Write(S)
Группа 1
‘Лицей №2’
Write(S,S)
Лицей №2Лицей №2
9.
S:p - значение S выводится в крайние правые позиции поля шириной p символов.
Значение S
Выражение
Результат
'Группа 1’
Write(S:12)
Группа 1
Процедура записи WriteLn аналогична процедуре Write, но после вывода последнего в списке
значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки.
Простые операторы
Простыми являются те операторы, которые не содержат в себе других операторов. К ним
относятся:
 Оператор присваивания;
 Обращение к процедуре;
 Оператор безусловного перехода Goto.
Оператор присваивания
Формат:
< Идентификатор>:=<выражение>;
Выполняется выражение, стоящее в правой части и присваивается результат переменной, стоящей
в левой части. Переменная и выражение должны иметь один и тот же тип.
Например:
Sort:=1;
Gen:=15.23;
NAZV:=’Модель’;
Rez:=sin(a)+cos(b);
12
Примеры решения задач
1. Даны две целые переменные A, B. Составить фрагмент программы, после исполнения которого,
значения переменных поменялись бы местами (новое значение A равно старому значению B и
наоборот).
USES Crt;
VAR
A, B, T : INTEGER;
BEGIN
ClrScr; { Чистка экрана }
Write(‘ Введите два значения ‘);
ReadLn(A,B);
{Введем дополнительную целую переменную T}
T := A; A := B; B := T;
Write(A,B);
END.
2. Задан радиус окружности. Найти площадь и длину окружности.
USES Crt;
VAR
R : INTEGER;
S,L: REAL;
BEGIN
ClrScr;
Write(‘ Введите радиус окружности ‘);
ReadLn(R);
{Pi - зарезервированное значение}
S:=Pi*R*R; {Вычисление площади окружности}
L:=2*Pi*R; {Вычисление длины окружности}
WriteLn(‘ Площадь окружности = ’,S:4:2);
WriteLn(‘ Длина окружности = ‘,L:4:2);
END.
Примеры для самостоятельного решения:
1. Для двух данных чисел найти среднее арифметическое и среднее геометрическое модулей этих
чисел.
2. Для данного числа А, не пользуясь никакими арифметическими операциями, кроме умножения,
получить А8 за три операции и А10, А16, за четыре операции.
3. Мальчик купил несколько тетрадей по сто рублей и несколько обложек по 50 рублей. Составить
программу, которая могла бы подсчитать стоимость всей покупки.
4. Даны две целые переменные A, B. Составить фрагмент программы, после исполнения которого,
значения переменных поменялись бы местами (новое значение A равно старому значению B и
наоборот), не используя дополнительных переменных.
Оператор безусловного перехода Goto
Формат:
Goto <метка>;
Применяется в случаях, когда после выполнения некоторого оператора следует выполнить не
следующий по порядку, а какой – либо другой, отмеченный меткой оператор. Метка может содержать
как цифровые, так и буквенные символы.
Пример: Вывести четные числа до 30.
Label Met1, Met2;
Var I:Integer;
BEGIN
I:=2;
WriteLn(‘Четные числа’);
13
Met1:
WriteLn(I);
I:=I+2;
If I>30 Then Goto Met2;
Goto Met1;
Met2: WriteLn(‘До свидания’);
END.
Структурированные операторы
Структурированными являются такие операторы, которые состоят из других операторов. К ним
относятся:
 Составной оператор;
 Условный оператор If;
 Условный оператор Case;
 Оператор цикла For;
 Оператор цикла While;
 Оператор цикла Repeat.
Составной оператор
Составной оператор представляет собой группу из произвольного числа операторов, отделенных
друг от друга «;» и ограниченную операторными скобками Begin и End
Формат:
Begin
<оператор>;
<оператор>;
…….
<оператор>;
End;
Например:
Begin
A:=A*B+(N-D);
Rez:=A+B*Pi;
WriteLn(Rez:12:6);
End;
Условный оператор If
Оператор If изменяет порядок выполнения операторов в зависимости от истинности или
ложности некоторого условия. Существует два варианта оператора:
1. If <условие> Then <оператор 1> Else <оператор 2>
2. If <условие> Then <оператор>
Условие может быть простым или сложным. Сложные условия образуются с помощью логических
операций AND, OR, NOT. При записи условий могут использоваться все возможные операции
отношения. Результат выражения всегда имеет булевский тип (истина или ложь).
В первом варианте, если условие принимает значение "Истина", выполняется оператор 1, если
условие - "Ложь", выполняется оператор 2.
Например:
A:=2; B:=8;
If A>B Then WriteLn(‘A>B’) Else WriteLn(‘A<=B’);
Во втором варианте формата, если условие принимает значение "Истина", выполняется оператор,
если условие - "Ложь", выполняется оператор, следующий сразу за оператором If.
Например:
A:=2; B:=8: C:=0;
If A>B Then C:=A+B;
C:=C+12;
14
WriteLn(‘C=’,C);
(Результат выполнения программы – 12).
Один оператор If может входить в состав другого оператора If. В таком случае говорят о
вложенности операторов.
Формат:
If <условие> Then
If <условие> Then <оператор>
Else <оператор>;
Например:
If A<20 Then
If A>=15 Then WriteLn(‘А в диапазоне 15 - 20’)
Else (WriteLn(‘А в диапазоне 1 - 14’);
Конструкцию со степенью вложенности более 2 – 3 лучше избегать из-за сложности их анализа.
Примеры:
1. с простым оператором:
If A>B Then D:=A+B Else D:=A-B;
2. с составным оператором:
If A<B Then Begin
WriteLn(‘A<B’);
D:=A*B;
End
Else Begin
WriteLn(‘A>=B’);
D:=A/B;
End;
3. с использованием сложного условия:
If (A=B) And (C=D) Then Begin
WriteLn(‘Норма’);
F:=0;
End
Else Begin
WriteLn(‘Превышение нормы’);
F:=100;
End;
Примеры решения задач
1. Заданы числа X,Y, Z. Найти минимальное из трех чисел.
Var
Mi, X,Y,Z:Integer;
BEGIN
WriteLn(‘Введите три числа’);
ReadLn(X,Y,Z);
Mi:=X;
If Y<Mi Then Mi:=Y;
If Z<Mi Them Mi:=Z;
WriteLn(‘ Минимальное число=’,Mi);
END.
2. Поменять местами значения переменных A,B,C т.о., чтобы оказалось A>B>C.
Var
PP,A,B,C:Real;
BEGIN
WriteLn(‘Введите три числа’);
ReadLn(A,B,C);
15
If A<B Then Begin PP:=A; A:=B; B:=PP; End;
If A<C Then Begin PP:=A; A:=C; C:=PP; End;
If B<C Then Begin PP:=B; B:=C; C:=PP; End;
WriteLn(‘A>B>C’,A,B,C);
END.
3. Определить, верно ли, что при делении натурального числа A на натуральное число B получится
остаток, равный числу C.
Var
A,B,S:Integer;
BEGIN
Repeat
WriteLn(‘Введите два натуральных значения’);
ReadLn(A,B);
Until (A>B) AND (B>C);
WriteLn(‘Введите остаток’);
ReadLn(S);
If A MOD B = S Then
WriteLn(‘остаток от деления А на В=’,S)
Else
WriteLn(‘остаток от деления А на В не =’,S);
END.
4. Даны положительные целые числа A, B, C. Выяснить существует ли треугольник с длинами сторон
A, B, C.
USES Crt;
VAR
A, B, C: INTEGER;
BEGIN
ClrScr;
WriteLn('Введите три числа');
ReadLn(A,B,C);
IF (A+B>C) AND (A+C>B) AND (B+C>A) Then
WriteLn('Треугольник построить можно')
Else
WriteLn('Треугольник построить нельзя');
END.
5. Верно ли, что в числе N первая и последняя цифры одинаковы (100<=N<1000).
USES Crt;
LABEL M1;
VAR
N,S,D,E: Integer;
BEGIN
M1: ClrScr;
Write(‘Введите целое трехзначное число ’);
ReadLn(N);
If (N <100) OR (N>=1000) Then GoTo M1;
{Выделение цифры в числе}
S:=N Div100; {сотни}
D:=((N-S*100) Div 10; {десятки}
E:=N mod 10; {единицы}
If S=E Then
WriteLn(‘Первая и последняя цифры одинаковы’)
Else
16
WriteLn(‘Первая и последняя цифры не одинаковы’);
END.
Примеры для самостоятельного решения:
1. Определить является ли данное целое число R четным. Дать словесный ответ.
2. Дано целое положительное число N (10<=N<=99). Выяснить, верно ли, что N равно кубу суммы
цифр числа N.
3. Заданы три числа X, Y, Z. Найти min(XYZ, X+Y+Z).
4. Даны три целых числа. Выбрать из них те, которые принадлежат интервалу [1,3]
5. Дано целое положительное число N (N<=1000). Определить сколько цифр в этом числе.
6. Вычислить max(min(a,b),max(c,d)).
Условный оператор Case
Оператор Case является обобщением оператора If и позволяет сделать выбор из произвольного
числа имеющихся вариантов.
Формат:
Case <выражение> Of
<список 1>:<оператор 1;>
<список 2>:<оператор 2;>
……..
<список n>:<оператор n;>
[ Else <оператор>]
End;
В этой структуре:
Выражение – выражение любого простого типа, кроме вещественного типа, значение которого
вычисляется.
список 1, список 2,…, список n – константы, с которыми сравнивается значение выражения.
оператор 1, оператор 2,…, оператор n – операторы, из которых выполняется тот, с константой
которого совпадает значение выражения.
оператор – оператор, который выполняется, если значение выражения не совпадает ни с одной из
констант.
Ветвь оператора Else является необязательной. Если она отсутствует и значение выражения не
совпадает ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие
от оператора If перед словом Else точку с запятой можно ставить, хотя это и необязательно.
Примеры решения задач
1. Выражение целочисленного типа.
Ввести номер месяца и определить месяц, соответствующий этому номеру.
Var
X: Byte;
BEGIN
Write(‘Введите номер месяца:’);
ReadLn(X);
Case X Of
1: Write(‘Январь’);
2: Write(‘Февраль’);
3: Write(‘Март’);
4: Write(‘Апрель’);
5: Write(‘Май’);
6: Write(‘Июнь’);
7: Write(‘Июль’);
8: Write(‘Август’);
9: Write(‘Сентябрь’);
10: Write(‘Октябрь’);
11: Write(‘Ноябрь’);
17
12: Write(‘Декабрь’);
Else
WriteLn(‘Такого месяца нет’);
End;
END.
2. Выражение интервального типа.
Ввести номер месяца и определить время года, к которому относится этот месяц.
Var
X: Byte;
BEGIN
Write(‘Введите номер месяца:’);
ReadLn(X);
Case X Of
1..2,12: WriteLn(‘Зима’);
3..5: WriteLn(‘Весна’);
6..8: WriteLn(‘Лето’);
9..11: WriteLn(‘Осень’);
End;
END.
3. Выражение символьного типа.
Составить программу, которая по введенному значению выводит оценки по математике, физике,
химии.
USES Crt;
VAR M:Char;
BEGIN
ClrScr;
WriteLn(' По какому предмету Вы хотите увидеть оценки');
WriteLn(' М - математика');
WriteLn(' Ф - физика');
WriteLn(' Х - химия');
ReadLn(M);
CASE M OF
'М','м':WriteLn('5 5 4 4 5 5 3 5 5 ');
'Ф','ф':WriteLn('5 4 5 3 5 4 5 5 5 ');
'Х','х':WriteLn('4 3 5 3 4 4 4 5 ');
End;
END.
Примеры для самостоятельного решения:
1. Составить программу, которая по введенному значению 1, 2, 3 вычисляет:
1. Площадь параллелограмма
2. Периметр параллелограмма
3. Выход
2. Составить программу «Календарь XX столетия», которая определяет день недели любого дня XXстолетия. По введенному значению 1, 2, 3 вычисляет
1. Номер дня недели по формуле, где D- день, М-месяц, G-год:
 S=[(12-M)/10]
 K=[(G-1900-S)*365,25]+[(M+12*S-2)*30,59]+D+29
 N=K-7[K/7] (N-вычисляется от 0-воскресенье до 6-суббота, []-целая часть)
2. День недели по его номеру
3. Выход
18
Оператор цикла For
Циклы позволяют многократно выполнять отдельный оператор или последовательность
операторов, причем при этом нет необходимости записывать в тексте программы одинаковые
операторы несколько раз.
Оператор цикла For организует выполнение одного оператора (или несколько операторов) заранее
известное число раз. Оператор For может быть представлен в двух форматах:
1. For <параметр цикла>:=<S1> To <S2> Do
<тело цикла>;
2. For <параметр цикла>:=<S1> DownTo <S2> Do
<тело цикла>;
<параметр цикла> - переменная цикла, которая может быть целочисленного или символьного типа.
Параметр цикла изменяется, увеличиваясь до конечного значения (1 формат). Параметр цикла может
изменяться в противоположном направлении - убывать (2 формат);
S1 – начальное значение параметра цикла, которое она получает при первом выполнении цикла;
S2 - конечное значение параметра цикла, достигнув которое повторение цикла прекращается;
For…Do – заголовок цикла;
< тело цикла > - оно может быть простым, состоящим из одного оператора или составным оператором.
Например:
For I:=1 To 20 Do Write(‘*’);
20 раз выведется на экран в одной строке «*»
Особенности выполнения оператора For
1. Начальное и конечное значения параметра цикла должны принадлежать к одному и тому же типу
данных.
2. В операторе For не допускается изменения параметра цикла на величину, отличную от единицы.
Например:
For I:=10 To 14 Do Write(I:3); {Результат выполнения - 1011121314}
For I:=14 DownTo 10 Do Write(I:3); {Результат выполнения - 1413121110}
3. В операторе For после Do может находиться составной оператор, в теле которого запрещены
операторы, меняющие значение параметра цикла.
Например:
For I:= 1 To 10 Do Begin
Rez:=A/Pi;
I:=I+1; {ошибка, попытка изменить параметр цикла}
End;
4. После нормального завершения оператора For значение параметра цикла равно конечному
значению. Если оператор For не выполнялся, значение параметра цикла не определено.
5. Чтобы прервать выполнение оператора For досрочно, необходимо использовать процедуру Break,
которая прерывает выполнение циклов. Процедура Continue начинает новую итерацию цикла, даже
если предыдущая не была завершена.
Примеры решения задач
1. Найти произведение положительных, сумму и количество отрицательных из 10 введенных целых
значений.
USES Crt;
VAR
X: INTEGER; S, K, P: INTEGER; I: BYTE;
Begin
Clrscr; {чистка экрана}
P:=1; S:=0; K:=0;
FOR I:=1 TO 10 DO Begin
WriteLn(‘Введите ‘,I,’ -е значение’);
ReadLn(x);
IF X>0 Then P:=P*X; { произведение положительных }
IF X<0 Then Begin
S:=S+X; { сумма отрицательных }
19
K:=K+1; { количество отрицательных }
End;
End;
WriteLn(‘ Произведение положительных значений = ‘,p);
WriteLn(‘ Сумма отрицательных значений = ‘,s);
WriteLn(‘ Количество отрицательных значений = ‘,k);
END.
2. Из N целых чисел найти минимальное значение.
USES Crt;
VAR MI, X: INTEGER; I,N: BYTE;
BEGIN
WriteLn('Введите количество значений'); ReadLn(n);
WriteLn('Введите первое значение'); ReadLn(mi);
FOR I:=2 TO N DO Begin
WriteLn(‘Введите ‘,I,’ -е значение’); ReadLn(x);
IF X<MI Then MI:=X;
End;
WriteLn(‘Минимальное значение = ‘,MI);
END.
3. Из N целых чисел найти минимальное среди положительных и максимальное среди отрицательных
значений.
USES Crt;
VAR
MI, MA, N, I, X: INTEGER; FL, FL1: BYTE;
BEGIN
Clrscr;
WriteLn('Введите количество значений'); ReadLn(N);
FL:=0; FL1:=0;
FOR I:=1 TO N DO Begin
WriteLn('Введите ',I,' значение'); ReadLn(X);
IF (FL=0) AND (X<0) Then Begin
MA:=X; FL:=1;
End;
IF (FL1=0) AND (X>0) Then Begin
MI:=X; FL1:=1;
End;
IF (X<0) AND (X>MA) Then MA:=X;
IF (X>0) AND (X<MI) Then MI:=X;
End;
IF FL=1 Then WriteLn('максимальное среди отрицательных = ',ma)
Else WriteLn('отрицательных нет');
IF FL1=1 Then WriteLn('минимальное среди положительных = ',mi)
Else WriteLn('положительных нет');
END.
Примеры для самостоятельного решения:
1. Найти среднее арифметическое минимального и максимального элементов из 10 введенных.
2. Найти сумму 2/3+3/4+…+n/(n+1).
3. Из n введенных чисел найти максимальное значение среди положительных элементов.
4. Вычислить сумму первых n слагаемых 12+22-32+42+52-62+…(каждое третье слагаемое берется со
знаком «минус»).
20
Оператор цикла Repeat…Until
Этот оператор называется циклом с постусловием, т.к. проверка условия осуществляется после
каждого выполнения тела цикла.
Формат:
Repeat
<тело цикла>;
Until <условие>;
Условие – выражение булевского типа. При написании условия допустимы булевские операции
(And, Or, Not) и операции отношения. Операторы, заключенные между словом Repeat и Until, являются
телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если
результат выражения –False, тело цикла выполняется еще раз, если результат – True, то происходит
выход из цикла.
Особенности выполнения оператора Repeat
1. Тело цикла выполняется, по крайней мере, один раз, так как условие проверяется после
выполнения тела цикла.
2. Тело цикла выполняется пока условие False.
3. В теле цикла может находиться произвольное число операторов без операторных скобок Begin
…End.
4. По крайней мере один из операторов тела цикла должен влиять на значение условия, иначе цикл
буде выполняться бесконечно.
Например:
D:=1; S:=0;
D:=1; S:=0;
Repeat
Repeat
S:=S+D;
S:=S+D;
Until (D>100);
D:=D+1; {изменение переменной, влияющей на условие}
{бесконечный цикл}
Until (D>100);
{цикл имеет завершение}
5. Чтобы прервать выполнение оператора Repeat досрочно, необходимо использовать процедуру
Break, которая прерывает выполнение циклов. Процедура Continue начинает новую итерацию цикла,
даже если предыдущая не была завершена.
Примеры решения задач
1. Составить программу ввода отрицательного числа.
Var X:Integer;
Begin
Repeat
Write(‘Введите отрицательное число’);
ReadLn(X);
If X>=0 Then WriteLn(‘Введено неправильное число’);
Until X<0;
End.
2. Просуммировать натуральные числа от 1 до 50 и вывести результат вычислений на экран.
Var I,Sum:Integer;
Begin
Sum:=0;
I:=0;
Repeat
I:=I+1;
Sum:=Sum+I;
Until I=50;
WriteLn(‘Сумма чисел от 1 до 50 = ’),Sum;
End.
3. В подъезде N ступенек. Сколько шагов будет сделано, если шагать через 3 ступеньки (один шаг –
три ступеньки).
21
Var S, KS, N: Byte;
{S-подсчет количества ступенек, KS-количество шагов}
Begin
S:=0; KS:=0;
Repeat
S:=S+3;
KS:=KS+1;
Until I>N;
WriteLn(‘Количество шагов= ’,KS);
End.
Примеры для самостоятельного решения:
1. Составить программу ввода натурального числа в интервале от N до M.
2. начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он
увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь пробежит
спортсмен за 7 дней.
Оператор повтора While
Этот оператор называется циклом с предусловием, т.к. проверка условия осуществляется до
начала очередной итерации.
Формат:
While <условие> Do
<тело цикла>;
Цикл выполняется, пока условие истинно. Как только условие нарушается, выполнение цикла
завершается
Особенности выполнения оператора While
1. Так как условие проверяется до начала выполнения тела цикла, цикл может ни разу не выполнится.
2. Тело цикла выполняется пока условие True.
3. По крайней мере один из операторов тела цикла должен влиять на значение условия, иначе цикл
буде выполняться бесконечно.
В ряде случаев возникает необходимость в бесконечном цикле. Тогда в условии записывается
константа True или условие, которое имеет значение True.
Например:
While True Do Write(‘Бесконечный цикл’);
While 1=1 Do Write(‘Бесконечный цикл’);
Примеры решения задач
1. Дано целое число а и натуральное (целое неотрицательное) число n. Вычислить а в степени n.
{Введем целую переменную k, которая меняется от 0 до n, причем поддерживается такое свойство: b
= (a в степени k).}
USES Crt;
VAR
A, N, B, K : INTEGER;
BEGIN
ClrScr;
Write(‘ Введите два значения ‘); ReadLn(A,N);
K := 0; B := 1;
While K <> N DO Begin
K := K + 1; B := B * A;
End;
Write(‘ A в степени N = ’,B);
END.
2. Даны натуральные числа а, b. Вычислить произведение а*b, используя в программе лишь операции
+, -, =, <>.
USES Crt;
22
VAR
A, B, C, K : INTEGER;
BEGIN
Write(‘ Введите два значения ‘); ReadLn(A,B);
K := 0; C := 0;
While K <> B DO Begin
K := K + 1; C := C + A;
End;
{C = A * K и K = B, следовательно, C = A * B}
Write(‘ A*B= ‘,C);
END.
3. Вычислить значение переменной Y=2K+N при всех значениях переменных N=1,2,3 и K=2,4,6,8.
обратите внимание на то, что если перебирать N и K получим 12 значений переменной Y.
Var N,K,Y: Integer;
Begin
For N:=1 To 3 Do Begin
K:=2;
While K<=8 Do Begin
Y:=2*K+N;
WriteLn(‘При N= ’,N:4,’ и K= ’,K:4,’ Y= ’Y:4);
K:=K+2;
End;
End;
End.
4. Составить программу перевода числа из 10 системы счисления в 2 систему счисления.
Для этой задачи представлено два решения.
USES Crt;
VAR
DES, OST, I, DW:INTEGER;
BEGIN
ClrScr;
Write('Введите десятичное число '); ReadLn(DES);
I:=1;
While (DES>=2) DO Begin
OST:=DES mod 2;
DES:=DES div 2;
DW:=DW+OST*I;
I:=I*10;
End;
DW:=DW+DES*I;
Write('Двоичная запись числа ',DW);
END.
Примеры для самостоятельного решения:
1. К старушке на обед ходят кошки. Каждую неделю две кошки приводят свою подружку. В доме у
старушки 100 мисок. Через какое время появятся лишние кошки, и сколько кошек при этом
останется голодными.
2. Известна сумма номеров страниц, определить номер страницы.
3. Лягушка каждый последующий прыжок делает в два раза короче предыдущего. Достигнет ли она
болота и за сколько прыжков. Длину первого прыжка задайте самостоятельно.
Вложенные циклы
Для решения задачи достаточно часто требуется использовать две и более циклические
конструкции, одна из которых расположена внутри другой (других). Такие конструкции называются
23
вложенными циклами. Какие именно циклы при этом используются, роли не играет, они могут быть
организованы посредством любых рассмотренных ранее операторов (For, While, Repeat … Until).
Примеры решения задач
1. Даны натуральные числа n и k. Составить программу вычисления выражения
1k + 2k + … + nk
Для вычисления указанной суммы целесообразно использовать оператор For с управляющей
переменной I, изменяющейся от 1 до n. В теле цикла вычисляется очередное значение y=Ik и
накапливается искомая сумма s=s+y.
Var n, k, y, I, s, j: Integer;
Begin
WriteLn (‘Введите n и k ‘);
ReadLn (n, k);
s: = 0;
For i: = 1 To n Do Begin
y: = 1;
For j: = 1 To k Do y: = y*i;
s: = s + y
End;
WriteLn (‘Сумма: ‘ , s)
End.
2. Сложим все цифры какого-либо числа. Получим новое число, равное сумме всех цифр исходного
числа. Продолжим этот процесс до тех пор, пока не получим однозначное число (цифру). Оно
называется цифровым корнем исходного числа. Например, цифровой корень числа 34697 равен
2(3+4+6+9+7=29; 2+9=11; 1+1=2). Составьте программу нахождения цифрового корня натурального
числа.
Var n, k, s: LongInt;
Begin
WriteLn (‘Введите число‘); ReadLn (n);
s: = n;
While s>9 Do Begin
k : = s ; s : = 0;
Repeat
s : = s + k mod 10;
k : = k div 10
Until k = 0
End;
WriteLn (‘Цифровой корень числа ‘,n,’ равен ‘,s)
End.
3. Старинная задача. Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корова – 5
рублей, теленок – полтинник (0,5 рубля), при условии, что на 100 рублей надо купить 100 голов скота.
Решение: обозначим через b – количество быков, k – количество коров, t – количество телят. После
этого можно записать два уравнения:
10b + 5 k + 0,5t = 100
и
b + k + t = 100
Преобразуем их:
20b + 10k + t = 200
и
b + k + t = 100
На 100 рублей можно купить:
 не более 10 быков, т.е. 0 ≤ b ≤ 10,
 не более 20 коров, т.е. 0 ≤ k ≤ 20,
 не более 200 телят, т.е. 0 ≤ t ≤ 200.
Таким образом, получаем:
Var b, k, t: Integer;
24
Begin
For b: = 0 To 10 Do
For k: = 0 To 20 Do
For t: = 0 To 200 Do
If (20*b+10*k+t=200) and (b+k+t=100) Then
WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t)
End.
Сколько раз будет проверяться условие в данной программе (сколько раз будет выполняться
оператор If)? Переменная b принимает 11 различных значений (от 0 до 10), для каждого значения
переменной b переменная k изменяется от 0 до 20, а для каждого значения переменной k переменная t
изменяется от 0 до 200.
Таким образом, условие будет проверяться 11 · 21 · 201 = 46431 раз. Но если известно количество
быков и коров, то количество телят можно вычислить по формуле
t = 100 – (b + k)
и цикл по переменной t можно исключить.
Program My 9_3;
Var b, k, t: Integer;
Begin
For b: = 0 To 10 Do
For k: = 0 To 20 Do Begin
t: = 100 – (b + k) ;
If (20*b+10*k+t=200) Then WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t)
End
End.
В этой программе условие повторяется 11 · 21 = 231 раз. Попробуйте еще уменьшить количество
проверок.
4. Написать программу, которая находит все четырехзначные числа abcd (a, b, c, d – цифры числа,
причем все они различны), для которых выполняется условие:
ab – cd = a + b + c + d
Другими словами, разность чисел, составленных из старших цифр числа и из младших, должна быть
равна сумме цифр числа.
Эту задачу можно решать разными способами. Например, можно перебирать все четырехзначные
числа и проверять выполнение условия. Попробуем сократить перебор: из равенства
10 · a + b – (10 · c + d) = a + b + c + d
получаем
9 · (a – c ) = 2 · (c + d)
или
(a – c) / (c + d) = 2 / 9,
a = c + 2, d = 9 – c и 0 ≤ c ≤ 7.
Var a, b, c, d: Integer;
Begin
For c: = 0 To 7 Do Begin
a: = c + 2; d: = 9 - c;
For b: = 0 To 9 Do
If (b<>c) and (b<>a) and (b<>d) Then WriteLn (a, b, c, d)
End
End.
5. Дано натуральное число, кратное 3. Найдем сумму кубов цифр данного числа. Получим новое число.
Применим к нему такое же преобразование и т.д. Оказывается, что любая последовательность чисел
сходится к числу 153.
Program My 9_5;
Var n, m, t, s, q: LongInt;
Begin
WriteLn (‘Введите число, оно умножается на 3, далее для полученного
25
числа строится последовательность ‘);
ReadLn (n);
m: = 3 * m; Write (m, ‘ ‘ );
Repeat
s : = 0; t : = m;
While m > 0 Do Begin
q: = m mod 10;
s: = s + q * q * q;
m: = m div 10
End;
m: = s;
Write (m, ‘ ‘ )
Until m = t;
ReadLn
End.
Массивы
Одним из важных инструментов программиста является возможность работы с массивами
переменных.
Массив - набор однотипных данных, хранящихся вместе и имеющих общее имя.
Возможность объединения групп элементов в массив позволяет, с одной стороны, облегчить
массовую обработку данных, а с другой - упростить идентификацию элементов массива.
Каждому элементу массива может быть присвоено одно числовое или символьное значение,
поэтому различаются массивы числовые и символьные. Кроме того, массивы могут быть одномерными
и многомерными.
Одномерные массивы
Основные понятия
Массив обозначается одним именем. Так всю совокупность действительных чисел
1.6, 14.9, -5.0, 8.5, 0.46
можно считать массивом и обозначить одним именем, например А. Образующие массив переменные
называются элементами массива. Каждый элемент массива обозначается именем массива с
индексом, заключенным в квадратные скобки.
A[1], A[2], A[3], ..., A[n].
Индекс определяет положение элемента массива данных относительно его начала.
Для рассмотренного выше примера элементами массива А являются:
A[1]=1.6, A[2]=14.9, A[3]=-5.0, A[4]=8.5, A[5]=0.46
Описание массива
Формат
Var
<идентификатор,…>:array[тип индекса] of <тип компонент>;
Например:
M: array[1..4] of integer;
MAS: array[1..60] of real;
Для описания массива можно использовать предварительно определенные константы.
Например,
Const
G1=4; G2=6;
Var
M1: array[1..G1] of integer;
M2: array[1..G2] of real;
Заполнение массива
1 Способ (заполнение с клавиатуры. Динамический ввод данных)
26
Var
M:array[1..10] of integer;
I: byte;
Begin
For I:=1 To 10 Do Begin
Write('Введите ',I,' значение ');
ReadLn(M[I]);
End;
End.
2 Способ (с использованием генератора случайных чисел)
Var
M: array[1..25] of integer;
I: byte;
Begin
For I:=1 To 25 Do Begin
M[I]:=Random(50);
Write(M[I]:4);
End;
End.
3 Способ (статический ввод данных)
Const
M: array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
Var
I: Integer;
Begin
For I:=1 To 9 Do
Write(M[I]:3);
End.
6.1.4 Примеры решения задач
1. Алгоритмы поиска и присвоения значений элементам массива
1. Составить программу обработки массива размерностью n, заполненного целыми числами,
введенными с клавиатуры. Вывести индексы и значения положительных элементов массива.
USES Crt;
CONST N=10;
VAR
A:ARRAY[0..N] OF INTEGER;
I:BYTE;
BEGIN
ClrScr;
{ Заполнение массива }
FOR I:=1 TO N DO Begin
Write('Введите ',I,' элемент массива '); ReadLn(A[I]);
End;
{ Обработка элементов массива }
FOR I:=1 TO N DO
IF A[I]>0 THEN WriteLn('Положительный элемент = ',A[I],' его индекс = ',I);
END.
2. Составить программу вычисления и печати значений функции Y=sin(x-1)/2x. Значения аргументов
задать в массиве X, состоящего из 6 элементов. Значения функции записать в массив Y.
USES Crt;
VAR
X,Y:ARRAY[0..6] OF REAL;
I: BYTE;
BEGIN
27
ClrScr;
FOR I:=1 TO 6 DO Begin
Write('Введите ',I,' значение аргумента '); ReadLn(X[I]);
End;
FOR I:=1 TO 6 DO Begin
Y[I]:=SIN(X[I]-1)/(2*X[I]);
WriteLn(' X= ',X[I]:4:1,' Y=',Y[I]:5:2);
End;
END.
3. Дан массив M, состоящий из 30 элементов. Элементы массива - произвольные целые числа. Выдать
на экран значение каждого пятого и положительного элемента. Указанные элементы выдать в строку.
USES Crt;
VAR
M:ARRAY[0..30] OF INTEGER;
I: BYTE;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов массива');
FOR I:=1 TO 30 DO Begin
M[I]:=Random(20)-4; Write(M[I]:3);
End; WriteLn;
I:=5;
WriteLn(' Значения каждого пятого и положительного элемента массива');
While I<=30 DO Begin
IF M[I] > 0 THEN Write(M[I]:3);
I:=I+5;
End;
END.
Примеры для самостоятельного решения:
1. Дан одномерный массив размерностью 10, заполненный целыми числами, введенными с клавиатуры,
и величина N. Отрицательные элементы заменить на N. Измененный массив вывести на экран одной
строкой.
2. Дан одномерный массив размерностью N, заполненный случайными числами в интервале от -15 до
20. Вывести на экран значения элементов массива, абсолютное значение которых >10.
3. Дан одномерный массив размерностью N, заполненный случайными числами. Каждый третий
элемент массива возвести в квадрат, если элемент отрицательный. Измененный массив вывести на
экран.
4. Составить программу вычисления и печати значений функции Y=(sinx+1)cos4x. Значения
аргументов задать в массиве X, состоящего из 10 элементов. Значения функции записать в массив Y.
5. Из элементов массива А, состоящего из 25 элементов, сформировать массив D той же размерности
по правилу: первые 10 элементов находятся по формуле Di=Ai+i, остальные - по формуле Di=Ai-i.
2. Алгоритмы нахождения суммы, произведения и количества элементов массива. Работа с
индексами элементов массива
1. Определить сумму элементов массива Р(n), значения которых > заданного Т
USES Crt;
Const N=30;
VAR
P:ARRAY[0..N] OF INTEGER;
I,T:BYTE; S:INTEGER;
BEGIN
ClrScr; Randomize;
{ Заполнение массива случайными числами }
WriteLn(' Значения элементов массива');
FOR I:=1 TO N DO Begin
28
P[I]:=Random(30); Write(P[I]:3);
End; WriteLn;
Write(' Введите значение переменной '); ReadLn(T);
S:=0;
FOR I:=1 TO N DO
IF P[I]>T THEN S:=S+P[I]; { сумма элементов массива > T }
WriteLn(' Сумма элементов массива > заданного значения = ',S);
END.
2. Дан массив целых чисел, состоящий из 25 элементов. Подсчитать сумму элементов массива,
произведение положительных и количество нулевых элементов. Результат вычисления вывести на
экран.
USES Crt;
VAR
A:ARRAY[0..25] OF INTEGER;
I: BYTE; S,K: INTEGER; P: REAL;
BEGIN
ClrScr; Randomize;
{ Заполнение массива случайными числами }
WriteLn(' Значения элементов массива');
FOR I:=1 TO 25 DO Begin
A[I]:=Random(10)-3; Write(A[I]:3);
End; WriteLn;
S:=0; K:=0; P:=1;
FOR I:=1 TO 25 DO Begin
S:=S+A[I]; { сумма элементов массива }
IF A[I]>0 THEN P:=P*A[I]; { произведение положительных элементов массива }
IF A[I]=0 THEN K:=K+1; { количество нулевых элементов массива }
End;
WriteLn(' Сумма элементов массива = ',S);
WriteLn(' Произведение положительных элементов массива = ',P:0:0);
WriteLn(' Количество нулевых элементов массива = ',K);
END.
3. Дан массив четных чисел, состоящий из 15 элементов. Заполнить его с клавиатуры. Найти:
 сумму элементов, имеющих нечетные индексы;
 подсчитать количество элементов массива, значения которых больше заданного
числа T и
кратны 5;
 номер первого отрицательного элемента, делящегося на 5 с остатком 2.
USES Crt;
CONST T=11;
VAR
A:ARRAY[0..15] OF INTEGER;
I,NP,FL: BYTE; S,K: INTEGER;
BEGIN
ClrScr; Randomize;
{ Заполнение массива с клавиатуры }
FOR I:=1 TO 15 DO Begin
Write('Введите ',I,' злемент массива '); ReadLn(A[I]);
End; WriteLn;
S:=0; K:=0; FL:=0;
FOR I:=1 TO 15 DO Begin
IF I mod 2 =0 THEN S:=S+A[I]; { сумма элементов, имеющих четные индексы }
IF (A[I]>T) AND (A[I] mod 5 =0) THEN K:=K+1; { количество }
IF (A[I]<0) AND (A[I] mod 5 =-2) AND (FL=0) THEN Begin NP:=I; FL:=1; End;
29
End;
WriteLn(' Сумма элементов,имеющих четные индексы = ',S);
WriteLn(' Количество элементов, значения которых > ',T,' и кратны 5 = ',K);
WriteLn(' Номер первого отрицательного элемента, делящегося на 5 с остатком 2 = ',NP);
END.
Примеры для самостоятельного решения:
1. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
 сумму отрицательных элементов;
 количество тех элементов, значения которых положительны и не превосходят заданного числа А;
 номер последней пары соседних элементов с разными знаками.
2. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
 сумму элементов, имеющих нечетное значение;
 вывести индексы тех элементов, значения которых больше заданного числа А;
 количество положительных элементов, кратных К. ( К вводится с клавиатуры ).
3. Дан массив целых чисел, состоящий из N элементов. Определить среднее арифметическое
положительных элементов.
4. Дан массив чисел. Найти, сколько в нем пар одинаковых соседних элементов.
5. Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2»,
полученных учащимися за урок и средний балл.
6. В очереди за билетами стоят мужчины и женщины. Какое количество мужчин стоит в начале
очереди до первой женщины.
3. Алгоритмы нахождения наибольшего или наименьшего элемента массива и его индекса
1. Дан массив K, состоящий из 45 элементов. Элементы массива - произвольные
целые числа.
Определить минимальный элемент массива и его индекс.
USES Crt;
VAR
K:ARRAY[0..45] OF INTEGER;
I,IND: BYTE; MIN:INTEGER;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов массива');
FOR I:=1 TO 45 DO Begin
K[I]:=Random(35)+6; Write(K[I]:3);
End; WriteLn;
MIN:=K[1]; IND:=1;
{ нахождение минимального значения и его индекса }
FOR I:=2 TO 45 DO
IF K[I]<MIN THEN Begin MIN:=K[I]; IND:=I; End;
WriteLn(' Минимальное значение = ',MIN);
WriteLn(' Индекс минимального значения = ',IND);
END.
2. Дан массив B, состоящий из N элементов. Элементы массива - произвольные
целые числа.
Определить сумму элементов, расположенных до максимального элемента массива.
USES Crt;
CONST N=20;
VAR
B:ARRAY[0..N] OF INTEGER;
I,IND: BYTE; MAX,S:INTEGER;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов массива');
FOR I:=1 TO N DO Begin
B[I]:=Random(35); Write(B[I]:3);
30
End; WriteLn;
MAX:=B[1]; IND:=1;
{ нахождение максимального значения и его индекса }
FOR I:=2 TO N DO
IF B[I]>MAX THEN Begin MAX:=B[I]; IND:=I; End;
WriteLn(' Максимальное значение = ',MAX);
{ нахождение суммы элементов, расположенных до максимального элемента }
S:=0;
FOR I:=1 TO IND-1 DO
S:=S+B[I];
WriteLn(' Cумма элементов, расположенных до максимального элемента =',S);
END.
3. Известны данные о среднемесячной температуре за год. Определить, какая была самая высокая
температура летом и самая низкая зимой.
USES Crt;
VAR
MAS: ARRAY[1..12] OF REAL;
I: INTEGER; MIN,MAX:REAL;
BEGIN
ClrScr;
{ Заполнение массива с клавиатуры }
FOR I:=1 TO 12 DO Begin
Write(' Введите среднюю температуру за ',I,' месяц '); ReadLn(MAS[I]);
End;
MAX:=MAS[6]; MIN:=MAS[12];
{ Определение самой высокой температуры летом }
FOR I:=7 TO 8 DO
IF MAX<MAS[I] THEN MAX:=MAS[I];
{ Определение самой низкой температуры зимой }
FOR I:=1 TO 2 DO
IF MIN>MAS[I] THEN MIN:=MAS[I];
WriteLn(' Самая высокая температура летом ',MAX);
WriteLn(' Самая низкая температура зимой ',MIN);
END.
Примеры для самостоятельного решения:
1. Дан массив чисел. Найти значение максимального элемента. Если таких элементов несколько, то
определить, сколько их.
2. Дан массив чисел. Найти среднее арифметическое максимального и минимального элемента.
Вывести значения и индексы этих элементов.
3. Дан массив чисел. Определить количество элементов, находящихся в интервале от 1 до 12 и
расположенных до максимального элемента массива.
6.2 Двумерные массивы
6.2.1 Основные понятия
Иногда решение задачи возможно только при наличии многомерных массивов, или матриц.
Наиболее часто применяются двумерные массивы, поскольку описывать информацию по ее позиции в
одномерном списке весьма неудобно. Представьте себе, как трудно было бы найти свое место на
стадионе, если бы на билете указывался лишь порядковый номер сиденья - один из многих тысяч!
Билеты же, на которых проставлены и номер ряда, и номер места, существенно упрощают эту задачу.
Составители географических карт тоже пользуются таким приемом. Координаты Парижа, Осло,
Рима, обозначаются не как 1, 2 или 300, а в терминах градусов широты и долготы. Эти два числа
указывают местоположение города относительно экватора и начального (Гринвичского) меридиана.
31
Каждый элемент двумерного массива описывается двумя индексами: первый обозначает номер
строки, а второй - номер столбца.
A[4,5], A[2,7], A[6,3], ..., A[m,n].
6.2.2 Описание массива
Формат
Var
<идентификатор,…>:array[тип индекса] of <тип компонент>;
Например:
M: array[1..4,1..5] of integer; {двумерный массив, состоящий из 4 строк и 5 столбцов}
MAS: array[1..6,1..7] of real;
Для описания массива можно использовать предварительно определенные константы.
Например,
Const
G1=4; G2=6;
Var
M1: array[1..G1,1..G2] of integer;
6.1.3 Заполнение и вывод элементов двумерного массива
1 Способ (заполнение с клавиатуры)
Var
M:array[1..7,1..5] of integer;
I,J: byte;
Begin
For I:=1 To 7 Do {цикл по строкам}
For J:=1 To 5 Do {цикл по столбцам}
ReadLn(M[I,J]);
End.
2 Способ (с использованием генератора случайных чисел)
Var
M: array[1..5,1..4] of integer;
I,J: byte;
Begin
For I:=1 To 5 Do Begin
For J:=1 To 4 Begin
M[I,J]:=Random(50);
Write(M[I,J]:4);
End;
WriteLn;
End;
End.
6.1.4 Примеры решения задач
1. Алгоритмы действий над элементами двумерного массива
1. В течение недели измерялась температура три раза в день: утром, в обед и вечером. Показания
записали в таблицу размерностью 7х3. Определить среднюю температуру за каждый день.
USES Crt;
VAR
T:ARRAY[0..7,0..3] OF INTEGER;
I,J:BYTE; S:INTEGER; ST:REAL; A:STRING[12];
BEGIN
ClrScr; WriteLn;
{ Заполнение таблицы }
FOR I:=1 TO 7 DO Begin
WriteLn(' Введите показания за ',I,' день');
FOR J:=1 TO 3 DO Begin
32
CASE J OF
1: A:=' Утром - ';
2: A:=' В обед - ';
3: A:=' Вечером - ';
End;
Write(A); ReadLn(T[I,J]);
End;
End; WriteLn;
{ Подсчет средней температуры за каждый день }
FOR I:=1 TO 7 DO Begin
S:=0;
FOR J:=1 TO 3 DO
S:=S+T[I,J];
ST:=S/3;
WriteLn('Средняя температура за ',I,' день = ',ST:4:1);
End;
END.
2. Группа из 10 учащихся сдавала экзамен по 4 предметам. Результаты экзаменов записали в таблицу
размерностью 10х4. Определить средний балл по каждому предмету.
USES Crt;
VAR
E:ARRAY[0..10,0..4] OF INTEGER;
I,J:BYTE; S:INTEGER; SB:REAL; A:STRING[16];
BEGIN
ClrScr; WriteLn;
{ Заполнение таблицы }
FOR I:=1 TO 10 DO Begin
WriteLn(' Введите оценки ',I,' учащегося');
FOR J:=1 TO 4 DO Begin
CASE J OF
1: A:=' Математика - ';
2: A:=' Физика - ';
3: A:=' Химия - ';
4: A:=' Информатика - ';
End;
Write(A); ReadLn(E[I,J]);
End;
End; WriteLn;
{ Подсчет среднего балла по каждому предмету. Циклы меняются местами.' }
FOR J:=1 TO 4 DO Begin
S:=0;
FOR I:=1 TO 10 DO
S:=S+E[I,J];
SB:=S/10;
CASE J OF
1: A:=' математике - ';
2: A:=' физике - ';
3: A:=' химии - ';
4: A:=' информатике - ';
End;
WriteLn(' Средний балл по ',A,' = ',SB:4:1);
End;
END.
33
3. Поменять местами значения К-ого и Р-ого столбцов матрицы В, размерностью MхM, заполненную
случайным образом.
USES Crt;
LABEL M1;
CONST M=8;
VAR
A:ARRAY[0..M,0..M] OF INTEGER;
I,J,K,P:BYTE; PP:INTEGER;
BEGIN
ClrScr;
{ Заполнение двумерного массива случайным образом и вывод в виде прямоугольной
матрицы }
WriteLn(' Значения двумерного массива');
FOR I:=1 TO M DO Begin
FOR J:=1 TO M DO Begin
A[I,J]:=Random(23); Write(A[I,J]:3);
End; WriteLn;
End; WriteLn;
WriteLn(' Введите номера столбцов, которые необходимо поменять');
WriteLn(' Их значения не должны превышать ',M);
M1:ReadLn(K,P);
IF (K>M) OR (P>M) THEN GOTO M1;
{ Перестановка значений введенных столбцов }
FOR I:=1 TO M DO Begin
PP:=A[I,K]; A[I,K]:=A[I,P]; A[I,P]:=PP;
End;
WriteLn(' Измененный двумерный массив');
FOR I:=1 TO M DO Begin
FOR J:=1 TO M DO Begin
Write(A[I,J]:3);
End; WriteLn;
End;
END.
4. Дан двумерный массив размерностью 6х3, заполненный целыми числами. Подсчитать количество
строк, в которых первый элемент строки меньше нуля.
USES Crt;
VAR
M:ARRAY[0..6,0..3] OF INTEGER;
I,J,K:BYTE;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения двумерного массива');
FOR I:=1 TO 6 DO Begin
FOR J:=1 TO 3 DO Begin
M[I,J]:=Random(23)-10; Write(M[I,J]:3);
End; WriteLn;
End; WriteLn; K:=0;
{ Подсчет количества строк, в которых первый элемент строки меньше 0 }
FOR I:=1 TO 6 DO
IF M[I,1]<0 THEN Inc(K);
Write(' Количество строк, в которых первый элемент строки меньше 0 = ',K);
END.
5. Дан двумерный массив размерностью Nх2N, заполненный целыми числами. Найти среднее
арифметическое элементов, имеющие четные номера строк.
34
USES Crt;
CONST N=5;
VAR
H:ARRAY[0..N,0..2*N] OF INTEGER;
I,J,K:BYTE; S:LongInt; SA:REAL;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов двумерного массива'); WriteLn;
FOR I:=1 TO N DO Begin
FOR J:=1 TO 2*N DO Begin
H[I,J]:=Random(23); Write(H[I,J]:3);
End; WriteLn;
End; WriteLn;
{ Нахождение суммы значений элементов, имеющих четные номера строк }
I:=2; K:=0;
WHILE I<=N DO Begin
FOR J:=1 TO 2*N DO Begin
S:=S+H[I,J]; Inc(K);
End; I:=I+2;
End;
SA:=S/K;
Write(' Среднее арифметическое элементов, имеющих четные номера строк =',SA:4:1);
END.
Примеры для самостоятельного решения:
1. Найти произведение элементов К-го и Р-го столбцов квадратной матрицы, размерностью 6х6.
2. Дан двумерный массив размерностью 5х3, заполненный целыми числами. Найти произведение
элементов нечетных строк матрицы.
3. Дан двумерный массив размерностью 5х6, заполненный целыми числами и величина К. Найти
количество элементов, равных К и их сумму.
4. Дан двумерный массив размерностью NхM, заполненный целыми числами. Определить, есть ли в
данном массиве столбец, в котором имеются одинаковые элементы.
2 Алгоритмы формирования одномерного массива
1. Дан двумерный массив размерностью 5х6, заполненный целыми числами.
Сформировать
одномерный массив, каждый элемент которого соответственно равен сумме элементов строк. Оба
массива вывести на экран.
USES Crt;
VAR
H:ARRAY[0..5,0..6] OF INTEGER; K:ARRAY[0..5] OF INTEGER;
I,J:BYTE; S:INTEGER;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения двумерного массива');
FOR I:=1 TO 5 DO Begin
FOR J:=1 TO 6 DO Begin
H[I,J]:=Random(23); Write(H[I,J]:3);
End; WriteLn;
End; WriteLn;
{ Нахождение суммы элементов строк и заполнение одномерного массива }
WriteLn(' Значения одномерного массива');
FOR I:=1 TO 5 DO Begin
S:=0;
FOR J:=1 TO 6 DO
S:=S+H[I,J];
35
K[I]:=S; Write(K[I]:4);
End;
END.
2. Дана квадратная матрица порядка n, заполненная целыми числами. Получить одномерный массив,
элементами которого являются первый положительный элемент соответствующей строки матрицы.
USES Crt;
LABEL M1;
CONST N=5;
VAR
H:ARRAY[0..N,0..N] OF INTEGER; B:ARRAY[0..N] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов двумерного массива');
WriteLn;
FOR I:=1 TO N DO Begin
FOR J:=1 TO N DO Begin
H[I,J]:=Random(25)-10; Write(H[I,J]:3);
End; WriteLn;
End; WriteLn;
WriteLn(' Значения первых положительных элементов соответствующих строк');
WriteLn;
FOR I:=1 TO N DO Begin
FOR J:=1 TO N DO
IF H[I,J]>0 THEN Begin B[I]:=H[I,J]; GOTO M1; End;
M1: Write(B[I]:3);
End;
END.
3. Дан двумерный массив размерностью NхM, заполненная целыми числами. Получить одномерный
массив, элементами которого являются сумма первого и последнего элементов соответствующих строк
двумерного массива.
USES Crt;
CONST N=5; M=7;
VAR
A:ARRAY[0..N,0..M] OF INTEGER; B:ARRAY[0..N] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr; Randomize;
{ Заполнение двумерного массива случайным образом и вывод в виде
прямоугольной
матрицы }
WriteLn(' Значения элементов двумерного массива');
WriteLn;
FOR I:=1 TO N DO Begin
FOR J:=1 TO M DO Begin
A[I,J]:=Random(30); Write(A[I,J]:3);
End; WriteLn;
End; WriteLn;
WriteLn(' Cумма первого и последнего элементов соответствующих строк');
WriteLn;
FOR I:=1 TO N DO Begin
B[I]:=A[I,1]+A[I,M]; Write(B[I]:3);
End;
END.
36
4. Дан двумерный массив размерностью 5х6, заполненный целыми числами.
Сформировать
одномерный массив каждый элемент которого равен произведению четных положительных элементов
соответствующего столбца.
USES Crt;
VAR
M:ARRAY[0..5,0..6] OF INTEGER; F:ARRAY[0..6] OF INTEGER;
I,J:BYTE; P:LongInt;
BEGIN
ClrScr; Randomize;
{ Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы }
WriteLn(' Значения элементов двумерного массива');
FOR I:=1 TO 5 DO Begin
FOR J:=1 TO 6 DO Begin
M[I,J]:=Random(20)-5; Write(M[I,J]:3);
End; WriteLn;
End; WriteLn;
{ Формирование одномерного массива}
WriteLn(' Значения элементов одномерного массива');
FOR J:=1 TO 6 DO Begin
P:=1;
FOR I:=1 TO 5 DO
IF (M[I,J]>0) AND (M[I,J] mod 2 =0) THEN P:=P*M[I,J];
IF P=1 THEN F[J]:=0 ELSE F[J]:=P;
Write(F[J]:4);
End;
END.
Примеры для самостоятельного решения:
1. Дан двумерный массив размерностью 6х5, заполненный целыми числами, введенными с клавиатуры.
Сформировать одномерный массив, каждый элемент которого равен первому четному элементу
соответствующего столбца, если такого нет, то равен нулю.
2. Дан двумерный массив размерностью 5х6, заполненный целыми числами.
Сформировать
одномерный массив, каждый элемент которого равен произведению четных положительных
элементов соответствующего столбца.
3. Дана квадратная матрица размерностью NхN, заполненная целыми числами и величина А.
Сформировать одномерный массив, каждый элемент которого равен элементу, расположенному на
главной диагонали , умноженному на величину А .
4. Дан двумерный массив размерностью 6х8, заполненный целыми числами, введенными с клавиатуры.
Сформировать одномерный массив, каждый элемент которого равен количеству элементов
соответствующих строк матрицы, значения которых находятся в интервале( -2, 10).
3 Алгоритмы нахождения наибольшего и наименьшего элементов двумерного массива
1. В соревнованиях по плаванию принимали участие 5 спортсменов. Соревнования состояли из 3
заплывов. Результаты заплывов записали в таблицу размерностью 3х5. Получить одномерный массив
размером 3, элементами которого будут лучшие результаты в каждом из заплывов.
USES Crt;
VAR
RZ:ARRAY[0..3,0..5] OF INTEGER; LR:ARRAY[0..3] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr; WriteLn;
{ Заполнение таблицы }
FOR I:=1 TO 3 DO Begin
WriteLn(' Введите результаты ',I,' заплыва');
FOR J:=1 TO 5 DO Begin
37
Write(J,' участник - '); ReadLn(RZ[I,J]);
End;
End; WriteLn;
{ Определение лучшего результата в каждом из заплывов }
FOR I:=1 TO 3 DO Begin
LR[I]:=RZ[I,1];
FOR J:=2 TO 5 DO
IF RZ[I,J]<LR[I] THEN LR[I]:=RZ[I,J];
WriteLn(' Лучший результат ',I,' заплыва = ',LR[I]);
End;
END.
2. Дан двумерный массив размерностью 5х6, заполненный целыми числами.
Сформировать
одномерный массив, каждый элемент которого равен
наибольшему по модулю элементу
соответствующего столбца.
USES Crt;
VAR
M:ARRAY[0..5,0..6] OF INTEGER; MAX:ARRAY[0..6] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr; Randomize;
WriteLn(' Значения элементов двумерного массива');
FOR I:=1 TO 5 DO Begin
FOR J:=1 TO 6 DO Begin
M[I,J]:=Random(20)-8; Write(M[I,J]:3);
End; WriteLn;
End; WriteLn;
{ Формирование одномерного массива}
WriteLn(' Значения элементов одномерного массива');
FOR J:=1 TO 6 DO Begin
MAX[J]:=ABS(M[1,J]);
FOR I:=2 TO 5 DO
IF ABS(M[I,J]) > MAX[J] THEN MAX[J]:=ABS(M[I,J]);
Write(MAX[J]:3);
End;
END.
3. Дан двумерный массив размерностью NхM, заполненный случайным образом. Определить, есть ли в
данном массиве строка, в которой имеется два элемента массива, имеющие наибольшее значение.
USES Crt;
CONST N=6; M=8;
VAR
A:ARRAY[0..N,0..M] OF INTEGER;
I,J,K,FL:BYTE; MAX:INTEGER;
BEGIN
ClrScr; Randomize;
{ Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы }
WriteLn(' Значения элементов двумерного массива');
FOR I:=1 TO N DO Begin
FOR J:=1 TO M DO Begin
A[I,J]:=Random(20); Write(A[I,J]:3);
End; WriteLn;
End; WriteLn;
{ Нахождение наибольшего значения }
MAX:=A[1,1];
38
FOR I:=1 TO N DO
FOR J:=1 TO M DO
IF A[I,J]>MAX THEN MAX:=A[I,J];
WriteLn(' Максимальное значение = ',MAX);
{ Нахождение строки, в которой два элемента имеют наибольшее значение }
FL:=0;
FOR I:=1 TO N DO Begin
K:=0;
FOR J:=1 TO M DO
IF A[I,J]=MAX THEN Inc(K);
IF K=2 THEN Begin WriteLn('В ',I,' строке два элемента имеют наибольшее значение');
FL:=1;
End;
End;
IF FL=0 THEN WriteLn(' Нет строк, в которых два элемента имеют наибольшее значение');
END.
Примеры для самостоятельного решения:
1. Дан двумерный массив размерностью 5x7, заполненный случайным образом. Найти наименьший и
наибольший элементы двумерного массива, поменять их местами.
2. Дан двумерный массив размерностью NxM, заполненный случайным образом. Получить
одномерный массив, элементами которого являются сумма наименьшего и наибольшего элементов
соответственной строки двумерного массива.
7. Множества
Множество – структурированный тип данных, представляющих набор взаимосвязанных по
какому-либо признаку или группе признаков объектов, которое можно рассматривать как единое целое.
Каждый объект в множестве называется элементом множества. Все элементы множества должны
принадлежать одному из скалярных типов, кроме вещественного. Значения элементов множества
указываются в квадратных скобках. Например:
[1,2,3,4]; [‘f’,’d’,’c.’]; [‘a’..’z’]
Формат:
Type
<имя типа>= set of <элемент1, элемент2, …,элементn>;
Var
<идентификатор>:<имя типа>;
или
Var
<идентификатор>:set of <элемент1, элемент2, …,элементn >;
Например:
Type
Pros=set of (1,3,5,7,13);
Nom=set of 1..31;
Var
Pr: Pros;
N: Nom;
Buk: set of (‘A’,’S’, ‘Z’,’J’);
S: Set Of Byte;
Количество элементов множества не более 256. Объем памяти, занимаемый одним элементом
множества, составляет 1 бит.
7. 1 Операции над множествами
С множествами допускаются все операции отношения (=, <>, >=, <=), операции объединения,
пересечения, разности множеств и операция in.
39
Результат выражений: True, False.
Операция «=».
Значение А
Значение В
Выражение
Результат
[1,2,3,5]
[1,2,3,5]
A=B
True
[‘a’,’b’,’c’]
[‘a’,’c’]
A=B
False
[‘a’..’z’]
[‘z’..’a’]
A=B
True
Операция «<>»
Значение А
Значение В
Выражение
Результат
[1,2,3]
[1,2,3,4]
A<>B
True
[‘a’..’z’]
[‘b’..’z’]
A<>B
True
[‘a’..’n’]
[‘n’..’a’]
A<>B
False
Операция «>=». Результат операции A>=B True, если все элементы множества B содержатся в
множестве A.
Значение А
Значение В
Выражение
Результат
[1,2,3,4]
[4,2,3]
A>=B
True
[‘a’..’z’]
[‘b’..’t’]
A>=B
True
Операция «<=». Результат операции A<=B True, если все элементы множества A содержатся в
множестве B.
Значение А
Значение В
Выражение
Результат
[1,2,3]
[1,2,3,4]
A<=B
True
[‘d’..’h’]
[‘a’..’z’]
A<=B
True
Операция in
Используется для проверки принадлежности какого-либо элемента указанному множеству.
Результат операции – значение True, если элемент принадлежит множеству, и False – в противном
случае.
Значение А
Выражение
Результат
2
If A in [1,2,3] Then…
True
‘v’
If A in [‘a’..’n’]
False
Then…
При использовании операции in множество в [ ] не обязательно описывать в разделе описаний.
Операция in позволяет эффективно производить сложные проверки условий. Например:
If (A=1) OR (A=2) OR (A=3) OR (A=4) OR (A=5) OR (A=6) Then …
можно заменить:
If A in {1..6] Then …
Допускается запись:
If NOT(X in M) Then…
Объединение множеств (+)
Объединением двух множеств является третье множество, содержащее элементы обоих множеств.
Значение А
Значение В
Выражение
Результат
[1,2,3]
[]
[1,4,5]
[]
A+B
A+B
[1,2,3,4,5]
[]
А
В
А+В
Пересечение множеств (*)
Пересечением двух множеств является третье множество, которое содержит элементы, входящие
одновременно в оба множества.
Значение А
Значение В
Выражение
Результат
[1,2,3]
[‘a’..’z’]
[]
[1,4,2,5]
[‘b’..’z’]
[]
A*B
A*B
A*B
[1,2]
[‘b’..’z’]
[]
40
А
В
А*В
Разность множеств (-)
Разностью двух множеств является третье множество, которое содержит элементы первого
множества, не входящие во второе.
Значение А
Значение В
Выражение
Результат
[1,2,3,4]
[X1,X2,X3,X4]
[1,3,4]
[X4,X1]
A-B
A-B
[2]
[X2,X3]
А
В
А-В
Преимущества при использовании множеств:
1. Упрощаются сложные операторы If.
2. В ряде случаев экономится память, время компиляции и выполнения.
Недостаток:
Pascal не поддерживает ввод-вывод элементов множества.
7.2 Примеры решения задач
1. Создать множество из элементов типа Char, выход из фазы создания осуществить при вводе
значения Z. Распечатать все элементы созданного множества в алфавитном порядке.
Var
S: Set of Char;
N: Char;
Begin
S:=[]; {пустое множество}
WriteLn(‘Введите элементы множества’);
Readln(N); {считывание первого элемента}
While True Do Begin
S:=S+[N]; {внесение значения элемента в множество}
ReadLn(N);
If N = ‘Z’ Then Exit
End;
{Вывод элементов множества в алфавитном порядке}
For N:=’A’ to ‘Z’ Do
If N in S Then WriteLn(N);
END.
3. Дано натуральное число n. Составить программу вывода цифр, не входящих в десятичную запись
числа n (в порядке возрастания).
Type Mn=Set Of 0..9;
Var S : Mn;
N: LongInt;
I : Integer;
Begin
WriteLn(‘Ведите число’);
ReadLn(N);
S:=[0..9];
While N<>0 Do Begin
S:=S-[n mod 10]; {Исключаем цифру}
N:=N Div 10;
End;
For I:=0 To 9 Do
41
If I In S Then Write (I:2);
WriteLn;
End.
3. Смоделировать игру с машиной. Задумайте целое число от 0 до 15. в ЭВМ вводятся номера групп, в
которых находится задуманное число. Например, я задумала число 5. в ЭВМ вводится 1, 3. компьютер
выводит число 5.
Группы
1
2
3
4
0,1,2,3,4,5,6,7
0,1,2,3,8,9,10,11 0,1,4,5,8,9,12,13 0,2,4,6,8,10,12,14
1 способ
Type S=set of 0..15;
A=array[1..4] of S;
Const
X: A=([0..7],[0..3,8..11],[0,1,4,5,8,9,12,13],[0,2,4, 6,8,10,12,14]);
Var
R:S {Множество типа S}
K,I: Byte;
B: array[1..4] of Byte;
BEGIN
R:=[0..15]; {R- множество, в которое входит задуманное число}
For I:==1 To 4 Do Begin
Write(‘Введите 0, если не принадлежит ’, I,’ –ой группе, и 1, если принадлежит:’);
ReadLn(B[I]);
End;
For I;=1 To 4 Do
If B[I]=1 Then R:=R*X[I];
For I;=1 To 4 Do
If B[I]<>1 Then R:=R-X[I];
I:=0;
While I<=15 Do Begin
If I in R Then Begin WriteLn(‘Ваше число=’;I); Halt End;
I=I+1;
End;
END.
2 способ (с переводом в 2 с/c)
Var
A,I: Integer;
X: array[1..4] of Integer;
Y,Y1: Integer
BEGIN
For I;=1 To 4 Do
X[I]:=0;
For I;=1 To 4 Do Begin
WriteLn(‘Ведите номер группы’);
ReadLn(A);
X[A]:=1;
End;
Y1:=X[4]+2*(X[3}+2*(X[2]+2*X[1]));
Y:=15-Y1;
WriteLn(‘Ваше число= ’,Y);
END.
Примеры для самостоятельного решения:
1. Найти общие цифры в записи m чисел.
42
2. Найти простые цифры в интервале от 2 до n.
3. Вывести в алфавитном порядке элементы множества, составленного из произвольных букв от
‘A’…’Z’
8. Строки
Строка – последовательность символов. При использовании в выражениях строка заключается в
апострофы. Количество символов в строке может изменяться от 0 до 255.
Определение строкового типа устанавливает максимальное количество символов, которое может
содержать строка.
Формат
TYPE
<имя типа>=String[максимальная длина строки];
VAR
<идентификатор,…>:<имя типа>;
Переменную String можно задать и без описания типа.
Формат
VAR
<идентификатор,…>:string[максимальная длина строки];
Пример
CONST
Adres=’ул. Фестивальная 4’;
TYPE
Flot=String[125];
VAR
Fstr: Flot;
St1: String[34];
St2, St3: string[50];
Nazv: String[325]; {ошибка, длина>255}
Nay: String;
{ошибка, не указана длина}
Для определения объема памяти в байтах, требуемой для размещения строки, к значению ее
максимальной длины прибавляется 1. например, для размещения в памяти переменных Fstr, St1, St2, St3
требуется соответственно 126, 35, 51, 51 байт. Дополнительный байт расположен в самом начале строки
( имеет нулевой номер) и содержит значение текущей длины строки.
8.1 Строковые выражения
Выражения, в которых операндами служат строковые данные, называются строковыми
выражениями.
Над строковыми данными допустимы операции сцепления и операции отношения.
Операции сцепления (+) применяются для сцепления нескольких строк в одну результирующую
строку.
Выражение
Результат
‘Группа ’+’2В’
‘Группа 2В’
‘А’+’Б’+’В’
‘АБВ’
Длина результирующей строки не должна превышать 255.
Операции отношения (=,<>,>,<,>=,<=) проводят сравнение двух строковых операндов и имеют
более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до
первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий
символ имеет больший номер в стандартной таблице обмена информацией.
Результат выполнения операций отношения имеет булевский тип (True, False)
Выражение
Результат
‘COSM1’>’COSM2’
True
‘akkord’>’AKKORD’
True
43
Если строки имеют различную длину, то считается, что более короткая строка меньше, чем более
длинная.
Выражение
Результат
‘Принтер ’>’Принтер’
True
‘Река’=’Река’
True
Для присваивания строковой переменной результата строкового выражения используется оператор
присваивания. Например:
Str1:=’Группа учащихся’;
Если значение переменной после выполнения оператора присваивания превышает по длине
максимально допустимую при описании, все лишние символы справа отбрасываются.
Описание А
Выражение
Значение А
A: String[6];
A:=’Группа 2В’
‘Группа’
A: String[8];
A:=’Группа 2В’
‘Группа 2В’
Допускается смешение в одном выражении операндов строкового и литерного типа. Если при
этом литерной переменной присваивается значение строкового типа, длина должна быть равна единице,
иначе будет ошибка.
Пример:
VAR
Lit: Char;
St1: String[12];
St2: String[30];
Begin
Lit:=’Z’;
Str1:=’Отдел’;
Str2:=Str1+Lit;
….
К отдельным символам строки можно обратиться по номеру (индексу) данного символа в строке.
Индекс записывается в квадратные скобки []. Например:
Str1[2] – доступ к букве “т”
Str1[0] – находится длина текущей длины строки.
8.2 Стандартные процедуры и функции для обработки строковых данных
Функции:
1) LENGTH(ST)
Вычисляет длину строки ST в символах. Результат – целочисленный.
Значение St
Выражение
Результат
‘Функция’
LENGTH(St)
7
Решение задач без использования стандартных функций.
Для самостоятельного решения.
1. В тексте имеется символ “:”. Вывести на экран все символы, расположенные после“:”.
2. В тексте заменить все восклицательные знаки на точки.
3. Определить среднюю длину слова в тексте. Слова разделены пробелом.
2) COPY(St,Poz,N)
Выдает из St подстроку длиной N символов, начиная с позиции Poz. Если Poz>длины строки, то
результат будет пробел. Если Poz>255, то выдается ошибка. Poz, N –целочисленные выражения.
Значение St
Выражение
Результат
строка
COPY(St,3,3)
рок
COPY(St,3,8)
рока
3) Concat(St1,St2,…Stn)
Выполняет сцепление St1…Stn в том порядке, в котором они указаны в списке параметров.
44
Выражение
Результат
Concat(‘AA’,XX’,’BB’)
AAXXBB
4) Pos(St1,St2)
Обнаруживает первое появление в строке St2 подстроки St1. результат равен номеру той позиции,
где находится первый символ подстроки St1.
Значение St
‘абвгде’
Выражение
Pos(‘вг’,St1)
Pos(‘к’,St1)
Результат
3
0
5) Str(IBR,St)
Преобразовывает числовое значение величины IBR в строковое, и помещает результат в строку St.
После IBR может записываться формат, аналогичный формату вывода.
Значение IBR
Выражение
Результат
1500
STR(IBR:6,St)
‘1500’
4800
STR(IBR:10,St)
‘4800’
6) UpCase(Ch)
Преобразует строчную букву в прописную. Параметр и результат имеют литерный тип.
Обрабатывает только буквы латинского алфавита.
Значение Ch
Выражение
Результат
‘a’
UpCase(Ch)
‘A’
‘v’
UpCase(Ch)
‘V’
Процедуры
1) DELETE(St, Poz, N)
Удаление N символов строки St, начиная с позиции Poz. Например:
St:=’абвгде’;
Delete(St,4,2);
Write(St);
Результат: ‘абве’
2) INSERT(St1, St2, Poz)
Вставка строки St1 в строку St2, начиная с позиции Poz. Например:
Var
S3:String[30];
S1,S2:String[11];
Begin
S1:=’ Петров’;
S2:=’Ученик ’;
Insert(S1,S2,7);
Write(S2);
End.
Результат: ‘Ученик Петров’
8.3 Примеры решения задач
1.Задачи на подсчет символов.
1. Определить количество букв “а” и ”о” в строке символов.
Var
St: Sring[255];
Ko,Ka: Byte;
I,N: Byte;
Begin
45
WriteLn(‘Введите строку символов ‘);
ReadLn(St);
N:=Length(St); {Определение длины введенной строки}
Ko:=0; Ka:=0;
For I:=1 To N Do Begin
If (St[I]=’o’) OR (St[I]=’O’) Then Ko:=Ko+1;
If (St[I]=’a’) OR (St[I]=’A’) Then Ka:=Ka+1;
End;
WriteLn(‘Количество букв о =’,Ko);
WriteLn(‘Количество букв а =’,Kа);
End.
2. Подсчитать сколько слов в тексте начинается на букву ‘а’.
Var
St: Sring[255];
I,K: Byte;
Begin
WriteLn(‘Введите текст ‘);
ReadLn(St);
N:=Length(St); {Определение длины введенной строки}
K:=0;
If St[1]=’A’ Then K:=K+1;
For I:=2 To N Do
If (Copy(St,I,2)=’ a’) OR (Copy(St,I,2)=’ A’) Then K:=K+1;
WriteLn(‘Количество слов, начинающихся на букву «а»=’,K);
End.
3. Определить среднюю длину слова в тексте.
USES Crt;
VAR
A: STRING [240]; KS, KB, N, I: INTEGER;
BEGIN
ClrScr;
Write('Введите тест '); ReadLn(A);
N:=Length(A);
KS:=0; KB:=0;
FOR I:=1 TO N DO
IF (A[I]=' ') OR (A[I]=',') OR (A[I]='.') THEN KS:=KS+1 ELSE KB:=KB+1;
IF (A[N]<>' ') AND (A[N]<>'.') AND (A[N]<>',') THEN KS:=KS+1;
WriteLn('Средняя длина слова = ',KB/KS:3:0);
END.
Примеры для самостоятельного решения:
1. Подсчитать, сколько слов в тексте оканчивается на букву “а”.
2. Подсчитать, сколько букв “т” в последнем предложении.
3. Подсчитать, сколько раз встречается в тексте слово “кот”.
4. В тексте найти количество слов, у которых первый и последний символы совпадают между собой
(слова разделены пробелом).
2. Задачи на замену символов.
1. Заменить в тексте последовательность символов ‘аб’ на ’яд’.
Var
St: Sring[255];
I,N: Byte;
Begin
WriteLn(‘Введите строку символов ‘);
ReadLn(St);
46
N:=Length(St); {Определение длины введенной строки}
S1:=’яд’;
For I:=1 To N-1 Do
If Copy(St,I,2)=’аб’ Then Begin
Delete(St,I,2);
Insert(S1,St,I);
End;
Write(‘Результирующая строка: ’,St);
End.
2. В тексте заменить все запятые, предшествующие первой точке, на пробелы.
Var
St: Sring[255];
I,P: Byte;
Begin
WriteLn(‘Введите строку символов ‘);
ReadLn(St);
P:=POS(‘.’,St); {Определение позиции первой точки}
For I:=1 To P-1 Do
If St[I]=’,’ Then St[I]:=’ ‘;
WriteLn(St);
End.
Примеры для самостоятельного решения.
1. Проверить правильность написания гласных букв: «ча», «ща», «чу», «щу», «жи». «ши».
2. В строке символов слово «она» заменить на слово «он».
3. Задачи на удаление символов.
1. В тексте убрать лишние пробелы между словами, оставив по одному.
Var
S: String[255];
I: Byte;
Begin
WriteLn(‘Ведите текст’);
ReadLn(S);
I:=1;
While(I<=LengTh(S)) Do Begin
If Copy(S,I,2)=’ ‘ Then Begin
Delete(S,I,1);
I:=I-1;
End;
I:=I+1;
End;
WriteLn(‘Измененный текст ’,S);
End.
2. В тексте удалить все слова, заканчивающиеся на букву "e".
USES Crt;
VAR
S: STRING [250]; PS,N,I: INTEGER;
BEGIN
ClrScr;
Write('Введите текст '); ReadLn(S);
S:= ' '+S+' ';
FOR I:=1 TO Length(S) DO Begin
IF S[I]=' ' THEN Begin
PS:=I-1;
47
IF S[PS]='E' THEN WHILE(S[PS]<>' ') DO Begin
Delete(S,PS,1); PS:=PS-1;
End;
End;
End;
WriteLn(‘ Измененный текст:’); Write(S);
END.
3. Из текста удалить каждое второе слово. Слова разделены пробелом.
USES Crt;
Type MAS= STRING [20];
VAR
A : MAS;
I,K: INTEGER;
BEGIN
ClrScr;
Write('Введите текст '); ReadLn(A);
i:=1;
While (I<=Length(A)) DO Begin
IF A[I]=' ' THEN Begin
K:=I+1;
While (A[K]<>' ') DO Delete(A,K,1);
I:=I+1;
End;
I:=I+1;
End;
WriteLn(‘Измененный текст:’); Write(A);
END.
4. В тексте удалить удвоенные согласные буквы, оставив по одной.
Var
S: String[255];
SB:String[25];
I,J:Byte;
Begin
WriteLn(‘Введите текст’);
ReadLn(S);
SB:=’бвгджзклмнпрстфхцчшщ’;
For I:=1 To Length(SB) D0
For J:=1 To Length(S) D0
If Copy(S,J,2)=SB[I]+SB[I] Then Delete(S,J,1);
WriteLn(‘Измененный текст ‘,S);
End.
Примеры для самостоятельного решения:
1. Из строки символов удалить все гласные буквы
2. Из строки символов удалить заданное слово
3. Удалить все символы «!», следующие за вторым предложением
4. В тексте удалить все слова, заканчивающиеся на букву «о» (слова разделены пробелом).
4. Задачи на вставку символов.
1. В тексте исправить ошибки в словах длиный и Генадьевич.
Var
St: Sring[255];
I,P: Byte;
Begin
48
WriteLn(‘Введите строку символов ‘);
ReadLn(St);
I:=1;
While I<=Length(St) Do Begin
If Copy(St,I,8)=’ длиный ‘ Then Insert(‘н’,St,I+4);
If Copy(St,I,12)=’ Генадьевич ‘ Then Insert(‘н’,St,I+3);
I:=I+1;
End;
2. В заданном тексте проверить наличие запятой перед каждым союзом «но». При отсутствии –
вставить.
Var
St: Sring[255];
I,K: Byte;
Begin
WriteLn(‘Введите текст ‘);
ReadLn(St);
S:=’, но ’;
I:=1;
While I<=Length(St) Do Begin
If (Copy(St,I,4)=’ но ’) and (St[I-1]<>’,’) Then Begin
Delete(St,I,4);
Insert(S,St,I);
I:=I+4;
End;
I:=I+1;
End;
WriteLn(St);
End.
3. В текст вставить символ пробел после каждого имеющегося символа пробел.
USES Crt;
VAR
A : STRING [255]; I: INTEGER;
BEGIN
ClrScr;
WriteLn('Введите текст'); ReadLn(A);
I:=1;
While (I<=Length(A)) DO Begin
IF A[I]=' ' THEN Begin Insert (' ',A,I); I:=I+1; End;
I:=I+1;
End;
WriteLn(‘Измененный текст:’); WriteLn(A);
END.
Примеры для самостоятельного решения:
1. Исправить ошибки в тексте: в словах «рож», «мыш», «доч», в конце поставить «ь».
2. В тексте в последнем предложении после слова «мама» вставить «и папа».
3. В тексте после слов «например» поставить «,».
4. В тексте во втором предложении после слов «Ура» поставить «!!!».
9. Процедуры и функции, определенные пользователем
Подпрограммой называется именованная логически законченная группа операторов языка,
которую можно вызвать для выполнения по имени любое количество раз из различных мест
программы. В языке Pascal для организации подпрограмм используются процедуры и функции.
49
Процедура – это независимая поименованная часть программы. Она состоит из заголовка и тела.
После однократного описания процедуру можно вызвать по имени из последующих частей программы.
Имя процедуры не может находиться в выражении в качестве операнда.
Функция аналогична процедуре, но имеет два отличия:
 функция передает в точку вызова скалярное значение (результат своей работы);
 имя функции может входить в выражение как операнд.
Все процедуры и функции языка Pascal подразделяются на две группы:
1. встроенные (стандартные).
2. определенные пользователем.
Встроенные процедуры и функции являются частью языка и вызываются по имени.
Использование процедур и функций дает ряд преимуществ:
1. организовать работу нескольких программистов над одной программой с последующим
объединением отдельно отлаженных и относительно независимых блоков в единое целое;
2. проводить отладку отдельных блоков и только после этого программы в целом;
3. значительно экономить память, т.к. многократно используемый участок заносится в память только
один раз;
4. упростить внесение изменений в программу, т.к. исправление ошибки в одном блоке не вызывает
корректировку других блоков.
9.1 Процедуры пользователя
Формат описания процедуры:
Procedure <имя>{(формальные параметры)};
Пример описания процедуры:
Procedure Sort(A:Integer;B:Real);
Procedure Sum;
{формальные параметры не требуются}
Procedure Kvadr(Al,Beta:Integer);
Имя процедуры – идентификатор, уникальный в пределах программы.
Тело процедуры по структуре аналогично программе:
Procedure <имя>{(формальные параметры)};
<раздел описания>
Begin
<раздел операторов>
End;
Для обращения к процедуре используется оператор вызова процедуры. Он состоит из имени
процедуры и списка фактических параметров, отделенных друг от друга запятыми.
Формат:
<имя процедуры>{(параметр1, параметр2, …)};
Примеры вызова процедур:
Sort(A1,B1); {параметры – значения переменных}
Rvadr(14,25); {параметры – непосредственно значения }
Sum;
Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в
заголовке описания процедуры устанавливается взаимно–однозначное соответствие в результате их
перебора слева направо. Количество и тип формальных параметров равны количеству и типу
фактических параметров. При обращении к процедуре формальные параметры заменяются на
соответствующие фактические параметры вызывающей программы.
Пример. В процедуре произвести очищение экрана, установку курсора в его центр и вывод слова
«Справочник».
USES CRT;
Procedure Ekran;
Begin
ClrScr;
GotoXY(30,12);
50
WriteLn(‘Справочник’);
End;
Begin
{начало программы}
…..
Ekran; {вызов процедуры Ekran}
End.
Задания для самостоятельной работы
1 вариант
1. Дан массив с оценками учащихся. Найти средний балл учащихся. Подсчитать количество 5 и 4.
Заполнение массива, подсчет среднего балла и подсчет количества оценок оформить отдельными
процедурами.
2. Задана матрица W(5,6). Отрицательные элементы матрицы заменить на 0. измененный массив
вывести на экран. Обработку элементов массива оформить в процедуре.
2 вариант
1. Дан одномерный массив со значениями веса кур на птицефабрике. Найти средний вес кур. Найти
вес самой тяжелой курицы. Заполнение массива, подсчет среднего веса и нахождение веса самой
тяжелой курицы оформить отдельными процедурами.
2. Найти произведение элементов массива R(7,5) в строках с четными номерами. Обработку
элементов массива оформить в процедуре.
9.2 Функции пользователя
Формат описания функции:
Function <имя>{(формальные параметры)}:<тип результата>;
Примеры заголовка функции:
Function Prov(X,Y,T:integer):Real;
Function ZX:Real;
Возвращаемый результат может иметь любой скалярный тип.
Тело функции аналогично по структуре программе.
Function <имя>{(формальные параметры)}:<тип результата>;
<раздел описания>
Begin
<раздел операторов>
End;
В разделе операторов должен находиться, по крайней мере один оператор, присваивающий
идентификатору функции значение. Если таких присваиваний несколько, то результатом выполнения
функции будет значение последнего оператора присваивания.
Пример1. С использованием функции производить возведение в степень положительного или
отрицательного числа.
Var
Z:Interer;
K:Real;
Function Step(F:Real; Exp:Integer):Real; {функция возведения в степень числа}
Var
C:Integer;
T:Real;
Begin
If Exp=0 Then Step:=1
Else Begin
T:=F;
For C:=2 To Abs(Exp) Do T:=T*F
If Exp >0 Then Step:=T Else Step:=1/T;
End;
End;
51
Begin
Write(‘Введите значение’);
Read(Z);
WriteLn(Step(Z,3)); {вызов функции Step и возведение числа Z в степень 3}
WriteLn(Step(Z,4)); {вызов функции Step и возведение числа Z в степень 4}
K:=1.4;
WriteLn(Step(K,3));
End.
Пример 2. Вычислить сложное выражение, используя функцию пользователя для вычисления
повторяющейся в нем части.
K=(1+m^2)/cos(1-m)–5*(c+d^2)/cos(c-d)+(x+y^2)/cos(x-y)
Var
M,C,D,X,Y:Integer;
K:Real;
Function SV(A,B:Integer):Real;
Begin
SV:=Abs((A+Sqr(B)/Cos(a-b));
End;
Begin
WriteLn(‘Введите 5 значений’);
ReadLn(M,C,D,X,Y);
K:=SV(1,M)-5*Sqrt(SV(C,D))+SV(X,Y);
WriteLn(‘K=’,K);
End.
Пример 3. Вычислить сумму N членов ряда. Факториал вычислять с помощью функции пользователя.
S=1!/4!+4!/5!+9!/6!+16!/7!+…+(n^2)!/(n+3)!
Var
S:LongInt;
J:Byte;
Function Fact(M:Integer):Integer; {функция вычисления факториала}
Var
I:Byte;
P:Integer;
Begin
P:=1;
For I:=1 To M Do P=P*I;
Fact:=P;
End;
Begin
WriteLn(‘Введите N’);
RearLn(N);
S:=0;
For J:=1 To N Do S:=S+Fact(Sqr(J))/Fact(J+3);
WriteLn(‘S=’,S);
End.
Задания для самостоятельного решения.
1. Вычислить сложное выражение, используя функцию пользователя для вычисления
повторяющейся в нем части.
C=(d+e)/tg(de)+(x+y)/tg(xy)-(z+t)/tg(zt)
2. Вычислить функцию: C = m!n!/(m-n)!. Для вычисления факториала использовать функцию
пользователя.
52
В любой программе все переменные делятся на глобальные и локальные. Глобальные переменные
описываются в разделе описаний основной части программы, а локальные – в разделах описаний
процедур и функций. Локальные переменные существуют только в течение времени работы процедуры,
определяются при ее вызове и «исчезают» после завершения работы процедуры.
9.3 Параметры
При описании процедуры указывается список формальных параметров. Каждый параметр
является локальным, к нему можно обращаться только в пределах данной процедуры. Фактические
параметры, которые передаются процедуре при обращении к ней. Количество и типы формальных и
фактических параметров должны совпадать.
Параметры могут иметь любой тип, включая структурированный. В Pascal различают два метода
передачи параметров:
 по значению;
 по ссылкам.
9.3.1 Параметры – значения
Изменение формальных параметров не влечет за собой изменения фактических параметров. Это
основная причина использования таких параметров, так как позволяет устранить несанкционированное
изменение собственного параметра программы. Однако передать информацию из подпрограммы в
основную программу с помощью таких параметров также нельзя. Параметр-значение указывается в
заголовке подпрограммы своим именем и через двоеточие – типом.
Procedure Konc(A,B,C:Integer;D:Real);
Function Doc(S1,S2:Real):Real;
Запись
Procedure Okl((M:array[1..12] Of Integer); - ошибочна
Необходимо тип переменной определить ранее в разделе описания типов блока:
Type Massiv=array[1..12] Of Integer;
Procedure Okl((M:Massiv);
Пример. Функция вычисления максимального элемента в массиве.
Type
Tarr=Array[1..100] Of Integer;
Var
Massiv:Tarr;
Maxim:Integer;
Function Max(Mas:Tarr;N:Byte):Integer;
{Определение максимального элемента}
Var
Ma:Integer;
I:Byte;
Begin
Ma:=Mas[1];
For I:=2 To N Do
If Ma<Mas[I] Then Ma:=Mas[I];
Max:=Ma;
End;
Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и
записи его в переменную Maxim можно записать оператор:
Maxim:=Max(Massiv,5);
9.3.2 Параметры - переменные
Любое изменение формального параметра означает изменение фактического параметра. Для
описания параметров-переменных служит слово Var. Действие слова Var распространяется до
ближайшей точки с запятой, т.е. в пределах одной группы.
53
Procedure MaxMin(A:Tarr; Var Max,Min: Real; C:Integer);
Max, Min – параметры-переменные, A,C – параметры-значения.
Пример. Функция вычисления максимального элемента в массиве.
Function Max(Var Mas:Tarr;N:Byte):Integer;
{Определение максимального элемента}
Var
Ma:Integer;
I:Byte;
Begin
Ma:=Mas[1];
For I:=2 To N Do
If Ma<Mas[I] Then Ma:=Mas[I];
Max:=Ma;
End;
При такой передаче параметра, возможно его нежелательное изменение.
Демонстрационный пример.
Var
A, B: Byte;
K, N: Integer;
I1,I2,J1,J2:Integer;
Procedure WW1;
Begin
A:=A+4; {Глобальная переменная}
End;
Procedure WW2(Var R,T:integer); {Процедура передает в программу значения R,T}
Begin
{R,T- параметры-переменные}
R:=555;
T:=666;
End;
Procedure WW3(R1,R2:integer; Var X1,X2:Integer); {R1,R2-принимает}
Begin
{X1,X2-передает}
X1:=R1+R2;
X2:=R1*R2;
End;
Begin
A:=9;
WriteLn(A:5);
WW1;
WriteLn(A:5);
WW2(K,N);
{в K,N содержатся результаты работы процедуры WW2}
WriteLn(K:5,N:5);
J1:=23; J2:=178;
WW3(I1,I2,J1,J2); {Значения I1,I2 передаются в процедуру}
WriteLn(J1:5,J2:5); {J1,J2 – принимаются из процедуры}
End.
Задания для самостоятельной работы
1. Вычислить арифметическое выражение Y=A*B-tgA . Использовать функцию для:
 вычисления функции tg;
 умножения двух чисел, используя только операцию сложения.
2. Длины отрезков заданы координатами концов. Найти самый длинный отрезок. Для нахождения
длины отрезка использовать функцию.
3. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
54
 сумму отрицательных элементов. Сумму отрицательных элементов передать в основную
программу, используя параметр-переменную.
 количество тех элементов, значения которых положительны и не превосходят заданного числа А.
Значение А задать в основной программе, в процедуру передать это значение;
 номер последней пары соседних элементов с разными знаками.
Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов
массива произвести в отдельных процедурах.
4. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
 сумму элементов, имеющих нечетное значение;
 вывести индексы тех элементов, значения которых больше заданного числа А. Значение А задать
в основной программе, в процедуру передать это значение;
 количество положительных элементов, кратных К. (К вводится с клавиатуры). Количество
положительных элементов передать в основную программу, используя параметр-переменную.
Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов
массива произвести в отдельных процедурах.
5. Дано n целых чисел. Найти среди них число, у которого приведенная ниже характеристика имеет
максимальное значение:
 сумма цифр;
 первая цифра;
 количество делителей;
 сумма всех делителей.
Вычисление данных значений произвести с использованием функций.
6. Дано n целых чисел. Написать программу подсчета чисел, в записи которых нет цифры 8. при этом
требуется использовать функцию вида
Function Yes8(x:LongInt):Boolean;
Ответ: 729.
7. Составить программу перестановки значений переменных a, b, c в порядке возрастания, т.е. так,
чтобы a<=b<=c.
Файлы
Вывод в файл
Язык Pascal позволяет сохранить результаты работы программы в файл на диске компьютера.
Существует два метода доступа к информации, хранящейся в файлах:
 последовательный доступ;
 прямой доступ.
Файлы последовательного доступа наиболее просты как в организации, так и в работе с ними.
Записи обрабатываются последовательно одна за другой. Подобные файлы легко просматриваются на
экране, используя любой простейший редактор.
Объявление файла
Формат:
Имя: file of <тип элемента>;
Например:
Res: file of char; {файл символов}
или
Res: text; {файл символов}
Koef: file of real; {файл вещественных чисел}
F: file of integer; {файл целых чисел}
Назначение файла
Процедура assign связывает файловую переменную с конкретным файлом.
Формат:
Assign(<имя файловой переменной>,<имя файла>);
Имя файла может быть полным (указание пути к файлу и имени файла) или с указанием только имени
файла.
Например:
55
Assign(f,’a:\result.txt’);
Fname:=’otcet.txt’;
Assign(f,fname);
Процедуры вывода в файл
Вывод в текстовый файл осуществляется при помощи процедур write и writeln.
Формат:
Write(<имя файловой переменной>,<список выводимых значений>);
Например:
Write(f,’Корни уравнения:’,x1,x2);
Открытие файла для вывода
Перед выводом в файл необходимо открыть файл. Возможны следующие режимы открытия файла
для записи в него данных:
 перезапись (запись нового файла поверх существующего или создание нового файла);
 добавление в существующий файл.
Формат в режиме перезаписи:
Rewrite(<имя файловой переменной >);
Формат в режиме добавления:
Append(<имя файловой переменной >);
Например:
1.создание нового файла.
Var
F:text;
I:integer;
Begin
Assign(f,’test.txt’);
Rewrite(f); {открытие в режиме перезаписи}
For i:=1 to 5 do
Writeln(f,’Строка ’,i:2);
Close(f); {закрыть файл}
End.
В результате выполнения программы на диске появится файл с именем test.txt.
2. запись в файл в режиме добавления.
Var
F:text;
I:integer;
Begin
Assign(f,’test.txt’);
append(f); {открытие в режиме добавления}
For i:=6 to 8 do
Writeln(f,’Строка ’,i:2);
Close(f); {закрыть файл}
End.
Ошибки открытия файла
Выяснить, завершилась ли успехом процедура открытия файла, можно, проверив значение функции
IOResult (результат ввода/вывода). Функция IOResult() возвращает 0, если операция ввода/вывода
завершилась успешно, в противном случае – не ноль. Однако чтобы программа могла проверить
результат выполнения операции ввода/вывода, нужно разрешить ей это делать, добавив перед вызовом
процедуры открытия файла строку {$I-}. После инструкции открытия файла следует поместить {$I+}.
Например:
Assign(f,’test.txt’);
{$I-}
Append(f); { открытие в режиме добавления }
56
{$I+}
If IOResult<>0 then {если файла нет}
rewrite(f); {создать новый}
Пример. Решение квадратного уравнения и вывод результатов в файл.
var
a,b,c,x1,x2:real; {Коэффициенты и корни уравнения}
d:real;
{дискриминант}
f:text;
{файл для вывода результатов работы программы}
i:integer;
begin
writeln('Введите значения коэффициентов в одной строке');
readln(a,b,c);
assign(f,'c:\result.txt');
append(f);
writeln(f,'Решение квадратного урафнения');
writeln(f,'Коэффициенты уравнения:',a:6:1,b:6:1,c:6:1);
d:=b*b-4*a*c;
if d>=0 then begin
x1:=-b+sqrt(d)/(2*a); x2:=-b-sqrt(d)/(2*a);
writeln(f,'Корни уравнения:',x1:6:1,x2:6:1);
end;
if d<0 then
writeln(f,'Корней нет');
for i:=1 to 4 do
write(f,i:3);
close(f); {закрываем файл}
end.
Ввод из файла
Язык Pascal позволяет вводить исходные данные для программы не только с клавиатуры, но и из
текстового файла.
Открытие файла
Открытие файла для ввода (чтения) выполняется вызовом процедуры reset, имеющей один параметр –
файловую переменную.
Формат:
Reset(<имя файловой переменной>);
Например:
Assign(f,’c:\data.txt’);
Reset(f);
Если имя файла указано неверно, т.е. файла с таким именем нет на диске, то возникает ошибка времени
выполнения программы. Как и при открытии файла для добавления, программа может взять на себя
задачу обработки возможной ошибки при открытии файла, используя функцию IOResult.
Пример. Демонстрация использования функции IOResult при открытии файла.
Label fin;
Var
F:text;
Fname: string[80]; {имя файла}
Res: integer;
{результат открытия файла}
Otv: char; {ответ на предложение повторить попытку открыть файл}
Begin
Fname:=’a:\test.txt’;
Assign(f,fname);
Repeat
57
{$I-}
Reset(f); {открыть файл для чтения}
{$I+}
Res:= IOResult;
If res<>0 then begin
WriteLn(‘ОШИБКА: файл ’,fname,’ не найден или диск не готов’);
WriteLn(‘Повторить попытку?(д/н)-> ’);
Readln(otv);
End;
Until (res=0) or (otv=’н’);
If res<>0 then goto fin;
{здесь операторы программы}
Fin:
End.
Чтение из файла
Чтение из файла выполняется при помощи процедур read и readln.
Формат:
Read(<имя файловой переменной>,<список переменных>);
ReadLn(<имя файловой переменной>,<список переменных>);
Имена переменных разделены запятыми.
Чтение чисел
Следует помнить, что в текстовом файле находятся не числа, а их изображения. Действие процедур
read и readln состоят из двух:
 из файла читаются символы до появления разделителя (пробела или конца строки)
 прочитанные символы, являющиеся изображением числа, преобразуются в число, и полученное
значение присваивается переменной.
Отличие процедуры ReadLn от Read в том, что при считывании последнего числа процедурой ReadLn
происходит переход к следующей строке файла.
Например, пусть файл ishod.txt такой:
12 5 97 10
15 5 97 12
Во время выполнения программы
Var
F:text;
a,b,c:integer;
Begin
Assign(f,’ishod.txt’);
Reset(f);
Read(f,a);
Readln(f,b);
Read(f,c);
End.
Переменная а получит значение 12, b-5, c-15.
Если при чтении значения переменной в файл вместо изображения числа будет какая-то
последовательность символов, то происходит ошибка.
Чтение строк
В программе строковая переменная может быть описана с указанием длины или без. Например:
str1:string[10] или str2:string.
При чтении из файла значения строковой переменной, длина которой
явно задана в описании переменной, из файла читается столько символов, сколько указано в описании,
но не больше, чем в оставшейся непрочитанной части текущей строки.
58
При чтении из файла значения строковой переменной, длина которой явно не задана в описании
переменной, значением переменной становится оставшаяся после последнего чтения часть трущей
строки
Пусть текстовый файл gioups.txt содержит строки:
Beatles Paul Mc'Cartney
Beatles John Lennon
В следующей таблице приведены описания переменных, инструкции чтения из файла groups.txt и
значения переменных после выполнения инструкций чтения.
Описание переменных и инструкции Значения переменных после чтения из
чтения из файла
файла
group='Beatles '
group:string[8];
f_name='Paul '
f_name:string[5];
l_name=’Mc'Car’
l_name:string[6];
read(f,group,f name, 1_ name);
group= ‘Beatles Paul Mc'Cartney’
group:string;
f_name=’’
f_name:string;
l_name=’’
l_name:string;
read(f,group,f_name,l_name) ;
group='Beatles '
group:string!8] ;
f_name='Paul Mc’’
f_name:string[ 8 ] ;
l_name=’Cartney’
l_name:string i 8] ;
read(f,group,f_name,l_name)
group='Beatles '
group:atring[8] ;
f_name=’Beatl’
f_namer:string[5] ;
l_name=’es Joh’
l_name:string[6] ;
readln(f,group) ;
readln(f,f_name,l_name);
Конец файла
Пусть на диске есть текстовый файл, содержащий информацию о доходах Каждая строка файла
начинается с цифры, соответствующей величине дохода, за которой следует строка символов —
комментарий. Содержимое файла может быть, например, таким:
250 Чтение лекций
1000 Гонорар за книгу
120 Доход по акциям ГАЗПРОМ
Пусть нужно вычислить суммарный доход. Решение задачи довольно очевидно: открыть файл,
прочитать число из первой строки и добавить его к сумме, прочитать число из второй строки и
добавить его к сумме и т. д. После прочтения последней строки вывести результат.
Но как определить, что прочитана последняя строка, или, другими словами, достигнут конец файла?
Для этого нужно проверить значение, возвращаемое функцией EOF (End Of File — коней файла),
описание которой выглядит так:
Формат:
function E0F(имя файловой переменной);
У функции EOF один параметр — файловая переменная. Функция
конец файла, иначе — FALSE.
EOF
возвращает
TRUE,
если достигнут
Например. Чтение из файла с использованием функции EOF {rdfromf.pas)
program rdfromf; var
f:text;
{файловая переменная}
incom:real;
{доход-значение из очередной строки файла}
sum: real;
{суммарный доход}
begin
59
assign(f,'incom.txt’);
{$I-}
reset(f); {откроем для чтения}
if IOResult=0 then begin
sum: =0;
writeln('Чтение данных’);
while not EOF(f) do {пока не достигнут конец файла}
begin
readln(f,incom);
sum: =sum+incom;
end;
close(f);
writeln('Суммарный доход: ' ,sum:ll:2);
end
else writeln('Ошибка открытия файла.');
end.
Обратите внимание: значение EOF проверяется перед каждым чтением, в том числе и перед первым.
Перед первым чтением EOF проверяется, так как хотя открываемый файл может существовать на диске,
он может быть пустым (не содержать строк).
Пример 1.
Хоккейные команды "Черные ястребы" и "Красные крылья" хранят в последовательных файлах
имена всех своих двенадцати нападающих, число заброшенных ими шайб, сделанных голевых
передач и заработанное штрафное время.
• Создайте файлы Black.dat и Red.dat, содержащие информацию о каждой из двух команд.
uses crt;
var
fam:string[10];
s,t:integer;
f,f1:text;
i:integer;
begin
clrscr;
assign(f,'c:\Black.txt');
assign(f1,'c:\Red.txt');
rewrite(f);
rewrite(f1);
for i:=1 to 5 do begin
readln(fam,s,t);
writeln(f,fam:10,s:4,t:4);
end;
for i:=1 to 5 do begin
readln(fam,s,t);
writeln(f1,fam:10,s:4,t:4);
end;
close(f);
close(f1);
end.
Ваша программа по данным, извлеченным из этих файлов, должна создавать новый файл Allstars.dat,
в котором содержались бы имя, команда и сумма очков (голы и передачи) для шести лучших игроков
обеих команд. Пусть имена и показатели результативности хоккеистов выводятся на экран.
uses crt;
var
fam:string[10];
60
s,t:string[4];
pp:string;
m:array[1..10,1..3] of string;
f,f1:text;
i,j,a,cod:integer;
begin
clrscr;
assign(f,'c:\Black.txt');
assign(f1,'c:\Red.txt');
reset(f);
reset(f1);i:=1;
while not eof(f) do begin
readln(f,fam,s,t);
m[i,1]:=fam;
m[i,2]:=s;
m[i,3]:=t;
inc(i);
end;
while not eof(f1) do begin
readln(f1,fam,s,t);
m[i,1]:=fam;
m[i,2]:=s;
m[i,3]:=t;
inc(i);
end;
for i:=1 to 9 do
for j:=i+1 to 10 do
if m[i,2]<m[j,2] then begin
pp:=m[i,1]; m[i,1]:=m[j,1]; m[j,1]:=pp;
pp:=m[i,2]; m[i,2]:=m[j,2]; m[j,2]:=pp;
pp:=m[i,3]; m[i,3]:=m[j,3]; m[j,3]:=pp;
end;
for i:=1 to 6 do begin
for j:=1 to 3 do
write(m[i,j]);
writeln;
end;
end.
61
Задания для самостоятельной работы
1. Школе необходим последовательный файл для учета выпускников.
• Создайте для канцелярии последовательный файл по учету выпускников. Храните в нем
фамилию, имя, год выпуска, любимый вид спорта и нынешний род занятий выпускника. Для
образца составьте файл на десять человек.
• Воспользуйтесь этим файлом и напечатайте приглашения на очередной домашний матч
"Зенита" тем выпускникам, которые назвали футбол своим любимым видом спорта.
2.
Компьютерная фирма ведет файл со сведениями о двадцати своих сотрудниках.
• Создайте последовательный файл, содержащий имя и адрес каждого сотрудника (с указанием
улицы, дома, квартиры и почтового индекса).
• По содержимому файла напечатайте почтовые адреса для рассылки чеков еженедельной
заработной платы.
3.
Гидрометцентр ведет статистику выпадения снега по регионам, для каждого из которых
заведен последовательный файл. Во всех файлах присутствуют три элемента данных: имя
метеоролога, название региона, количество выпавшего за зиму снега в мм.
• Напишите программу ввода данных, заполните файлы для трех регионов.
• Просмотрите все три файла и подсчитайте средний уровень снежных осадков по трем
областям. Результат выведите на экран.
4.
Налоговая инспекция поощряет налогоплательщиков, вносящих подоходный налог до истечения
апрельского контрольного срока, делая им скидку.
• Создайте файл, в котором содержались бы имена, сведения о сроках уплаты и размере налога
для каждого налогоплательщика (ограничьтесь группой из шести человек).
• Пусть ваша программа читает файл и делает скидку в 10% для тех, кто уплатил налог
досрочно, а также выводит на экран их имена и размер скидки в рублях.
5.
Фабрика игрушек ведет учет фирм розничной торговли, сбывающих ее продукцию. Файл
контрагентов содержит названия этих фирм, сведения об их местоположении и индекс
кредитоспособности: низкая или высокая.
• Напишите программу, которая создала бы последовательный файл контрагентов.
• Напишите программу, которая создала бы два последовательных файла с именами Good.dat
и Bad.dat соответственно для фирм с высокой и низкой кредитоспособностью.
• Пусть ваша программа спрашивает у бухгалтера, какой из двух списков ему представить, а
затем выдает названия фирм и их местоположение из соответствующего файла.
6.
Предположим, адвокат Михаил Бурщевский с помощью компьютера ведет учет своих клиентов
и их дел.
• Напишите программу, которая позволяла бы ему вводить в последовательный файл следующие
сведения: имя клиента, обвинение, исход дела.
• Клиент Мицкевич "из огня попадает в полымя". Напишите программу, которая заменяла
бы неопределенное решение суда на "Проиграно".
• Напечатайте обновленный файл.
Таблица. Исходные данные задачи
Имя клиента
Обвинение
Исход дела
Сердюков
Прохоров
Мицкевич
Максимова
Лермзн
Клевета
Оскорбление
Поджог
Взлом
Взятка
Выиграно
Проиграно
?????
Выиграно
Проиграно
62
7.
Хоккейные команды "Черные ястребы" и "Красные крылья" хранят в последовательных файлах
имена всех своих двенадцати нападающих, число заброшенных ими шайб, сделанных голевых
передач и заработанное штрафное время.
• Создайте файлы Black.dat и Red.dat, содержащие информацию о каждой из двух команд.
• Ваша программа по данным, извлеченным из этих файлов, должна создавать новый файл
Allstars.dat, в котором содержались бы имя, команда и сумма очков (голы и передачи) для
шести лучших игроков обеих команд. Пусть имена и показатели результативности хоккеистов
выводятся на экран.
8.
Имена и адреса всех, кто обращается за информацией в фирму, попадают в список рекламной
рассылки.
• Создайте основной файл Master.dat из десяти записей в качестве списка рассылки и
меньший файл Family.dat из пяти записей для вновь обратившихся с запросами в фирму.
Добавьте данные из второго файла в конец первого.
• Напишите программу, которая случайным образом выбирала бы из основного файла одну
запись и посылала бы адресату письмо с уведомлением о выигрыше приза.
9.
Инспектор колледжа ведет файл академических занятий студентов.
• Создайте последовательный файл и заполните его фамилиями, на званиями академических
курсов и оценочным коэффициентом студентов. Воспользуйтесь данными, перечисленными в
табл. 4.5.
Таблица. Исходные данные
Фамилия студента
Курс
Оценочный
коэффициент
78
91
56
45
39
Югов
Северов
Западов
Востоков
Зюйдов
Программирование
Японский язык
Психология
Психология
Корейский язык
Вестов
Программирование
66
Полюсов
Психология
90
• Выберите "умных" студентов, т. е. тех, кто имеет оценку выше 88, и запишите сведения о них в
файл Best.dat. Пусть программа помогает инспектору формировать на основе этого файла
группы углубленного обучения. По названию курса она должна выдавать список «умных»
студентов, зачисленных в такую группу.
10 Модуль CRT. Процедуры и функции модуля CRT
Процедура Delay
Delay(Ms:Word);
Задает задержку выполнения программы в милисекундах.
Процедура GotoXY
GotoXY(X,Y:Byte);
Устанавливает курсор в позицию экрана с координатами X,Y. Если значение какого-либо из
параметров окажется некорректным, то вызов процедуры GotoXY будет проигнорирован.
Процедура TextBackground
TextBackground(Color:Byte);
63
Задает цвет фона.
Процедура TextColor
TextColor(Color:Byte);
Задает цвет символов.
Функции опроса клавиатуры (KeyPressed, ReadKey)
KeyPressed:BOOLEAN
Возвращает логическое значение TRUE, если в буфере клавиатуры содержится хотя бы один
символ, т.е. была нажата клавиша, и FALSE, если буфер пуст, т.е. нажатия клавиши не произошло.
Наиболее часто функция KeyPressed применяется в конструкциях типа: REPEAT UNTIL KeyPressed;
ReadKey: CHAR;
Функция считывает из буфера и возвращает в программу последний введенный символ. Если
буфер пуст, то функция приостанавливает выполнение программы и ожидает нажатия клавиши.
Символ, соответствующий нажатой клавише, не отобразится на экране. Это называется «ввод без эха
на экране».
Процедура Window
Window(X1,Y1,X2,Y2)
Отображает на экране окно в текстовом режиме, определяемое как текущее. X1,Y1,X2,Y2координаты окна и должны удовлетворять условиям:
1<= X1<=X2<=Xmax (Xmax=80)
1<= Y1<=Y2<=Ymax (Ymax=25)
Если эти условия не выполняются, то окно создано не будет. После выполнения процедуры Window все
операции с экраном относятся к части, которая определена координатами X1,Y1,X2,Y2. при этом
перемещение курсора происходит только в пределах текущего окна.
Пример:
USES Crt;
Var
X,Y,I,J,T:byte;
Ch:Char;
BEGIN
Randomize;
{Инициализация генератора случайных чисел}
I:=0;
J:=15;
Repeat
TextBackground(1);
ClrScr;
X:=random(80);
{Определение случайных координат X}
Y:=random(25);
{и Y}
Window(X,Y,X+Random(20),Y+Random(20));
TextBackground(I); {Определение цвета экрана}
TextColor(J);
{Определение цвета символов}
Write('Окно');
Inc(I);
{Приращение цвета экрана}
Inc(J);
{Приращение цвета символа}
IF J=16 Then J:=0;
IF I=16 Then I:=0;
Ch:=ReadKey;
Until Ch=#27;
{#27 –ASCII-код клавиши Esc}
END.
64
11 Модуль Graph
11.1 Классификация типов драйверов и видеорежимов
Перед началом работы с графикой необходимо установить наиболее подходящий для данного
монитора видеорежим. В комплект поставки Турбо Паскаля входит ограниченное число драйверов
(каталог BGI), каждый из которых может поддерживать один или несколько видеорежимов. Тип
драйвера и режим могут быть заданы в виде числа или символьной константы.
Задание типа графического адаптера
Detect
=0
автоопределение
IBM8514
=6
адаптер 8514
VGA
=9
адаптер VGA
Возможные графические режимы для различных типов видеоадаптеров
Драйвер
Значение константы Разрешение
Палитра
Число
режима
экрана (в точках)
видеостраниц
VGA
0
640 X 200
16 цветов
4
1
640 X 350
16 цветов
2
2
640 X 480
16 цветов
1
IBM8514
0
640 X 480
256 цветов
1
1
1024 X 768
256 цветов
1
11.2 Инициализация графики
Любая программа, предназначенная для работы с графикой, обязательно должна содержать блок
вызовов процедур инициализации графического режима и обращение к процедуре его завершения.
Gd – тип драйвера
Gm – режим графики
USES Graph;
VAR
Gd,Gm:Integer;
Begin
Gd:=VGA; Gm:=1;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
………….
CloseGraph; {завершение графического режима}
End.
11.3 Переключение между текстовым и графическим режимами
Переключение режимов осуществляется процедурой
SetGraphMode(GraphMode);
Переключает систему в графический режим и очищает экран монитора.
Процедура
RestoreCRTMode;
возвращает систему в текстовый режим.
USES Graph;
VAR
65
Gd,Gm:Integer;
Begin
{Первоначально в текстовом режиме}
WriteLn(‘Нажмите Enter для перехода в графику’);
ReadLn;
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
OutText(‘Нажмите Enter для возвратав текстовый режим’);
ReadLn;
{Переключение в текстовый режим}
RestoreCRTMode;
WriteLn(‘Снова нажмите Enter’);
ReadLn;
SetGraphMode(GetGraphMode);
OutText(‘Вы снова в графике’);
ReadLn;
CloseGraph;
End;
11.4 Система координат
(0,0)
X
Y
Определение значений максимальных координат экрана в модуле Graph реализовано с помощью
функций
GetMaxX:Integer;
GetMaxY:Integer;
Отображение строк
OutText(Text)
Выводит на экран строку текста, начиная с текущего положения курсора.
OutTextXY(X,Y,Text)
Выводит на экран строку текста, начиная с точки с координатами X,Y.
11.5 Управление текущим указателем
Чтобы построить изображение, необходимо обязательно указать начальную позицию. В
графическом режиме для перемещения указателя используются процедуры MoveTo и MoveRel
Формат:
MoveTo(X,Y:Integer);
Перемещает текущий указатель в точку с координатами X, Y.
MoveRel(dX,dY:Integer);
Перемещает указатель на dX точек по горизонтали и на dY точек по вертикали относительно
последнего положения текущего указателя. При задании положительных значений dX или dY значения
соответствующих координат текущего указателя будут увеличиваться, при задании отрицательных –
уменьшаться.
Для определения текущего положения графического курсора используются функции
66
GetX:Integer;
GetY:integer;
Возвращающие значения текущих координат указателя.
Пример. Позиционирование указателя и определение его координат.
USES Graph;
VAR
Gd,Gm:Integer;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
{перемещение в центр экрана}
MoveTo(GetMaxX DIV 2,GetMaxY DIV 2);
OutTextXY(GetX,GetY,’Указатель в центре’);
{смещение указателя на некоторую величину}
MoveRel(-GetX DIV 2,-GetY DIV 2);
OutText(‘Указатель смещен’);
ReadLn;
CloseGraph;
END.
11.6 Отображение точки на экране
Какие бы изображения ни выводились на экран, все они построены из точек. Для отображения
точки (пиксела) на экране используется процедура
PutPixel(X,Y,Color)
где X и Y – координаты точки на экране, Color – ее цвет.
11.7 Определение параметров пикселов
Функция
GetPixel(X,Y)
определяет номер цвета пиксела с координатами X,Y.
Пример1. Заполнение экрана множеством точек различного цвета.
USES Graph;
VAR
Gd,Gm:Integer;
Color:Word;
X,Y:Word;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
Color:=0;
Randomize;
Repeat
67
{звуковой сигнал, если цвет пикселов совпадает}
If Color=GetPixel(X,Y) Then Write(#7);
{случайным образом выбранные координаты пиксела}
X:=Random(GetMaxX);
Y:=Random(GetMaxY);
PutPixel(X,Y,Color); {вывод пиксела}
Inc(Color);
{изменение цвета}
{проверка, не превышает ли значение цвета максимально допустимого}
If Color=GetMaxColor Ten Color:=0;
Until KeyPressed; {пока не нажата клавиша}
CloseGraph;
End.
Пример 2. Вывести N точек в пределах окружности радиуса R.
USES CRT,GRAPH;
VAR
GD,GM:integer;
A:Real;
R:Integer;
X,Y:integer;
Color:Word;
BEGIN
GD:=detect;
InitGraph(GD,GM,'c:\tp7\bgi');
IF GraphResult<>0 THEN HALT(1);
ClearDevice;
SetBkColor(1);
Color:=1;
Repeat
A:=Random(628)/100; {Угол отклонения в радианах}
R:=Random(80);
{Радиус}
Y:=Trunc(R*Sin(A));
X:=Trunc(R*Cos(A));
PutPixel(GetMaxX Div 2 +X,GetMaxY Div 2 + Y,Color);
Inc(Color);
If Color=16 Then Color:=1;
Until KeyPressed;
CloseGraph;
END.
11.8 Отображение отрезков прямых линий
Процедура вывода отрезка прямой на экран
Line(X1,Y1,X2,Y2:Integer);
X1,Y1 - координаты начальной точки линии
X2,Y2 - координаты конечной точки линии
Процедура
LineTo(X,Y)
строит отрезок из текущего положения указателя до точки с координатами X,Y.
Процедура
LineRel(dX,dY)
строит отрезок от точки текущего положения указателя до точки (CPX+dX,CPY+dY), где CPX и CPY –
текущие координаты CP.
Пример. Заполнение экрана множеством отрезков различных цветов.
USES Graph,Crt;
68
VAR
Gd,Gm:Integer;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
Randomize;
Repeat
SetColor(Random(15)); {случайный выбор цвета}
{построение линий с использованием различных процедур}
Line(Random(GetMaxX),Random(GetMaxY),GetX,GetY);
LineTo(Random(GetMaxX),Random(GetMaxY));
LineRel(50,-50)
Until KeyPressed;
CloseGraph;
End.
11.9 Вычерчивание линий различных стилей
Возможно вычерчивать линии самых различных стилей
SetLineStyle(LineStyle,Pattern,Thickness)
LineStyle – задает тип строки
Pattern – шаблон (если параметр LineStyle не равен 4, то Pattern не используется и задается равным
нулю)
Thickness – задает толщину линии.
Значение
Характеристики линий
0
Сплошная
1
Пунктирная
2
Штрих-пунктирная
3
Штриховая
4
Заданная пользователем
1
Нормальной толщины
3
Большой толщины
Например. Задание стиля линии и построение отрезка.
USES Graph,Crt;
VAR
Gd,Gm:Integer;
Ch:Char;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
Randomize;
Repeat
ClearDevice; {чистка экрана}
69
{определение типа линии}
SetLineStyle(3,0,1);
Line(1,1,GetMaxX,GetMaxY);
Ch:=ReadKey;
Until Ch=#27;
CloseGraph;
End.
11.10 Построение прямоугольников
11.10.1 Построение прямоугольника на плоскости
Rectangle(X1,Y1,X2,Y2)
X1,Y1 – координаты левого верхнего угла
X2,Y2 - координаты правого нижнего угла
Пример. Построение последовательности прямоугольников.
USES Graph,Crt;
VAR
Gd,Gm:Integer;
I:Word;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
For I:=1 To GetMaxY Do Rectangle(1,1,I,I);
ReadLn;
SetWriteMode(XorPut); {режим вывода}
{построенная последовательность стирается}
For I:=GetMaxY DownTo 2 Rectangle(1,1,I,I);
ReadLn;
CloseGraph;
End.
11.10.2 Построение закрашенного прямоугольника
Внутренняя область прямоугольника залита по текущему шаблону
Bar(X1,Y1,X2,Y2);
X1,Y1 – координаты левого верхнего угла
X2,Y2 - координаты правого нижнего угла
3. Отображение параллелепипеда
Bar3D(X1,Y1,X2,Y2,D3,Top);
отображается параллелепипед, «лицевая сторона» которого заливается по текущему шаблону, а глубина
задается в пикселах параметром D3. Параметр Top задает режим отображения верхней плоскости.
TopOn - верхняя плоскость отображается
TopOff - верхняя плоскость не отображается
11.11 Установка стиля заполнения
В модуль Graph включен ряд стандартных шаблонов различных узоров для заполнения
внутренних и внешних областей различных геометрических фигур. Узор может быть окрашен в
допустимые для установленной палитры цвета. Комбинацию узор-цвет принято называть стилем
заполнения.
SetFillStyle(Pattern,Color)
70
Pattern – значение шаблоно различных узоров
Color – цвет
Значение Описание узора
(Pattern)
0
Сплошной цветом фона
1
Сплошной текущим цветом
2
Типа --3
Типа // нормальной толщины
4
Типа // удвоенной толщины
5
Типа \\ удвоенной толщины
6
Типа \\ нормальной толщины
7
Заполнение клеткой
8
Заполнение косой редкой клеткой
9
Заполнение косой частой клеткой
10
Заполнение редкими точками
11
Заполнение частыми точками
12
Определяется пользователем
Пример. Построение прямоугольников, параллелепипеда без верхней плоскости и с верхней плоскостью
с различным стилем заполнения.
USES Graph,Crt;
VAR
Gd,Gm:Integer;
X1,X2,Y1,Y2:Word;
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
TextBackGround(1);
{определяются координаты прямоугольника}
X1:=GetMaxX DIV 4;
Y1:=GetMaxY DIV 4;
X2:=2*GetMaxX DIV 3;
Y2:=3*GetMaxY DIV 4;
ClearDevice; {чистка экрана}
{установка стиля заполнения}
SetFillStyle(7,4);
Bar(X1,Y1,X2,Y2); {обычный прямоугольник}
ReadLn;
ClearDevice; {чистка экрана}
{параллелепипед без верхней плоскости}
SetFillStyle(1,2);
Bar3D(X1,Y1,X2,Y2,10,TopOff);
ReadLn;
ClearDevice; {чистка экрана}
{параллелепипед с верхней плоскостью}
SetFillStyle(10,6);
Bar3D(X1,Y1,X2,Y2,10,TopOn);
71
ReadLn;
CloseGraph;
End.
11.12 Построение многоугольников
Многоугольники можно рисовать самыми различными способами, например с помощью процедур
Line или LineTo. В Турбо Паскале имеется процедура DrawPoly, которая позволяет строить любые
многоугольники с помощью линий текущего цвета, стиля и толщины.
Формат:
DrawPoly(NumPoints,PolyPoints);
DrawPoly позволяет отображать на экране любую ломаную, заданную совокупность координат
некоторого множества точек.
Это может быть как сложная геометрическая фигура, так и график математической функции,
заданной в табличном виде.
NumPoints – это количество точек ломаной.
PolyPoints – набор записей, каждая из которых состоит из двух полей, содержащих координаты X
и Y очередной точки.
Пример. Построение многоугольников с пятью вершинами. Координаты вершин случайные.
USES Graph,Crt;
VAR
Gd,Gm:Integer;
I:Byte;
Ch:Char;
Points:Array[1..6] Of PointType; {Массив вершин}
Begin
Gd:=Detect;
{Инициализация графического режима}
InitGraph(Gd,Gm,'C:\TP7\BGI');
{Обработка ошибки инициализации}
IF GraphResult<>0 THEN Begin
WriteLn(‘Ошибка инициализации’);
HALT(1);
End;
Randomize;
Repeat
ClearDevice;
{определение случайных координат вершин}
For I:=1 To % Do Begin
Points[I].X:=Random(GetMaxX);
Points[I].Y:=Random(GetMaxY);
End;
{Связь координат первой и последней вершин}
Points[6].X:=Points[1].X;
Points[6].Y:=Points[1].Y;
DrawPoly(6,Points); {построение многоугольника}
Until Ch=#27; {пока не нажата клавиша Esc}
CloseGraph;
End.
Построение дуг, эллипсов и окружностей
Изображение окружности
Circle(X, Y, Radius);
X, Y – координаты центра окружности
Radius – радиус окружности
72
Изображение дуг
Arc(X, Y, StAngle, EndAngle, Radius);
X, Y – центр окружности дуги.
StAngle, EndAngle – начальный и конечный углы, отсчитываемые от горизонтальной оси против
часовой стрелки.
Radius – радиус.
Если StAngle=0 и EndAngle=359, то вычерчивается полная окружность.
Построение эллиптических дуг
Ellipse(X, Y, StAngle, EndAngle, XR, YR)
XR, YR – задают горизонтальную и вертикальную оси.
Если StAngle=0 и EndAngle=359, то вычерчивается полный эллипс.
11.13 Построение заполненных областей изображения
11.13.1 Построение заполненного сектора эллипса
Sector(X,Y, StAngle, EndAngle, XR, YR)
X, Y – центр окружности дуги.
StAngle, EndAngle – начальный и конечный углы, отсчитываемые от горизонтальной оси против
часовой стрелки.
Radius – радиус.
Эллипс (сектор эллипса) будет залит цветом по текущему шаблону.
Построение заполненного сектора круга
PieSlice(X,Y, StAngle, EndAngle, Radius)
Сектор круга (круг, если StAngle=0 и EndAngle=359) будет заполнен текущим узором.
11.13.2 Построение заполненного эллипса
FillEllipse(X, Y, XR, YR)
XR, YR – задают горизонтальную и вертикальную оси.
X, Y – координаты центра эллипса
11.13.3 Построение заполненных сложных геометрических фигур
FillPoly(NumPoints, PolyPoints)
Эта процедура по своему действию очень похожа на процедуру DrawPoly и имеет такие же параметры.
Различие лишь в том, что многоугольник, который рисуется процедурой FillPoly, всегда замкнутый, а
область, ограниченная контуром полученной фигуры, закрашивается.
Пример. Построение геометрических фигур.
Uses Graph, Crt;
VAR
GD,GM:integer;
Radius, I, Width, K:Integer;
Y0, Y1, Y2, X1, X2:integer;
Pattern:FillPatternType;
Points:Array[1..6] Of PointType;
BEGIN
GD:=vga; GM:=1;
Initgraph(gd,gm,'C:\tp7\bgi');
IF GraphResult<>0 then Halt(1);
SetBkColor(0); SetColor(2); {Цвет фона и изображения}
I:=0;
For Radius:=1 to 5 Do Begin {Построение окружностей}
SetColor(radius+4);
Circle(150,150,Radius*25);
Inc(I); If I=4 Then I:=0;
End;
ReadLn;
ClearDevice; SetBkColor(1); SetColor(5);
73
SetLineStyle(0,0,3); {установка стиля линии}
Ellipse(130,130,0,360,30,50); {Построение эллипса}
ReadLn;
ClearDevice; SetColor(4);
Ellipse(130,130,0,180,100,70); {построение эллиптической дуги}
ReadLn;
ClearDevice; K:=4;
For Radius:=1 to 5 Do Begin
SetColor(K);
Arc(300,100,0,90,Radius*20); {построение дуги}
Inc(K);
End;
ReadLn;
ClearDevice; Width:=20; SetColor(1); SetBkColor(11);
For I:=1 to 5 Do Begin
SetFillStyle(7, I+4);
{Определение стиля заполнения}
Bar(I*Width, I*20, Succ(I)*Width, 200); {Построение прямоугольников}
End;
SetFillStyle(5,12);
Bar(150,150,250,250);
ReadLn;
SetFillStyle(8,4); {Построение параллелепипеда с верхней плоскостью}
ClearDevice;
Y1:=100; Y2:=200; X1:=230; X2:=300;
SetLineStyle(3,0,3); {Определение стиля линии}
Bar3d(x1,y1,x2,y2,10,TopOn);
ReadLn;
ClearDevice; {Построение параллелепипеда без верхней плоскости}
SetLineStyle(0,0,1); SetFillStyle(11,1);
Bar3d(X1,Y1,X2,Y2,10,TopOff);
ReadLn;
{Пользовательский шаблон заполнения}
ClearDevice; SetColor(6);
SetLineStyle(0,0,3); { Стиль линии}
pattern[1]:=31; pattern[2]:=62; {заполнение массива}
pattern[3]:=124; pattern[4]:=248;
pattern[5]:=124; pattern[6]:=62;
pattern[7]:=31; pattern[8]:=0;
SetFillPattern(pattern,12); {Задание шаблона пользователя}
Bar(10,10,GetMaxX div 2,GetMaxY div 2);
Rectangle(10,10,GetMaxX div 2, GetMaxY div 2);
ReadLn;
{Построение закрашенного сектора эллипса}
ClearDevice; SetBkColor(3); SetColor(4);
SetFillStyle(7,14);
Sector(100,100,0,90,50,70);
ReadLn;
{Построение закрашенного сектора круга}
ClearDevice; SetFillStyle(1,14);
PieSlice(150,150,90,360,100);
ReadLn;
{Построение эллипса, заполненного текущим цветом}
ClearDevice;
74
SetFillStyle(6,13); SetLineStyle(3,0,1);
FillEllipse(200,200,50,100);
ReadLn;
{Построение закрашенного многоугольника}
ClearDevice; Randomize;
SetLineStyle(0,0,1); SetFillStyle(11,1);
{Определение случайных координат вершин}
For I:=1 To 5 Do Begin
points[i].X:=random(getmaxX); points[i].y:=random(getmaxY);
End;
points[6].x:=points[1].y; points[6].y:=points[1].y;
FillPoly(6,points);
ReadLn;
CloseGraph;
End.
11.14 Установка цвета
11.14.1 Установка цвета фона
SetBkColor(Color)
Color – новый цвет фона
11.14.2 Установка цвета изображения
SetColor(Color)
Color – новый цвет изображения
11.15 Заполнение областей изображения
FloodFill(X,Y,Border)
Служит для заполнения заданным с помощью SetFillStyle и SetFillPattern стилем области,
расположенной либо внутри замкнутого контура, либо вне его.
X,Y – координаты точки внутри или вне замкнутого контура.
Border – задает цвет контура.
В зависимости от расположения указанной точки по отношению к контуру будет производиться
заполнение текущим узором либо области, ограниченной контуром, либо части экрана, расположенной
вне границ контура. Если указанный контур не является замкнутым, то будет заполнен весь экран.
75
Список литературы
1. А.И. Гусева, «Учимся программировать: Pascal 7.0», Москва, 1998 г.
2. А.М. Епанешников, «Turbo Pascal 7.0», Москва, 1998 г.
3. С.А. Немнюгин, «Turbo Pascal», Санкт-Петербург, 2001 г.
4. Н. Б. Культин, «Turbo Pascal в задачах и примерах», Санкт-Петербург, 2000 г.
5. Г.В. Медведева, «Сборник задач по языку программирования Turbo Pascal 7.0», 2000 г.
76
Download