Remkomplekty.ru

IT Новости из мира ПК
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Разветвляющиеся вычислительные процессы паскаль

Разветвляющийся вычислительный процесс.

Если вычислительный процесс зависит от определенных условий и реализуется по одному из нескольких заранее предусмотренных направлений, он называется разветвляющимся вычислительным процессом, а каждое из этих направлений – ветвью вычислений. Для выбора ветви вычислений в Паскале используются операторы IF и CASE.

Однако прежде, чем перейти к рассмотрению этих операторов, необходимо познакомиться с понятиями составного оператора, логическими операциями и выражениями.

Составной оператор.
Составной оператор предписывает выполнение составляющих его операторов в порядке их написания. Зарезервированные слова BEGIN и END являются операторными скобками. Формат оператора:
BEGIN <Начало составного оператора>

END; <Конец составного оператора>
Составной оператор используется в тех конструкциях, где по синтаксису языка должен быть только один оператор, а для решения задачи требуется более одного. В составном операторе все операторы 1, 2. n выполняются последовательно ДРУГ за другом.
Логические выражения.
Одним из нечисловых видов данных является тип BOOLEAN. Булевы (логические) переменные имеют только два значения: FALSE (ложь), TRUE (истина). Существует несколько форм конструирования логического выражения:

  • константа, описанная в разделе CONST;
  • переменная, которой можно присвоить булевы значения (например FLAG:= TRUE);
  • отношение между переменными скалярных и некоторых структурированных типов.

В Паскале допускаются отношения, перечисленные в таблице 16.

Пример 6. Пусть заданы вещественные переменные А, В и логическая переменная FLAG. Требуется построить примеры простых логических выражений, содержащих отношения между А и В.
Если:
VAR
FLAG, FLAG1, FLAG2: BOOLEAN;
А, В: REAL;
тогда допустимы выражения вида:
FLAG := А В;
Значение TRUE ‘истина’ присваивается переменной FLAG1, если А не равно В.
FLAG2 := А = В;
Значение TRUE ‘истина’ присваивается переменной FLAG2, если А равно В.
Помимо указанных выше отношений (таблица 16), логические выражения конструируются с помощью булевых операций, описанных в таблице 17.

Пример 8. Сформулировать логическое условие попадания точки с координатами (х, у) в область S (рисунок 2).


Пусть:
VAR FLAG: BOOLEAN;
Уравнение окружности, которая ограничивает область S в первом и втором квадранте системы координат XOY имеет вид:

Тогда величину FLAG, которая принимает значение TRUE в том случае, когда точка с координатами (х, у) принадлежит области S, можно найти по формуле: FLAG:=(Х>=-A) AND (Х =0)) OR ((Y =B)));
В языке Паскаль логическое выражение просчитывается до тех пор, пока результат не становится очевидным. После чего вычисления прекращаются. Так в нашем случае используется конъюнкция трех условий: X больше -А, X меньше А и ограничение на значение Y. Достаточно любой логической величине принять значение FALSE и остальные величины, стоящие правее в логическом выражении, уже не просчитываются, так как переменная FLAG независимо от значений оставшихся отношений будет равна FALSE. О качественной установке терминалов оплаты можно узнать на сайте http://xn——6kcabbjdz4asrcijhjkculnxhob5v.xn--p1ai/ опытные специалисты сделают все в лучшем виде. В нашем случае это удобно! Потому, что уравнение окружности определено для значений X, удовлетворяющих условию -А —A) AND (X -0))
OR ((Y

B)));
IF FLAG THEN WRITELN(‘Tочкa в области S’)
ELSE WRITELN(‘Toчкa вне области S’)
END.
В стандартном Паскале предусмотрен порядок старшинства операций в булевых выражениях: Высший — (скобки); NOT; AND; (OR, XOR); ( >, =, >-, ) — низший. Однако в различных версиях языка эти требования могут и не соблюдаться, поэтому надежнее использовать скобки для уточнения последовательности вычислений.
Существуют встроенные булевы функции, наиболее известные из которых ODD(X), EOF(F), EOLN(F), описание которых приведено в таблице 10.
Логическое выражение может быть достаточно сложным и включать в себя арифметические и логические функции, например: FLAG := ODD(I*3+K) AND (( SQR(C) > SIN(D/2)) OR ( A = 5 ));
Переменная FLAG принимает значение TRUE, если целочисленное выражение I*3 + К принимает нечетное значение и квадрат С больше, чем синус D, деленной пополам, или А равно 5. В противном случае FLAG принимает значение FALSE.
В приведенных примерах в правой части оператора присваивания расположено логическое выражение, а в левой части – логическая переменная.

