2). Состав данных.
Тип |
имя |
Смысл |
структура |
Задаваемые данные |
|||
Цел. |
X |
массив из колвава неотрицательных элементов в столбцах |
Массив одномерный n элем. |
Цел. |
n |
Количество элементов в матрице {X} |
Простая переменная |
Передаваемые данные |
|||
Цел. |
MIN |
Минимальный элемент массива |
Простая переменная |
Промежуточные данные |
|||
Цел. |
I |
Номер элемента {X} |
Простая переменная |
Процедура MINIM(X,n, MIN )
Вход. Дан. Выход.Дан
3).
4). Внутренних аномалий нет.
II. Вспомогательный алгоритм 3.
1
2
Начало
Задать: {X},n
MIN:=X(1)
I:=2
MIN:=X(I)
I:=I+1
3
4
X(i)<MIN
ДА 5 НЕТ
6
7
I>n
НЕТ 8
ДА
Передать: MIN
Конец
9
10
III. Паскаль – программа.
3.1. Паскаль программа блочной структуры.
PROGRAM TRV9B;
type odn=array[1..100]of integer;
dvum=array[1..50,1..50] of real;
var a:dvum; b:dvum; kp:odn; t,i,j,m,n:integer;
f1,f2:text;
FUNCTION MINIM(var x; n:integer ):integer;
type mas=array[1..10922] of integer;
var min,i:integer;
Begin
min:=Mas(x)[1];
for i:=1 to n do
if (mas(x)[i] < min) then
min:= mas(x)[i];
minim:=min;
end;
PROCEDURE IZM(var t;m,n:integer;var Y);
type mat=array[1..50,1..50] of real;
var i,j,p,o:integer;
Begin
for j:=1 to n do
begin
o:=0;
p:=1;
for i:=1 to m do
if mat(t)[i,j]>0 then
begin
mat(y)[p,j]:=mat(x)[i,j];
p:=p+1
end
else
begin
mat(y)[m-o,j]:=mat(x)[i,j];
o:=o+1;
end;
end;
End;
PROCEDURE POL(var x,y;m,n:integer;);
type mas=array[1..10922] of integer; mat=array[1..50,1..50] of real;
var i,j,sh:integer;
Begin
for j:=1 to n do
begin
sh:=0;
for i:=1 to m do
if mat(x)[i,j]>0 then
sh:=sh+1;
mas(y)[j]:=sh;
end;
end;
BEGIN
assign(f1,'yltris1.pas');
assign(f2,'yltrvd1.pas');
reset (f1);
rewrite(f2);
writeln(f2,' ':35,'РЕЗУЛЬТАТЫ');
read(f1,m);
read(f1,n);
readln(f1);
for i:=1 to m do
begin
for j:=1 to n do
read(f1,a[i,j]);
readln(f1);
end;
izm(a,m,n,b);
pol(b,m,n,kp);
t:=minim(kp,n);
If t=0 then
write(f2,'Нет строк, не имеющих отрицательных элементов')
else
for i:=1 to t do
begin
for j:=1 to n do
write(f2,b[i,j]:3:2,' ');
writeln(f2);
end;
close(f1);
close(f2);
END.
3.2. паскаль – программа модульной структуры
UNIT DAN;
INTERFACE
TYPE ma=array[1..5,1..5]of real;
mas=array[1..5] of real;
VAR a:ma;
z:mas;
y,i,j,k:integer;
f1,f2:text;
w,w1,w2:real;
IMPLEMENTATION
BEGIN
assign(f1,'is.pas');
assign(f2,'v.pas');
reset(f1);
rewrite(f2);
writeln(f2,' ':35,'РЕЗУЛЬТАТЫ');
for i:=1 to 5 do
begin
for j:=1 to 5 do
read(f1,a[i,j]);
readln(f1);
end;
END.
UNIT unit2;
INTERFACE
USES DAN;
FUNCTION srarifm(var a:mа):real;
IMPLEMENTATION
FUNCTION srarifm;
Begin
W1:=0;
for i:=1 to 5 do
begin
for j:=1 to 5 do
w1:=w1+a[i,j];
end;
w1:=w1/25;
end;
END.
UNIT unit3;
INTERFACE
USES vvod;
PROCEDURE kol(var a:ma; var z; VAR P);
TYPE mas=array[1..10922] of real;
IMPLEMENTATION
Procedure kol;
Var y:integer;
Begin
P :=0;
for j:=1 to 5 do
begin
Y:=0;
for i:=1 to 5 do
if a[i,j]<0 then
begin
P: =P+1;
Y: =Y+1;
end;
mas(z)[j]:=Y;
end;
end;
END.
UNIT unit4;
INTERFACE
USES vvod;
FUNCTION maxotr(var Z):integer;
TYPE ma=array[1..10922] of real;
IMPLEMENTATION
Function maxotr;
Begin
max:=MAS(z)[1];
k:=0;
for j:=2 to m do
if maS(z)[j]>max then
begin
max:=MAS(z)[j];
k:=j;
end;
maxotr:=k;
end;
END.
UNIT unit5;
INTERFACE
USES VVOD, UNIT4;
PROCEDURE IZM(var a:matr; k:integer);
IMLEMENTATION
Procedure IZM;
Begin
for i:=1 to 5 do
begin
for j:=(1+k) to 5 do
if a[i,j]<0 then
a[i,j]:=ABS(a[i,j]);
end;
end;
End.
PROGRAM TR_v_19_M;
USES VVOD, unit2, unit3, unit4, unit5;
BEGIN
SRARIFM(a,W1);
KOL(A,Z);
If P=0 then
Writeln(f2,’ ‘:25 ‘отрицательных элементов нет’)
else
begin
k : =maxotr(z);
IZM(a,k);
SRARIFM(a,W2);
W:=W2-W1;
if W=0 then
begin
if K=5 then
writeln(f2,’ ‘:10 ‘столбец с макс. кол-вом отриц. эл-ов находится последним’)
else
writeln(f2,’ ‘:10 ‘после столбца с макс. кол-вом отриц. эл-ов нет отриц. эл-ов ‘);
end;
end;
writeln(f2,' ':15, ’среднее арифметическое изменилось на величину =’ s:0:5);
close(f1);
close(f2);
END.
4. Отладка программ.
4.1. Отладка Паскаль – программы блочной структуры.
При кодировании алгоритма были допущены логически и синтаксические ошибки, который были исправлены в ходе отладки программы. Ошибки, который я обнаружил в ходе визуального контроля:
-
В некоторых местах пропущены символы «;», «=»,«:»;
-
Во время набора программы пропущены некоторые строчки
-
Лишняя пара begin и end;
С помощью компиляции (использовался режим Compile и make) мною был проведен синтаксический контроль корректности программы. Компилятор ошибок не выдал, что и позволяет говорить о 1-ом уровне корректности программы.
Затем было проведено тестирование на тестах, подготовленных заранее. На положительные и отрицательные результаты
Далее я воспользовался комбинированным методом тестирования, при котором были созданы “заглушки”, и “счётчики” которые описаны далее.
Проверка основной программы.
Оставшиеся подпрограммы я заменил заглушками.
Текст программы для первого набора исходных данных:
PROGRAM TR_v_19;
TYPE ma=array[1..5,1..5] of real;
mas=array[1..5] of real;
VAR a:ma;
z:mas;
p,i,j,k:integer;
f1,f2:text;
w,w1,w2:real;
PROCEDURE srarifm(var a:ma; var w:real);
Begin
w:=0;
for i:=1 to 5 do
begin
for j:=1 to 5 do
w1:=w1+a[i,j];
end;
w1:=w1/25;
end;
PROCEDURE KOL(var a:ma; var z);
……………
Begin
z[1]:=0;
z[2]:=3;
z[3]:=1;
z[4]:=0;
z[5]:=0;
end;
FUNCTION maxotr(var z):integer;
Type mas=array[1..10922] of real;
…………….
Begin
k:=2;
maxotr:=k;
end;
PROCEDURE IZM(var a:ma; k:integer);
Begin
A[1,1]:=1; A[1,2]:=2; A[1,3]:=3; A[1,4]:=4; A[1,5]:=5; A[2,1]:=2; A[2,2]:=3; A[2,3]:=4; A[2,4]:=5; A[2,5]:=6; A[3,1]:=3; A[3,2]:=-1; A[3,3]:=5; A[3,4]:=2; A[3,5]:=1; A[4,1]:=4; A[4,2]:=-1; A[4,3]:=-1; A[4,4]:=1; A[4,5]:=1; A[5,1]:=5; A[5,2]:=-1; A[5,3]:=6; A[5,4]:=1; A[5,5]:=2;
end;
Главная программа(сокращена)
BEGIN
…….
END.
Тестирование основной программы дало положительные результаты.
Так же корректные результаты были получены и для остальных исходных данных.
Далее я провел тестирование сегментов программы. Каждая «заглушка» по очереди была заменена на реальный код программы.
Тестирование всех сегментов программы, для которых были составлены “заглушки”, прошло успешно, а из этого следует, что все процедуры и функция работают корректно.
Для проверки алгоритма и структуры программы был применен метод тестовых счётчиков. Мной были вставлены счетчики в начало и конец алгоритма, на каждую ветвь ветвления в каждый цикл.
Текст программы с счетчиками (сокращ.):
PROGRAM TR_v_19;
TYPE ma=array[1..5,1..5] of real;
mas=array[1..5] of real;
VAR a:ma;
z:mas;
c1,c2,c3,c4,c5,с6.p,i,j,k:integer;
f1,f2:text;
W,W1,W2:real;
…..
BEGIN
c1:=0;
c2:=0;
c3:=0;
c4:=0;
c5:=0;
c6:=0;
assign(f1,'is.pas');
assign(f2,'vd.pas');
reset(f1);
rewrite(f2);
writeln(f2,' ':35,'РЕЗУЛЬТАТЫ');
for i:=1 to 5 do
begin
for j:=1 to 5 do
read(f1,a[i,j]);
readln(f1);
end;
SRARIFM(a,W1);
KOL(A,Z);
If P=0 then
Begin
C1:=c1+1;
Writeln(f2,’ ‘:25, ‘отрицательных элементов нет’);
End
else
begin
c2:=c2+1;
k : =maxotr(z);
IZM(a,k);
SRARIFM(a,W2);
W:=W2-W1;
if W=0 then
begin
if K=5 then
begin
c3:=c3+1;
writeln(f2,’ ‘:10, ‘столбец с макс. кол-вом отриц. эл-ов находится последним’);
end
else
begin
c4:=c4+1;
writeln(f2,’ ‘:10, ‘после столбца с макс. кол-вом отриц. эл-ов нет отриц. эл-ов ‘);
end;
end
else
begin
c5:=c5+1;
writeln(f2,' ':15, ’среднее арифметическое изменилось на величину =’ W:0:5);
end;
end;
c6:=c6+1;
writeln(f2, ‘c1,’ ‘,c2,’ ‘,c3,’ ’,c4,’ ‘,c5,’ ’,c6);
close(f1);
close(f2);
END.
|
Показания счётчиков |
|||||||||||
|
c1 |
c2 |
c3 |
c4 |
c5 |
c6 |
||||||
|
0 |
1 |
0 |
0 |
1 |
1 |
||||||
|
1 |
0 |
0 |
0 |
0 |
1 |
||||||
|
0 |
1 |
0 |
1 |
0 |
1 |
||||||
|
0 |
1 |
1 |
0 |
0 |
1 |
||||||
Суммарное показание счётчиков |
1 |
3 |
1 |
1 |
1 |
4 |
Так как по суммарным показаниям счетчиков видно, что каждая ветвь программы пройдена хотя бы один раз, то количество тестов подобрано верно.
Так как по результатам комбинированного метода тестирования были получены корректные результаты, то программе можно присвоить третий уровень корректности.
4.2. Отладка Паскаль – программы модульной структуры.
Сначала мной был проведен визуальный контроль корректности программы, хотя большая часть ошибок была исправлена в ходе отладки программы блочной структуры, совсем без ошибок не обошлось:
2. В разделе USES забыл описать используемый модуль.
3.Мною было пропущено служебное слово IMPLEMENTATION в одном из модулей.
Для отладки программы модульной структуры был использован тот же набор тестов, что и для программы блочной структуры.
С помощью компиляции (использовался режим Compile и make) мною был проведен синтаксический контроль корректности программы. Компилятор ошибок не выдал, что и позволяет нам говорить о 1-ом уровне корректности программы.
Я провел тестирование на ранее подготовленных тестах на положительные и отрицательные значения, которые описаны ранее.
Далее я воспользовалась комбинированным методом тестирования, при котором были созданы “заглушки” и “счётчики”, которые описаны далее.
В модуле VVOD нет ни процедур, ни функций, так что “заглушками” там заменять нечего.
Проверка основной программы.
Оставшиеся подпрограммы я заменила заглушками.
Текст программы для первого набора исходных данных:
UNIT proc;
INTERFACE
USES vvod;
PROCEDURE srarifm(var a:ma; var W:real);
IMPLEMENTATION
PROCEDURE srarifm;
Begin
W1:=0;
for i:=1 to 5 do
begin
for j:=1 to 5 do
w1:=w1+a[i,j];
end;
w1:=w1/25;
end;
END.
UNIT proc_1;
INTERFACE
USES vvod;
PROCEDURE KOL(var a:ma; var z);
TYPE ma=array[1..10922] of real;
IMPLEMENTATION
Procedure KOL;
z[1]:=0;
z[2]:=3;
z[3]:=1;
z[4]:=0;
z[5]:=0;
END.
UNIT unit2;
INTERFACE
USES vvod;
FUNCTION maxotr(var Z):integer;
TYPE ma=array[1..10922] of real;
IMPLEMENTATION
Function maxotr;
Begin
k:=2;
maxotr:=k;
end;
END.
UNIT unit4;
INTERFACE
USES vvod, unit2;
PROCEDURE izm(var a:ma; k:integer);
IMLEMENTATION
Procedure izm;
Begin
A[1,1]:=1; A[1,2]:=2; A[1,3]:=3; A[1,4]:=4; A[1,5]:=5; A[2,1]:=2; A[2,2]:=3; A[2,3]:=4; A[2,4]:=5; A[2,5]:=6; A[3,1]:=3; A[3,2]:=-1; A[3,3]:=5; A[3,4]:=2; A[3,5]:=1; A[4,1]:=4; A[4,2]:=-1; A[4,3]:=-1; A[4,4]:=1; A[4,5]:=1; A[5,1]:=5; A[5,2]:=-1; A[5,3]:=6; A[5,4]:=1; A[5,5]:=2;
end;
END.
PROGRAM TR_v_19_M;
USES VVOD, unit2, unit3, unit4, unit5;
BEGIN
…..
END.
Тестирование основной программы на первом тесте дало ожидаемые результаты.
Так же корректные результаты были получены и для остальных исходных данных.
Тестирование всех сегментов программы, для которых были составлены “заглушки”, прошло успешно, а из этого следует, что все процедуры и функция работают корректно.
Для проверки алгоритма и структуры программы был применен метод тестовых счётчиков. Мной были вставлены счетчики в начало и конец алгоритма, на каждую ветвь ветвления в каждый цикл.
Текст программы с счетчиками (текст программы сокращен):
UNIT vvod;
INTERFACE
TYPE ma=array[1..5,1..5]of real;
mas=array[1..5] of real;
VAR a:ma;
z:mas;
p,i,j,k c1,c2,c3,c4,c5,с6:integer;
f1,f2:text;
w,w1,w2:real;
IMPLEMENTATION
BEGIN
assign(f1,'is.pas');
assign(f2,'vd.pas');
reset(f1);
rewrite(f2);
writeln(f2,' ':35,'РЕЗУЛЬТАТЫ');
for i:=1 to 5 do
begin
for j:=1 to 5 do
read(f1,a[i,j]);
readln(f1);
end;
END.
………
PROGRAM TR_v_19_M;
USES vvod, unit2, unit3, unit4, unit5;
BEGIN
c1:=0;
c2:=0;
c3:=0;
c4:=0;
c5:=0;
c6:=0;
SRARIFM(a,w1);
KOL(A,Z);
If P=0 then
Begin
C1:=c1+1;
Writeln(f2,’ ‘:25, ‘отрицательных элементов нет’);
End
else
begin
c2:=c2+1;
k : =maxotr(z);
izm(a,k);
SRARIFM(a,w2);
w:=w2-w1;
if w=0 then
begin
if K=5 then
begin
c3:=c3+1;
writeln(f2,’ ‘:10, ‘столбец с макс. кол-вом отриц. эл-ов находится последним’);
end
else
begin
c4:=c4+1;
writeln(f2,’ ‘:10, ‘после столбца с макс. кол-вом отриц. эл-ов нет отриц. эл-ов ‘);
end;
end
else
begin
c5:=c5+1;
writeln(f2,' ':15, ’среднее арифметическое изменилось на величину =’ w:0:5);
end;
end;
c6:=c6+1;
writeln(f2, c1,’ ‘,c2,’ ‘,c3,’ ’,c4,’ ‘,c5,’ ’,c6);
close(f1);
close(f2);
END.
|
Показания счётчиков |
|||||||||||
|
c1 |
c2 |
c3 |
c4 |
c5 |
c6 |
||||||
|
0 |
1 |
0 |
0 |
1 |
1 |
||||||
|
1 |
0 |
0 |
0 |
0 |
1 |
||||||
|
0 |
1 |
0 |
1 |
0 |
1 |
||||||
|
0 |
1 |
1 |
0 |
0 |
1 |
||||||
Суммарное показание счётчиков |
1 |
3 |
1 |
1 |
1 |
4 |
Так как по суммарным показаниям счетчиков видно, что каждая ветвь программы пройдена хотя бы один раз, то количество тестов подобрано верно.
Так как по результатам комбинированного метода тестирования были получены корректные результаты, то программе можно присвоить третий уровень корректности.
5. Заключение.
Программа предназначена для решения конкретной задачи, но для довольно широкого диапазона данных. Перед использование программы пользователь должен ознакомиться с условием задачи, и четко понимать и представлять, что он получит. Желателен опыт работы с TURBO PASCAL.