Главная страница

спецификация. спецификация 23. Спецификация к Лабораторной работе 24 (Вариант 23) Постановка задачи (ПЗ)


Скачать 1.04 Mb.
НазваниеСпецификация к Лабораторной работе 24 (Вариант 23) Постановка задачи (ПЗ)
Анкорспецификация
Дата20.09.2021
Размер1.04 Mb.
Формат файлаdocx
Имя файласпецификация 23.docx
ТипДокументы
#234590


Спецификация к Лабораторной работе №2-4 (Вариант 23)

  1. Постановка задачи (ПЗ).

Задание: Написать программу обработки одномерного массива(ов) в соответствии с условием.

Условие: В заданном массиве X1, X2, …, Xn заменить значения отрицательных элементов их абсолютными величинами; при этом подсчитать число элементов, равных нулю.

  1. Уточненная постановка задачи

Дан одномерный вещественный массив x из n (0<n≤20) и

Найти:

  1. Пример

Возьмём массив X= {10,-5,3,0,12,0},

заменить значения отрицательных элементов их абсолютными величинами получим.

Получим Y={10,5,3,0,12,0}, Количество элементов равных нулю,k=2

Класс

Имя

Описание

(смысл, диапазон, точность)

Тип

Структура

Формат в/в



Входные данные

n

число точек плоскости, 0 < n  20

цел

простая переменная

XX (:2)

x

абсциссы точек плоскости, |xi|<=10, точн. 0.1

вещ

одномерный массив (20)

+XX.X (:5:1)

y

ординаты точек плоскости, |yi|<=10, точн. 0.1

вещ

одномерный массив (20)

+XX.X (:5:1)

r

критическое удаление, 1  r  14 т.к. 0 < r < 102 102 14,14

цел

простая переменная

XX (:2)



(продолжение таблицы данных)

Класс

Имя

Описание

(смысл, диапазон, точность)

Тип

Структура

Формат в/в



Выходные данные

p

искомый процент точек, 0  p  100, точн. 0.1

вещ

простая переменная

XXX.X (:5:1)

sr

среднее удаление всех точек от начала координат,

0≤sr≤ 102 102 ≤10 2 <15;

точн. 0.00001

вещ

простая переменная

XX.XXXXX

(:8:5)

Промежуточные данные*

i

индекс текущего элемента,

0  i  21 (в Delphi выход из цикла с 1 до 20 с шагом +1 происходит при значении 21, из цикла с 20 до 1 – при 0)

цел

простая переменная

---









---









---









---

*Промежуточные данные заполняются не сразу, а по мере необходимости использовать дополнительные переменные. Оставляйте место для них

5. Входная форма:

обр1 обр2


7. Аномалии


Пока не рассматриваем, но можете сделать (n<1, n>20, r<1, r>14, i:|x[i]|>10, i:|y[i]>10),например:



Описание

Условие возникновения**

Реакция на аномалию

1

n меньше минимально

допустимого значения

n<1

Сообщение: «Некорректное n: n<1» (обр.А1)

Действие: Завершение работы программы

2







**В условиях желательно НЕ использовать связку  (ИЛИ), объединяя разные случаи воедино, и выводить разные сообщения, чтобы реакция была более конкретная.



При создании тестов можно выделить больше классов эквивалентности для выходных и исходных данных, например:

А) для вещественных значений: если при совпадении минимума или максимума с 0, искать минимум по абсолютной величине, отличный от 0. Это поможет проверить точность выходных данных.

Например, у нас минимумы p и sr совпали с 0. Выбираем новые минимумы, лучше сразу два:



Б) Даже если минимум/максимум не совпадает с нулем, можно в любом случае вместо максимума делать тесты на граничные значения результата (максимальное значение и максимальное по абсолютной величине отрицательное значение), а в качестве минимума – отрицательное и/или положительное значения, по абсолютной величине ближайшие к 0;

В) Для исходных данных при проверке аномальных ситуаций можно рекомендовать для проверки брать значение, ближайшее к граничному – пограничное, чтобы четче проверять границу аномального и нормального значения переменной;

Г) При проверке аномальных ситуаций, если 0 (ноль) входит в область аномальной ситуации, проверять отдельно нули и НЕнули. Например, для (n<1) отдельно тесты для 0 и -1;

Д) Можно расширить проверку исходных данных на аномалии, когда введены не цифры, а буквы или «лишние» символы присутствуют во веденном значении. Или, как частный случай, вместо точки в качестве разделителя дробной части использована запятая, или наоборот. В лабораторной работе 9 будут проверки ошибок при открытии и чтении из файла. Ошибки при чтении как раз могут быть изза некорректных символов и попытки ввода букв вместо цифр.


