2
Этапы разработки программ
Постановка задачи
3
Этапы разработки программ
Разработка модели данных
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 );
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;
«заглушки»
22
полюс
Полярные координаты
А(, )
- полярный угол
- полярный радиус
Примеры:
Описание фигур, полученных при вращении объектов.
= f ()
= R
окружность
= a ∙
спираль Архимеда
O
O
= a∙sin(2/3)
«роза»
24
Описание в параметрической форме
t – независимый параметр («время»)
Описание фигур, полученных при сложном движении объектов.
x = f1 (t)
y = f2 (t)
Циклоида – траектория точки на ободе колеса при вращении
R
y
x
0
25
Системы координат
Математическая
Экранная
Преобразование координат:
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;
28
Разметка оси X («черточки»)
(xЭ, Y0−2)
(xЭ, Y0+2)
Число меток на [0, xmax]:
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Э
(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;
левый верхний угол
(xЭ-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 цикл для каждой оси).
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;
если точка (xЭ, yЭ) в пределах экрана…
координаты в математической системе
цвет точки
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»: Построить графики, соединив точки линиями.
40
Точки пересечения
f1 (x*) = f2 (x*)
a
b
f1 (x*) – f2 (x*) = 0
f (x*) = 0
Пример:
Проблема: уравнение сложно (или невозможно) решить аналитически (получить формулу для x*)
Точка пересечения:
41
Методы решения уравнений
f (x) = 0
Точные (аналитические)
Приближенные
графические
b – a <
42
Численные методы
Применение: используются тогда, когда точное (аналитическое) решение неизвестно или очень трудоемко.
дают хотя бы какое-то решение
во многих случаях можно оценить ошибку и найти решение с заданной точностью
решение всегда приближенное, неточное
43
Метод прямого («тупого») перебора
Задача: найти решение уравнения f (x) = 0 на интервале [a, b] с заданной точностью (чтобы найденное решение отличалось от истинного не более, чем на ).
Алгоритм:
45
Метод дихотомии (деление пополам)
Найти середину отрезка [a,b]: c = (a + b) / 2;
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
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)
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;
вычисление площади
если на фигуре, увеличить счетчик
65
Графики функций
«скриншот» (screenshot) – «снимок» экрана
через Редактор формул (Вставка – Объект – Microsoft Equation)
66
Как получить копию экрана?
Поменять цвета так, чтобы все линии и текст были белые.
Запустить программу (она должна все нарисовать).
Нажать клавишу PrtScr (Print Screen – «снимок» экрана) на клавиатуре или комбинацию Alt+PrtScr («снимок» активного окна).
В графическом редакторе (Paint): Правка – Вставить.
Выделить нужную часть рисунка.
Вставить в отчет через буфер обмена (Ctrl+C, Ctrl+V).
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.