
- •Часть 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.3 Использование страниц видеопамяти
Если графический фрагмент большой то использование процедуры PutImage вызывает мелькание экрана, а его движение носит прерывистый характер. Можно избавиться от мелькания экрана, и заставить спрайт двигаться более плавно. Для этого организуют вывод нового сюжета на следующую невидимую страницу видеопамяти, а потом делают её видимой. Имея в своём распоряжении от двух до четырех страниц видеопамяти можно сделать весьма качественную анимацию. Это так называемый, метод постраничного вывода изображений. Этот метод часто применяется начинающими программистами потому, что он интуитивно понятен каждому из-за полного сходства с мультипликацией: Алгоритм метода состоит из следующих действий:
вывести изображение на видимую страницу 0 (она видима по умолчанию);
сделать активной страницу 1;
сформировать новое изображение на невидимой странице 1;
сделать видимой страницу 1;
сформировать новое изображение на невидимой странице 0 и т.д.
Память видеобуфера делится на несколько частей - так называемых видеостраниц. Их число зависит от режима и типа адаптера. нумерация страниц начинается с 0. В каждый момент времени на экране воспроизводится только одна страница, называемая видимой. Страница на которой формируется изображение называется активной. Процедура SetActivePage(Page: word) устанавливает активную страницу для построения изображения. Построение изображения идет незаметно для смотрящего на экран. Когда страница сформирована она может быть выведена на экран с помощью процедуры SetVsualPage(Page: word). В качестве примера реализации метода постраничного вывода изображений рассмотрим следующий демонстрационный пример (см. рис. 3.22).
Пример 32. Демонстрационная программа "Модель земной орбиты".
Рис. 3.22 Модель земной орбиты
Program PR32; {Krivtsov D. IS-11}
Uses Graph, Crt;
Const RadOrb = 250 {РАДИУС ОРБИТЫ ЗЕМЛИ};
RadSun = 70 {РАДИУС СОЛНЦА};
RadGal = 100 {Радиус Галактики };
RadZem = 18 {РАДИУС ЗЕМЛИ };
Naklon = 0.2 {КОЭФФИЦИЕНТ НАКЛОНА ПЛОСКОСТИ ОРБИТЫ ЗЕМЛИ};
PressZem = 0.65 {КОЭФФИЦИЕНТ СПЛЮЩЕННОСТИ ПОЛЮСОВ ЗЕМЛИ};
Compress = 0.8 {КОЭФФИЦИЕНТ СЖАТИЯ ПРИ ПЕРЕХОДЕ ИЗ };
{РАСШИРЕНИЯ РЕЖИМА VGA В РЕЖИМ CGA }
Var ZemX, ZemY, UgMer, PixelY, DUgZem , UpDown,
XRad, Grad, UgZem, PixelX, StAngle, Ua, Ub,
ParallelY , Color, ZemPix, EndAngle,
VisualPage, GrMode, GrError, GrDriver, i : Integer;
Ugol, CompressZem, Expansion,
DUgol, Projection, PolUgol : Real;
BEGIN {УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА И ПРОВЕРКА ВОЗМОЖНЫХ ОШИБОК}
GrDriver := EGA; GrMode := EGAHi;
InitGraph(GrDriver, GrMode, 'd:\tp\bgi');
GrError := GraphResult; If GrError<>GrOk then Halt;
SetBkColor(Black);
SetFillStyle(1,Yellow); {УСТАНОВКА СТИЛЯ ЗАПОЛНЕНИЯ
И ЦВЕТА CОЛНЦA}
Ugol := 0; DUgol := 2*Pi/180; {ОРБИТАЛЬНОЕ УГЛОВОЕ СМЕЩЕНИЕ ЗЕМЛИ}
UgZem := 0; DUgZem := 14; {ОСЕВОЕ УГЛОВОЕ СМЕЩЕНИЕ ЗЕМЛИ}
{------------------------------------------------}
VisualPage := 1;
Repeat {Цикл Прерывается Нажатием Любой Клавиши}
SetVisualPage(1- (VisualPage mod 2));
{Установка Номера Видимой Видеостраницы}
VisualPage := VisualPage+1; {листание видеостраниц}
SetActivePage(1 - (VisualPage mod 2));
{Установка номера невидимой (активной) видеостраницы,}
{используемой для построения смещенного изображения }
ClearDevice; {ОЧИСТКА АКТИВНОЙ СТРАНИЦЫ}
{РИСОВАНИЕ "РАСХОДЯЩЕЙСЯ" ГАЛАКТИКИ}
RandSeed:=1; {ИСХОДНОЕ ЗНАЧЕНИЕ ДАТЧИКА СЛУЧАЙНЫХ ЧИСЕЛ}
Expansion:=VisualPage/100; {СКОРОСТЬ РАСШИРЕНИЯ ГАЛАКТИКИ}
For i:= 1 to VisualPage
do begin XRad := Trunc(Expansion*RadGal*Random);
{ТЕКУЩЕЕ РАССТОЯНИЕ ОТ ЗВЕЗДЫ ДО ЦЕНТРА ГАЛАКТИКИ}
PolUgol:= 2*Pi*Random-VisualPage/30;
{ТЕКУЩИЙ ЦЕНТРАЛЬНЫЙ УГОЛ ПОЛОЖЕНИЯ ЗВЕЗДЫ ГАЛАКТИКИ}
PixelX := 370+Trunc(XRad*cos(PolUgol+1.8)); {КООРДИНАТЫ}
PixelY := 250+Trunc(XRad*0.5*sin(PolUgol)); { ЗВЕЗДЫ }
PutPixel(PixelX, PixelY, White) {РИСОВАНИЕ ЗВЕЗДЫ}
end;
{РИСОВАНИЕ МЕРЦАЮЩИХ ЗВЕЗД}
Randomize; {ИНИЦИАЛИЗАЦИЯ ДАТЧИКА СЛУЧАЙНЫХ ЧИСЕЛ}
For i:=1 to 70
do PutPixel(Random(640),Random (350),White); {ВСПЫХИВАЮЩИЕ ЗВЕЗДЫ}
{----------------------------------------------}
For i := 1 to 100 {РИСОВАНИЕ ОРБИТЫ}
do PutPixel(320+Round(RadOrb * cos((i+VisualPage/5)*Pi/50+0.3)),
160+Round(RadOrb*Naklon*sin((i+VisualPage/5)*Pi/50-Pi/2)),15);
{-----------------------------------------------}
PieSlice(310, 160, 0, 360, RadSun); {РИСОВАНИЕ СОЛНЦА}
{-----------------------------------------------}
{РИСОВАНИЕ ЗЕМЛИ (ЕЕ ПАРАЛЛЕЛЕЙ И МЕРИДИАНОВ)}
Ugol := Ugol+DUgol; {УГОЛ ПОВОРОТА ЗЕМЛИ ОТНОСИТЕЛЬНО СОЛНЦА}
Grad := Round(180*Ugol/Pi) mod 360; {В РАД.(UGOL) И
В ГРАД.(GRAD)}
ZemX := 320+Round(RadOrb*cos((Ugol+Pi/2+0.3))); { КООРДИНАТЫ }
ZemY:=160+Round(RadOrb*Naklon*sin(Ugol)); {ЦЕНТРА ЗЕМЛИ}
CompressZem := 2.5-cos(Ugol+0.3);
{КОЭФФИЦИЕНТ УЧЕТА УДАЛЕННОСТИ ЗЕМЛИ ОТ НАБЛЮДАТЕЛЯ}
ZemPix := Round(RadZem*CompressZem); {ТЕКУЩИЙ РАДИУС ЗЕМЛИ}
UgZem := UgZem+DUgZem; {УГОЛ ПОВОРОТА ЗЕМЛИ ОТНОСИТЕЛЬНО
СВОЕЙ ОСИ}
For i := 0 to 11 { РИСОВАНИЕ МЕРИДИАНОВ }
do begin
UgMer := (UgZem+i*30) mod 360;
If (90<UgMer) and (UgMer<270) {УСТАНОВКА НАЧАЛЬНОГО
И КОНЕЧНОГО}
then begin StAngle:= 90; EndAngle:= 270 end {УГЛОВ ДУГИ}
else begin StAngle:= 270;EndAngle:= 90 end; {ЭЛЛИПСА МЕРИДИАНА}
Ua := (Grad+220) mod 360; Ub := (Grad+400) mod 360;
{УСТАНОВКА ЦВЕТОВ РИСОВАНИЯ ЗАТЕНЕННОЙ
И ОСВЕЩЕННЫХ ЧАСТЕЙ МЕРИДИАНА}
Color := LightBlue;
If Ua<=Ub then if (Ua<UgMer) and (UgMer<Ub) then Color:=White;
If Ua >Ub then if (Ua<UgMer) or (UgMer<Ub) then Color :=White;
SetColor(Color); XRad := round((ZemPix*cos(UgMer*Pi/180)));
Ellipse(ZemX, ZemY, StAngle, EndAngle, abs(XRad),
round(PressZem*ZemPix));
end;
For i := 2 to 7 {РИСОВАНИЕ ПАРАЛЛЕЛЕЙ}
do begin
XRad := abs(Round(ZemPix*sin(i*Pi/9)));
{БОЛЬШАЯ ПОЛУОСЬ ЭЛЛИПСА ПАРАЛЛЕЛИ}
UpDown := Round(ZemPix*PressZem*cos(i*Pi/9));
{высота параллели над плоскостью экватора}
ParallelY := ZemY+UpDown; {КООРДИНАТА Y ЦЕНТРА
ЭЛЛИПСА ПАРАЛЛЕЛИ}
SetColor(LightBlue);
Ellipse(ZemX, ParallelY, 0, 360, XRad, Round(Naklon*XRad));
{ЗАТЕНЕННАЯ ЧАСТЬ ПАРАЛЛЕЛИ}
SetColor(White);
Ellipse(ZemX,ParallelY,Grad+220,Grad+400,XRad,
Round(Naklon*XRad));
{ОСВЕЩЕННАЯ ЧАСТЬ ПАРАЛЛЕЛИ}
end;
{------------------------------------------------------}
{ПОВТОРНОЕ РИСОВАНИЕ СОЛНЦА, ЕСЛИ ОНО БЛИЖЕ
К НАБЛЮДАТЕЛЮ, ЧЕМ ЗЕМЛЯ}
If CompressZem<2 then PieSlice(310, 160, 0, 360, RadSun);
{-------------------------------------------------------}
RandSeed := VisualPage mod 12;
For i := 1 to 250 {РИСОВАНИЕ ПРОТУБЕРАНЦЕВ}
do begin
Projection := (1-sqr(Random))*Pi/2;
XRad := RadSun+Round((20)*sin(Projection))-15;
PolUgol := 2 * Pi * Random+VisualPage/20;
{PolUgol, XRad - Полярные Координаты Протуберанца}
PixelX := 310 + Round( XRad * cos(PolUgol));
PixelY := 160 + Round( Compress * XRad * sin(PolUgol));
PutPixel(PixelX, PixelY, LightRed)
end;
until KeyPressed
END.