Разветвляющиеся вычислительные процессы паскаль

Главное, чего недостает нашим первым программам — гибкости и умения принимать решения. Ведь уже несложный алгоритм решения квадратного уравнения предусматривает два варианта расчета, реальные же алгоритмы могут выдавать результаты, зависящие от десятков и сотен условий.

Разветвляющийся вычислительный процесс (РВП) реализуется по одному из нескольких направлений вычисления (ветвей алгоритма). Выбор одной из ветвей зависит от истинности или ложности некоторого условия (логического выражения), включенного в состав условного оператора. Программа должна учитывать все возможные ветви вычислений. При запуске программы, в зависимости от данных, выполняется только одна из возможных ветвей.

7.1. Логические выражения

Логические выражения (ЛВ) строятся из АВ, операций отношения, логических операций и круглых скобок.

Результатом вычисления ЛВ является одно из двух значений: true или false .

7.2. Операции отношения

Операции отношения (сравнения) имеют следующий общий вид:

где АВ — арифметические выражения, ОО — один из следующих знаков операций:

Последний знак обозначает отношение «не равно». Обратите также внимание на запись отношений «меньше или равно», «больше или равно».

В любое логическое выражение должна входить хотя бы одна операция отношения.

Приведем примеры ЛВ, включающих одну ОО:

d 1 — результат этого ЛВ всегда равен false .

К вещественным значениям в общем случае неприменима операция = («равно») из-за неточного представления этих значений в памяти компьютера. Поэтому для вещественных переменных отношение вида a = b часто заменяется на abs ( a — b ) 1) всегда даст значение true .

Операция AND связывает не менее двух логических выражения (является бинарной). Ее результат равен true , если все выражения истинны или false , если хотя бы одно из выражений ложно.

