спецификация. спецификация 23. Спецификация к Лабораторной работе 24 (Вариант 23) Постановка задачи (ПЗ)
![]()
|
Спецификация к Лабораторной работе №2-4 (Вариант 23) Постановка задачи (ПЗ). Задание: Написать программу обработки одномерного массива(ов) в соответствии с условием. Условие: В заданном массиве X1, X2, …, Xn заменить значения отрицательных элементов их абсолютными величинами; при этом подсчитать число элементов, равных нулю. Уточненная постановка задачи Дан одномерный вещественный массив x из n (0<n≤20) и Найти: ![]() ![]() ![]() Пример Возьмём массив X= {10,-5,3,0,12,0}, заменить значения отрицательных элементов их абсолютными величинами получим. Получим Y={10,5,3,0,12,0}, Количество элементов равных нулю,k=2
(продолжение таблицы данных)
*Промежуточные данные заполняются не сразу, а по мере необходимости использовать дополнительные переменные. Оставляйте место для них 5. Входная форма: ![]() 7. АномалииПока не рассматриваем, но можете сделать (n<1, n>20, r<1, r>14, i:|x[i]|>10, i:|y[i]>10),например:
**В условиях желательно НЕ использовать связку (ИЛИ), объединяя разные случаи воедино, и выводить разные сообщения, чтобы реакция была более конкретная. ![]() При создании тестов можно выделить больше классов эквивалентности для выходных и исходных данных, например: А) для вещественных значений: если при совпадении минимума или максимума с 0, искать минимум по абсолютной величине, отличный от 0. Это поможет проверить точность выходных данных. Например, у нас минимумы p и sr совпали с 0. Выбираем новые минимумы, лучше сразу два: ![]() Б) Даже если минимум/максимум не совпадает с нулем, можно в любом случае вместо максимума делать тесты на граничные значения результата (максимальное значение и максимальное по абсолютной величине отрицательное значение), а в качестве минимума – отрицательное и/или положительное значения, по абсолютной величине ближайшие к 0; В) Для исходных данных при проверке аномальных ситуаций можно рекомендовать для проверки брать значение, ближайшее к граничному – пограничное, чтобы четче проверять границу аномального и нормального значения переменной; Г) При проверке аномальных ситуаций, если 0 (ноль) входит в область аномальной ситуации, проверять отдельно нули и НЕнули. Например, для (n<1) отдельно тесты для 0 и -1; Д) Можно расширить проверку исходных данных на аномалии, когда введены не цифры, а буквы или «лишние» символы присутствуют во веденном значении. Или, как частный случай, вместо точки в качестве разделителя дробной части использована запятая, или наоборот. В лабораторной работе 9 будут проверки ошибок при открытии и чтении из файла. Ошибки при чтении как раз могут быть изза некорректных символов и попытки ввода букв вместо цифр. 9. МетодОтделим ввод-вывод от обработки данных (собственно решения задачи). То есть, разделим нашу задачу на три подзадачи: Подзадача А0.1. Ввести исходные данные (обр.1-3) и вывести их на экран (обр.5-8) для визуального подтверждения. Подзадача А0.2. Решение задачи: на основе введенных исходных данных (n,r,x,y) найти процент подходящих точек p и среднее расстояние sr. Подзадача А0.3. Ввести вывести полученные результаты (p, sr) на экран (обр.9-10) Здесь ввод-вывод тривиален и представляет собой чисто техническую задачу; в алгоритмизации нуждается только обработка. Поэтому на нулевом уровне сразу опишем ввод-вывод (подзадачи А0.1 и А0.3), оставив задачу обработки А0.2 в виде абстракции (которую раскроем на следующем уровне проектирования). На данном уровне эту абстракцию в алгоритме заменим ЗАГЛУШКОЙ («Заглушка» – это простейший алгоритм, временно заменяющим реальный алгоритм и помогающий уменьшить область поиска ошибок и отладить уже написанную часть программы, не внося дополнительных ошибок, потенциально содержащихся в том самом реальном алгоритме. Алгоритм «заглушки» должен быть настолько простым, чтобы в нем не было ошибок или было очень просто их обнаружить и исправить. В простейшем случае, это просто присваивание результата. На следующем шаге разработки «заглушка» заменяется реальным алгоритмом, и, поскольку остальная часть программы уже проверена, то можно с высокой долей вероятности считать, что все вновь обнаруженные ошибки находятся в добавленном алгоритме.)Для ввода-вывода массивов потребуется промежуточная переменная - индекс элемента. Пусть i – индекс текущего элемента массива. (Добавляем его в таблицу данных) Алгоритм (блок-схемы можно рисовать вручную, оставив место в распечатке) ![]() Программа на Delphi. Диалоговый вариант {ввод с клавиатуры, вывод на экран}\ Комментариев в программе можно так много не делать program Lab2; {$APPTYPE CONSOLE} Uses Windows; // для русификации {раздел определения констант:} const Nmax=20; {верхняя граница индексов массива – максимальное количество точек} {раздел описания типов type- пустой Или можно определить тип массива: Type Tmassiv = array [1..Nmax] of real;} Использование именованной константы Nmax для границ лучше с точки зрения стиля. ![]() {раздел описания переменных:} Если константа упомянута несколько раз в var коде (допустим есть ещё строка: if n>Nmax then}, n, i, r: integer; то изменение значения такой константы p, sr: real; позволит изменить значения по всему коду. Без x, y: array [1..Nmax] of real; создания именованной константы можно {или, если выше описан тип, то случайно пропустить одно из значений и внести x,y: Tmassiv;} ошибку в программу. Имя константы произвольно, но должно {раздел операторов:} отражать смысл во избежание путаницы, а значит begin и ошибок. setConsoleCP(1251); // для ввода русификация и setConsoleOutputCP(1251); // для вывода {A0.1 - ввод-вывод входных данных} {вывод заголовка в выходной документ: } writeln('Лаб.2' :40); {вывод c переходом на следующую строку} {ввод исходных данных: } writeln('Количество точек n:'); readln(n); {обр 1.1,1.2} writeln('Критическое удаление r:'); readln(r); { обр 2.1,2.2} {ввод массивов x и y:} writeln('Абсциссы и ординаты:'); {обр3.1} for i:=1 to n do readln(x[i], y[i]); {обр3.2:ввод 2 элементов через пробел и переход на след. строку} {вывод входных данных в выходной документ для подтверждения: } for i:=1 to 80 do write(‘=’); { отделим визуально чертой и строкой введенные и выводимые значения } writeln; {вывод n, r по обр5-6} writeln(' Количество точек =', n:3); writeln(' Критическое удаление = ', r:2); {вывод массивов x и y} writeln(' Абсциссы и ординаты: '); {обр7} for i:=1 to n do writeln(' ':5, x[i]:5:1, ' ':8, y[i]:5:1); {обр8} {А0.2 - обработка} // p:=20; sr:=4.573196; {заглушка для теста 1} p:=100; sr:=10*sqrt(2); {заглушка для теста 2} // p:=0; sr:=0; {заглушка для теста 3} {А0.3 - вывод результатов} writeln(' Искомый процент точек = ',p:5:1); {p по обр9} writeln(' Среднее удаление = ',sr:8:5); {sr по обр10} write('Press Enter…'); readln; {задерживаем экран до нажатия ENTER} end. Раскрытие абстракции А0.2Поскольку условие всей задачи совпадает (за исключением необходимости ввода и вывода) с условием выделенной подзадачи, вместо полной спецификации с пунктами 1-11. сделаем просто дополнение к пунктам 4, 9-11. 9. Метод Пустьi – номер текущий точки, si – удаление точки (x[i], y[i]) от начала координат; тогда ![]() si x[i] *x[i] y[i] *y[i] Пусть s – сумма расстояний всех точек от начала координат; тогда sr = s/n; чтобы найти sr, надо найти s: n s si i1 Пусть np – число точек, попавших в область (удаление больше r, коорд-ты положительны); тогда p = (np/n)*100; чтобы найти p, надо найти np: np Countin1((si r)(x[i] 0)(y[i] 0)) Методы подсчета суммы и количества описаны в файле Base-Algorithmes.docОба алгоритма (поиск суммы и количества) выполним в одном и том же цикле по элементам массивов, иначе расстояние (si) каждой точки от центра пришлось бы считать дважды. 4. Таблица данных (продолжение)(в рукописной спецификации можно дополнить исходную таблицу)
![]() 11. Программный кодАлгоритм не будем оформлять в виде отдельной процедуры, а просто вставим в основной алгоритм вместо заглушки. В разделе var следует добавить описание трех переменных:
Вместо заглушки в раздел операторов программного кода:
Получившиеся программы Лабораторная работа 3: program Lab3; {$APPTYPE CONSOLE} Uses Windows; // для русификации {раздел определения констант:} const ![]() Nmax=20; {верхняя граница индексов массива – максимальное количество точек} {раздел описания переменных:} var n, i, r: integer; p, sr: real; x, y: array [1..Nmax] of real; np: integer; si, s: real; {раздел операторов:} begin setConsoleCP(1251); // для ввода русификация и setConsoleOutputCP(1251); // для вывода {A0.1 - ввод-вывод входных данных} {вывод заголовка в выходной документ: } writeln('Лаб.3' :40); {вывод c переходом на следующую строку} {ввод исходных данных: } writeln('Количество точек n:'); readln(n); {обр 1.1,1.2} writeln('Критическое удаление r:'); readln(r); { обр 2.1,2.2} {ввод массивов x и y:} writeln('Абсциссы и ординаты:'); {обр3.1} for i:=1 to n do readln(x[i], y[i]); {обр3.2:ввод 2 элементов через пробел и переход на след. строку} {вывод входных данных в выходной документ для подтверждения: } for i:=1 to 80 do write(‘=’); { отделим визуально чертой и строкой введенные и выводимые значения } writeln; {вывод n, r по образцам 5-6} writeln('Количество точек =', n:3); writeln('Критическое удаление = ', r:2); {вывод исходных массивов x и y} writeln('Абсциссы и ординаты: '); {обр7} for i:=1 to n do writeln(' ':5, x[i]:5:1, ' ':8, y[i]:5:1); {обр8}
{А0.3 - вывод результатов} writeln(' Искомый процент точек = ',p:5:1); {p по обр9} writeln(' Среднее удаление = ',sr:8:5); {sr по обр10} write('Press Enter…'); readln; {задерживаем экран до нажатия ENTER} end. Лабораторная работа 4: program Lab4; {$APPTYPE CONSOLE} Uses Windows; // для русификации const Nmax=20; { ![]() var n, i, r: integer; p, sr: real; x, y: array [1..Nmax] of real; np: integer; si, s: real; fin, fout: TextFile; { описание файловых переменных, для работы с текстовыми файлами} begin setConsoleCP(1251); // для ввода русификация и setConsoleOutputCP(1251); // для вывода {Для работы программы необходимо передать ей параметры - имена исходного и выходного файла: Run Parametersв среде разработки или через ярлык exe-файла или bat-файл – читайте семинар Sem2.pdf} if ParamCount<2 then begin writeln(‘CritError: Не заданы параметры программы’); readln; exit end; AssignFile(fin, ParamStr(1)); AssignFile(fout, ParamStr(2)); Reset(fin); { открытие для чтения текстового файла, связанного с fin в предыдущей строке} Rewrite(fout); { создание и открытие для записи файла, связанного с переменной fout} {A0.1 - ввод-вывод входных данных} {вывод заголовка в выходной документ: } writeln(fout, 'Лаб.4' :40); {вывод в файл, связанный с переменной fout, и переход на след.строку в нём} {ввод исходных данных из файла, связанного с переменной fin, и открытого для чтения: } readln(fin, n); {обр 1.2} readln(fin,r); { обр 2.2} {ввод массивов x и y:} for i:=1 to n do readln(fin,x[i], y[i]); {обр3.2:ввод 2 элементов через пробел и переход на след. строку} {вывод n, r по образцам 5-6} writeln(fout,' Количество точек =', n:3); writeln(fout,' Критическое удаление = ', r:2); {вывод массивов x и y} writeln(fout,' Абсциссы и ординаты: '); {обр7} for i:=1 to n do writeln(fout,' ':5, x[i]:5:1, ' ':8, y[i]:5:1); {обр8}
{А0.3 - вывод результатов} writeln(fout,' Искомый процент точек = ',p:5:1); {p по обр9} writeln(fout,' Среднее удаление = ',sr:8:5); {sr по обр10} CloseFile(fin); CloseFile(fout); write('Press Enter…'); readln; {задерживаем экран до нажатия ENTER} end. 2>1> |