Паскаль_Графики.ppt

  • ppt
  • 30.04.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Паскаль_Графики.ppt

1

Структурное программирование на языке Паскаль

Тема 1. Теория

2

Этапы разработки программ

Постановка задачи
определить цель и категорию программы (системная, прикладная)
определить исходные данные и требуемый результат
проверить, является ли задача хорошо поставленной (должны быть определены все связи между исходными данными и результатом)


зафиксировать требования к программе в письменной форме

3

Этапы разработки программ

Разработка модели данных
формальная модель
типы данных (массивы, структуры, …)
взаимосвязь между данными
Разработка алгоритма
выбор существующего или разработка нового
возможен возврат к шагу 2
Разработка программы
Языки: C, C++, Visual Basic, Delphi (Паскаль), `…
Отладка программы (поиск и исправление ошибок) debug – извлечение жучков (bug), 1945, MAРK-I
отладчик (точки останова, пошаговый режим, просмотр переменных)
профайлер (сколько выполняется каждая из процедур)

4

Этапы разработки программ

Тестирование программы (проверка на исходных данных, для которых известен результат)
альфа-тестирование: внутри фирмы (тестеры)
бета-тестирование: в других организациях, распространение через Интернет



Разработка документации
справочная система
руководство пользователя (User Manual)
руководство разработчика
Сопровождение (техническая поддержка)
исправление ошибок, найденных заказчиком
обучение и консультирование заказчика
новые версии по льготной цене

5

Методы проектирования программ

основная программа

процедуры 1-ого уровня

процедуры 2-ого уровня

снизу вверх

сверху вниз

6

Проектирование «снизу вверх»

сначала составляются процедуры нижнего уровня, из которых затем «собираются» процедуры более высокого уровня.

легче начать программировать
более эффективные процедуры

процедуры необходимо связывать с основной задачей («держать в голове»)
при окончательной сборке может не хватить «кубиков»
часто программа получается запутанной
сложно распределить работу в команде

7

Проектирование «сверху вниз»

метод последовательного уточнения:
начинаем с основной программы;
она разбивается на подзадачи, для каждой из которых пишется процедура-«заглушка»;
реализуем каждую из процедур тем же способом.
меньше вероятность принципиальной ошибки (начали с главного)
проще структура программы
удобно распределять работу в команде
в разных блоках могут быть реализованы похожие операции (можно было решить одной общей процедурой), особенно в команде

8

Структурное программирование

Существовавшие проблемы:
увеличилась сложность программ
сократилось время на разработку
Цели:
повысить надежность
уменьшить время и стоимость разработки
облегчить тестирование и отладку
возможность переделки одного модуля
улучшить читабельность
без переходов на другую страницу
избегать трюков и запутанных приемов

9

Структурное программирование

Принципы:
абстракции: программу можно рассматривать на любом уровне без лишних подробностей
модульности: программа разбивается на отдельные модули, которые могут отлаживаться независимо друг от друга
подчиненности: связь между модулями «сверху вниз»
локальности: каждый модуль использует только свои локальные переменные, глобальные переменные только в крайних случаях

10

Модуль

Модуль – это программный блок (процедура или функция), отделенный от кода других модулей, который полностью решает самостоятельную задачу своего уровня.
работа модуля не зависит от того, откуда он вызывается, и от того, сколько раз он вызывался до этого
размер модуля не более 50-60 строк (1 страница)
модуль имеет один вход и один выход
модуль начинается с «шапки»-комментария (входные данные, результаты, какие модули использует)
имена переменных – смысловые
в одной строке – один оператор
«трюки» – долой

11

Оформление текста программы

Шапка – комментарий в начале процедур и функций.

{----------------------------------------
Max – максимальное из двух чисел
Вход: a, b – исходные числа
Выход: максимальное из a и b
----------------------------------------}
function Max(a, b: integer): integer;
begin
...
end;

12

Оформление текста программы

Отступы – тело цикла, условного оператора, оператора выбора и т.п. сдвигается вправо на 2-3 символа.

for i:=1 to n do begin j := 0; while j < i
do begin j := j + 1; k := k mod N; end; k
:= k + 1; end;

for i:=1 to n do begin
j := 0;
while j < i do begin
j := j + 1;
k := k mod N;
end;
k := k + 1;
end;

легче читать текст программы
видны блоки begin-end (где начинаются и заканчиваются)

13

Оформление текста программы

«говорящие» имена функций, процедур, переменных: Sum, ShowMenu, count, speed.
пробелы в операторах



выделение пустыми строками и комментариями важных блоков

if(a

if ( a < b ) then
b := c + d;

{ ввод данных }
writeln( 'Введите число' );
read ( n );
{ вычисления }
n2 := n*n;
{ вывод результата }
writeln ( 'Его квадрат ', n2 );

14

Структурное программирование на языке Паскаль

Тема 2. Проект

15

Проект «Графики функций»



построить координатные оси и сделать их разметку


построить графики заданных функций (по вариантам)

16

Проект «Графики функций»


найти точки пересечения графиков, используя численные методы



заштриховать образованную замкнутую область

x=3,58
y=2,14

x=1,40
y=1,55

17

Проект «Графики функций»



вычислить площадь этой области двумя способами

оформить отчет по работе

S1=3,014
S2=3,025

18

Структура программы

program qq;



begin
Axes; { оси координат }
Plot; { графики функций }
Cross; { точки пересечения графиков }
Hatch; { штриховка }
Area; { площадь (способ 1) }
Area2; { площадь (способ 2) }
end.

константы и переменные

процедуры и функции

основная программа

{------------------------------------
Axes: оси координат
------------------------------------}
procedure Axes; begin end;

«заглушки»

19

Структурное программирование на языке Паскаль

Тема 3. Графики функций

20

Функции, заданные в явном виде

y = f (x)

21

Функции, заданные в неявном виде

f (x, y) = 0

пример: уравнение эллипса

22

полюс

Полярные координаты

А(, )

- полярный угол

- полярный радиус

Примеры:

Описание фигур, полученных при вращении объектов.

= f ()

= R

окружность

= a

спираль Архимеда

O

O

= a∙sin(2/3)

«роза»

23

Полярные координаты

Переход к декартовым координатам

24

Описание в параметрической форме

t – независимый параметр («время»)
Описание фигур, полученных при сложном движении объектов.

x = f1 (t)
y = f2 (t)

Циклоида – траектория точки на ободе колеса при вращении

R

y

x

0

25

Системы координат

Математическая

Экранная

Преобразование координат:
X0, Y0 – экранные координаты точки (0,0)
k масштаб (во сколько раз растягивается единичный отрезок)

26

Перевод в экранные координаты

const X0 = 100; Y0 = 400; { начало координат }
k = 80; { масштаб }
{------------------------------------------
ScreenX - перевод X в координаты экрана
-------------------------------------------}
function ScreenX(x: real): integer;
begin
ScreenX := round(X0 + k*x);
end;
{---------------------------------------
ScreenY – перевод Y в координаты экрана
--------------------------------------------}
function ScreenY(y: real): integer;
begin
ScreenY := round(Y0 - k*y);
end;

27

Оси координат

procedure Axes;
begin
line ( X0, 0, X0, 499 );
line ( 0, Y0, 699, Y0 );
end;

28

Разметка оси X («черточки»)

(, Y0−2)

(, Y0+2)

Число меток на [0, xmax]:
длина 700X0
единичный отрезок k

var i, xe: integer;

for i:=1 to trunc((700-X0)/k) do begin
xe := ScreenX(i);
line ( xe, Y0-2, xe, Y0+2 );
end;

trunc – отбросить дробную часть

29

Разметка оси X (числа)

1

xЭ

(, Y0+2)

Вывод в нужной точке:
MoveTo ( x, y );
write ( i );

var i, xe: integer;

for i:=1 to trunc((700-X0)/k) do begin
xe := ScreenX(i);
line ( xe, Y0-2, xe, Y0+2 );
MoveTo(xe-4, Y0+3);
write(i);
end;

левый верхний угол

(-4, Y0+3)

MoveTo(xe-4, Y0+3);
write(i);

30

Оси с разметкой (полностью)

procedure Axes;
var i, xe: integer;
begin
line ( X0, 0, X0, 499 );
line ( 0, Y0, 699, Y0 );
for i:=1 to trunc((700-X0)/k) do begin
xe := ScreenX(i);
line ( xe, Y0-2, xe, Y0+2 );
MoveTo(xe-4, Y0+3);
write(i);
end;
end;

31

Задания

«4»: Сделать разметку осей полностью (не только положительной части оси X).
«5»: Сделать задание на «4», использовав только 2 цикла (1 цикл для каждой оси).

32

Построение графика по точкам

Границы области «видимости»:

33

Вывод точки с проверкой

{----------------------------------------
SetPoint - вывод пикселя с проверкой
и пересчетом координат
----------------------------------------}
procedure SetPoint ( x, y: real;
r, g, b: integer);
var xe, ye: integer;
begin
xe := ScreenX(x);
ye := ScreenY(y);
if (xe >= 0) and (xe < 700) and
(ye >= 0) and (ye < 500) then begin
Pen(1, r, g, b);
Point(xe, ye);
end;
end;

если точка (, ) в пределах экрана…

координаты в математической системе

цвет точки

34

Описание функций

{-----------------------------------------
F1, F2
Вход: x
Выход: y = f1(x), f2(x)
-----------------------------------------}
function f1 (x: real): real;
begin
f1 := sqrt(x+1);
end;
function f2 (x: real): real;
begin
f2 := 4*sin(x-1);
end;

35

Области определения

{----------------------------------------
ODZ1 – область определения f1(x)
Вход: x
Выход: True, если x входит в ОДЗ
False, если x не входит в ОДЗ
----------------------------------------}
function odz1(x: real): Boolean;
begin
odz1 := (x >= -1);
end;

не нужно!

36

Вывод графика функции

{----------------------------------------
PLOT вывод графиков функций
----------------------------------------}
procedure Plot;
var xmin, xmax, x, h: real;
begin
xmin := - X0 / k;
xmax := (700 - X0) / k;
h := (xmax - xmin) / 1000;
x := xmin;
while x <= xmax do begin
if odz1(x) then
SetPoint(x, f1(x), 255, 0, 0);
x := x + h;
end;
end;

границы видимой части

x := xmin;
while x <= xmax do begin
if odz1(x) then
SetPoint(x, f1(x), 255, 0, 0);
x := x + h;
end;

шаг по x

37

Общее расположение

function f1(x: real): real; begin ... end;
function odzf1(x: real): Boolean;
begin ... end;
procedure SetPoint ( x, y: real;
r, g, b: integer);
begin ... end;
procedure Plot;
begin
...
if odz1(x) then
SetPoint(x, f1(x), 255, 0, 0);
...
end;

38

Задания

«4»: Построить графики в соответствии с заданием.
«5»: Построить графики, соединив точки линиями.

39

Структурное программирование на языке Паскаль

Тема 4. Точки пересечения

40

Точки пересечения

f1 (x*) = f2 (x*)

a

b

f1 (x*) – f2 (x*) = 0

f (x*) = 0

Пример:

Проблема: уравнение сложно (или невозможно) решить аналитически (получить формулу для x*)

Точка пересечения:

41

Методы решения уравнений

f (x) = 0

Точные (аналитические)
Приближенные
графические



численные (методы последовательного приближения):
по графику найти интервал [a, b], в котором находится x* (или одно начальное приближение x0)
по некоторому алгоритму уточнить решение, сужая интервал, в котором находится x*
повторять шаг 2, пока не достигнута требуемая точность:

b – a < 

42

Численные методы

Применение: используются тогда, когда точное (аналитическое) решение неизвестно или очень трудоемко.

дают хотя бы какое-то решение
во многих случаях можно оценить ошибку и найти решение с заданной точностью

решение всегда приближенное, неточное

43

Метод прямого («тупого») перебора

Задача: найти решение уравнения f (x) = 0 на интервале [a, b] с заданной точностью  (чтобы найденное решение отличалось от истинного не более, чем на ).

Алгоритм:
разбить интервал [a, b] на полосы шириной 
найти полосу [a*, b*], в которой находится x*
решение – a* или b*

44

Есть ли решение на [a, b]?

есть решение

нет решения

нет решения

45

Метод дихотомии (деление пополам)

Найти середину отрезка [a,b]: c = (a + b) / 2;
Если f(c)*f(a)<0, сдвинуть правую границу интервала b = c;
Если f(c)*f(a)≥ 0, сдвинуть левую границу интервала a = c;
Повторять шаги 1-3, пока не будет b – a ≤ .

46

Метод дихотомии (деления пополам)

простота
можно получить решение с любой заданной точностью

нужно знать интервал [a, b]
на интервале [a, b] должно быть только одно решение
большое число шагов для достижения высокой точности
только для функций одной переменной

47

Метод дихотомии (в программе)

{----------------------------------------------
Solve находит точку пересечения на [a,b]
Вход: a, b – границы интервала, a < b
eps - точность решения
Выход: x – решение уравнения f1(x)=f2(x)
----------------------------------------------}
function Solve(a, b, eps: real): real;
var c, fa, fc: real;
begin
while b - a > eps do begin
c := (a + b) / 2;
fa := f1(a) - f2(a);
fc := f1(c) - f2(c);
if fa*fc < 0 then b := c
else a := c;
end;
Solve := (a + b) / 2;
end;

48

Метод дихотомии (в программе)

var xc1, xc2: real; { глобальные переменные }
{ абсциссы точек пересечения }
...
function Solve(a, b, eps: real): real;
begin... end;
procedure Cross;
begin
xc1 := Solve(1, 2, 0.0001);
MoveTo(150, 220);
write(xc1:5:2);
MoveTo(150, 240);
write(f1(xc1):5:2);
...
end;

xc1 := Solve ( 1, 2, 0.0001 );

вывод на экран значения x

… и значения y!

то же самое для остальных точек

найти решение на интервале [1,2] с точностью 0,0001

49

Структурное программирование на языке Паскаль

Тема 5. Штриховка

50

Штриховка (две функции)

x

y

xс2

xс1

y = f1 (x)

y = f2 (x)

procedure Hatch;
const N = 10;
var xe, yUp, yDown: integer;
x, h: real;
begin
h := (xc2 - xc1) / (N + 1);
x := xc1 + h;
while x < xc2 do begin
xe := ScreenX ( x );
yUp := ScreenY ( f1(x) );
yDown := ScreenY ( f2(x) );
line ( xe, yUp, xe, yDown );
x := x + h;
end;
end;

экранная координата x

экранные координаты границ области по оси y

шаг по x

51

Штриховка (составная нижняя граница)

x

y

xс3

xс1

xс2

N линий

y = f1 (x)

y = f2 (x)

y = f3 (x)

(----------------------------
FDown нижняя граница области
-----------------------------}
function FDown(x: real): real;
begin
if x < xc2 then
Fdown := f2(x)
else Fdown := f3(x);
end;

52

Штриховка (общий случай)

function FUp (x: real): real;
...
function FDown (x: real): real;
...
procedure Hatch;
...
h := ( ? ) / (N + 1);
x := xc1 + h;
while ? do begin
xe := ScreenX ( x );
yUp := ScreenY ( ? );
yDown := ScreenY ( ? );
line ( xe, yUp, xe, yDown );
x := x + h;
end;
end;

xc3 - xc1

x < xc3

у всех по-разному…

FUp(x)

FDown(x)

53

Структурное программирование на языке Паскаль

Тема 6. Вычисление площади

54

Метод (левых) прямоугольников

y = f1 (x)

y = f2 (x)

S1

S2

S3

S4

procedure Area;
var x, S, h: real;
begin
S := 0; h := 0.001; x := xc1;
while x < xc2 do begin
S := S + h*(f1(x)-f2(x));
x := x + h;
end;
MoveTo ( 250, 320 );
write ( 'S = ', S:0:2 );
end;

S := S * h;

S := S + f1(x) – f2(x);

55

Метод (правых) прямоугольников

x

y

xс2

xс1

y = f1 (x)

y = f2 (x)

S1

S2

S3

S4

procedure Area;
var x, S, h: real;
begin
S := 0; h := 0.001; x := xc1;
while x < xc2 do begin
S := S + h*(f1(x+h)-f2(x+h));
x := x + h;
end;
MoveTo ( 250, 320 );
write ( 'S = ', S:0:2 );
end;

S := S * h;

S := S + f1(x+h) – f2(x+h);

56

Метод (средних) прямоугольников

x

y

xс2

xс1

y = f1 (x)

y = f2 (x)

S1

S2

S3

S4

procedure Area;
var x, S, h: real;
begin
S := 0; h := 0.001; x := xc1;
while x < xc2 do begin
S := S + f1(x+h/2) – f2(x+h/2);
x := x + h;
end;
MoveTo ( 250, 320 ); S := S * h;
write ( 'S = ', S:0:2 );
end;

левые (правые):

средние

x = xc1;
while x < xc2 do begin
S:= S + f1(x) – f2(x)
+ f1(x+h) – f2(x+h);
x:= x + h;
end;
S := S*h/2;

57

Метод трапеций

x

y

xс2

xс1

y = f1 (x)

y = f2 (x)

S :=( f1(xc1)-f2(xc1)+f1(xc2)-f2(xc2) )/2;
x := xc1 + h;
while x < xc2 do begin
S := S + f1(x) – f2(x);
x := x + h;
end;
S := S*h;

58

Метод Монте-Карло

Применение: вычисление площадей сложных фигур (трудно применить другие методы).
Требования: необходимо уметь достаточно просто определять, попала ли точка (x, y) внутрь фигуры.
Пример: заданы 100 кругов (координаты центра, радиусы), которые могу пересекаться. Найти площадь области, перекрытой кругами.

59

Метод Монте-Карло

Вписываем сложную фигуру в другую фигуру, для которой легко вычислить площадь (прямоугольник, круг, …).
Равномерно N точек со случайными координатами внутри прямоугольника.
Подсчитываем количество точек, попавших на фигуру: M.
4. Вычисляем площадь:

Всего N точек

На фигуре M точек

Метод приближенный.
Распределение должно быть равномерным.
Чем больше точек, тем точнее.
Точность ограничена датчиком случайных чисел.

!

60

Случайное число в заданном интервале

{-----------------------------------------
rand – случайное вещественное число
в заданном интервале
------------------------------------------}
function rand(a, b: real): real;
begin
rand := (b-a)*random + a;
end;

random
(b-a)*random
(b-a)*random + a

[0,1)
[0,b-a)
[a,b)

61

Проверка точки (внутри или нет?)

{-----------------------------------------
Inside – определяет, находится ли точка
внутри фигуры
Вход: x, y – координаты точки
Выход: True, если точка внутри фигуры,
False, если точка вне фигуры
------------------------------------------}
function Inside(x, y: real): Boolean;
begin
if (FDown(x) <= y) and (y <= FUp(x)) then
Inside := True
else Inside := False;
end;

function Inside(x, y: real): Boolean;
begin
Inside := (FDown(x) <= y) and (y <= FUp(x));
end;

62

Метод Монте-Карло (реализация)

{----------------------------------------------------
Area2 – вычисление площади методом Монте-Карло
-----------------------------------------------------}
procedure Area2;
var i, N, M: integer;
x1, x2, y1, y2, x, y, S: real;
begin
N := 200000; M := 0;
x1 := xc1; x2 := xc2; y1 := 1; y2 := 4;
for i:=1 to N do begin
x := rand ( x1, x2 );
y := rand ( y1, y2 );
if Inside(x,y) then M := M + 1;
end;
S := (x2-x1)*(y2-y1)*M/N;
Moveto(250, 340);
write('S = ', S:0:2);
end;

x1 := xc1; x2 := xc2; y1 := 1; y2 := 4;

границы прямоугольника (у каждого свои!)

S := (x2-x1)*(y2-y1)*M/N;

вычисление площади

если на фигуре, увеличить счетчик

63

Структурное программирование на языке Паскаль

Тема 7. Оформление отчета

64

Титульный лист

65

Графики функций

«скриншот» (screenshot) – «снимок» экрана

через Редактор формул (Вставка – Объект – Microsoft Equation)

66

Как получить копию экрана?

Поменять цвета так, чтобы все линии и текст были белые.
Запустить программу (она должна все нарисовать).
Нажать клавишу PrtScr (Print Screen – «снимок» экрана) на клавиатуре или комбинацию Alt+PrtScr («снимок» активного окна).
В графическом редакторе (Paint): Правка – Вставить.
Выделить нужную часть рисунка.
Вставить в отчет через буфер обмена (Ctrl+C, Ctrl+V).

67

Структура программы

68

Текст программы

шрифт Courier New,
(моноширинный)
размер 10 пт