
IV.Отладка программ.
Визуальный контроль корректности программ:
Обращение к данным
Значения каждого из индексов у элементов массивов не выходит за границы, указанные в описании массивов.
В функции не было задано начальное значение переменной M.
Ошибки были исправлены.
Описание данных
Все переменные основной программы были описаны в разделе описаний в сооствествии с внешней спецификацией, а переменные подпрограмм – в соостветствии с внутренними спецификациями.
Переменных со сходными именами не было.
Вычисления
Вычислений, использующих операнды недопустимых типов не было обнаружено.
Потеря результата при вычислениях значений выражений не возможна.
Деление на нуль невозможно.
Значение переменных выходных данных не может выходить за указанный диапазон.
Величины разных типов не сравниваются.
Управление вычислениями
Каждый цикл завершается.
Значения параметров циклов после выхода из них по основному условию не используются далее.
Межмодульный интерфейс
Правила соответствия параметров при каждом обращении к подпрограммам выполнены. Типы формальных и соответствующих фактических параметров идентичны.
Планирование ввода-вывода данных
Задание и размещение значений исходных данных соответствует их описанию в программе.
Была обнаружена орфографическая ошибка в выводимом тексте. А так же не учтены поля выходных данных при их выводе в файл.
оответствует их описанию в программе.
в описании массивов.
Синтаксический контроль корректности программ: все базовые управляющие структуры построены и закодированы корректно.
Семантический контроль корректности программ: конструкции языка программирования применены правильно. Порядок ввода-вывода выдержан верно. Лишних переменных нет.
V.Тестирование.
Для проверки корректности программы использован способ восходящего тестирования.
Для каждой подпрограммы были составлены программы-драйверы:
Драйвер для процедуры SUMST:
Входные данные:
0.0 -12.2 -13.3 14.4 15.5 99.0
16.6 17.7 18.8 19.9 -20.0 -100.0
1.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 0.0
2.0 2.0 2.0 2.0 2.0 2.0
Program SUMST;
TYPE MATRICA=array[1..5,1..6] of real;
MASSIV=array[1..6] of real;
VAR A:MATRICA;
B:MASSIV;
i,j:integer;
f1,f2: text;
Procedure SUMST(Var A:MATRICA;Var S1:MASSIV);
Var i,j:integer;
Begin
For j:=1 to 6 do
begin
S1[j]:=0;
For i:=1 to 5 do
S1[j]:=S1[j]+A[i,j]
end
End;
BEGIN
assign(f1,'pr1.pas');
assign(f2,'pr2.pas');
reset(f1);
rewrite(f2);
For i:=1 to 5 do
begin
For j:=1 to 6 do
Read(f1,A[i,j]);
Readln(f1);
end;
SUMST(A,B);
For i:=1 to 6 do
Write(f2,B[i],’ ’);
close(f1);
close(f2)
END.
Выходной протокол:
19.6 8.5 8.5 37.3 -1.5 2
Для данной подпрограммы требуется только один тест. Тестирование этой подпрограммы показало, что она работает корректно.
Драйвер для функции MST:
Входные данные:
19.6 8.5 8.5 37.3 -1.5 2
Program MST;
TYPE MASSIV=array[1..6] of real;
Var A:MASSIV;
i:integer;
Function MST(Var S2;D:integer):integer;
Type AXAXA=array[1..10922] of real;
Var i,ms:integer;
M:real;
Begin
M:=AXAXA(S2)[1];
ms:=1;
For i:=1 to D do
If AXAXA(S2)[i]>=M Then
begin
M:=AXAXA(S2)[i];
ms:=i
end;
MST:=ms
End;
BEGIN
assign(f1,'pr2.pas');
assign(f2,'pr3.pas');
reset(f1);
rewrite(f2);
For i:=1 to 6 do
Read(f1,A[i]);
Write(f2,MST(A,6));
Close(f1);
Close(f2)
End.
Выходной протокол:
4
Для данной подпрограммы требуется только один тест. Тестирование этой подпрограммы показало, что она работает корректно.
Драйвер для процедуры SOZMATR:
Входные данные:
0.0 -12.2 -13.3 14.4 15.5 99.0
16.6 17.7 18.8 19.9 -20.0 -100.0
1.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 0.0
2.0 2.0 2.0 2.0 2.0 2.0
2
Program SOZMATR;
TYPE MATRICA=array[1..5,1..6] of real;
VAR A,B:MATRICA;
i,j,M:integer;
f1,f2:text;
Procedure SOZMATR(Var A:MATRICA;N1:integer;Var B1:MATRICA);
Var i,j:integer;
Begin
For j:=1 to N1 do
For i:=1 to 5 do
B1[i,j]:=A[i,j]
End;
BEGIN
assign(f1,'pr4.pas');
assign(f2,'pr5.pas');
reset(f1);
rewrite(f2);
For i:=1 to 5 do
begin
For j:=1 to 6 do
Read(f1,A[i,j]);
Readln(f1);
end;
Read(f1,M);
SOZMATR(A,M,B);
For i:=1 to 5 do
begin
For j:=1 to M do
Write(f2,B[i,j]);
Writeln(f2);
end;
close(f1);
close(f2)
END.
Выходной протокол:
0.0 -12.2
16.6 17.7
1.0 1.0
0.0 0.0
2.0 2.0
Для данной подпрограммы требуется только один тест. Тестирование этой подпрограммы показало, что она работает корректно.
Драйвер для процедуры SOZMAS:
Входные данные:
0.0 -12.2 -13.3 14.4 15.5 99.0
16.6 17.7 18.8 19.9 -20.0 -100.0
1.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 0.0
2.0 2.0 2.0 2.0 2.0 2.0
3
Program SOZMAS;
TYPE MATRICA=array[1..5,1..6] of real;
MASSIV=array[1..6] of real;
VAR A:MATRICA;
B:MASSIV;
i,j,M:integer;
f1,f2: text;
Procedure SOZMAS(Var A:MATRICA;N2:integer;Var C1:MASSIV);
Var i:integer;
Begin
For i:=1 to 5 do
C1[i]:=A[i,N2]
End;
BEGIN
assign(f1,'pr6.pas');
assign(f2,'pr7.pas');
reset(f1);
rewrite(f2);
For i:=1 to 5 do
begin
For j:=1 to 6 do
Read(f1,A[i,j]);
Readln(f1);
end;
Readln(f1,M);
SOZMAS(A,M,B);
For i:=1 to 5 do
Writeln(f2,B[i],’ ’);
Close(f1);
Close(f2)
END.
Выходной протокол:
-13.3 18.8 1.0 0.0 2.0
Для данной подпрограммы требуется только один тест. Тестирование этой подпрограммы показало, что она работает корректно.
Все подпрограммы протестированы и исправно работают.
Тестирование основной программы было произведено на двух тестах. Чтобы определить достаточное ли количество тестов сделано, реализован метод тестовых счетчиков: в каждый цикл, в каждую ветвь ветвления вставляется «счетчик» - некоторая переменная целого типа. При выполнении программы на некотором тесте значение счетчика увеличивается на единицу при каждом прохождении той ветви, в которую вставлен этот счетчик. Набор тестов должен быть таким, чтобы при реализации всех тестов каждый из счетчиков хотя бы один раз изменил свое значение.
Для вывода значений счетчиков создан дополнительный файл.
PROGRAM tipovichok;
TYPE MATRICA=array[1..5,1..6] of real;
MASSIV=array[1..6] of real;
VAR A,B:MATRICA;
C,SU:MASSIV;
N,i,j,m1,m2:integer;
f1,f2,f3:text;
Procedure SUMST(Var A:MATRICA;Var S1:MASSIV);
Var i,j:integer;
m1,m2:integer;
Begin
m1:=0;
m2:=0
For j:=1 to 6 do
begin
m1:=m1+1;
S1[j]:=0;
For i:=1 to 5 do
begin
m2:=m2+1;
S1[j]:=S1[j]+A[i,j]
end
end;
Writeln(f3,m1,’ ’,m2)
End;
Function MST(Var S2;D:integer):integer;
Type AXAXA=array[1..10922] of real;
Var i,ms:integer;
M:real;
m1,m2:integer;
Begin
M:=AXAXA(S2)[1];
ms:=1;
m1:=0;
m2:=0;
For i:=1 to D do
begin
If AXAXA(S2)[i]>=M Then
begin
m2:=m2+1;
M:=AXAXA(S2)[i];
ms:=i
end;
m1:=m1+1
end;
MST:=ms
writeln(f3,m1,’ ’,m2)
End;
Procedure SOZMATR(Var A:MATRICA;N1:integer;Var B1:MATRICA);
Var i,j,m1,m2:integer;
Begin
m1:=0; m2:=0;
For j:=1 to N1 do
begin
m2:=m2+1;
For i:=1 to 5 do
begin
m1:=m1+1;
B1[i,j]:=A[i,j]
end;
end;
writeln(f3,m1,’ ’,m2)
End;
Procedure SOZMAS(Var A:MATRICA;N2:integer;Var C1:MASSIV);
Var i,m1:integer;
Begin
m1:=0;
For i:=1 to 5 do
begin
m1:=m1+1;
C1[i]:=A[i,N2]
end
writeln(f3,m1)
End;
BEGIN
assign(f1,'slish.pas');
assign(f2,'mish.pas');
assign(f3,’nda.pas’);
reset(f1);
rewrite(f2);
rewrite(f3);
For i:=1 to 5 do
begin
For j:=1 to 6 do
Read(f1,A[i,j]);
Readln(f1);
end;
Read(f1,N);
Writeln(f2,' ':35,'Результаты');
Writeln(f2);
SUMST(A,SU);
m1:=0; m2:=0;
If MST(SU,6)>N Then
Begin
m1:=m1+1;
SOZMATR(A,MST(SU,6),B);
Writeln(f2,' ':13,'{B}:');
For i:=1 to 5 do
begin
Write(f2,' ':10);
For j:=1 to MST(SU,6) do
write(f2,B[i,j]:6:1,' ');
Writeln(f2)
end;
end
Else
Begin
m2:=m2+1;
SOZMAS(A,N,C);
Write(f2,' ':10,'{C}: ');
For i:=1 to 5 do
Write(f2,C[i]:6:1,' ')
end;
write(f3,m1,’ ’,m2);
close(f1);
close(f2)
END.
ТЕСТ 1. (Положительный результат)
Протокол ввода(slish.pas): Выходной протокол(mish.pas):
0.0 -12.2 -13.3 14.4 15.5 99.0 Результаты
16.6 17.7 18.8 19.9 -20.0 -100.0
1.0 1.0 1.0 1.0 1.0 1.0 {C}: 99.0 -100.0 1.0 0.0 2.0
0.0 0.0 0.0 0.0 0.0 0.0
2.0 2.0 2.0 2.0 2.0 2.0
6
Выходной протокол(nda.pas): Выходной протокол(nda.pas):
6 5 6 5
4 2 4 2
5 5 4
0 1 1 0
ТЕСТ 2. (Положительный результат)
Протокол ввода(slish.pas): Выходной протокол(mish.pas):
0.0 -12.2 -13.3 14.4 15.5 99.0 Результаты
16.6 17.7 18.8 19.9 -20.0 -100.0
1.0 1.0 1.0 1.0 1.0 1.0 {B}:
0.0 0.0 0.0 0.0 0.0 0.0 0.0 -12.2 -13.3 14.4
2.0 2.0 2.0 2.0 2.0 2.0 16.6 17.7 18.8 19.9
3 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0
2.0 2.0 2.0 2.0
По результатам тестирования соотнесены результаты счетчиков двух тестов и сделан вывод о прохождении каждой ветви алгоритма как минимум один раз: учитывая подбор тестов случайным, сделан вывод о четвертом уровне корректности программы.
Для тестирования Паскаль-программы модульнуй структуры использовались те же тесты. Ошибки возникли только в правильном написании имени модулей.
VII Рекомендации по использованию программы.
Программа предназначена для решения достаточно узкого круга задач. Не исключены ошибки, связанные с вводом данных, не входящих в заданные диапазоны. Программа рассчитана на опытного пользователя. Ввод данных рекомендуется производить строго в соответствии с формой ввода и диапазонами данных.