
- •Часть 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 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
3 Циклические вычислительные процессы
Если при выполнении программы один оператор или группа операторов выполняется два и более раза, то мы имеем дело с циклическим процессом.
Задачи, решаемые компьютером, практически всегда в своей основе имеют циклический алгоритм. И это вполне оправдано, поскольку основное назначение компьютера – помочь человеку освободиться от рутинной работы, которая не требует мыслительной деятельности, например, от расчета по одним и тем же формулам, от поиска и сортировки информации путем однотипного перебора множества данных, от многократной печати одного и того же текста.
Прежде, чем сформулировать правила построения циклического алгоритма, приведем некоторые определения.
ЦИКЛ – это многократно повторяемая часть алгоритма.
ЦИКЛИЧЕСКИЙ АЛГОРИТМ – это алгоритм, содержащий один или несколько циклов.
ПАРАМЕТР ЦИКЛА – это переменная, которая при каждом новом вхождении в цикл принимает новое значение.
ТЕЛО ЦИКЛА – многократно повторяемая последовательность действий, которая отражает правила выполнения поставленной задачи.
УПРАВЛЯЮЩЕЕ УСЛОВИЕ – условие, управляющее реализациями цикла; оно может быть реализовано либо в виде условия выхода, либо в виде условия повторения.
Каждый цикл обязательно содержит тело цикла и управляющее условие, но последовательность их выполнения может быть различной.
Существует классификация циклов в зависимости от порядка следования тела цикла и управляющего условия.
Цикл, в котором условие выхода проверяется после выполнения тела цикла, называется циклом с постусловиями или ЦИКЛОМ-ПОСЛЕ. В таких циклах тело цикла выполняется по крайней мере один раз. Циклы с постусловиями на языке PASCAL программируются с помощью оператора REPEAT…UNTIL…;
Цикл, в котором условие повторения проверяется до выполнения тела цикла, называется циклом с предусловиями или ЦИКЛОМ-ДО. В таких циклах может случиться так, что при первой проверке условие повторения не выполняется, а значит тело цикла не выполняется ни разу. Циклы с предусловиями на языке PASCAL программируются с помощью операторов WHILE…DO…; или FOR …TO …DO…;
Рис. 2.4
Структуры циклов с постусловием и
предусловием
Существует еще одна классификация циклов. Циклические алгоритмы по способу организации выхода из цикла можно разделить на арифметические и итерационные.
АРИФМЕТИЧЕСКИЙ ЦИКЛ – это цикл, где число повторений известно (или легко может быть вычислено) до первого вхождения в тело цикла.
ИТЕРАЦИОННЫЙ ЦИКЛ – это цикл, в котором число повторений заранее не известно, выход из него осуществляется по выполнению некоторого условия. Обычно таким условием является достижение заданной точности при последовательном приближении к искомому значению.
3.1 Арифметический цикл
Арифметическим
называется циклический процесс, в
котором количество повторений известно
в момент входа в цикл. В языке Паскаль
для реализации этого вида циклов
рекомендуется использовать оператор
FOR … DO..,
получивший название оператор цикла с
параметром.
До первого вхождения в тело арифметического цикла известно, сколько раз его необходимо повторить, например, N раз. В арифметических циклах обязательно должен присутствовать счетчик (параметр) цикла, который показывает, сколько раз до заданного момента времени повторилось тело цикла. Первоначально он принимает начальное значение, а при каждом прохождении тела он изменяется на величину приращения, и так происходит до тех пор, пока его значение или не превысит конечное значение, равное N (для случая положительного значения приращения) или не станет меньше N (для случая отрицательного значения приращения), затем происходит выход из цикла.
Арифметический цикл служит основой для алгоритмизации процесса, в котором число повторений известно заранее, поэтому при использовании такого процесса необходимо четко уяснить, какая переменная является счетчиком цикла, каков диапазон ее изменения ( начальное и конечное значение ), чему равно ее приращение за один проход цикла.
Чаще всего алгоритм арифметического цикла строится на основе цикла с предусловиями ( ЦИКЛ – ДО ), шаблон такого цикла для положительного значения приращения счетчика цикла приведен на рис. 2.5. В блоке задания начальных условий указываются начальное и конечное значения счетчика цикла и его приращение, при этом счетчик цикла получает свое начальное значение, затем проверяется условие повторения цикла ( счетчик цикла не больше конечного значения счетчика ), в зависимости от выполнения которого тело цикла выполняется еще раз ( по ветке ДА ) или происходит выход из цикла ( по ветке НЕТ ), затем следует тело цикла. После выполнения тела цикла счетчик цикла увеличивает свое значение на величину приращения, а затем осуществляется переход на проверку условия повторения.
Рис. 2.5 Шаблон арифметического цикла
Арифметические циклы используются, как правило, для решения следующих задач:
вычисление суммы N слагаемых;
вычисление произведения N сомножителей;
табулирование функции на конечном интервале в N точках.
Рассмотрим подробнее примеры решения таких задач.
Вычисление суммы
слагаемых.
Пусть необходимо вычислить
Исходными данными алгоритма являются значение переменной N, которое необходимо ввести, а выходными данными алгоритма является значение переменной S, которое надо вычислить и вывести.
В данном примере счетчиком цикла является переменная i, которая принимает значения от 1 до N с шагом 1.
Представим процесс вычисления суммы S как последовательное вычисление частичных сумм:
;
;
;
Исходя из этого, начальное значение
суммы S принимается равным 0, затем,
на каждом шаге текущее значение S
увеличивается на величину i-го
слагаемого:
Заполним таблицу имен объектов:
Имя объекта в задаче |
Имя объекта в блок-схеме |
Тип объекта |
Примечание |
|
I |
целая переменная |
счетчик цикла |
|
N |
целая переменная |
конечное значение счетчика цикла |
|
S |
Вещественная переменная |
текущее значение частичной суммы |
|
PI |
Вещественная переменная |
|
|
A |
Вещественная переменная |
текущее слагаемое |
Тогда схема алгоритма по шагам запишется следующим образом:
Ш1. Ввод N.
Ш2. S присвоить 0.
Ш3.
присвоить 1.
Ш4. Если
,
то перейти на Ш7.
Ш5. Вывод .
Ш6. Конец.
Ш7.
присвоить
.
Ш8. S присвоить
.
Ш9.
присвоить
.
Ш10. Перейти на Ш4.
Блок-схема этого алгоритма приведена на рис.2.6.
Рис 2.6 Блок-схема алгоритма вычисления суммы N слагаемых
Поясним работу алгоритма таблицей
трассировки для
.
№ действия |
№ блока |
Результат действия |
1 |
1 |
Ввод
|
2 |
2 |
|
3 |
3 |
|
4 |
4 |
1 3, ДА |
5 |
7 |
|
6 |
8 |
S = 0 + 0,8674 = 0,8674 |
7 |
9 |
i= 1 + 1 = 2 |
8 |
10 |
переход на 4 |
9 |
4 |
2 3, да |
10 |
7 |
|
11 |
8 |
|
12 |
9 |
i = 2 + 1 = 3 |
13 |
10 |
переход на 4 |
14 |
4 |
3 3, да |
15 |
7 |
|
16 |
8 |
S = 1,3011 + 0 = 1,3011 |
17 |
9 |
i = 3 + 1 = 4 |
18 |
10 |
переход на 4 |
19 |
4 |
4 3, нет |
20 |
5 |
Вывод S = 1,3011 |
21 |
6 |
Конец |
При составлении программы по блок-схеме блоку "Начало" поставим в соответствие заголовок программы PROGRAM, блоку описания используемых в программе переменных соответствует раздел описания переменных VAR декларативной части блока. В этом разделе содержатся два описания : переменные I и N объявляются целыми, а переменные S и A вещественными.
Далее следует исполнительная часть блока, представляющая собой составной оператор. Она начинается с открывающей операторной скобки BEGIN. За ней следуют операторы программы. Блоку ввода ставим в соответствие вызов процедуры вывода информации на экран дисплея WRITELN для вывода приглашения ко вводу и вызов процедуры ввода информации с клавиатуры READLN для ввода исходных данных алгоритма – значения N.
Далее программируем операторы присваивания для задания сумме S начального значения 0, и параметру цикла I начального значения 1, ставя каждому блоку в соответствие один оператор, затем переходим к программированию цикла с предусловиями с помощью оператора WHILE. В теле цикла содержится более одного оператора, поэтому необходимо использование операторных скобок BEGIN END. В теле цикла последовательно вычисляются значение А, S и значение счетчика цикла увеличивается на величину приращения.
По выходу из цикла вывод информации программируем с помощью вызова процедуры вывода информации на экран дисплея WRITELN, блоку "конец" ставим в соответствие закрывающую операторную скобку END.
В результате получается следующая программа:
PROGRAM SUMMA1;
VAR I, N: INTEGER;
A,S:REAL;
BEGIN
WRITELN('ВВЕДИ ЗНАЧЕНИЕ N');
READLN(N);
S:=0.;
I:=1;
WHILE I<=N DO
BEGIN
A:=SIN(PI*I/N)/I;
S:=S+A;
I:=I+1;
END;
WRITELN('СУММА S=',S:10:4);
END.