- •Оглавление
- •1. 2. Среда Турбо-Паскаль
- •1. 3. Структура языка Турбо-Паскаль
- •1. 4. Типы переменных
- •Var a1, a2 : array [ 1 . . 1000 ] of real ;
- •Var m1: array[1..200] of integer; a1: array[100..200] of real;
- •Var t1,t2:Date_m; c1:Ruch_b; s1:Lat_b; a1,a2:Otmetka; b:Ball;
- •1. 5. Структура программы
- •1. 6. Операции и стандартные функции
- •1. 7. Операторы Турбо-Паскаля
- •Составной оператор Begin "операторы" end;
- •1. 7. 1. Операторы ввода/вывода данных
- •Операторы вывода данных на экран Write("сп"); или Writeln("сп");
- •X1, y1, z1: integer; xb, yb, zb: boolean;
- •Var n, X, y: real;
- •1. 7. 2. Оператор выбора
- •0..9: Writeln('однозначное');
- •1. 7. 3. Условный оператор
- •If "условие" Then "оператор1" Else "оператор2";
- •Var V : integer; Then
- •If Writeln(a2)
- •1. 7. 4. Оператор цикла с параметром
- •Var a, s, Sn, I, n: word;
- •Var s, Sn, pr: real; I, n: integer;
- •Var y, X, a, dx: real; I, j: integer;
- •Var a1, a2, n1, s, g: longint; bb: boolean;
- •1. 7. 5. Операторы цикла с условием
- •Var y, y1, X, eps, a, k: real; n: Word;
- •1. 7. 6. Операторы ограничения и прерывания цикла
- •1. 7. 7. Оператор перехода к метке
- •Var b, a: longint;
- •1. 8. Блок - схемы алгоритмов
- •1. 9. Составление диалоговых программ
- •Var I, n, n1: integer;
- •1. 10. Массивы
- •1. 10. 1. Линейные массивы
- •1. 10. 2. Работа с элементами переменной строкового типа
- •1. 10. 3. Двумерные массивы
- •Var a: array[1..30, 1..7] of byte;
- •2 S[2] Массив a: a[2, 1] a[2, 2] a[2, 3] a[2, 4] . . . A[2, j] . . . A[2, m]
- •1. 10. 4. Создание баз данных с использованием массивов записей
- •I: byte;
- •1. 10. 5. Работа с большими массивами
- •I, j: word;
- •1. 11. Текстовые файлы
- •Var c: char; j, I: word;
- •1. 12. Разработка функций и процедур
- •1. 12. 1. Описание функций и процедур
- •Viz(Dat); { вызов процедуры } Readln end.
- •Var z: r_1000; x1, x2: real; n: word;
- •Var X: m_30х30_r; I, j, n, m: byte;
- •Var a, b, c, ha, hb, hc: real;
- •Var p, s: real;
- •Var y, y1, x1: real;
- •Var a, k, y: real; I: longint;
- •1. 12. 2. Рекурсивные функции и процедуры
- •Var n_1: Longint; I: word;
- •Var ch: char; I: word;
- •Var n, n1: integer;
- •1. 13. Разработка модулей
- •Interface
- •1. 14. Модуль сrt
- •1. 14. 1. Управление экраном в текстовом режиме
- •InsLine; Вставка пустой строки.
- •1. 14. 2. Управление клавиатурой
- •Var n : word; f, dx, X, y, I, j, xm, ym : byte;
- •1. 14. 3. Работа с символьными переменными
- •Var r: registers;
- •X, y, I, xm, ym: byte;
- •1. 14. 4. Работа со строковыми переменными
- •1. 14. 5. Управление звуковыми сигналами
- •1. 15. Модуль Graph
- •1. 15. 1. Инициализация графического режима
- •InitGraph(Gd, Gm, 'way');
- •1. 15. 2. Простейшие графические процедуры и функции
- •Var X, y, VX, Vy, p: array[1..N] of integer; ch: char;
- •I1, i2, zx, zy, ax, ay, I, k: integer;
- •1. 15. 3. Рисование геометрических фигур
- •1. 15. 3. 1. Построение заполненных фигур
- •Var I, x1, y1, x2, y2, Gd, Gm : integer;
- •1. 15. 3. 2. Работа с линиями
- •1. 15. 3. 3 Создание графических узоров
- •1. Перемещение фигуры.
- •2. Масштабирование фигуры.
- •3. Симметричное отображение фигуры.
- •4. Штриховка углов.
- •Var xx1, xx2, yy1, yy2, I: integer; k: real;
- •5. Использование рекурсии.
- •Var gD, gM, n, X, y, x1, y1, k: integer; dl, ugol, ugol_0, s, I: real;
- •6. Создание узоров построением зеркальных отображений фигуры.
- •Var I, j : integer;
- •Var I, j : integer;
- •1. 15. 3. 4. Работа с текстом в графическом режиме
- •Var Gd, Gm, k, X, y, Size: integer; s: string;
- •1. 15. 5. Мультипликация
- •1. 15. 5. 1. Мультипликация с запоминанием части экрана
- •Var Gd, Gm, I, j, k, Size, X, y, Xmax, Ymax: Integer;
- •1. 15. 5. 2. Мультипликация с чередованием видеостраниц
- •1. 15. 5. 3. Мультипликация с управлением движения образа
- •1. 15. 5. 4. Модификация контурного изображения
- •Var Gd, Gm, I, j, k, n, xc, yc, r, m: integer;
- •X, y, x1, y1, x2, y2: array[1..12] of integer; alfa: real;
- •Глава 2. Программирование в среде Турбо - Паскаль
- •2. 1. Геометрические построения на плоскости
- •2. 1. 1. Построение графиков функций
- •0 Left, right GetMaxX
- •Interface
- •Var right, left, down, up: integer; k_xy, kx, ky, x_max, x_min, y_max, y_min: double; { описание глобальных переменных }
- •Implementation
- •Var XX, yy: word; xg_m, yg_m:integer;
- •Var xg0, yg0:integer;
- •1 Спираль a*fi 0 ... 8 -1 1 3 -
- •4 Логарифмическая a*Exp(b*fi) -3 ... 3 -1 1 -1 0 1
- •5 Спираль a*fi2 - b -8 ... 8 -1 1 2 0 1 2
- •6 Роза a*Sin(b*fi) 0 ... 8 -1 1 2 целые и
- •12 Строфоида a*Cos(2*fi)/Cos(fi) 0,1 ... 1,5 -3 -2 1 -
- •13 Циссоида a*Sin2(fi)/Cos(fi) 0,1 ... 1,5 -1 1 2 -
- •2. 1. 2. Графическое решение уравнений
- •2. 1. 3. Уравнение прямой на плоскости
- •2. 1. 4. Построение касательных и нормалей к плоским кривым
- •2. 1. 5. Двумерные преобразования координат
- •Var z: real;
- •Var alfa: real;
- •I_r; picture;
- •2. 1. 6. Проецирование пространственного изображения тела на плоскость
- •2. 2. Некоторые задачи физики
- •2. 2. 1. Механика
- •Var x3, y3, l, Lc, sa, ca, s3, c3: double;
- •2. 2. 2. Оптика и свет
- •2. 2. 3. Электростатика и электромагнетизм
- •2. 3. Математическое моделирование физических процессов
- •2. 4. Моделирование многовариантных задач с использованием графов
- •2. 5. Программы математических расчетов
- •2. 5. 1. Численное решение уравнений
- •2. 5. 2. Аппроксимация по методу наименьших квадратов
- •2. 5. 3. Численный расчет интегралов
- •2. 5. 4. Сортировка одномерных массивов
- •Список литературы
Var I, x1, y1, x2, y2, Gd, Gm : integer;
Begin Gd:= Detect; InitGraph(Gd, Gm, '_');
SetFillPattern(Red_50, Red); { орнамент - 50% красных пикселов }
Bar(250, 10, 350, 110);
SetFillPattern(bukva_Y, Blue); { орнамент - синяя буква "Y" }
Bar(340, 30, 440, 130);
{ стандартный набор из 12 орнаментов BGI выводим цветом с номером "11" }
for i:=0 to 11 do begin SetFillStyle(i, 11);
if i<6 then begin x1:=90*i; y1:=150 end
else begin x1:=90*(i-6); y1:=270 end;
x2:=x1+70; y2:=y1+80;
Bar3d(x1, y1, x2, y2, 10, TopOn) end;
ReadLn; CloseGraph
End.
Заполняя не черный экран орнаментом Red_50, можно получить новые цвета фона.
Выбранным из стандартных или определенным орнаментом можно заполнить любую замкнутую область с границей цвета "N" оператором
FloodFill(X, Y, N);
Заполнение начинает производится из точки X, Y и ограничивается при достижении границы цвета с номером "N". Например: Rectangle(x1, y1, x2, y2); FloodFill((x1+x2) div 2, (y1+y2) div 2, Red); Если область не замкнута или цвет границы не равен "N", то заполнение "разольется" по экрану.
Практическое задание N 1. 54
1. С использованием оператора цикла нарисовать на экране 12 одинаковых заполненных различными стандартными орнаментами фигур ( в 3 ряда по 4 фигуры). По нажатию клавиши должен меняться вариант фигуры:
1. 1 Прямоугольник, 2. 1 Эллипс,
1. 2 Параллелепипед. 2. 2 Круг.
Выполнить задание с использованием процедур рисования фигур без автоматического заполнения, а затем заполнить их.
2. Нарисовать 5 вложенных прямоугольников с увеличением размера на 20 пикселов в каждом направлении. Стиль заполнения для каждой фигуры определить буквами Вашего имени.
3. Нарисовать 5 соосных кругов разного цвета с уменьшением радиуса на 10 пикселов. Стиль заполнения для каждого круга определить его номером, т. е. цифрами 1, 2, 3, 4, 5.
4. Определить три орнамента заполнения: "снежинка", "иголки" с наклоном влево и вправо. Нарисовать из треугольников пять елок и заполнить их орнаментом "иголки". Заполнить экран орнаментом "снежинка".
5. Создать элемент орнамента с единицами (4*4) в центре. Нарисовать на экране картину "ночной город", используя фрагменты "звездного неба" и пять прямоугольников, заполненных орнаментом 4*4 разного цвета.
6. Используя исходные орнаменты из одной линии составить с использованием логических операций орнаменты цифр: 1, 6, 7 и букв: B, F, E.
90
1. 15. 3. 2. Работа с линиями
В графическом режиме курсор невидим, его положение можно определить функциями, возвращающими значения координат:
GetX; - по оси "Х", GetY; - по оси "Y".
Следующие процедуры перемещают курсор без рисования:
MoveTo(x, y); - переместить курсор в точку с координатами (x, y),
MoveRel(dx,dy); - сместить курсор на расстояние dx, dy от текущего положения.
Для построения многоугольников и ломаных линий удобно использовать процедуры:
LineTo(x, y); - провести отрезок прямой линии от текущего положения
курсора до точки с координатами X, Y.
LineRel(dX, dY); - провести отрезок прямой линии от текущего положения
курсора до точки, смещенной на расстояние dX, dY по
соответствующим осям.
В отличие от процедурыLine(x1, y1, x2, y2); процедуры LineTo(x, y); и LineRel(dX, dY); при своем исполнении перемещают текущий указатель.
Пример операторов для построения восьмиугольника:
R:=100; { расстояние от вершин до центра xc, yc }
xc:= GetMaxX div 2; yc:= GetMaxY div 2;
for i:= 1 to 8 do begin alfa:= i * pi/4; { значение угла в рад. }
x[i]:= xc + round(R * cos(alfa)); { координаты вершин }
y[i]:= yc + round(R * sin(alfa))
end;
MoveTo(x[8], y[8]); { исходная позиция для рисования }
for i:= 1 to 8 do LineTo(x[i], y[i]); { рисование линий }
Для отрезков прямых линий и процедур с их использованием можно задать режимы построения прямых линий оператором:
SetWriteMode(N);
N=0 - замещение линией изображения на экране ( режим CopyPut ) используется по умолчанию,
N=1 - изображение комбинируется ( режим XorPut ). Работа функции состоит в изменении согласно логической операции "исключающее ИЛИ" исходного значения цвета пиксела (числа "1" или "0"). Логическая функция Xor, примененная к одной переменной дважды, восстанавливает ее исходное значение: ( J xor I ) xor I = J . Следовательно при повторном проведении линии в режиме XorPut изображение этой линии уничтожается, а цвет пикселов экрана становится исходным. На этом правиле основаны некоторые программы построения движущихся изображений.
91
Пример операторов для рисования движущегося прямоугольника:
SetWriteMode(1);
a:= 100; b:= 50; { стороны прямоугольника }
x1:= 0; y1:= GetMaxY div 2;
N:= GetMaxX - x1 - a; { N - число перемещений }
for i:= 0 to N do begin
Rectangle(x1+i, y1, x1+a+i, y1+b); { рисование прямоугольника }
delay(10); Rectangle(x1+i,y1,x1+a+i,y1+b);{ стирание прямоугольника }
end;
1. Составить процедуру рисования N - угольной звезды. В параметры процедуры включить число лучей звезды, радиусы вписанной и описанной окружностей, цвет линий и координаты центра звезды. Перемещать две звезды разного цвета в пределах экрана случайным образом.
где N= 3, 5, 7, ... Операторы рисования имеют вид:
M:=N div 2; Moveto(x[1],y[1]);
For i:=1 to N do begin j:=(M*i) mod N + 1;
LineTo(x[j],y[j]) end;
Перемещать две звезды разного цвета в пределах экрана.
Толщину и форму (стиль) линий отрезков прямых, прямоугольников, окружностей, эллипсов можно задать оператором
SetLineStyle(F, P, T);
Здесь F - форма линии из стандартного набора BGI:
F=0 - сплошная,
F=1 - пунктирная,
F=2 - штрих-пунктирная,
F=3 - штриховая.
F=4 - форма линии задается параметром Р. При F<4 значение Р игнорируется. Параметры F, P, T типа Word.
Стиль линии Р - число, двоичное представление которого отображает заполнение линии длиной 16 пикселов. Если разряд числа равен 1, то пиксел высвечивается, 0 - не высвечивается. Удобно использовать шестнадцатеричные числа. Например:
P = $35F1 = 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 ( двоичное )
отобразит стиль:
Можно использовать десятичную форму записи значения параметра "Р",
где 0<= P <= 65535= 216-1 .
T - толщина линии может принимать два значения:
T= 1 - тонкая (1 пиксел), T= 3 - толстая (3 пиксела).
Например, операторы: SetLineStyle(4, $5555, 3); Line(x1, y1, x2, y2); определяют толстую мелким пунктиром линию.
92
Практическое задание N 1. 55
1. Вывести на экран горизонтальные толстые линии с двоичным представлением:
1111000001100000, 1111000011110000, 0111101111011110,
1100110011001100, 1001100110011001, 1111100011111000.
2. Вывести на экран вертикальные толстые линии с двоичным представлением:
0101010101010101, 1100011000110001, 1111110011111100,
0111011101110111, 1110001110001110, 1111000000001111.
3. Вывести на экран линии разных форм, заданных параметром РN = PN-1 + 2 * N,
где P0= 1; N= 1, . . , 150 . Линии располагать вертикально.
4. Вывода на экран линий разных форм, заданных параметром РN = PN-1 + 2N,
где P0= 1; N= 1, . . , 15 . Линии располагать горизонтально.
5. Нарисовать расходящийся из центра экрана по спирали ромбический лабиринт шириной 6 пикселов из отрезков наклонных прямых. Очищать экран и менять толщину и форму линии F= 0, . . , 3.
6. Нарисовать расходящийся из центра экрана по спирали прямоугольный лабиринт шириной 5 пикселов из отрезков вертикальных и горизонтальных прямых. Очищать экран и менять толщину и форму линии.
Применяя к исходным стилям линий пользователя логические операции, можно получать новые стили линий. Например:
P3 = P1 and P2 - линии из совпадающих единичных битов.
P3 = P1 or P2 - добавление единичных битов.
P3 = P1 xor P2 - обнуление совпадающих значений битов.
P3 = not P2 - изменение значений битов на противоположные.
Таблица результатов выполнения логической операции "xor" над битами.
( Таблица результатов выполнения
бит "A" операция бит "B" результат логических операций "or" и "and"
над битами приведена на стр. . )
1 xor 1 0
1 xor 0 1 Результат операции "A xor B" равен
0 xor 0 0 единице при различных значениях битов
0 xor 1 1 "A" и "B", иначе результат равен нулю.
Практическое задание N 1. 56
1. Создать эффект "бегущих огней" перемещением на один пиксел набора из трех касающихся толстых пунктирных линий ( перерисовка в режиме XorPut ). Крайние линии стиля "Р", средняя - стиля "not P".
2. Создать штриховые стили "Р1", "Р2" и рассчитать с использованием всех логические операций приведенные выше стили Р3. Вывести на экран исходные и расчетные линии.
93