В качестве примера распишем выражение . Т. к. операции принадлежности в Паскале нет, используем операцию AND и операции отношения: ( x >= a ) and ( x 0 (одновременно) будет иметь вид ( a >0) and ( b >0) and ( c >0) .

Читать еще:  Актуальность проблемы обеспечения безопасности информации

Операция OR также связывает не менее двух логических выражений. Ее результат равен true , если хотя бы одно выражение истинно и false , если все выражения ложны.

Распишем выражение . На Паскале оно будет иметь вид ( x b ) . Другой способ связан с применением операции NOT : not (( x >= a ) and ( x 0) or ( b >0) or ( c >0) .

Условие «только одно из значений a , b , c положительно» потребует объединения возможностей операций AND и OR :

(a>0) and (b 0) and (c 0) .

Операция XOR , в отличие от OR , возвращает значение «ложь» ( false ) и в том случае, когда все связанные ей логические выражения истинны. Чтобы лучше уяснить это отличие, составим так называемую таблицу истинности двух логических операций (табл. 7.2). Для краткости значение false обозначим нулем, а true — единицей. Для двух логических аргументов возможно всего 4 комбинации значений 0 и 1.

Табл. 7.2. Таблица истинности операций OR и XOR

Разветвляющийся вычислительный процесс и условный оператор

Главное, чего недостает нашим первым программам – гибкости и умения принимать решения. Ведь уже несложный алгоритм решения квадратного уравнения предусматривает два варианта расчета, реальные же алгоритмы могут выдавать результаты, зависящие от десятков и сотен условий.

Разветвляющийся вычислительный процесс (РВП) реализуется по одному из нескольких направлений вычисления (ветвейалгоритма). Выбор одной из ветвей зависит от истинности или ложности некоторого условия (логического выражения), включенного в состав условного оператора. Программа должна учитывать все возможные ветви вычислений. Всегда выполняется только одна из всех возможных ветвей.

Логические выражения строятся из арифметических выражений, операций отношения, логических операций и круглых скобок.

Результатом вычисления логического выражения является одно из двух значений: TRUE или FALSE.

Операции отношения имеют следующий общий вид:

арифм.выраж.1 ОО арифм.выраж.2

где ОО – один из следующих знаков операций:

Последний знак обозначает отношение «не равно». Обратите также внимание на запись отношений «меньше или равно», «больше или равно».

В любое логическое выражение должна входить хотя бы 1 операция отношения!

d 1 результат всегда = FALSE

К вещественным значениям операция = («равно») в общем случае неприменимаиз-за неточного представления этих значений в памяти компьютера. Поэтому для вещественных переменных отношение вида a=b заменяется на abs(a–b)

Операция NOT применима к одному логическому выражению (является унарной). Результат равен TRUE, если выражение ложно и наоборот.

Пр. NOT (sin(x)>1) результат всегда TRUE

Операция AND связывает не менее двух логических выражения (является бинарной). Результат равен TRUE, если все выражения истинны и FALSE, если хотя бы одно из выражений ложно.

Пр. Распишем выражение Так как операции принадлежности в Паскале нет, используем операцию AND и операции отношения: (x>=a) and (x 0 (одновременно): (a>0) and (b>0) and (c>0)

Операция OR также связывает не менее 2 логических выражений. Результат равен TRUE, если хотя бы одно выражение истинно и FALSE, если все выражения ложны.

Пр. Распишем выражение : (xb)

другой способ – not ((x>=a) and (x 0) or (b>0) or (c>0)

Пр. Условие «только одно из значений a,b,c положительно»:

(a>0) and (b 0) and (c 0)

Операция XOR, в отличие от OR, дает ложь (false) и в том случае, когда все связанные ей логические выражения истинны. Чтобы лучше уяснить это отличие, составим так называемую таблицу истинности этих двух логических операций. Для краткости значение false обозначим нулем, а true – единицей. Для двух логических аргументов возможно всего 4 комбинации значений 0 и 1:

Разветвляющиеся вычислительные процессы

В линейной программе все операторы выполняются последовательно, один за другим. Таким способом можно записывать только очень простые алгоритмы. Для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов, применяются операторы ветвления if и case.

Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case — на одну из произвольного числа ветвей. Рассмотрим сначала задачи с применением оператора if.

if выражение then оператор_1 [else оператор_2:]

Сначала вычисляется выражение, которое должно иметь логический тип. Как правило, в выражении используются знаки операций отношения (меньше , равно =, не равно <>, меньше или равно =)2. Если требуется проверить несколько условий, их объединяют знаками логических операций and (И), or (ИЛИ), хог (исключающее ИЛИ) и not (отрицание)3. Примеры логических выражений:

Если выражение имеет значение true, выполняется первый оператор, иначе — второй (рис. 2.1). Ветвь else может отсутствовать. После выполнения операторов из соответствующей ветви управление передается оператору, следующему за условным оператором.

Рис. 1. Структурная схема условного оператора

Когда по какой-либо ветви требуется выполнить не один, а несколько операторов, применяют блок (составной оператор). Блок обрамляется ключевыми словами begin и end:

if а=0 then begin х:=0; у:=0 end

else begin х:=1; у:=2 end;

Внутри условного оператора можно записать еще один условный оператор, например:

if а >= b then if а = b then с := 0 else с := 1 else с := 2;

Ключевое слово else всегда считается относящимся к ближайшему слову if, т.е.

Большого количества вложенных условных операторов следует избегать, потому что они делают программу совершенно нечитабельной.

Оператор варианта (выбора) используется для реализации алгоритмов, имеющих приведенную на рис. 2 структуру. Решение о том, какой именно оператор выполнить, принимается после анализа значения выражения порядкового типа. Выполняется оператор (простой или составной), записанный после константы, с которой совпало значение выражения.

Рис. 2. Структурная схема оператора выбора

Чаще всего после ключевого слова case указывается имя переменной (это частный случай выражения). Если требуется выполнить одни и те же действия для нескольких констант, они записываются либо через запятую, либо с помощью операции диапазона (..).

case выражение of

константы_1 : оператор_1; константы_2 : оператор_2;

Вычисление значения функции.

Пример 1. Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика (рис.) на интервале [-3; 3].

Читать еще:  Динамические структуры данных паскаль

Рис. Функция, заданная в виде графика

Начинать решение даже простейшей задачи необходимо с четкого описания ее исходных данных и результатов. В данном случае это очевидно: исходными данными является вещественное значение аргумента х, который определен на интервале [-3; 3], а результатом — вещественное значение функции у. Поэтому для представления этих величин в программе следует выбрать тип real.

Перед написанием программы следует составить алгоритм ее решения — сначала в общем виде, а затем постепенно детализируя каждый шаг. Такой способ, называемый нисходящей разработкой, позволяет создавать простые по структуре программы.

Сначала запишем функцию в виде формул:

Далее приведено описание алгоритма в словесной форме.

1. Ввести значение аргумента х.

2. Проверить, принадлежит ли оно области определения функции.

3. Если не принадлежит, вывести диагностическое сообщение и завершить программу.

4. Определить, какому интервалу из области определения функции принадлежит введенное значение, и вычислить значение функции у по соответствующей формуле.

5. Вывести значение у.

Опишем четвертый пункт алгоритма более подробно:

· Если аргумент х принадлежит интервалу [-3; -2), то .

· Если аргумент х принадлежит интервалу [-2; 0), то .

· Если аргумент х принадлежит интервалу [0; 1), то

· Если аргумент х принадлежит интервалу [1; 3], то .

По такому алгоритму можно практически «один в один» написать программу:

writeln (‘Введите значение аргумента:’);

if (x 3) then begin

writeln (‘Значение должно принадлежать [-3;3]’);

if x =-2) and ( x =0) and (x =1 then y:= sqrt(1-sqr(x-2));

writeln (‘Для x= ‘, x:3:2, ‘ значение функции y=’, y:3:2)

Обратите внимание на запись условий, содержащих два сравнения. Начинающие часто записывают такие условия, просто воспроизводя математическую формулу, то есть как а , ==, , ! =) являются бинарными, то есть должны иметь два операнда. И если мы хотим проверить два условия (а 2 , что вряд ли соответствует нашему замыслу.

Первый и последний условные операторы записаны без двойных условий, потому что проверка того, что аргумент находится в диапазоне [-3; 3], выполнена раньше.

Стандартная процедура exit обеспечивает выход из программной единицы, в которой она записана.

Тестовые примеры для этой программы должны включать по крайней мере по одному значению аргумента из каждого интервала, а для проверки граничных условий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в условиях «забыть» знак =, а затем ввести значения х, равные -2 и 0).

Структурная схема вычисления значения функции приведена на рис.

При работе приведенной выше программы всегда выполняются один за другим все четыре условных оператора, при этом истинным оказывается только одно условное выражение и, соответственно, присваивание значения переменной у выполняется один раз. Запишем условные операторы так, чтобы уменьшить количество проверок:

writeln(‘Максимальный элемент: ‘, max)

Можно просматривать массив не со второго, а с первого элемента. В этом случае за начальное значение максимума можно принять любой элемент массива.

Для решения поставленной задачи нам требуется знать не значение максимума, а его положение в массиве, то есть индекс:

a : array [1 .. n] of integer;

writeln(‘Введите ‘, n, ‘ элементов массива’);

for i := 1 to n do read(a[i]);

for i := 2 to n do

if a[i] > a[imax] then imax := i;

writeln(‘Номер максимального элемента: ‘, imax);

writeln(‘Максимальный элемент: ‘, a[imax])

Как видим, в этой программе в переменной imax запоминается номер максимального из просмотренных элементов. По этому номеру осуществляется выборка элемента из массива.

Запишем уточненный алгоритм решения нашей задачи:

1. Определить, где в массиве расположены его максимальный и минимальный элементы:

· задать начальные значения индексов искомых максимального и минимального элементов (например, равные номеру его первого элемента, но можно использовать любые другие значения индекса, не выходящие за границу массива);

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

2. Определить границы просмотра массива для поиска положительных элементов, находящихся между его максимальным и минимальным элементами:

· если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе — индексу минимума;

· если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе — индексу максимума.

3. Определить количество положительных элементов в найденном диапазоне:

· обнулить счетчик положительных элементов;

· просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.

Для экономии времени значения элементов массива при отладке задаются путем инициализации:

a : array [1 .. n] of integer = (1, 3, -5, 1, -2, 1, -1, 3, 8, 4);

for i := 1 to n do write(a[i]:3); writeln;

imax := 1; imin := 1;

for i := 1 to n do begin

if a[i] > a[imax] then imax := i;

if a[i] 0 then inc(count);

writeln(‘ Количество положительных: ‘, count);

После нахождения каждой величины вставлена отладочная печать. Рекомендуется никогда не пренебрегать к этим способом отладки и не жалеть времени, стараясь сделать эту печать максимально понятной, то есть содержащей необходимые пояснения и хорошо отформатированной. Кроме того, полезно выводить на печать исходные данные.

Массив просматривается начиная с элемента, следующего за максимальным (минимальным), до элемента, предшествующего минимальному (максимальному).

Тестовых примеров для этой задачи должно быть по крайней мере три — для случаев, когда:

· элемент a[imin] расположен левее элемента a[imax];

· элемент a[imin] расположен правее элемента a[imax];

· элементы a[imin] и a[imax] совпадают.

Последняя ситуация имеет место, когда в массиве все элементы имеют одно и то же значение. Желательно также проверить, как работает программа, если элементы a[imin] и a[imax] расположены рядом, а также в начале и в конце массива (граничные случаи). В массиве должны присутствовать как положительные, так и отрицательные элементы.

Читать еще:  Вычислить сумму матрицы паскаль

Работа с текстовыми файлами

При отладке даже небольших программ может потребоваться их выполнить не раз, не два и даже не десять. При этом ввод исходных данных с клавиатуры может стать утомительным и испортить все удовольствие от процесса. Удобнее заранее подготовить исходные данные в текстовом файле и считывать их в программе. Помимо всего прочего это дает возможность не торопясь продумать, какие данные требуется ввести для полной проверки программы, и заранее рассчитать, что должно получиться в результате.

Результат работы программы тоже бывает полезно выводить не на экран, а в текстовый файл для последующего неспешного анализа. Ниже приведена версия предыдущей программы, использующая файлы:

f_in, f_out : text;

a : array [1 .. n] of integer;

i, imax, imin, ibeg, iend, count : integer;

for i :=1 to n do read(f_in, a[i]);

imax := 1; imin := 1;

for i:=1 to n do begin

if a[i] > a[imax] then imax := i;

if a[i] 0 then inc(count);

writeln(f_out, ‘ Количество положительных:’, count);

Для того чтобы использовать в программе файлы, необходимо сделать следующее:

1. Объявить файловую переменную (оператор 1).

2. Связать ее с файлом на диске (операторы 2 и 4).

3. Открыть файл для чтения (оператор 3) или записи (оператор 5).

4. Выполнить операции ввода-вывода (операторы 6 и 7).

5. Закрыть файл (оператор 8).

В этой программе объявляются две переменные f_in и f_out стандартного типа «текстовый файл». Процедура assign связывает эти переменные с файлами на диске, путь к которым задается с помощью строк символов. Если полный путь не указан, предполагается, что файл находится в текущем каталоге. Процедура reset открывает файл для чтения, a rewrite — для записи. Если файл, который требуется открыть для записи, существует, он стирается и создается заново.

Входной файл input.txt можно создать в любом текстовом редакторе. Он, естественно, должен существовать до первого запуска программы. Если файл, открытый для чтения, не существует, выдается сообщение об ошибке.

При вводе из файла и выводе в файл используются процедуры read, readln, write и writeln, первым аргументом в которые передается файловая переменная. Файл, в который выполняется запись, после окончания работы нужно обязательно закрывать с помощью процедуры close, иначе информация может быть потеряна.

Задача 4.3. Сжатие массива

Написать программу, которая «сжимает» целочисленный массив из 10 элементов, удаляя из него элементы, меньшие заданной величины. Освободившиеся в конце массива элементы заполнить нулями.

Рубрикатор

Разветвляющиеся вычислительные процессы

Разветвляющиеся вычислительные процессы – это процессы, в которых происходит выбор одного из нескольких возможных направлений вычислительного процесса в зависимости от значений исходных данных или промежуточных результатов вычислений.

В языке Pascal существует ряд средств, с помощью которых можно организовать разветвление в программе [Л1, стр. 51 — 54]. Одним из таких средств является условный оператор if.

Общий вид оператора if:

if логическое_выражение then оператор 1 еlse оператор 2;

где оператор1, оператор2 – простые или составные операторы.

Составной оператор представляет собой последовательность операторов, заключенных в операторные скобки begin — end.

Выполнение оператора if:

  1. вычисление значения логического выражения;
  2. в случае, если его значение равно true (истина), выполняется оператор1, в противном случае — оператор2;
  3. управление передается оператору, следующему за оператором if.

Допускается форма оператора if без конструкции else:

if логическое_выражение then оператор 1;

В этом случае оператор1 выполняется, когда значение логического_выражения равно true (истина), в противном случае управление передается оператору, следующему за оператором if.

Пример 1. Вычислить значение функции y(x)

ПрограммаСхема алгоритмаProgram Prim1;var a,x,y: real;begin writeln(‘Введите а, x’); readln(a,x); if x>a then y:=a*sin(x) else y:=1- sqr(x);writeln(‘y=’, y:7:2);end.Исходные данные:I вариант a = 2.3; x = 5.5II вариант a = 12.1; x = 3.7Результат:y = -1.62y = -12.69

В операторе вывода writeln(‘y=’, y:7:2) указан формат вывода y:7:2 для значения переменной y, где число 7 определяет общий размер поля, отводимого в строке вывода для размещения значения переменной, а число 2 указывает количество разрядов для дробной части этой переменной.

Пример 2. Вычислить значение функции y(x)

ПрограммаСхема алгоритмаProgram Prim2; var a, b, x, y: real;begin writeln(‘Введите a, b, x’); readln(a,b,x); if x =2 then y:=exp(-x)+1 else y:= exp(4.5*ln(x)); writeln(‘y=’, y:5:2);end.Исходные данные:I вариант a = 1.4; b = 3; x = -5.2II вариант a = 2.8; b = -4; x = 1.5III вариант a = 2; b = 6; x = 4Результат:y= 4.28y= 6.20y= 1.02

Для вычисления выражения x4.5 в программе используется эквивалентное выражение: x4.5=e4.5*lnx

Пример 3. Вычислить значение функции y(x)

В этом примере нужно предусмотреть выдачу на экран сообщения, (например, “Нет решения”) при возникновении так называемой исключительной (аварийной) ситуации [Л1, стр. 17], которая может произойти в случае, если знаменатель дроби 1/(a+x) равен нулю.

ПрограммаСхема алгоритмаProgram Prim3; label 1; var a,b,x,y: real; begin writeln(‘Введите a, b, x’); readln(a,b,x); if x 0 then y:=1/(a+x) else begin writeln(‘Нет решения’); goto 1; end else y:=1+b*x; writeln(‘y=’, y:6:3);1: end.Исходные данные:I вариант a = 4.35; b = 3; x = 2.85II вариант a = -1; b = 5; x = 1III вариант a = 2.5; b = 3.7; x = 6.4Результат:y= 0.139Нет решенияy=24.680

1. В операторе if перед словом else после слова end нельзя ставить точку с запятой.

2. В данной программе используется оператор безусловного перехода goto 1; где 1 – метка, которая указывает, к какому оператору нужно перейти (Л1, стр. 47).

Метка выбирается пользователем и должна быть описана в разделе описаний программы, например так: label 1;

Пример 4. Вычислить значение функции y(x)

В этом примере исключительные ситуации могут возникнуть в случаях, если выражение (cx+d) меньше или равно нулю и выражение (dx-3) меньше нуля, т.е. в случаях невозможности вычисления логарифма отрицательного числа, или числа, равного нулю, а также вычисления корня квадратного из отрицательного числа.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×