Pers.narod.ru. Обучение. Простое число или особенности цикла for в MathCAD |
Для иллюстрации применения в MathCAD так называемого цикла типа арифметической прогрессии (обычного цикла for
) напишем функцию, определяющую, является ли простым заданное натуральное число n
:
Она предполагает, что переданное ей число n
– простое (присваивает переменной r
значение 1), а затем последовательно проверяет остатки от деления n
на значения 2, 3, …, корень(n)
– остатки от деления на 1 и n
проверять нет смысла, а если число не простое, ни один из его двух целочисленных сомножителей не может быть больше квадратного корня из числа (5*5=25
и 5 равно корню из 25, а числа, на которое 25 бы делилось нацело, большего 5, не существует).
Остаток от деления нацело значения n
на значение i
можно найти с помощью стандартной функции mod(n,i)
. Если найден хотя бы один остаток, равный нулю, функция Simple
записывает возвращаемое значение r=0
и прерывает цикл проверок, в противном случае значение r
остаётся равным 1, как оно и было назначено до цикла.
Протестировать нашу функцию можно, если написать ещё одну функцию, формирующую вектор из всех простых чисел, не превышающих заданного значения N
:
Как видим, наша функция Simple
неверна – например, она не считает простыми числа 2 и 3. Проблема состоит в том, что цикл for
будет выполняться, даже если начальное значение параметра цикла больше конечного и шаг цикла равен 1 (по умолчанию). Например, для n=2
граница цикла floor(корень(2))=1
и цикл, проверив остатки от деления n=2
на 2 и 1, равные нулю, решит, что число 2 – не простое.
Правильно будет реализовать внутренний цикл через оператор while
:
или задать для цикла for
явный шаг, равный +1
:
В последнем варианте функции числа 2 и 3 пришлось обработать отдельно, чтобы избежать ошибки «Необходимо определить переменную-диапазон с последовательными значениями» - в этом случае она возникнет, если значение floor(корень(n))
окажется меньше трёх.
Второй интересный момент - в классическом цикле for в MathCAD, как известно, справа от знака ∈ обычно ставят дискретный аргумент:
for i ∈ 1..10 ...
Однако Маткад позволяет поставить вместо дискретной переменной справа от знака ∈ вектор или матрицу.
Более того, можно туда поставить список векторов или матриц, перечисленных через запятую.
Скалярная переменная слева от знака ∈ по очереди примет значение каждого элемента каждой не-скалярной величины в порядке перечисления.
На показанном ниже скриншоте видно, как с помощью переменной i
(и счётчика элементов k
) программно
формируется вектор x
из всех положительных элементов векторов-параметров A
и B
.
гостевая; E-mail |