спецификация. спецификация 23. Спецификация к Лабораторной работе 24 (Вариант 23) Постановка задачи (ПЗ)
Скачать 1.04 Mb.
|
Спецификация к Лабораторной работе №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. Входная форма: обр1 обр2 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> |