Сегмент 1.4. Функция SUMMA2

Внутренняя спецификация:

1. Подзадача:

Определить сумму элементов заданного одномерного массива после К-ого.

  1. Состав данных:
Тип Имя Смысл Структура
Входные данные
Вещ S Заданный массив Массив, одномерный, 5 элементов
Цел М Заданный номер столбца Простая переменная
Выходные данные
Вещ SU Искомый массив Простая переменная
Промежуточные данные
Цел J Номер элемента массива Простая переменная
  1. Данная подзадача реализована в TP 7.0 как функция, поскольку она имеет один выходной параметр.
  1. Аномалии:

Аномалии не анализируются.

Вспомогательный алгоритм 1.4. :

Сегмент 1.4. Функция SUMMA2 - student2.ru

Сегмент 1.4. Функция SUMMA2 - student2.ru

Сегмент 1.4. Функция SUMMA2 - student2.ru

SU: = 0
Сегмент 1.4. Функция SUMMA2 - student2.ru Задать: {S}, M

Сегмент 1.4. Функция SUMMA2 - student2.ru

J: = M

Сегмент 1.4. Функция SUMMA2 - student2.ru

 
  Сегмент 1.4. Функция SUMMA2 - student2.ru

SU: = SU + S(J)

Сегмент 1.4. Функция SUMMA2 - student2.ru

 
 
J: = J + 1

 
  Сегмент 1.4. Функция SUMMA2 - student2.ru

Сегмент 1.4. Функция SUMMA2 - student2.ru Нет

Сегмент 1.4. Функция SUMMA2 - student2.ru

Сегмент 1.4. Функция SUMMA2 - student2.ru

Да

Передать: SU

 
  Сегмент 1.4. Функция SUMMA2 - student2.ru

Сегмент 1.4. Функция SUMMA2 - student2.ru

III. Паскаль программы:

Паскаль программа блочной структуры:

PROGRAM TR_V7;

TYPE MASS1=ARRAY[1..5,1..5] OF REAL;

MASSIV=ARRAY[1..5] OF REAL;

VAR A:MASS1;

S:MASSIV;

SU:REAL;

I,J,M:INTEGER;

F1,F2:TEXT;

PROCEDURE SUMJ(VAR A:MASS1;VAR S1:MASSIV);

VAR I,J:INTEGER;

BEGIN

FOR J:=1 TO 5 DO

BEGIN

S1[I]:=0;

FOR I:=1 TO 5 DO

S1[J]:=S1[J]+A[I,J]

END;

END;

FUNCTION MINJ(VAR S2;N:INTEGER):INTEGER;

TYPE XM=ARRAY[1..10922] OF REAL;

VAR K,J:INTEGER;

MIN:REAL;

BEGIN

MIN:=XM(S2)[1];

K:=1;

FOR J:=1 TO N DO

BEGIN

IF XM(S2)[J]<=MIN THEN

BEGIN

MIN:=XM(S2)[J];

K:=J

END;

END;

MINJ:=K

END;

FUNCTION SUMMA1(VAR S;K:INTEGER):REAL;

TYPE BR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=1 TO MINJ(S,5) DO

BEGIN

SU:=SU+BR(S)[J]

END;

SUMMA1:=SU

END;

FUNCTION SUMMA2(VAR S;M:INTEGER):REAL;

TYPE TR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=M TO 5 DO

BEGIN

SU:=SU+TR(S)[J]

END;

SUMMA2:=SU

END;

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2);

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

READ(F1,M);

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SUMJ(A,S);

IF MINJ(S,5)=M THEN

SU:= SUMMA1(S,MINJ(S,5))

ELSE

SU:=SUMMA2(S,M);

WRITELN(F2,' ':20,'SU= ',SU:6:3);

CLOSE(F1);

CLOSE(F2)

END.

Паскаль-программа модульной структуры:

UNIT OBIVL;

INTERFACE

TYPE MASS1=ARRAY[1..5,1..5] OF REAL;

MASSIV=ARRAY[1..5] OF REAL;

VAR A:MASS1;

S:MASSIV;

SU:REAL;

I,J,M:INTEGER;

F1,F2:TEXT;

IMPLEMENTATION

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2)

END.

UNIT OPRSUMJ;

INTERFACE

USES OBIVL;

PROCEDURE SUMJ(VAR A:MASS1;VAR S1:MASSIV);

IMPLEMENTATION

PROCEDURE SUMJ;