9. Метод


Отделим ввод-вывод от обработки данных (собственно решения задачи). То есть, разделим нашу задачу на три подзадачи:



  1. Подзадача А0.1. Ввести исходные данные (обр.1-3) и вывести их на экран (обр.5-8) для визуального подтверждения.

  2. Подзадача А0.2. Решение задачи: на основе введенных исходных данных (n,r,x,y) найти процент подходящих точек p и среднее расстояние sr.

  3. Подзадача А0.3. Ввести вывести полученные результаты (p, sr) на экран (обр.9-10)



Здесь ввод-вывод тривиален и представляет собой чисто техническую задачу; в алгоритмизации нуждается только обработка. Поэтому на нулевом уровне сразу опишем ввод-вывод (подзадачи А0.1 и А0.3), оставив задачу обработки А0.2 в виде абстракции (которую раскроем на следующем уровне проектирования). На данном уровне эту абстракцию в алгоритме заменим ЗАГЛУШКОЙ («Заглушка» – это простейший алгоритм, временно заменяющим реальный алгоритм и помогающий уменьшить область поиска ошибок и отладить уже написанную часть программы, не внося дополнительных ошибок, потенциально содержащихся в том самом реальном алгоритме. Алгоритм «заглушки» должен быть настолько простым, чтобы в нем не было ошибок или было очень просто их обнаружить и исправить. В простейшем случае, это просто присваивание результата. На следующем шаге разработки «заглушка» заменяется реальным алгоритмом, и, поскольку остальная часть программы уже проверена, то можно с высокой долей вероятности считать, что все вновь

обнаруженные ошибки находятся в добавленном алгоритме.)




Для ввода-вывода массивов потребуется промежуточная переменная - индекс элемента. Пусть i – индекс текущего элемента массива. (Добавляем его в таблицу данных)



  1. Алгоритм (блок-схемы можно рисовать вручную, оставив место в распечатке)





  1. Программа на 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

i1

Пусть np – число точек, попавших в область (удаление больше r, коорд-ты положительны); тогда

p = (np/n)*100;

чтобы найти p, надо найти np:

np Countin1((si r)(x[i] 0)(y[i] 0))


Методы подсчета суммы и количества описаны в файле Base-Algorithmes.doc


Оба алгоритма (поиск суммы и количества) выполним в одном и том же цикле по элементам массивов, иначе расстояние (si) каждой точки от центра пришлось бы считать дважды.


4. Таблица данных (продолжение)


(в рукописной спецификации можно дополнить исходную таблицу)

Промежуточные

i

индекс текущего элемента, 0 < i  21

цел

простая переменная

---

np

число точек, удовлетворяющих условию, 0  np 20

цел

простая переменная

---

s

сумма расстояний всех точек от начала координат, 0 s  20 102 102 <=20*10* 2 <300; точн. 0.001

вещ

простая переменная

---

si

расстояние до i-ой точки от начала

координат, 0 si 102 102 = 10 215; точн. 0.001

вещ

простая переменная

---




11. Программный код


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

В разделе var следует добавить описание трех переменных:



{описания других промежуточных данных: }

var

np: integer; si, s: real;



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



{А0.2 - обработка}

s:=0;

np:=0;

for i:=1 to n do // перебираем по-очереди все n точек begin

si:= sqrt(x[i]*x[i] + y[i]*y[i]); {вычисляем удаление точки от центра координат } s:= s+si; // и сумму

if (x[i]>0) and (y[i]>0) and (si>r) then // если точка в нужной области, то np:=np+1; ; // и количество увеличиваем end;

p:=np / n *100; sr:= s / n;

Получившиеся программы Лабораторная работа 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.2 - обработка} s:=0;

np:=0;

for i:=1 to n do // перебираем по-очереди все n точек begin

si:= sqrt(x[i]*x[i] + y[i]*y[i]); {вычисляем удаление точки от центра координат } s:= s+si; // и сумму

if (x[i]>0) and (y[i]>0) and (si>r) then // если точка в нужной области, то np:=np+1; ; // и количество увеличиваем end;

p:=np / n *100; sr:= s / n;

{А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.2 - обработка} s:=0; np:=0;

for i:=1 to n do // перебираем по-очереди все n точек begin

si:= sqrt(x[i]*x[i] + y[i]*y[i]);

s:= s+si;

if (x[i]>0) and (y[i]>0) and (si>r) then np:=np+1;

end;

p:=np / n *100; sr:= s / n;



{А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.


написать администратору сайта