Program
Simple; {Версия
2}
label
LabErr; var
N
: integer;
F
: boolean;
begin
readln(N);
if
N<=0 then
goto
LabErr;
F:=
false;
for
I:=2 to
N-1 do
if
(N mod
I) = 0 then
F:=
true;
writeln('Число
не является простым')
else
writeln('Число
простое'); LabErr:
end.I : integer;
If f then
Теперь программа будет функционировать надежнее.
Удобство применения – это способность программы обеспечивать простоту ввода исходных данных и получение результатов в наиболее понятной и наглядной форме.
Для этого программа должна:
-
формировать запрос на ввод данных в понятной форме
-
снабжать комментариями вывод результатов
-
информировать пользователя об ошибках при задании входных данных и (при диалоговом режиме работы программы) дать ему возможность исправить ошибку.
Наша программа (ее вторая версия):
-
не выводит запрос на ввод данных
-
не информирует об ошибке (вводе отрицательного числа)
-
не позволяет исправить эту ошибку.
Исправим программу следующим образом:
Вместо оператора «goto LabErr» используем конструкцию «repeat … until», обеспечив циклический запрос на ввод данных до тех пор, пока они не будут введены правильно. Кроме этого дополнительно поместим операторы вывода текста, характеризующего назначение программы, для пользователя.
Текст программы теперь примет следующий вид:
Program
Simple;
{Версия
3} var
N
: integer;
F
: boolean;
begin writeln('Программа
определения принадлежности'); writeln('
числа
множеству простых чисел');
repeat
write('Введите
исходное натуральное число ');
readln(N);
if
N<=0 then
writeln('Число
должно быть больше 0');
until
N>0;
F:=
false;
for
I:=2 to
N-1 do
if
(N mod
I) = 0 then
F:=
true;
writeln('Число
не является простым')
else
writeln('Число
простое');
end.
I : integer;
If f then
Эффективность по быстродействию и по затратам памяти характеризуется зависимостью времени работы программы или затрат основной памяти от размера исходных данных. В этом контексте говорят о временнóй (ударение на «о») и емкостной сложности программы.
Поведение временнóй сложности в пределе при увеличении размера задачи называется асимптотической временнóй сложностью программы.
Зависимости могут быть различными, например:
-
линейными, когда временнáя сложность линейно зависит от N (например, при вычислении суммы элементов массива)
-
квадратичными, когда временнáя сложность имеет порядок N2 (например, при сортировке массива)
-
логарифмическими, когда время решения пропорционально log2N (например, при поиске в упорядоченном массива методом деления интервала пополам).
Асимптотическая временнáя сложность – важная характеристика алгоритма и программы, построенной на ее основе. Выбор более оптимального алгоритма, если это в принципе возможно, с меньшей асимптотической временнóй сложностью позволит значительно сократить время работы программы.
В нашей программе асимптотическая временнáя сложность – линейная (за счет использования цикла со счетчиком «for I:=2 to N-1 do». Однако можно заметить, что для поиска делителя достаточно просмотреть числа от 2 до корня квадратного от N, и в этом случае асимптотическая временнáя сложность программы уменьшится и станет пропорциональной корню квадратному от N. При этом вместо приведенного выше оператора потребуется два:
imax:=round(sqrt(N));
for I:=2 to imax do
Кроме того, время работы программы можно сократить еще, если прекращать выполнение цикла, как только будет найден первый делитель. Для этого заменим оператор цикла со счетчиком (for) на оператор цикла с предусловием (while).
Текст новой (четвертой) версии программы приведен на следующей странице.
Эта программа будет работать значительно быстрее. А говорить о ее емкостной сложности нет смысла.
Удобство сопровождения - это способность программы обеспечивать простоту процесса поддержания программы (программного обеспечения) в работоспособном состоянии и простоту внесения в нее необходимых модификаций.
