Изучение разветвляющихся процессов обработки данных начнём со следующего примера.
Спецификация программы.
Пусть требуется спроектировать и реализовать программу для вычисления площади треугольника. Программа должна работать в режиме диалога с пользователем. Данные вводятся с клавиатуры терминала. Результат выводится на монитор.
Для вычисления площади треугольника использовать формулу Герона:
Программа, разработанная нами в предыдущей лекции для вычисления площади треугольника, завершается выводом результата, только в том случае, если введённые числа являются длинами сторон треугольника, в противном случае – программа завершится ошибкой времени выполнения, так как при вычислении площади под корнем окажется отрицательное значение. Для исключения подобного рода ошибок необходимо перед вычислением площади треугольника удостовериться в том, что введённые значения являются длинами сторон треугольника. Если это так, то необходимо вычислить и вывести значение площади, в противном случае необходимо вывести сообщение, о том, что введённые значения не могут быть сторонами треугольника. Три значения являются длинами сторон треугольника в случае, если все три значения положительны и каждое из них меньше суммы двух других.
Проанализировав программную спецификацию, опишем поведение проектируемого процесса обработки данных с точки зрения исходных данных, результирующих данных и связей между ними с помощью HIPO – диаграммы.
HIPO - диаграмма
Детализируем раздел «обработка» HIPO - диаграммы с помощью блок-схемы. Для этого необходимо подобрать и описать последовательность действий над исходными данными, которая приведёт нас к ожидаемому результату – вычислению площади треугольника или выдачи сообщения о причине, по которой она не может быть вычислена. Проект программы выполним, используя разветвляющийся процесс обработки данных. Блок-схема полученной программы приведена на рисунке.
Рисунок 1. Вычисление площади треугольника с использованием разветвляющегося ПОД.
Управляющая структура программы – это результат абстрагирования (отвлечения) от содержимого узлов блок-схемы. Для нашей программы управляющая структура будет иметь вид, представленный ниже:
Рисунок 2. Управляющая структура программы.
Ниже на рисунке представлено конечное дерево выполнения программы (Е-схема). Оно построено на основе управляющей структуры программы. На нём отображены все возможные пути выполнения программы. Дерево выполнения (Е-схему) используют для тестирования программы.
Рисунок 3. Е-схема выполнения программы.
Наша программа может выполняться по одному из двух возможных путей. То, по какому из возможных путей пойдёт выполнение программы, зависит от исходных данных. Первый путь включает узлы 1,2,3,4. По первому пути программа будет выполнена, если введённые значения являются длинами сторон треугольника. Второй путь включает узлы 1, 2, 5. По нему программа будет выполняться, если введённые значения не являются сторонами треугольника.
Проект программы, представленный блок-схемой (см. Рисунок 2) может быть реализован программой на Object Pascal, текст которой приведён в примере ниже.
//-----------------------------------------------------
program Geron;
{$APPTYPE CONSOLE}
// Программа для вычисления площади треугольника
// Пример программы с разветвляющимся вычислительным процессом
uses
SysUtils;
var
a,b,c: Real;//стороны треугольника
p: Real;//полупериметр
s: Real;//площадь
poz: boolean;//a,b,c - положительные числа
Issides: boolean;//a,b,c - стороны треугольника
begin
write('Triangle sides: '); readln(a,b,c);
poz:= (a > 0)and(b > 0)and(c > 0);
Issides:= poz and (c< (a + b)) and (a< (c + b)) and (b < (c + a));
if Issides
then//a,b,c - //стороны треугольника
begin
p:= (a + b + c)/2;
s:= SQRT(p*(p - a)*(p - b)*(p - c));
writeln('Triangle sides: ','a = ',a:6:2,'b = ',b:6:2,'c = ',c:6:2);
writeln('Triangle area : ','s = ',s:6:2);
end
else writeln(' a,b,c - is not triangle sides');
readln;
end.
//-----------------------------------------------------
Пример 1. Программа, реализующая вычисление площади треугольника, с разветвляющейся управляющей структурой.
В программе для хранения исходных данных используются переменные a,b,c типа real, для хранения результата используется переменная s типа real. Для хранения промежуточных значений используются вспомогательные переменные: p типа real – для хранения полупериметра, poz типа Boolean – для хранения значения утверждения «значения переменных a,b,c положительны» для введённых значений, IsSides типа Boolean для хранения значения утверждения «значения переменных a,b,c – длины сторон треугольника».
Под тестированием понимают процесс исполнения программы с целью обнаружения в ней логических ошибок. Под логической ошибкой понимают любое несоответствие программы заданной на неё спецификации.
Будем тестировать программу методом тестирования путей. Существуют только два пути выполнения разработанной программы (см. Рисунок 3). Необходимо подобрать исходные данные для выполнения программы по каждому из возможных путей. Однако, учитывая, что условие ветвление сложное: оно состоит из составных частей, каждое из которых может содержать ошибку, для левой ветви необходимо разработать шесть тестовых наборов, по одному для каждой из частей условия.
Набор тестов для тестирования разработанной программы представлен в таблице 2.
Таблица 2. Тестовый набор данных
Номер теста |
Исходные данные |
Ожидаемый результат |
Пояснения |
1 |
a = -3, b = 4, c = 5 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, a < 0 |
2 |
a = 3, b = -4, c = 5 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, b < 0 |
3 |
a = 3, b = 4, c = -5 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, c < 0 |
4 |
a = 1, b = 4, c = 5 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, c = b + a |
5 |
a = 1, b = 6, c = 4 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, b > a + c |
6 |
a = 1, b = 2, c = 5 |
'a,b,c - не стороны треугольника' |
Левая ветвь IFTHENELSE, c > b + a |
7 |
a = 3, b = 4, c = 5 |
s = 6 |
Правая ветвь IFTHENELSE |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.