- •Часть I. Этапы решения задачи на компьютере 7
- •Часть II. Задачи. Алгоритмизация и программирование 15
- •Часть III. Теоретические положения и примеры программ 188
- •Введение
- •Часть I. Этапы решения задачи на компьютере
- •1.1 Постановка и формализация условий задачи
- •1.2 Алгоритмизация задачи
- •1.2.1 Интерпретация объектов
- •1.2.2 Вычислительная схема
- •1.2.3 Вычислительная схема решаемой задачи
- •1.2.4 Составление блок-схемы
- •1.2.5 Трассировка
- •1.3 Составление программы на языке Паскаль
- •1.4 Подготовка текста программы на машинном носителе
- •1.5 Трансляция (компиляция) программы
- •1.6 Компоновка (редактирование связей)
- •1.7 Запуск программы на исполнение
- •1.8 Анализ результатов
- •Часть II. Задачи. Алгоритмизация и программирование классических вычислительных процессов
- •1 Линейный вычислительный процесс
- •1.1 Программирование формул
- •1.2 Формализация и алгоритмизация задачи
- •2 Разветвляющийся вычислительный процесс
- •2.1 Программирование формул
- •2.2 Формализация и алгоритмизация графических задач
- •2 .3 Параметрические задачи
- •3 Циклические вычислительные процессы
- •3.1 Арифметический цикл
- •Вычисление произведения n сомножителей.
- •Табулирование функции на конечном отрезке.
- •3.2 Итерационный цикл
- •Вычисление предела последовательности с заданной точностью.
- •Вычисление суммы бесконечного ряда с заданной точностью.
- •3.3 Арифметические циклы с рекуррентными соотношениями
- •3.4 Итерационные циклы с рекуррентными соотношениями
- •3.5 Двойной вложенный цикл
- •4. Пользовательские алгебраические функции
- •4.1 Применение функции в линейных и разветвляющихся вычислительных процессах
- •4.2 Использование функции в циклических процессах
- •4.3 Табуляция функции
- •5 Одномерные числовые массивы
- •5.1 Работа с компонентами массива
- •5.2 Работа с векторами
- •6 Двумерные числовые массивы
- •6.1 Работа с элементами массива
- •6.2 Работа с векторами и матрицами
- •6.3 Использование процедур и функций для работы с массивами
- •7 Работа со строками
- •7.1 Анализ и преобразование текста строки
- •7.2 Работа со строковыми функциями и процедурами
- •8 Работа со списками
- •8.1 Стеки
- •8.2 Очереди
- •8.3 Бинарные деревья
- •9 Работа с текстовыми файлами
- •10 Работа с файлами записей
- •11 Компьютерная графика
- •12 Анимация изображений
- •Часть III. Теоретические положения и примеры программ
- •1 Вычисление определителя квадратной матрицы
- •2.2 Использование записей для описания таблиц
- •Работа с полями записи
- •Использование оператора with … do
- •Ввод данных в массив записей с клавиатуры
- •2.3 Вложение записей
- •Присвоение значений полям вложенных записей
- •3 Файлы записей
- •3.1 Структура файла
- •3.2 Встроенные процедуры и функции обработки файлов
- •3.3 Организация последовательного доступа к записям файла
- •3.4 Организация прямого доступа к компонентам файла
- •3.5 Создание индексного файла
- •3.6 Работа с файлом произвольного доступа
- •Просмотр файла
- •Редактирование записей
- •Изменение структуры основного файла
- •Использование клавиш для управления программой
- •Удаление записи из файла
- •Добавление записи в файл
- •3.7 Информационное взаимодействие текстовых файлов и файлов записей
- •Экспорт данных. Копирование информации из файла записей в текстовый файл
- •Импорт данных. Копирование информации из текстового файла в файл записей
- •3.8 Запросы к файлам записей
- •Запрос с группировкой
- •4 Графическое программирование
- •4.1 Управление видеорежимом
- •Инициализация видеорежима. Процедура InitGraph
- •Закрытие видеорежима. Процедура CloseGraph
- •Создание графического окна. Процедура SetViewPort
- •Закрытие графического окна. Процедура ClearDevice
- •4.2 Построение графических фигур
- •Построение прямой линии. Процедуры SetColor, SetLineStyle, Line, LineRel, LineTo
- •Построение прямоугольника. Процедуры Rectangle и Bar
- •Построение окружности. Процедура Circle
- •Построение дуги окружности. Процедура Arc
- •Построение эллипса. Процедуры Ellipse, FillEllipse
- •Построение сектора. Процедуры PieSlice, Sector
- •4.3 Корректировка изображения Процедуры GetAspectRatio, SetAspectRatio
- •4.4 Создание пользовательского шаблона заливки
- •Заливка замкнутой области. Процедура FloodFill
- •Построение и окраска произвольного рисунка на примере замка
- •Построение и заливка правильного многоугольника
- •4.5 Работа с текстом
- •Выбор стандартного шрифта. Процедура SetTextStyle
- •Коррекция стандартного шрифта. Процедура SetUserCharSize
- •Вывод числовых величин на экран
- •5 Анимация изображений
- •5.1 Дублирования спрайта цветом фона
- •5.2 Манипулирование фрагментами изображения
- •5.3 Использование страниц видеопамяти
- •6 Сообщения об ошибках
- •6.1 Ошибки стадии компиляции
- •6.2 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
5 Одномерные числовые массивы
Рассматриваемые до сих пор типы данных были простыми типами.
Простой тип – это такой тип данных, данные которого могут представлять только по одному значению, например, переменная целого типа может хранить только одно целое число.
Язык PASCAL, наряду с простыми типами данных, содержит еще и стуктурированные типы данных, элементы которых могут представлять совокупность значений.
Наиболее часто используемый структурированный тип данных – это массив. Под массивом понимается упорядоченная конечная совокупность данных одного типа, рассматриваемая как единое целое. К необходимости использования массивов приходят всякий раз, когда требуется связать и использовать целый ряд родственных величин, например, результаты замеров температуры воздуха в течение некоторого периода удобно рассматривать как совокупность вещественных чисел, объединенных в один сложный объект – массив измерений.
Каждый массив имеет имя (идентификатор). Доступ к элементу массива в программе осуществляется с помощью индекса – целого числа, служащего своебразным номером элемента в массиве. Индекс элемента заключается в квадратные скобки. При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках.
T0 |
5.1 |
6.3 |
7.1 |
6.2 |
5.0 |
TEMP |
TEMP[1] |
TEMP[2] |
TEMP[3] |
TEMP[4] |
TEMP[5] |
Число элементов массива определяется при его описании, и в дальнейшем не меняется. Массив описывается при помощи задания типа его компонент, типа индексов и границ изменения индексов.
Тип индекса обычно целый ограниченный.
Тип компонента может быть любым: целым вещественным, символьным, и даже массивом. Тип компонент массива – это просто тип данных, ассоциированный с каждым элементом массива. Например, если массив имеет вешественный тип, то каждый его элемент может быть использован как вешественная переменная.
Если в программе используется массив, то он должен быть описан в разделе описания переменных VAR по следующей структуре:
VAR <ИмяМассива>:ARRAY[<НачЗначИндекса>..<КонЗначИндекса>] OF <ТипЭлементов>;
При описании массива определяются границы изменения его индексов. Если в программе делается попытка обратиться к элементу массива с несуществующим индексом, то возникает ошибка исполнения.
Пример описания массива:
VAR RESULT:ARRAY[1..10] OF REAL;
Здесь описывается вешественный массив RESULT из 10 элементов.
Если несколько массивов имеют одинаковое описание, то при описании их можно объединить в список.
VAR A,B,C:ARRAY[1..5] OF INTEGER;
Если два массива имеют одинаковое описание, то их можно проверить на равенство или неравенство с помощью одной операции сравнения, не детализируя ее до поэлементного сравнения. При этом следует учитывать, что в операциях сравнения можно использовать только операции «=» или «!=», другие операции сравнения требуют поэлементного сравнения.
При обращении к элементу массива в качестве индекса может стоять выражение, частным случаем которого являются константа или переменная.
Элемент массива называется индексированной переменной, в отличие от него, переменная без индекса называется простой переменной.
Элементы массива могут стоять как в левой, так и в правой частях оператора присваивания. Над элементами массива можно производить те же операции, которые допустимы для данных его базового типа, т.е. если его базовый тип – вещественный, то для такого элемента допустимы все операции, выполняемые над вещественными данными, включая и стандартные функции. Например:
B[5]:=B[3]+1;
SUM:=SUM+A[K];
P1:=A[2*K+3];
P2:=SIN(A[1]);
Для ввода и вывода числовых значений массива надо использовать арифметический цикл, где целая переменная I используется с одной стороны как параметр цикла, а с другой стороны – в качестве индекса.
PROGRAM MASSIV;
VAR A:ARRAY [1..5] OF REAL;
B:ARRAY [1..6] OF REAL;
I:INTEGER;
BEGIN
FOR I:=1 TO 5 DO
BEGIN
WRITE(‘ENTER A[’,I,’]=’);
READLN(A[I]);
END;
…
FOR I:=1 TO 6 DO WRITELN(‘B[’,I,’]=’,B[I]:10:4);
END.
Актуальной является задача поиска наибольшего и наименьшего элемента массива. Для ее решения вводятся вспомогательные переменные, хранящие текущие максимальное (amax) и минимальное (amin) значения, а также переменные, хранящие их номера (nmax и nmin). Первоначально за текущий минимальный и максимальный элемент принимается первый элемент массива, а затем организуется цикл перебора элементов массива, начиная со второго, и до конца. В цикле производится срвнение текущего элемента массива с текущим минимальным и текущим максимальным элементами. Если текущий элемент массива меньше текущего минимального элемента, то текущий минимальный элемент принимается равным текущему элементу, и, аналогично, если текущий элемент массива больше текущего максимального элемента, то текущий максимальный элемент принимается равным текущему элементу.
Рассмотрим процесс поиска наибольшего и наименьшего элемента массива на примере массива из 10-ти элементов.
a |
5 |
7 |
4 |
10 |
3 |
9 |
2 |
6 |
1 |
8 |
amin |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
nmin |
1 |
1 |
3 |
3 |
5 |
5 |
7 |
7 |
9 |
9 |
amax |
5 |
7 |
7 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
nmax |
1 |
2 |
2 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
В результате работы этого алгоритма получаем наибольший элемент массива – это 10, стоящий на 4-м месте, а наименьший элемент – это 1, стоящий на 9-м месте. Блок-схема алгоритма решения задачи приведена на рис. 2.13.
PROGRAM MINMAX;
VAR I, NMIN, NMAX: INTEGER;
AMIN, AMAX: REAL;
A: ARRAY[1..10] OF REAL;
BEGIN
FOR I:=1 TO 10 DO
BEGIN
WRITE(‘ENTER A[’, I,’’);
READLN(A[I]);
END;
WRITELN(‘INITIAL ARRAY’);
FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);
WRITELN;
NMIN:=1;AMIN:=A[1];
NMAX:=1;AMAX:=A[1];
FOR I:=2 TO 10 DO
BEGIN
IF A[I]>AMAX THEN BEGIN AMAX:=A[I]; NMAX:=I; END;
IF A[I]<AMIN THEN BEGIN AMIN:=A[I]; NMIN:=I; END;
END;
WRITELN(‘MAX=’,AMAX, ‘ NMAX=’,NMAX);
WRITELN(‘MIN=’,AMIN, ‘ NMIN=’,NMIN);
END.
Часто требуется упорядочить массив по убыванию или возрастанию его элементов, для этого используют алгоритмы сортировки элементов массива. Наиболее известным среди них является алгоритм «пузырька», блок-схема которого приведена на рис. 2.14. В этом алгоритме используется аналогия с пузырьками воздуха, всплывающими вверх в стакане с газированной водой. Только в этом случае, при упорядочивании по возрастанию, наименьший элемент перемещается вверх к началу массива, затем перемещается вверх элемент, наименьший из оставшихся, и т.д. Для перемещения вверх элементов, два соседних элемента массива сравнивают друг с другом, и если имеется инверсия (следующий элемент меньше предыдущего), то тогда они меняются местами.
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||
7 |
7 |
7 |
7 |
7 |
7 |
7 |
1 |
5 |
5 |
5 |
5 |
5 |
5 |
2 |
2 |
2 |
2 |
2 |
2 |
|||||||
4 |
4 |
4 |
4 |
4 |
4 |
1 |
7 |
7 |
7 |
7 |
7 |
7 |
2 |
5 |
5 |
5 |
5 |
5 |
3 |
|||||||
10 |
10 |
10 |
10 |
10 |
1 |
4 |
4 |
4 |
4 |
4 |
4 |
2 |
7 |
7 |
7 |
7 |
7 |
3 |
5 |
|||||||
3 |
3 |
3 |
3 |
1 |
10 |
10 |
10 |
10 |
10 |
10 |
2 |
4 |
4 |
4 |
4 |
4 |
3 |
7 |
7 |
|||||||
9 |
9 |
9 |
1 |
3 |
3 |
3 |
3 |
3 |
3 |
2 |
10 |
10 |
10 |
10 |
10 |
3 |
4 |
4 |
4 |
|||||||
2 |
2 |
1 |
9 |
9 |
9 |
9 |
9 |
9 |
2 |
3 |
3 |
3 |
3 |
3 |
3 |
10 |
10 |
10 |
10 |
|||||||
6 |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
2 |
9 |
9 |
9 |
9 |
9 |
9 |
6 |
6 |
6 |
6 |
6 |
|||||||
1 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
9 |
9 |
9 |
9 |
9 |
|||||||
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
|||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|
|||||||||||||||||||
2 |
2 |
2 |
2 |
2 |
2 |
2 |
|
|||||||||||||||||||
3 |
3 |
3 |
3 |
3 |
3 |
3 |
|
|||||||||||||||||||
5 |
5 |
5 |
4 |
4 |
4 |
4 |
|
|||||||||||||||||||
7 |
7 |
4 |
5 |
5 |
5 |
5 |
|
|||||||||||||||||||
4 |
4 |
7 |
7 |
7 |
6 |
6 |
|
|||||||||||||||||||
10 |
6 |
6 |
6 |
6 |
7 |
7 |
|
|||||||||||||||||||
6 |
10 |
10 |
10 |
8 |
8 |
8 |
|
|||||||||||||||||||
8 |
8 |
8 |
8 |
10 |
10 |
9 |
|
|||||||||||||||||||
9 |
9 |
9 |
9 |
9 |
9 |
10 |
|
|||||||||||||||||||
В
таблице приведен процесс сортировки
массива методом пузырька на примере
массива из десяти элементов. Жирным
шрифтом выделены меняющиеся местами
элементы.
PROGRAM BUBBLE;
VAR X:REAL;
I,J:INTEGER;
A:ARRAY[1..10] OF REAL;
BEGIN
FOR I:=1 TO 10 DO
BEGIN
WRITE(‘ENTER A[’,I,’]=’);
READLN(A[I]);
END;
WRITELN(‘INITIAL ARRAY’);
FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);
WRITELN;
FOR I:=2 TO 10 DO
FOR J:=10 DOWNTO I DO
BEGIN
IF A[J-1]>A[J] THEN BEGIN
X:=A[J];
A[J]:=A[J-1];
A[J-1]:=X;
END;
END;
WRITELN(‘SORTED ARRAY’);
FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ‘);
WRITELN;
END.
Для примера рассмотрим решение следующей задачи. Дан массив из десяти вещественных чисел. Найти среднее арифметическое положительных элементов этого массива.
Решение этой задачи распадается на следующие этапы:
ввод исходного массива;
контрольный вывод исходного массива;
перебор элементов массива с подсчетом суммы и числа положительных элементов;
вычисление среднего арифметического положительных элементов;
вывод полученных результатов.
PROGRAM VECTOR;
VAR A: ARRAY [1..10] OF REAL;
I,K: INTEGER;
S,SRAR: REAL;
BEGIN
{ввод исходного массива}
FOR I:=1 TO 10 DO
BEGIN
WRITE(‘ENTER A[’,I,’]=’);
READLN(A[I]);
END;
{контрольный вывод введенного массива}
WRITELN(‘INITIAL ARRAY’);
FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);
WRITELN;
{подсчет числа и суммы положительных элементов}
S:=0; K:=0;
FOR I:=1 TO 10 DO
BEGIN
IF A[I]>0 THEN BEGIN
S:=S+A[I];
K:=K+1;
END;
END;
{вывод результатов}
IF K>0 THEN BEGIN
SRAR:=S/K;
WRITELN(‘AVERAGE=’,SRAR:10:4);
END
ELSE WRITELN(‘NO POSITIVE ELEMENTS’);
END.