VAR I,J:INTEGER;

BEGIN

FOR J:=1 TO 5 DO

BEGIN

S1[I]:=0;

FOR I:=1 TO 5 DO

S1[J]:=S1[J]+A[I,J];

END;

END;

END.

UNIT OPRMINJ;

INTERFACE

USES OBIVL;

FUNCTION MINJ(VAR S2;N:INTEGER):INTEGER;

IMPLEMENTATION

FUNCTION MINJ;

TYPE XM=ARRAY[1..10922] OF REAL;

VAR K,J:INTEGER;

MIN:REAL;

BEGIN

MIN:=XM(S2)[1];

K:=1;

FOR J:=1 TO N DO

BEGIN

IF XM(S2)[J]<=MIN THEN

BEGIN

MIN:=XM(S2)[J];

K:=J

END;

END;

MINJ:=K

END;

END.

UNIT OPRSU1;

INTERFACE

USES OBIVL;

FUNCTION SUMMA1(VAR S;K:INTEGER):REAL;

IMPLEMENTATION

FUNCTION SUMMA1;

TYPE BR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=1 TO K DO

BEGIN

SU:=SU+BR(S)[J]

END;

SUMMA1:=SU

END;

END.

UNIT OPRSU2;

INTERFACE

USES OBIVL;

FUNCTION SUMMA2(VAR S;M:INTEGER):REAL;

IMPLEMENTATION

FUNCTION SUMMA2;

TYPE TR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=M TO 5 DO

BEGIN

SU:=SU+TR(S)[J]

END;

SUMMA2:=SU

END;

END.

PROGRAM MODYLTR7;

USES OBIVL,OPRSUMJ,OPRMINJ,OPRSU1,OPRSU2;

BEGIN

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SUMJ(A,S);

IF MINJ(S,5)=M THEN

SU:=SUMMA1(S,MINJ(S,5))

ELSE

SU:=SUMMA2(S,M);

WRITELN(F2,' ':20,'SU ',SU:6:3);

CLOSE(F1);

CLOSE(F2)

END.

IV. Отладка программы:

Отладка паскаль-программы блочной структуры:

В процессе отладки программа прошла следующие уровни корректности:

1. Синтаксические ошибки, которые определил компилятор:

· После некоторых операторов были пропущены знаки препинания, такие как точка с запятой.

· В разделе описания данных была пропущена запятая между двумя простыми переменными.

2. Ошибки, которые выявляются как при компиляции, так и при разовом выполнении программ:

· В подпрограмме MINJ переменной К (номер минимального элемента заданного массива) изначально было присвоено значение «ноль» вместо единицы.

3. Получение корректных результатов на некотором множестве тестов:

· В результате исправления ошибок, были получены корректные результаты выполнения программы на заданных тестах.

В результате, данная программа получила уровень корректности 3.

Контроль корректности программы:

1. Визуальный контроль:

· При кодировании оператора «условие» основного алгоритма в паскаль -программе был упущен оператор «IF»;

· В функции SUMMA1 изначально сумме SU не было присвоено значение ноль;

  • Все переменные основной программы были описаны в разделе описаний в соответствии с внешней спецификацией, а переменные подпрограмм – в соответствии с внутренними спецификациями.
  • Переменных со сходными именами не было.
  • Вычислений, использующих операнды недопустимых типов не было обнаружено.
  • Деление на нуль невозможно (отсутствует математическая операция деления).
  • Значение переменных выходных данных не может выходить за указанный диапазон.
  • Величины разных типов не сравниваются.
  • Каждый цикл завершается.
  • Правила соответствия параметров при каждом обращении к подпрограммам выполнены.
  • Были не учтены поля выходных данных при их выводе в файл.

2. Синтаксический контроль:

Все базовые управляющие структуры построены и закодированы корректно.

3. Семантический контроль:

Конструкции языка программирования применены правильно. Порядок ввода-вывода выдержан верно. Лишних переменных нет.

Для проверки корректности программы использован способ восходящего тестирования:

Для каждой подпрограммы были составлены программы-драйверы:

Драйвер для процедуры SUMJ:

PROGRAM DRAV1;

TYPE MASS1=array(1..5,1..5):real;

TYPE MASSIV=array(1..5):real;

VAR A:MASS1;

S:MASSIV;

I,J:INTEGER;

F1,F2:TEXT;

PROCEDURE SUMJ(VAR A:MASS1;VAR S1:MASSIV);

