VBA Excel. Число Пи (значение)
Число Пи как константа или функция, его возвращающая, отсутствуют в VBA, но есть функция Pi рабочего листа Excel, которой можно воспользоваться. А также есть и другие способы расчета значения этого числа.
Функция Pi рабочего листа
Функция Pi рабочего листа Excel возвращает значение числа Пи, округленное до 14 знаков после запятой (3,14159265358979). Присвоение этого значения переменной myPi в коде VBA будет выглядеть следующим образом:
Число Пи через арктангенс
Как известно из геометрии, tg(π/4)=1. Соответственно, π/4=arctg(1), а π=4arctg(1). Используя последнее выражение и учитывая, что функция арктангенс (Atn) в VBA есть, можно не обращаться к соответствующей функции рабочего листа Excel:
Число Пи через арккосинус
Здесь совсем все просто: cos(π)=-1, отсюда π=arccos(-1). Единственная загвоздка только в том, что функции арккосинус в VBA нет и опять приходится обращаться к функции арккосинус (Acos) рабочего листа Excel:
Проверка работы функций
Скопируйте код в модуль VBA и убедитесь в работоспособности представленных выше функций, возвращающих число Пи. Все функции возвращают значение, округленное до 14 знаков после запятой (3,14159265358979):
Создание константы myPi
Если при написании кода VBA Excel часто приходится использовать число Пи, его можно объявить как константу. Объявление следует разместить в разделе Declarations и константа будет доступна во всех процедурах этого модуля:
Объявление константы myPi
Вместо числового значения, присваиваемого константе myPi, можно использовать любую из выше представленных функций.
2 комментария для “VBA Excel. Число Пи (значение)”
Здравствуйте!
Существует ли возможность обратиться к константе из другого модуля
(по аналогии с доступом к глобальной переменной — Module1.myPi)?
Спасибо!
Добрый день!
Именно так (Module1.myPi) можно будет обращаться к константе, если объявить ее в разделе Declarations модуля Module1:
Есть ли встроенная константа Пи
Есть ли какая-то константа в С, означающая число Пи
Или может функция, возвращающая точное число Пи
Есть ли константа системной папки виндоус?
Есть ли в VB константа системной папки виндоус? Чтобы не определять версию винды, т.к. папки по.
Есть ли в C# константа, которая хранит путь к экзешнику
Есть ли в C# константа, которая хранит путь к экзешнику? Ну или просто скажите как определить.
Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построить модель
Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построит.
Блин..а мне на аккес надо и не работает(((
Добавлено через 4 минуты
Придется воспользоваться выражением 4*Atan(1)
— «мне бы ваши заботы, господин учитель. «
или вот еще стишок.
надо очень постараться
и запомнить все как есть
три, четырнадцать, пятнадцать,
девяносто два и шесть
. пять-три-пять и восемь-девять,
семь и девять, тридцать два.
Всё. Распухла голова!
Ребят, вы эт чего стебетесь))))) Я изначально и задал самостоятельно константу с 10ю знаками, но при дальнейших вычислениях (не буду грузить) где выявлялось более точное pi, разность не равнялась нулю (из-за недостаточной неточности моей пи) вот и задал вопрос, тему которого давно можно закрыть, так как я в самом начале еще сам написал формула Atn(1)*4, и лучшего варианта нет)))
а за стишок спасибо! я знал 13 цифр, теперь он голове и языку покоя не дает)))
Добавлено через 21 секунду
Ребят, вы эт чего стебетесь))))) Я изначально и задал самостоятельно константу с 10ю знаками, но при дальнейших вычислениях (не буду грузить) где выявлялось более точное pi, разность не равнялась нулю (из-за недостаточной неточности моей пи) вот и задал вопрос, тему которого давно можно закрыть, так как я в самом начале еще сам написал формула Atn(1)*4, и лучшего варианта нет)))
а за стишок спасибо! я знал 13 цифр, теперь он голове и языку покоя не дает)))
да вот пожалуйста, для большей точности можете забить в
константу своего проекта и пользовать на здоровье
Число пи и синус
Вычислить квадрат и синус числа
1) Дано одно число. Вычислить его квадрат и синус, затем, если синус числа положительный.
Синус и число эйлера
подскажите пож-та как вычислить синус в паскале? и как записать число эйлера
Синус, который не похож на синус
f = 120e+6; t=-10e-6:1/f:10e-6; y = 2048*sin(2*pi*f*t); plot(t,y) Получаем нечто, как на.
Решение
Решение
на самом деле этих алгоритмов множество, и довольно производительных даже на обычном ПК
Интересные факты по теме:
В августе 2009 года учёные из японского университета Цукубы рассчитали последовательность из 2 576 980 377 524 десятичных разрядов[17].
31 декабря 2009 года французский программист Фабрис Беллар на персональном компьютере рассчитал последовательность из 2 699 999 990 000 десятичных разрядов[18].
2 августа 2010 года американский студент Александр Йи и японский исследователь Сигэру Кондо (яп.)русск. рассчитали последовательность с точностью в 5 триллионов цифр после запятой[19][20].
19 октября 2011 года Александр Йи и Сигэру Кондо рассчитали последовательность с точностью в 10 триллионов цифр после запятой[21][22].
Голландский математик Брауэр в первой половине XX века привёл в качестве примера бессмысленной задачи поиск в десятичном разложении ПИ последовательности <0123456789>— по его мнению, нужная для этого точность никогда не будет достигнута. В конце XX века эта последовательность была обнаружена, она начинается с 17 387 594 880-го знака после запятой.- Википедия
Большой медведь
Грозен, а глупый ведь…
Бейсик вкратце – 1
Статья излагает языковые средства VBScript и доступна школьникам старших классов.
Первая часть содержит следующие подзаголовки:
Программа
Программа – это предписание для компьютера, которое программист составляет на особом искусственном языке. А бейсик – это один из таких языков. У бейсика имеется несколько диалектов. Однако в данной статье мы будем пытаться излагать ту часть бейсика, которая относится ко всем вариантам языка. Кроме того мы постараемся, чтобы эта часть языка оказалась достаточно богатой для написания на ней работающих программ.
Программа на любом языке выглядит как обычный текст. В таком виде она может быть напечатана на бумаге. В таком же виде вы можете увидеть ее на экране компьютера. Для выполнения программа передается компьютеру, оснащенному специальной бейсик-средой. Конкретные варианты бейсик-среды мы будем обсуждать позже. Пока же программа для нас это просто некоторый текст, а бейсик-среда, которая, собственно, и может выполнять программу, – это просто бейсик. Таким образом, вы можете спросить приятеля: «А у тебя установлен бейсик?». А приятель может вам пожаловаться: «Бейсик выполнил мою программу до 120-й строки и остановился.»
Каждая строка программы на бейсике обычно содержит ровно одну команду для компьютера. Например, команда
Оператор присваивания
Переменная это своего рода контейнер для хранения данных. Программист дает переменной имя, которое использует для работы с этой переменной. Чтобы положить данные в переменную он использует оператор присваивания. Например:
Этот оператор присваивает переменной с именем A значение 5. Оператор
Теперь переменной A присвоено новое значение. Прежнее значение переменной безвозвратно утеряно, поскольку переменная может хранить только одно значение. Обратите внимание на то, что при записи числа 7,5 мы отделили целую часть от дробной не запятой, а точкой. Это стандартный способ записи десятичных дробных чисел во всех языках программирования.
Естественно, такой оператор нельзя рассматривать как равенство A = A + 1, ведь такое равенство никогда бы не выполнялось.
Итак, оператор присваивания предписывает вычислить выражение, которое находится справа от знака « = » и присвоить результат переменной, имя которой стоит слева от этого знака.
Вычисления
Как мы видим, справа от знака присваивания должно стоять выражение, которое бейсик должен вычислить. При помощи выражения программист указывает, какие вычисления и в какой последовательности должен произвести компьютер. В качестве выражения может выступать одиночная переменная или константа. Но выражение может быть произвольной сложности. В выражение могут входить числовые константы, переменные и знаки операций. Знаки операций и их старшинство в бейсике такие же, как и в математике, за исключением того, что для умножения используется знак « * », а для возведения в степень знак « ^ ». Для указания порядка выполнения операций можно использовать круглые скобки. Имеется большой выбор стандартных математических функций. Например, Sqr – это извлечение квадратного корня, Sin – это взятие синуса.
Допустим, нам нужно вычислить длину гипотенузы c, при заданных длинах катетов 3 и 4. Мы можем выполнить следующие операторы:
но мы пока больше думаем не об экономии, а о наглядности. Для вычисления угла, лежащего против катета a, можно воспользоваться функцией арктангенса Atn :
Угол мы получили в радианах. Для перевода его в градусы нужно разделить его на пи и умножить на 180
Правда, число пи приведено не очень точно – всего 5 знаков после запятой, то есть в случае бейсика надо сказать – после десятичной точки. Но ведь мы пока и не знаем, сколько знаков при записи числа бейсик действительно проглотит. С другой стороны, цифры числа пи с большой точностью придется разыскивать в каком-нибудь справочнике. В языке паскаль имеется специальная функция для получения числа пи, а в бейсике такой функции нет. Зато в нашем распоряжении имеется функция Atn. Давайте запишем преобразование радианов в градусы следующим образом:
Один раз вычислив переменную pi, можно воспользоваться ею и при дальнейших вычислениях – число пи в математике может требоваться часто.
Теперь, когда наши операторы стали, наконец, делать что-то полезное, возникает естественный вопрос: как сообщить внешнему миру результаты вычислений.
Запуск программы
Мы не предполагаем, что вы немедленно начнете пробовать на компьютере приводимые нами примеры. Полезнее сначала вдумчиво прочитать текст без использования компьютера. Но вы будете чувствовать себя комфортнее, если будете знать, что в любой момент можете проверить вашу программу в натуре. Если ваш компьютер оснащен операционной системой Windows, то вам даже не придется устанавливать никаких дополнительных программ.
Откройте какой-нибудь текстовый редактор, например блокнот (Notepad), и занесите в него текст программы. Размещаем каждый оператор на отдельной строке. Особо следует сказать о пробелах. Пробел нужен бейсику лишь для отделения одного слова или числа от другого. Если же рядом со словом стоит знак операции, то пробел между ними не обязателен. Пробелы широко используется программистами для декоративных целей. Для того чтобы текст читался легче, принято выделять пробелами знаки операций. Пробелы мы будем использовать также для выделения блоков текста при помощи отступов. Для этих целей можно использовать также символ табуляции, который для бейсика эквивалентен пробелу. Красота и удобство восприятия может также потребовать переноса длинного оператора на новую строку. Для этого достаточно в том месте вашего оператора, где возможен пробел (ну, то есть, не в середине слова или числа), поставить пробел и символ подчеркивания. После этого оператор можно смело продолжить на новой строке. Символ подчеркивания должен быть последним символом в строке. Проследите, чтобы после него случайно не оказалось пробела или другого невидимого символа.
Сохраните набранный текст на рабочий стол с расширением vbs. Операционная система знает, что файлы vbs содержат сценарий на одном из вариантов бейсика – языке VBScript, и показывает эти файлы в виде иконки, похожей на свиток. Теперь, если вы кликните на иконке (клик должен быть двойным или одинарным в зависимости от установок Windows), то ваша программа запустится. Язык VBScript – это упрощенный вариант бейсика. Например, команда Beep в этом языке отсутствует и, поэтому, работать не будет. Мы постараемся в дальнейшем не выходить за рамки языка VBScript, чтобы все примеры можно было запустить без особых хлопот.
Ваша программа сможет вводить данные при помощи функции InputBox, а выводить результаты при помощи функции MsgBox. Попробуйте выполнить следующую программу, содержащую две строки:
Хранение в переменной не числа, а произвольного набора символов – это нечто новое. Работе со строками символов нам сейчас и предстоит научиться.
Работа со строками
Со строками так или иначе приходится сталкиваться, например, при вводе или выводе данных. Всё что пользователь вводит посредством клавиатуры, так или иначе передается в программу в виде строк. Программа должна уметь разобраться в том, что он там навводил, сообщить ему об ошибках (тоже в виде строк), если нужно, преобразовать строки в числа и т. д. Вывод результатов тоже связан со строками: вывод логично начать с поясняющего заголовка, между числами можно разместить надписи – а ведь это всё строки!
В конце-концов, имеются программы, которые не предназначены для вычислений, а связаны исключительно с обработкой текстов. Да что там – имеются, – таких программ большинство! Рассмотрим, какие же возможости в части обработки строк предоставляет нам бейсик.
Программа может сохранить строку в переменной. Иными словами, значение переменной может быть не только числовым, но и строковым. Например, оператор
присваивает переменной a_plus_b соответствующее строковое значение. Справа от знака присваивания « = » мы видим строковую константу. Строковая константа получается, если последовательность некоторых символов заключить в двойные кавычки. Двойные кавычки служат для бейсика признаком и ограничителем строковой константы, но не включаются в значение константы. Чтобы получить значение строковой константы, следует отбросить ограничивающие её кавычки. Таким образом, в нашем случае переменная a_plus_b получит строковое значение, состоящее из пяти символов ABCDE. Символы, которые находятся внутри кавычек, бейсик старается не анализировать. К примеру, если внутри строки встретится символ апострофа « ‘ », то остаток программной строки не будет рассматриваться бейсиком как комментарий. Однако бейсику, конечно, приходится при анализе внутренности строки реагировать на символ двойной кавычки, ведь этот символ по идее должен служить признаком окончания строки. Для того чтобы символ двойной кавычки всё же мог являться частью строки, в бейсике договорились удваивать этот символ, если он содержится в строковой константе. Например, константа «»»A»»» содержит три символа, а именно: «A». Одинарная кавычка – апостроф – не удваивается. Например, мы можем записать такую константу: «can’t». В отличие от написания имен, при написании текстовых констант приходится обращать внимание на регистр букв, поскольку «ABCDE» и «Abcde» – это разные константы.
Возможность хранить в переменной значения разных типов подразумевает, что переменная вместе со значением должна хранить также информацию о типе этого значения. Вы понимаете теперь, что, скажем, при сложении таких переменных бейсик не просто должен сложить значения, но проверить типы переменных и, если потребуется, провести предварительные преобразования строковых значений к числу. Для повышения эффективности вычислений логично применять другой подход: каждая переменная может хранить значения определенного типа, и этот тип явно указывается при объявлении переменной. Таким образом, у бейсика появляется возможность не заниматься проверками и тем самым организовать вычисления более эффективно. Однако объявление типа переменных доступно только в полном варианте бейсика. Наш вариант языка допускает только бестиповые или, как их еще называют, вариантные переменные.
Но продолжим обсуждение строкового типа. Основная, и пожалуй, единственная операция над текстовыми значениями – это сцепление текстов или конкатенация. Все остальные действия над строками осуществляются при помощи стандартных функций. Для конкатенации рекоменднуется использовать знак « & », хотя чаще всего можно вместо него пользоваться знаком « + ». Разберем ряд примеров.
В данном случае обе переменные a и b получают одно и то же значение «ABCDEF». Нюансы возникают, когда в операции участвуют числа. Вот что будет при выполнении следующих операторов:
Бейсик исходит из того, что программист всегда прав. В первом и втором случаях он видит строковую операцию « & » и поэтому пытается преобразовать числа в строку. Если же он увидит операцию « + » а один из операндов числовой, тогда он полагает, что второй операнд также должен быть числом, и пытается провести соответствующее преобразование. Понятно, что такое либеральное отношение бейсика к тому что пишет программист, чревато тем, что возможная ошибка программиста не будет вовремя замечена. Поэтому безопаснее обозначать конкатенацию знаком « & » а не « + ».
Теперь рассмотрим некоторые нюансы, связанные с преобразованием данных. Дело в том, что преобразование числа в строку и обратно происходит в соответствии с локальными установками Windows. Эти установки в частности конкретизируют символ, который используется при отделении дробной части числа от целой. На большинстве компьютеров этот символ – запятая. Бейсик же предполагает, что программу пишет программист, приверженный общемировым программистским ценностям, и изображающий число в программе с использованием точки. А вот, преобразуя число в строку, бейсик предполагает, что результат такого преобразования будет читать обычный бухгалтер, и здесь вполне оправдано применить локальные установки. Надо сказать, что не каждый программист подозревает о такой услужливости бейсика. Чтобы не попадать в таких случаях впросак, подробно разберем следующий пример:
В последнем случае бейсик отказался преобразовывать строку в число, поскольку дробная часть в записи числа отделена точкой, а не запятой. Так что запомним: числа в программе пишет программист, и поэтому, там всегда нужно использовать точку. Числа в строке обычно попадают в программу после ввода строк рядовым пользователем программы. И поэтому в этих числах используются региональные установки.
Рассмотрим теперь строковые функции.
Функция Len(str) возвращает длину строки str. Если строка пустая, то есть не содержит ни одного символа, то возвращается ноль.
Функция Left(str, count) принимает два параметра: строковый str и числовой count. Она отсчитывает с левой стороны строки str ровно count символов, формирует из них строку и возвращает ее значение. Если строка str содержит менее чем count символов, то возвращается вся строка str.
Функция Right(str, count) работает также как и функция Left, только отсчет идет с правой стороны строки.
Функция Mid(str, position, count) возвращает «середину» строки str, начиная с позиции position (нумерация символов строки ведется с единицы) и длиной count. Если параметр count не задан (то есть указано только два первых параметра), то возвращается часть строки начиная со стартовой позиции и до конца строки. Строка str может оказаться недостаточно длинной. В этом случае функция ведет себя довольно логично. Если указанная начальная позиция больше чем длина строки, то будет возвращена пустая строка. Если параметр count требует выхода за пределы исходной строки, то возвращаются те символы, которые имеются в наличии, то есть с начальной позиции position и до конца строки. Кстати, Mid – это сокращение от Middle – середина.
Приведем несколько примеров работы этих функций.
Теперь уже нетрудно очистить строку от комментария и выделить комментарий в чистом виде, без скобок
Пример: нам надо из полного пути файла выделить имя файла и его расширение. Полный путь может быть, например, таким:
применяем обратный поиск
Замену подстроки в строке проще всего осуществлять функцией, которая так и называется – Replace (заменить). Эта функция не просто заменяет, она ищет и заменяет найденное. Например, строку
после скачка цен можно «индексировать» так
Теперь строка t будет иметь следующее значение:
Функция нашла все вхождения подстроки «сто» и заменила их на строку «сто двадцать». Саму строку s функция оставила нетронутой. Так же как и функция InStr функция Replace может осуществлять поиск не с начала строки, а с указанного места. Позицию начала поиска можно указать в 4-м параметре. Единственное неудобство это то, что возвращаемое значение будет при этом начинаться с этого же места, то есть начало строки будет обрезано. Например:
Функция Replace может иметь пятый параметр – максимальное количество замен. Понятно, что если вы задали пятый параметр, то четвертый параметр также должен присутствовать. Например, возвращаясь к нашим рублям и друзьям мы можем поправить оператор «индексации» следующим образом
Теперь мы учли, что дружба инфляции не подверглась, и получили окончательное значение строки t
а следующий оператор удалит пробел в конце строки, если он есть:
Последовательность выполнения операторов
Как мы уже имели возможность наблюдать, операторы программы выполняются по очереди, сверху вниз. Однако есть возможность изменить этот естественный порядок выполнения при помощи специальных операторов. Мы начнем с рассмотрения оператора If. Самый простейший вид этого оператора следующий:
Как вы видите, это не совсем оператор, а какая-то непонятная конструкция, расположенная на нескольких строках. Первую строку этой конструкции и занимает, собственно, оператор If. Этот оператор открывает собой группу операторов. Признаком конца этой группы служит строка « End If ». Операторы группы выполняются только в том случае, если условие оператора If истинно. В противном случае бейсик пропускает эти операторы и переходит к выполнению того, что следует за строкой « End If ». В качестве условия должно выступать, выражение, истинность которого бейсик может проверить.
Например, нам надо вычислить максимум из значений переменных a и b. Сначала мы пробовали написать что-то вроде c = Max(a, b), но обнаружили, что функция Max среди стандартных функций бейсика отсутствует. Следующие операторы решили проблему
Здесь в качестве условия выступает сравнение « a », смысл которого понятен из написания. Вычисление максимума можно записать по-другому:
Здесь в составе условного оператора появилась еще одна группа, тоже состоящая из единственного оператора. Эта группа начинается после строки « Else ». Слово else означает «иначе», «в противном случае». Операторы, следующие после « Else » выполняются только в том случае, если условие « a » не выполняется.
Сравнивать можно не только числа, но и строки. Здесь возникает много нюансов и мы в свое время будем о них говорить. Следующий условный оператор удаляет пробел в конце строки, если строка кончается пробелом:
Здесь вам всё должно быть понятно: один оператор If находится внутри другого. Для того, чтобы логика вложенности была ясней мы выделили группы операторов отступами. Пробелы в начале строк никак не влияют на выполнение операторов, однако они помогают человеку понять логику программы.
Те, кого смущает большое количество строк для записи оператора If, могут использовать однострочную форму этого оператора, которая особенно удобна, когда группа операторов содержит один оператор. Вот как можно записать предыдущий пример.
Как видите, запись сократилась еще и за счет того, что пропали операторы End If. Отсутствие оператора End If, как вы знаете, чревато некоторыми недоразумениями. Например, в следующем варианте того же самого примера два слова If, но одно слово Else :
Непонятно, к которому из двух слов If бейсик отнесет слово Else. Эта двусмысленность решается стандартным образом: встретив слово Else, бейсик просматривает строку влево до первого If, который не имеет своего Else.
Вы можете подумать, что однострочный If можно применять только с такими группами операторов, которые состоят из одиночного оператора. Это не так. Группа может состоять из нескольких операторов, только между ними нужно поставить разделитель «:». Допустим, вам надо обменять значения переменных a и b, если а>b, тогда можно выполнить следующий оператор:
И вообще, используя двоеточие вы всегда можете объединить несколько операторов бейсика, расположенных на нескольких строках, в единую строку. Вот как может выглядеть наш первоначальный многострочный пример, сначала записанный в одну строку, а потом еще и разбитый на две строки при помощи подчеркивания:
Ясно, что слова End If при этом пропускать нельзя. Можно ли при этом говорить о наглядности? Ответ на этот вопрос зависит от того, что вам нужно. Если вам нужна обозримая программа, которая помещается на одном экране, то за наглядность ее деталей наверно можно и не бороться.
Вернемся, однако к первоначальной записи нашего примера. Она ведь тоже не очень наглядна. Понятно, что вложенность операторов If не отражает сути дела, а вызвана только тем, что мы пытаемся выбирать из трех вариантов при помощи двухальтернативного If. Однако ведь у оператора If есть в распоряжении не только Else. Можно ведь использвать еще и ElseIf. Вот как будет выглядеть наш If, если его «разлить на троих».
Здесь внутри одного и того же оператора If уже три группы операторов. Вторая из них начинается со строки « ElseIf ». А выполнение такого оператора происходит следующим образом: проверяется условие в строке « If » и если оно истинно, выполняется первая группа операторов. Если же это условие ложно, то проверяется условие в строке « ElseIf ». При истинности этого условия выбор делается в пользу второй группы. Группа операторов после строки « Else » выполняется только в том случае, если оба условия ложны.
Оператор If может содержать несколько строк « ElseIf », каждая со своим условием и группой операторов. Бейсик будет проверять условия последовательно сверху вниз, пока не натолкнется на истинное. Группа с истинным условием и будет выполняться. Если все условия ложны то выполнится группа « Else ». Если же « Else » отсутствует, а такое тоже возможно, то не будет выполнена ни одна из групп. После выполнения операторов любой из групп бейсик переходит к операторам, следующим непосредственно за строкой « End If », таким образом, различные группы операторов взаимоисключают друг друга.
Для того, чтобы не дублировать сравнения для больших и маленьких букв, анализируемая буква была преобразована в верхний регистр при помощи функции UCase (Upper case – верхний регистр). Эта функция принимает один строковый аргумент и возвращает его с буквами преобразованными в верхний регистр. При этом русские буквы преобразуются тоже, (конечно, если в системе есть поддержка русского языка). Имеется аналогичная функция LCase (Lower case – нижний регистр) для преобразования букв в нижний регистр. Обращаем ваше внимание, что обе функции оставляют неизменным сам аргумент, а результат преобразования только «возвращают».
Вернемся к задаче выделения комментариев из строки вида
Если комментарий в этой строке отсутствует, то нам желательно не пытаться выделять комментарий, а присвоить выходным переменным cont и comm осмысленные значения. Для этого достаточно ввести дополнительные проверки при помощи уже изученного нами оператора If.
Здесь вас должно смутить то, что один и тот же фрагмент программы, повторяется дважды. Мы имеем ввиду два оператора после строки « Else ». Когда это только два оператора, то об экономии можно было бы и не заботиться. Ну а если бы это был обширный фрагмент, да в добавок его было бы нужно модифицировать от запуска к запуску? Универсальный способ избежать дублирования кода – это вынос этого кода в подпрограмму, и мы обязательно научимся это делать. Но в нашем случае можно просто немного изменить логику сравнений:
Во втором операторе « If » мы видим два сравнения, между которыми стоит слово « And. » В данном случае нам понятно, что это такое, ведь « And » переводится как «и». То есть первая группа операторов выполняется только если истинны оба сравнения. Но стоило бы узнать подробнее о тех возможностях, которые может предоставить нам оператор « If ».
Логический тип
На самом деле, после слова « If » или « ElseIf » может стоять произвольное выражение, которое бейсик попытается привести к логическому типу. Выражение логического типа может принимать два значения True – «истина» и False – «ложь». Сравнение – это как раз и есть выражение логического типа, точнее говоря, – выражение, которое при вычислении дает значение логического типа.
Имеется шесть операций сравнения:
Над значениями логического типа возможны математические действия – это так называемые логические связки:
Если же говорить о старшинстве среди всех операций, то здесь на первом месте стоят арифметические операции, на втором – сравнения, далее следуют логические связки. В следующем выражении скобки излишни и только обозначают порядок вычислений в соответствии со старшинством операций.
Если же старшинство нескольких стоящих рядом операций одно и то же, то операции выполняются последовательно слева направо:
Мы уже сталкивались с подобным выражением, когда переводили угол из радианов в градусы:
Мы не хотим здесь погружаться в эту нудную тему. Логические связки мы намеренно перечислили не все, имеются также неизвестные нам арифметические операции. Мы хотим лишь подчеркнуть, что логический тип, ничем не хуже арифметического. В частности, логическое значение можно сохранять в переменной.
можно написать – не пугайтесь
Для тренировки рассмотрим следующий замысловатый оператор присваивания
Он выполняется по общим правилам. Здесь операция сравнения « = » выполняется справа налево, т. е.:
Бейсик может произвести и обратное преобразование
Последний пример не очень понятен. Дело в том, что бейсик видит числовую операцию и пытается привести логическое выражение к числу. False он привел бы к нулю, а True приводит к минус единице. Почему именно к минус единице, можно понять если вспомнить, что минус единица в двоичном виде выглядит как «все единицы».
Сравнение строк
Строки мы уже сравнивали, и смысл сравнения понятен, когда происходит сравнение строк на равенство или неравенство. Но как поступает бейсик, когда строки сравниваются на «больше» или «меньше»? Например мы написали так:
Здесь придется напомнить вам о том, что каждый символ строки запоминается в компьютере в виде кода – небольшого целого числа от 0 до 255. А числа уже можно сравнивать. Символ «F» меньше символа «G» просто потому что код символа «F» меньше чем код символа «G». Мы не будем здесь приводить коды символов. Скажем лишь, что коды букв соответствуют их алфавитному порядку – чем дальше буква от начала алфавита, тем ее код больше. Код строчных букв больше кода прописных. Код русских букв больше кода латинских. Коды цифр меньше чем коды букв, коды служебных символов (пробел, запятая) еще меньше.
присвоит строке s значение «F-G». Без функции Chr бывает трудно обойтись, когда требуется включить в строку символы, не имеющие графического представления, например, символ табуляции или перевода строки.
Но вернемся к сравнению строк. Как бейсик поступит, если строки состоят из нескольких символов? В этом случае сначала сравниваются первые символы строк. Если они равны, то сравниваются вторые символы и так до тех пор пока будет получено несовпадение, либо одна из строк не кончится. При несовпадении символов бейсик сравнит коды этих символов – и вопрос решен. А если одна из строк кончится раньше, то бейсик будет полагать, что именно эта строка меньше.
Такой способ сравнения называется лексикографическим. Его можно использовать, когда надо упорядочить некоторые слова, например фамилии, по алфавиту. Та фамилия, которая «меньше», должна стоять выше в списке. Затруднения возникают, когда некоторые фамилии набраны прописными буквами, ведь код прописной буквы всегда меньше кода строчной (для одного и того же языка). Например, строка «ИГНАТОВ» меньше, чем строка «Иванов», и поэтому при упорядочении будет претендовать на верхние места в списке. Это не совсем то, чего бы нам хотелось.