Сегмент 1.4. Функция SUMMA2
Внутренняя спецификация:
1. Подзадача:
Определить сумму элементов заданного одномерного массива после К-ого.
- Состав данных:
Тип | Имя | Смысл | Структура |
Входные данные | |||
Вещ | S | Заданный массив | Массив, одномерный, 5 элементов |
Цел | М | Заданный номер столбца | Простая переменная |
Выходные данные | |||
Вещ | SU | Искомый массив | Простая переменная |
Промежуточные данные | |||
Цел | J | Номер элемента массива | Простая переменная |
- Данная подзадача реализована в TP 7.0 как функция, поскольку она имеет один выходной параметр.
- Аномалии:
Аномалии не анализируются.
Вспомогательный алгоритм 1.4. :
|
![Сегмент 1.4. Функция SUMMA2 Сегмент 1.4. Функция SUMMA2 - student2.ru](/images/informatika/segment-1-3-funkciya-summa1-141547-46.gif)
|
![]() |
|
|
![]() |
Нет
Да
|
![]() |
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