VAR I,J:INTEGER;

BEGIN

FOR J:=1 TO 5 DO

BEGIN

S1[I]:=0;

FOR I:=1 TO 5 DO

S1[J]:=S1[J]+A[I,J]

END;

END;

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2);

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

READ(F1,M);

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SUMJ(A,S);

FOR i:=1 to 5 do

WRITELN(F2,' ':20,'s= ',S[i]:6:3);

CLOSE(F1);

CLOSE(F2)

END.

Драйвер для функции MINJ:

PROGRAM DRAV2:

TYPE MASS1=array(1..5,1..5):real;

TYPE MASSIV=array(1..5):real;

VAR A:MASS1;

S:MASSIV;

I,J:INTEGER;

F1,F2:TEXT;

FUNCTION MINJ(VAR S2;N:INTEGER):INTEGER;

TYPE XM=ARRAY[1..10922] OF REAL;

VAR K,J:INTEGER;

MIN:REAL;

BEGIN

MIN:=XM(S2)[1];

K:=1;

FOR J:=1 TO N DO

BEGIN

IF XM(S2)[J]<=MIN THEN

BEGIN

MIN:=XM(S2)[J];

K:=J

END;

END;

MINJ:=K

END;

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2);

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

READ(F1,M);

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

MINJ(S,5,K);

WRITELN(F2,' ':20,'K= ',K);

CLOSE(F1);

CLOSE(F2)

END.

Драйвер для функции SUMMA1:

PROGRAM DRAV3;

TYPE MASS1=ARRAY[1..5,1..5] OF REAL;

MASSIV=ARRAY[1..5] OF REAL;

VAR A:MASS1;

S:MASSIV;

SU:REAL;

I,J:INTEGER;

F1,F2:TEXT;

FUNCTION SUMMA1(VAR S;K:INTEGER):REAL;

TYPE BR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=1 TO K DO

BEGIN

SU:=SU+BR(S)[J]

END;

SUMMA1:=SU

END;

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2);

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

READ(F1,M);

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SU:= SUMMA1(S,K)

WRITELN(F2,' ':20,'SU= ',SU:6:3);

CLOSE(F1);

CLOSE(F2)

END.

Драйвер функции SUMMA2:

TYPE MASS1=ARRAY[1..5,1..5] OF REAL;

MASSIV=ARRAY[1..5] OF REAL;

VAR A:MASS1;

S:MASSIV;

SU:REAL;

I,J,:INTEGER;

F1,F2:TEXT;

FUNCTION SUMMA2(VAR S;M:INTEGER):REAL;

TYPE TR=ARRAY[1..10922] OF REAL;

VAR J:INTEGER;

SU:REAL;

BEGIN

SU:=0;

FOR J:=M TO 5 DO

BEGIN

SU:=SU+TR(S)[J]

END;

SUMMA2:=SU

END;

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

RESET(F1);

REWRITE(F2);

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

READ(F1,M);

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SUMJ(A,S);

SU:=SUMMA2(S,M);

WRITELN(F2,' ':20,'SU= ',SU:6:3);

CLOSE(F1);

CLOSE(F2)

END.

Для каждой подпрограммы требуется только один тест. Тестирование этих подпрограмм показало, что они работают корректно.

Отладка паскаль-программы модульной структуры:

Для тестирования программы модульной структуры были использованы те же тесты, что и для программы блочной структуры. При тестировании паскаль-программы модульной структуры были обнаружены следующие ошибки:

· При кодировании основной программы было дублировано слово «PROGRAM»;

· В модуле OPRMINJ был неверно описан раздел INTERFACE.

При функциональном тестировании паскаль-программы модульной структуры ошибок не было выявлено. Но так как этот метод тестирования лишь говорит об ошибке, но не указывает на ее место расположения, необходимо применить структурное тестирование.

При проведении структурного тестирования в данной программе реализуется один из методов структурного тестирования – метод тестовых счетчиков. Суть метода – в начало и конец каждого цикла, а также в каждую ветвь каждого ветвления вставляется «счетчик» - некоторая переменная целого типа. Сначала все счетчики обнуляются. При выполнении программы на некотором тесте значение счетчика увеличивается на 1 при каждом прохождении той ветви, в которую вставлен этот счетчик. Набор тестов должен быть таким, чтобы при реализации всех тестов, каждый из счетчиков хотя бы один раз изменил свое значение.

UNIT OBIVL;

INTERFACE

