ГЛАВА III. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ И ЦИКЛИЧЕСКИХ АЛГОРИТМОВ ... и если ничто уже не помогает - посмотри инструкцию для пользователя. Из завещания неизвестного программиста Линейные алгоритмы и соответствующие им программы редко встречаются в практике решения на компьютере реальных задач. Ведь неизменная последо- вательность действий, как правило, не может соответствовать изменяющимся обстоятельствам разнообразных жизненных или учебных ситуаций. Чаще всего порядок выполнения действий (ход алгоритмического процесса) зависит от оп- ределенных условий,поэтому возникает необходимость использовать операторы управления - оператор безусловной передачи управления, оператор условной передачи управления, оператор цикла. Изучение этих операторов позволит ответить на вопрос: может ли с т а - т и ч е с к и й объект - текст программы - быть построен таким образом, чтобы дать ясное представление о динамической ситуации - ее выполнении? III.1. ОПЕРАТОР БЕЗУСЛОВНОЙ ПЕРЕДАЧИ УПРАВЛЕНИЯ GOTO ...квалификация программистов является убывающей функцией от плотности предложений GOTO в создаваемых ими программах. Э.Дейкстра Выполнение операторов в программе осуществляется в порядке их естест- венного следования. Оператор GOTO ("to go to"-"перейти") позволяет нару- шить этот порядок. Оператор безусловной передачи управления имеет следующую структуру: GOTO n , где: GOTO ("to go to"-"перейти") - служебное слово; n - любой существующий номер строки в программе; 0≤n≤65529 . Оператор GOTO передает управление программной строке с указанным номе- ром n . Если в программе нет строки с этим номером,то выдается сообщение "Undefined line number" ("Н о м е р с т р о к и н е о п р е д е л е н"). Управление передается заданной строке, даже если в ней нет выполняемо- го оператора; например, в строке может находиться оператор REM. Поскольку, однако, оператор REM не исполняется, лучше передавать управление следующе- му за ним исполняемому оператору. В этом случае программа будет выполнять- ся правильно и после удаления программной строки, содержащей комментарии. Выполнение оператора GOTO n в режиме прямого выполнения команд аналоги- чно выполнению команды RUN n , но в отличие от этой команды оператор GOTO n начинает выполнение программы с первого оператора указанной стро- ки, не присваивая начальных значений переменным и не меняя ранее присвоен- ных значений. С этой точки зрения оператор GOTO n в режиме прямого выпол- нения команд полезен при о т л а д к е и т е с т и р о в а н и и. В остальных случаях использовать его в этом режиме не рекомендуется, пос- кольку существует большая вероятность задать неправильный номер строки или непреднамеренно изменить значение переменной так, что фактически изме- нится порядок работы программы, что приведет к появлению многочисленных ошибок! Оператор GOTO - одна из наиболее интуитивно ясных и в то же время одна из наиболее опасных конструкций языков программирования. Оператором GOTO следует пользоваться как можно р е ж е, так как он делает программу труд- но читаемой для программиста - приходится особо следить за тем, в каком порядке выполняются строки программы. Отметим,что в школьный алгоритмичес- кий язык эта конструкция не включена вообще! П р и м е р ы: 1) 20 GOTO 20 'Зацикливание обеспечено! Стандартный при- ───────────── ем при работе с графикой. 2) NEW Ok 5'Пример плохой,трудно читаемой программы! 10 INPUT X 20 GOTO 40 30 PRINT X+Y:GOTO 60 40 INPUT Y 50 GOTO 30 60 END Нетрудно видеть, что приведенная программа эквивалентна программе, сос- тоящей из единственной программной строки: 10 INPUT X,Y:PRINT X+Y:END 3) NEW Ok 10 PRINT "2*2=4":GOTO 10 Эта программа никогда не закончит свою работу,т.к.после вывода текста "2*2=4" на экран оператор GOTO 10 возвращает к строке 10,которая опять вы- водит "2*2=4" и т.д. Пользователь,разумеется,может вмешаться и остановить такую "вечно" работающую программу(ее называют з а ц и к л и в ш е й с я) - для этого одновременно нажимают клавиши "CTRL" и "STOP" (напомним, что такое нажатие обозначается "CTRL"+"STOP"). В случае, если оператор записывается двумя служебными словами GO TO n, то он выполняется аналогично - этот формат сохранен для совместимости с другими языками программирования. Однако, использовать "двухсловную" форму GOTO не рекомендуется,так как она требует большого объема памяти для хранения. Достигаемая экономия на первый взгляд несущественна, однако рано или поздно многие программисты попадают в ситуацию, когда "нескольких битов не хватает!" В статье Бема и Якопини [40] было показано, что любой алгоритм может быть описан на языке программировaния, использующем т о л ь к о т р и управляющие структуры: следование, цикл и ветвление. Возможность представ- ления любых алгоритмов с помощью вложенных друг в друга структур следова- ния, цикла и ветвления составляют основу метода структурного программиро- вания. В последующих разделах мы расскажем об операторах IF...THEN...ELSE и FOR...NEXT, которые являются простейшими эквивалентами управляющих конст- рукций Бема и Якопини. III.2. ОПЕРАТОР УСЛОВНОЙ ПЕРЕДАЧИ УПРАВЛЕНИЯ IF ЕСЛИ нельзя, но очень хочется, ТО можно! Евг.Сазонов, программовед и языколюб Сказочные герои, как известно, по дороге за тридевять земель в триде- сятое царство встречали на перекрестке камень с надписью - альтернативой. У программиста при написании программы возникает потребность запрограмми- ровать альтернативу,т.е. предусмотреть возможность выбора одного,либо дру- гого действия в зависимости от некоторого условия. Для программирования таких разветвляющихся участков алгоритма используется оператор условной передачи управления IF. Структура оператора : ┌───────────────────────────────────────────────────────────┐ │ IF условие THEN список операторов [ELSE список операторов]│ └───────────────────────────────────────────────────────────┘ Здесь: IF("если"), THEN("то"), ELSE("иначе") - служебные слова; у с л о в и е - арифметическое или логическое выражение; с п и с о к о п е р а т о р о в - несколько (или ни одного) опе- раторов MSX-BASIC, разделенных двоеточиями, или номер существующей про- граммной строки. Напомним, что квадратные скобки - обозначение, указывающее, что синтак- сическая конструкция внутри них не является обязательной! Кроме того,вместо служебного слова THEN может быть использовано служеб- ное слово GOTO, при этом за GOTO должен следовать номер существующей про- граммной строки. Более того, в случае, когда с п и с о к о п е р а т о - р о в состоит лишь из оператора GOTO n , служебное слово GOTO может опус- каться. Таким образом, если мы обозначим: n1 и n2 - номера программных строк, О1 и О2 - последовательности операторов MSX-BASIC (операторы внутри каждой последовательности разделяются символом ":"), то можно записать следующие формы оператора IF: IF условие THEN О1 IF условие ТHEN n1 IF условие GOTO n1 IF условие THEN O1 ELSE O2 IF условие THEN O1 ELSE n2 IF условие ТHEN n1 ELSE O2 IF условие ТHEN n1 ELSE n2 IF условие GOTO n1 ELSE O2 IF условие GOTO n1 ELSE n2 IF условие GOTO O1 ELSE O2 (обратите внимание!) Отметим,что в некоторых версиях BASIC (например, для ПЭВМ"ДВК-2М") ре- ализованы только "усеченные"конструкции оператора IF - без ветви "иначе" (т.е.без служебного слова ELSE): IF условие THEN n1 , IF условие THEN O1 . Теперь рассмотрим несколько примеров: 1) 300 DEFDBL A,B:IF A=B GOTO 700'Внимание!Может оказаться,что два чис ла,которые должны быть р а в н ы м и, все-таки н е м н о г о отл ичаются из-за ошибок округления! Переход на строку с номером 700 мо жет не осуществиться! Правильной будет следующая запись строки 300: 300 DEFDBL A,B:IF ABS(A-B)<=EPS GOTO 700 где EPS - допустимая "точность несовпадения" чисел A и B. Напомним, что основное различие между целыми и действительными (с фик- сированной или плавающей точкой) константами в том, что целые константы представлены в компьютере т о ч н о, а действительные - лишь п р и б л и- ж е н н о. Выполняя операции с действительными числами, мы о б я з а - т е л ь н о должны считаться с погрешностью округления, которая может очень сильно исказить результат! Взгляните: 10 INPUT А 10 INPUT A! 20 ? (A/3)^2*9 20 PRINT A!/3*3 run run ? 4 ? 1 15.999999999999 .99999999999999 Ok Ok 2) 10 INPUT A,A! 20 IF A!=A THEN PRINT "Верно!":END ELSE PRINT "Посмотрите комментар ий к предыдущему примеру!":END run ? 0.000001000002,0.000001000002 Посмотрите комментарий к предыдущему примеру! Ok 3) 10 IF AB THEN DIM C(4) ELSE DIM C(7) 30 C(6)=1:PRINT C(6) run run ? 1,3 ? 3,1 1 Subscript out of range in 30 Ok Ok Сообщение об ошибке "Subscript out of range"переводится как "В ы х о д за г р а н и ц ы м а с с и в а",то есть обращение к элементу массива со значением индекса,выходящим за пределы границ измерения массива. Таким образом, в некоторых случаях вместо использования "стирающего" оператора ERASE (см. I.5) для переопределения размерности массива в про- грамме можно применять указанный прием. 6) Ok ?11*(1/11) 1 Ok Однако естественно возникновение вопроса: почему компьютер выводит чис- ло 1 в качестве результата вычисления выражения 11*(1/11)? Объяснение этого факта следует искать в особенностях работы процедуры вывода, инициализируемой оператором PRINT,а именно: эта процедура самосто- ятельно выполняет определенные операции округления выводимых числовых дан- ных. Однако результаты подобных округлений, как видно из приведенных при- меров, труднопредсказуемы, что в свою очередь может приводить к непредви- денным последствиям. Замечание. Будьте осторожны при записи условий, ибо посмотрите: ───────── 10 IF Z%=&B11 THEN PRINT "1" ELSE PRINT "0" run Sintax error in 10 Исправить ошибку можно, заключив &В11 в круглые скобки! Напомним, что с е м а н т и к а (от греч."semantikos"-"обозначающий") - значения единиц языка, а с и н т а к с и с (от греч."syntaxis"-"постро- ение,порядок") - способы соединения слов(и их форм) в словосочетания,пред- ложения и текст. Опишем семантику конструкции IF...THEN...ELSE... .Вначале вычисляется значение условия. Если в качестве условия записано строковое выражение,то выдается сообщение об ошибке: "Type mismatch" ("Н е с о о т в е т с т в и е т и п о в"). Если условие истинно (TRUE), то управление передается фразе THEN; если условие ложно (FALSE) и есть фраза ELSE, то управление передается фразе ELSE; если условие ложно (FALSE) и нет фразы ELSE, то управление переда- ется первому оператору с л е д у ю щ е й программной строки (то есть ус- ловно можно считать,что фраза ELSE есть,но за ней стоит "пустой" оператор, не производящий никаких действий). Если непосредственно за THEN или ELSE указан номер программной строки и управление передается этой фразе, то фактически выполняется оператор GOTO Н о м е р с т р о к и В качестве примера рассмотрим программу, вычисляющую и показывающую на экране наибольший общий делитель (НОД) двух натуральных чисел M и N, вве- денных пользователем. Программа использует а л г о р и т м Е в к л и д а, который основывается на том, что НОД пары различных натуральных чисел сов- падает с НОД пары, полученной из предыдущей заменой большего числа раз- ностью большего и меньшего чисел. NEW Ok 20 DEFINT M,N:INPUT"Введите M,N";M,N 50 IF M>N THEN M=M-N 60 IF MN THEN GOTO 50 80 PRINT "НОД...";M:END run run run Введите M,N? 34,51 Введите M,N? 15,625 Введите M,N? 11,121 НОД... 17 НОД... 5 НОД... 11 Ok Оk Ok Проследим теперь за работой компьютера. При первом обращении к строке 50 переменная М имеет значение 34, а переменная N - значение 51. Условие M>N не соблюдено, поэтому следует переход к строке 60. Условие MN (M не равно N) то- же соблюдено и поэтому строка 70 передает управление назад, строке 50. Теперь M имеет значение 34, а N - значение 17, и условие M>N соблюдено; поэтому переменной M присваивается значение 34-17=17. M=N=17.Условие стро- ки 60 не соблюдено, условие M<>N строки 70 тоже не соблюдено, и компьютер, наконец, выполняет строку 80,выводящую на экран дисплея текст "НОД... 17". В строке 80 работа программы заканчивается. Эта короткая программа позво- ляет найти НОД для любой пары натуральных чисел - выполнение серии строк 50, 60, 70 всегда будет повторено необходимое число раз. Об этом "заботят- ся" операторы IF...THEN ! В качестве еще одного примера приведем программу вычисления наименьше- го общего кратного (НОК) двух натуральных чисел. В алгоритме используем тот факт, что произведение НОК и НОД двух чисел равно произведению самих чисел (в программе - переменная К). NEW Ok 10 DEFINT M,N,K:INPUT"Введите M,N";M,N:K=M*N 20 IF M>N THEN M=M-N 30 IF N>M THEN N=N-M 40 IF M<>N THEN 20 50 PRINT "НОК...";K/M:END run run run Введите M,N? 4,6 Введите M,N? 12,45 Введите M,N? 888,117 НОК... 12 НОК... 180 НОК... 103896 Оk Ok Ok В а ж н о е з а м е ч а н и е : оператор IF должен полностью размеща- ться в одной программной строке (программная строка,вообще говоря,отлична от дисплейной строки!) и быть последним в ней. В этом случае будьте внима- тельны: программнaя строкa должна включать не более 255 символов (вместе с номером)! Однако не всегда удается "втиснуть"в одну программную строку последова- тельности операторов O1 и O2. В таких случаях помогает оператор GOTO, ко- торый передает управление на строку, с которой начинается нужный фрагмент программы (если необходимо вернуться к строке программы, следующей за ус- ловным оператором, то в конце фрагмента опять приходится ставить оператор GOTO). Такая конструкция весьма громоздка,поэтому предпочтительнее исполь- зовать подпрограммы (см. раздел IV.4). Любое арифметическое выражение может быть использовано в качестве у с- л о в и я; при этом следует помнить, что если результат его вычисления от- личен от нуля, то значением условия является TRUE, во всех остальных слу- чаях - FALSE . П р и м е р. IF X <> 0 THEN ... идентично записи ─────────── IF X THEN ... Отметим, что с п и с о к о п е р а т о р о в может содержать опера- тор IF...THEN...ELSE... (в этом случае говорят о в л о ж е н и и опера- торов IF друг в друга). Например, алгоритм нахождения большего из трех чисел A, B и C можно за- писать при помощи оператора: 10 IF A>B THEN IF A>C THEN Z=A ELSE Z=C ELSE IF B>C THEN Z=B ELSE Z=C 'Не правда-ли, элегантно (!) и непонятно? Сравните: 10 BIG=X 20 IF Y>BIG THEN BIG=Y 30 IF Z>BIG THEN BIG=Z При вложении операторов IF возникают определенные логические трудности, связанные с проблемой "болтающегося ELSE". В самом деле, если написать опе- ратор вида: IF условие1 THEN IF условие2 THEN O1 ELSE O2 то сразу же возникает вопрос: к какому IF (первому или второму)принадлежит фраза ELSE O2 (как говорят, ELSE "болтается"!)? Для устранения возможной двусмысленности учтите, что любой ELSE "связы- вается" с ближайшей п р е д ш е с т в у ю щ е й ему в программной строке конструкцией IF...THEN, которой еще не поставлен в соответствие ELSE (сра- вните с расстановкой скобок в алгебраическом выражении!). Поэтому можно сформулировать простое п р а в и л о: добавляйте нужное количество "пустых" ELSE, начиная с конца программной строки,для удовлетво- рения всех вхождений IF...THEN(сравните с правилом "вложенного IF"на языке программирования PL/1: каждая из вложенных конструкций IF...THEN должна иметь соответствующий ELSE, возможно "пустой"). Таким образом, конструкция IF условие1 THEN IF условие2 THEN O1 ELSE O2 понимается как IF условие1 THEN ( IF условие2 THEN O1 ELSE O2 ) Скобки поставлены т о л ь к о для наглядности. Упаси Вас бог употре- бить их в программе! Но если Вам все-таки хочется выделить в программе группу операторов,то можете применить для этой цели последовательность дво- еточий ::...: . Например: IF условие1 THEN:::IF условие2 THEN O1 ELSE O2::: . Смысл конструкции можно изменить, добавив "пустой" ELSE: IF условие1 THEN:::IF условие2 THEN O1 ELSE:::ELSE O2 . В какой-то мере последовательность двоеточий играет роль операторных скобок, присущих, например, языкам ALGOL, PL/1, Pascal, C ! П р и м е р ы: ───────────── 1) NEW Ok 10 INPUT X 20 IF X>1 THEN IF X<3 THEN PRINT "1≤X<3":END ELSE PRINT "X>3":END 30 PRINT "X≤1" run run run run ? 0 ? 1 ? 2.5 ? 4 X≤1 X≤1 1≤X<3 X>3 Ok Ok Ok Ok 2) NEW Ok 10 INPUT X 20 IF X>1 THEN IF X<3 THEN PRINT "1≤X<3":END ELSE ELSE PRINT "X≤1":END 30 PRINT "X≥3" run run run run ? 0 ? 1 ? 2.5 ? 4 x≤1 x≤1 1≤x<3 x≥3 Ok Ok Ok Ok 3) составить программу, определяющую, каким должен быть Ваш идеальный вес, по следующему алгоритму (формула Мэгони, уточненная К. Купером).Муж- чина берет свой рост в дюймах, умножает это число на 4 и вычитает 128.Жен- щине надо умножить свой рост в дюймах на 3.5 и затем вычесть 108. Эта фор- мула рассчитана на мужчину со средней шириной кости и женщину среднего те- лосложения. Но Вы можете заметить:"У меня широкая кость. Годится ли мне эта формула?" Да, но тогда прибавьте 10% к окончательному результату. Что- бы определить, насколько широка у Вас кость,используйте следующее правило. Измерьте окружность запястья доминирующей руки, т.е. руки, которой Вы пи- шите. Мужчина имеет широкую кость, если окружность его запястья больше 18 см, женщина - больше 16.5 см. Если размер окружности запястья меньше, то говорят о среднекостном или о тонкокостном типе сложения. Описанная выше формула предполагает измерение роста в футах и дюймах, а веса - в фунтах. Напомним, что 1 фут = 0.3048 м, 1 дюйм = 0.0254 м, 1 фунт = 0.4536 кг. NEW Ok 10 INPUT"Если Вы мужчина, то нажмите клавишу 'SHIFT'+'1',а если Вы жен щина, то нажмите клавишу 'клюшка'";X% 20 INPUT "Укажите Ваш рост в метрах";L 30 INPUT"Укажите обхват запястья сильнейшей руки в см";Y 35 PRINT"Ваш идеальный вес:" 40 IF X%=1 THEN IF Y>18 THEN PRINTUSING"###.###";(L/.0254*4-128)*.4536 *1.1;ELSE PRINTUSING "###.###"; (L/.0254*4-128)*.4536;ELSE IF Y>16.5 T HEN PRINTUSING "###.###";(L/.0254*3.5-108)*.4536*1.1;ELSE PRINTUSING " ###.###";(L/.0254*3.5-108)*.4536; 50 PRINT " кг":END run Если Вы мужчина, то нажмите клавишу 'SHIFT'+'1', а если Вы женщина, то нажмите клавишу 'клюшка'? 1 Укажите Ваш рост в метрах? 1.745 Укажите обхват запястья сильнейшей руки в см? 18.5 Ваш идеальный вес: 73.249 кг Ok 4) составить программу решения квадратного уравнения a·x² + b·x + c = 0 . NEW Ok 100 INPUT"Задайте a,b,c";A,B,C 110 DISC=B*B-4*A*C:W=1/2/A:Z=-B/2/A 120 IF ABS(DISC)<1.E-14 THEN PRINT"Двойной корень,x=";Z:GOTO 100'Услов ие ABS(DISC)<1.E-14 взято вместо условия DISC=0 с целью компенсации ош ибок округления. 130 IF DISC<0 THEN 160 140 PRINT "Корни";Z+SQR(DISC)*W; 150 PRINT "и";Z-SQR(DISC)*W:GOTO 100 160 PRINT "Мнимые корни:";Z;"+/-";SQR(-DISC)*W;"i":GOTO100 run Задайте a,b,c? 1,2,1 Двойной корень,x=-1 Задайте a,b,c? 1,1,1 Мнимые корни:-.5 +/- .8660254037844 i Задайте a,b,c? 1,-5,6 Корни 3 и 2 Задайте a,b,c? 0,1,1 Division by zero in 110 Ok Заметим, что указанная программа "не работает" в том случае, когда а=0. Поэтому добавим к программе строку: 105 IF A=0 THEN IF B=0 THEN IF C=0 THEN PRINT"x-любое":GOTO 100 ELSE P RINT"решений нет":GOTO 100 ELSE PRINT"корень равен";-C/B:GOTO 100 Это приведет к следующему результату: run Задайте a,b,c? 0,0,0 x-любое Задайте а,b,c? 0,1,1 корень равен-1 Задайте a,b,c? 0,0,1 решений нет и так далее... Целые числа сотворил господь бог, все остальное - дело рук человеческих. Л.Кронекер 5) написать программу, которая выводит на экран разложение введенного в компьютер натурального числа на простые сомножители, например, 24=2*2*2*3, 17=17 . Напомним о с н о в н у ю т е о р е м у а р и ф м е т и к и. Любое натуральное число n>2 может быть представлено в виде произведе- ния простых множителей; с точностью до порядка множителей такое представ- ление единственно. 10 PRINT "Введите натуральное N,N>1" 20 INPUT N:PRINT N;"=";:P=2 30 D=N/P 40 IF D=INT(D) THEN ?S$;P;:S$="*":N=D:GOTO 30 ELSE P=P+1 50 IF N>=P THEN 30 60 PRINT:END run run Введите натуральное N,N>1 Введите натуральное N,N>1 ? 111 ? 1111 111 = 3 * 37 1111 = 11 * 101 Ok Ok Далее, легко получаются следующие результаты: 11111 = 41 * 271 111111 = 3 * 7 * 11 * 13 * 37 1111111 = 239 * 4649 11111111 = 11 * 73 * 101 * 137 ··· ··· 11111111111111 = 11 * 239 * 4649 * 909091 Объектом исследования в данной программе являются числа, записанные це- почкой единиц, р е п ь ю н и т ы (от английского "repeated unit"-"повто- ренная единица"): 1,11,111, и т.д. Этот термин придумал в 1964 году амери- канец А. Бейлер. Первую же работу об этих удивительных числах написал дву- мя столетиями раньше Иоганн-III Бернулли в связи с исследованиями периоди- ческих десятичных дробей. В 1895 году француз Э.Люка в книге "Заниматель- ная математика" публикует проверенную им таблицу всех простых делителей репьюнитов до 18-го репьюнита включительно. В частности, 111111111111111 = 3*37*31*41*271*290*6161 1111111111111111 = 11*17*73*101*137*5882353 11111111111111111 = 2071723*5363222357 111111111111111111 = 3*7*11*13*19*37*52579*333667 . Сегодня таблица делителей репьюнитов достигла n=3000 (С. Ейтс, 1975), однако в ней еще достаточно много пробелов, и даже не все ясно в первой сотне репьюнитов. Практический интерес к репьюнитам существует в теории арифметических кодов,служащей основой помехоустойчивого кодирования в ком- пьютерной технике, и в проблеме простых чисел: их ищут сейчас в основном среди так называемых ч и с е л М е р с е н н а, имеющих вид 2ⁿ-1 , n=1,2,3,... . и последним достижением на этом пути стало число 132049 2 - 1 (1984 год). А ведь числа Мерсенна - это репьюниты в двоичной системе счисления! Про- верьте этот факт! Обязательно проведите аналогию между операторoм условной передачи уп- равления IF в языке программирования MSX-BASIC и командой ветвления если условие ──── │ то серия 1 │ ── │ иначе серия 2 │ ───── все ─── в школьном алгоритмическом языке! Кстати отметим, что аналог служебного слова все в MSX-BASIC не нужен ─── - признаком конца оператора IF является конец программной строки, в кото- рой он находится. В школьном алгоритмическом языке введена еще одна команда - команда п р о в е р к и к о н т р о л ь н о г о у с л о в и я утв у с л о в и е ─── Если в процессе исполнения алгоритма условие нарушается, то компьютер прекращает исполнение алгоритма и сообщает, что возник отказ. Аналогом данной команды в MSX-BASIC может служить, например, конструк- ция IF...THEN...ELSE в следующем примере: NEW Ok 10 'Вычисление значения функции y=√(x-2) 20 INPUT"Введите X";X 30 IF X>=2 THEN PRINT SQR(X-2) ELSE PRINT 1/0 run run Введите X? 4 Введите X? 1.414213562373 Division by zero in 30 Ok Ok