TYPE MASS1=ARRAY[1..5,1..5] OF REAL;

MASSIV=ARRAY[1..5] OF REAL;

VAR A:MASS1;

S:MASSIV;

SU:REAL;

I,J,M:INTEGER;

F1,F2,F3:TEXT;

IMPLEMENTATION

BEGIN

ASSIGN(F1,'VGIK.PAS');

ASSIGN(F2,'BGIK.PAS');

ASSIGN(F3,'SCHET.PAS');

RESET(F1);

REWRITE(F2);

REWRITE(F3)

END.

UNIT OPRSUMJ;

INTERFACE

USES OBIVL;

PROCEDURE SUMJ(VAR A:MASS1;VAR S1:MASSIV);

IMPLEMENTATION

PROCEDURE SUMJ;

VAR I,J,M1,M2:INTEGER;

BEGIN

M1:=0;

FOR J:=1 TO 5 DO

BEGIN

M2:=0;

S1[I]:=0;

FOR I:=1 TO 5 DO

BEGIN

S1[J]:=S1[J]+A[I,J];

M2:=M2+1;

END;

M1:=M1+1;

END;

WRITELN(F3,M1,' ',M2);

END;

END.

UNIT OPRMINJ;

INTERFACE

USES OBIVL;

FUNCTION MINJ(VAR S2:MASSIV;N:INTEGER):INTEGER;

IMPLEMENTATION

FUNCTION MINJ;

TYPE XM=ARRAY[1..10922] OF REAL;

VAR K,J,M1,M2:INTEGER;

MIN:REAL;

BEGIN

MIN:=S2[3];

K:=1;

M1:=0;

FOR J:=1 TO N DO

BEGIN

M2:=0;

IF S2[J]<=MIN THEN

BEGIN

M2:=M2+1;

MIN:=S2[J];

K:=J

END;

M1:=M1+1;

END;

MINJ:=K;

WRITELN(F3,M1,' ',M2);

END;

END.

UNIT OPRSU1;

INTERFACE

USES OBIVL;

FUNCTION SUMMA1(VAR S;K:INTEGER):REAL;

IMPLEMENTATION

FUNCTION SUMMA1;

TYPE BR=ARRAY[1..10922] OF REAL;

VAR J,M1:INTEGER;

SU:REAL;

BEGIN

SU:=0;

M1:=0;

FOR J:=1 TO K DO

BEGIN

SU:=SU+BR(S)[J];

M1:=M1+1;

END;

SUMMA1:=SU;

WRITELN(F3,M1);

END;

END.

UNIT OPRSU2;

INTERFACE

USES OBIVL;

FUNCTION SUMMA2(VAR S;M:INTEGER):REAL;

IMPLEMENTATION

FUNCTION SUMMA2;

TYPE TR=ARRAY[1..10922] OF REAL;

VAR J,M1:INTEGER;

SU:REAL;

BEGIN

SU:=0;

M1:=0;

FOR J:=M TO 5 DO

BEGIN

SU:=SU+TR(S)[J];

M1:=M1+1;

END;

SUMMA2:=SU;

WRITELN(F3,M1);

END;

END.

PROGRAM MODYLTR7;

USES OBIVL,OPRSUMJ,OPRMINJ,OPRSU1,OPRSU2;

BEGIN

FOR I:=1 TO 5 DO

BEGIN

FOR J:=1 TO 5 DO

READ(F1,A[I,J]);

READLN(F1)

END;

WRITELN(F2,' ':35,'REZYLTAT');

WRITELN(F2);

SUMJ(A,S);

IF MINJ(S,5)=M THEN

SU:=SUMMA1(S,MINJ(S,5))

ELSE

SU:=SUMMA2(S,M);

WRITELN(F2,' ':20,'SU ',SU:6:3);

CLOSE(F1);

CLOSE(F2);

CLOSE(F3);

END.

По результатам тестирования соотнесены результаты счетчиков двух тестов и сделан вывод о прохождении каждого цикла и ветви алгоритма как минимум один раз.

V. Заключение:

Задача предназначена для решения узкого круга задач. Требует ввода данных строго в заданном диапазоне, описанного в составе данных внешней спецификации.

Московский Энергетический Институт

(Технический Университет)

Расчетное задание.

Вариант №7

Группа: ТФ – 11 – 08

Студент: Кисмерешкина К. С.

Преподаватель: Архипов О. Г.

Москва 2009

Наши рекомендации