Программирование на visual basic
Скачать 1.19 Mb.
|
1.4.1. Математические функции Имя функ- ции Описание действий функции Abs(x) Возвращает значение, тип которого совпадает с типом пе- реданного аргумента x, равного абсолютному значению указанного числа Atn(x) Возвращает значение типа Double, содержащее арктангенс числа x. Значение, возвращаемое данной функцией, лежит в диапазоне от - π/2 до π/2 радиан Cos(x) Sin(x) Tan(x) Возвращает значение типа Double, содержащее косинус, синус и тангенс угла. Обязательный аргумент x представ- ляет значение типа Double или любое допустимое числовое выражение, задающее угол в радианах Exp(x) Возвращает значение типа Double, содержащее результат возведения числа e (основание натуральных логарифмов) в указанную степень. Обязательный аргумент x представляет значение типа Double или любое допустимое числовое вы- ражение. Если значение аргумента число превышает 709, возникает ошибка. Константа e приблизительно равняется 2,718282 Sqr(x) Возвращает значение типа Double, содержащее квадратный корень указанного числа x. Обязательный аргумент x пред- ставляет значение типа Double или любое допустимое не- отрицательное числовое выражение Log(x) Возвращает значение типа Double, содержащее натураль- ный логарифм числа x. Обязательный аргумент x пред- ставляет значение типа Double или любое положительное допустимое числовое выражение 20 Int(x) Fix(x) Возвращают значение типа, совпадающего с типом аргу- мента x, которое содержит целую часть числа. Обязатель- ный аргумент x представляет значение типа Double или любое допустимое числовое выражение. Обе функции Int и Fix отбрасывают дробную часть числа и возвращают целое значение. Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента x функ- ция Int возвращает отрицательное ближайшее целое число, меньшее либо равное аргументу, а Fix отрицательное бли- жайшее целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8 Sgn(x) Возвращает значение типа Variant (Integer), соответствую- щее знаку указанного числа. Обязательный аргумент x мо- жет представлять любое допустимое числовое выражение. Возвращаемые значения:-1, если x <0; 0 при x=0 и 1 при x>0 Rnd(x) Возвращает значение типа Single, содержащее случайное число в диапазоне от 0 до 1. Если аргумент x<0, то каждый раз возвращается одно и то же число, используя аргумент число в качестве опорного числа. Если аргумент >0 или не задан, то возвращается следующее случайное число в по- следовательности. Если аргумент =0, то возвращается слу- чайное число, совпадающее с числом при предыдущем вы- зове этой функции. Перед вызовом функции Rnd обычно используют инструкцию Randomize для инициализации генератора случайных чисел значением, возвращаемым системным таймером Round Round(число, кол-во знаков). Возвращает число, округлен- ное до указанного количества знаков после запятой Используя встроенные основные математические функции, можно вы- числить остальные математические функции по формулам: Секанс Sec(X) = 1 / Cos(X) Косеканс Cosec(X) = 1 / Sin(X) Котангенс Cotan(X) = 1 / Tan(X) Арксинус Arcsin(X) = Atn(X / Sqr(-X * X + 1)) Арккотангенс Arccotan(X) = Atn(X) + 2 * Atn(1) Арккосинус Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) Логарифм по основанию N LogN(X) = Log(X) / Log(N) 21 1.4.2. Символьные функции Символьные функции предназначены для работы с переменными тек- стового типа. При помощи текстовых функций можно найти определенные слова в тексте, сделать замену одного слова на другое, поменять местами буквы или набор букв и т.д. В табл. 1.5 представлены основные символьные функции. Причем мно- гие функции могут вызываться с различными количествами аргументов. При этом некоторые аргументы являются необязательными, т.е. при их от- сутствии компилятор вызывает функцию без этого параметра. В табл. 1.5 аргументы, которые являются необязательными, заключены в квадратные скобки. Таблица 1.5 Имя функ- ции Краткое описание действий функций и их аргументов Mid Mid(string, start[, length]). Возвращается подстрока, содер- жащая указанное число (length) символов строки string, на- чиная с символа номер start. При отсутствии последнего ар- гумента возвращается подстрока от символа start до конца строки. Mid(“Паровоз”,3,2) – возвращает подстроку ро Mid(“Паровоз”,5) – возвращает воз Left Left (string, length). Возвращается левая часть строки длиной length Left (“Привет, Маша!”,6) – возвращает слово Привет Right Right (string, length). Возвращается правая часть строки дли- ной length Right(“Привет, Маша!”,5) – возвращает подстроку Маша! Trim Trim(string). Возвращается строка string без начальных и ко- нечных пробелов Ltrim(“ Привет, Маша! ”) –возвращает подстроку Привет Маша! Ltrim RTrim Возвращается строка string без начальных Ltrim и конечных Rtrim пробелов Trim(“ Привет, Маша! ”) – возвращает подстроку Привет Маша! . Ucase Ucase(string). Возвращается строка string, преобразованная к верхнему регистру. Ucase(“привет”) – возвращает ПРИВЕТ Lcase Lcase(string). Возвращается строка string, преобразованная к нижнему регистру. Lcase(“ПРИВЕТ”) – возвращает привет 22 InStr InStr([start,] string, sh [,Comp]). Возвращает целое число, указывающее позицию первого вхождения строки sh внутри строки string. Если подстроки sh нет в строке string, то воз- вращается 0. Необязательный аргумент start показывает на- чало поиска. Если он опущен, то поиск производится, начи- ная с первого символа. Аргумент Comp задает способ срав- нения строк. Он может быть опущен или иметь значение 0 или 1. Если аргумент Comp присутствует, то обязан присут- ствовать и аргумент start. По умолчанию он равен Comp = 0. При Comp = 1 буквы на нижнем регистре и верхнем регист- ре считаются одинаковыми InStr(“Наша Наташа нашла ”,”на”) – возвращает 13 InStr(1,“Наша Наташа нашла ”,”на”,0) – возвращает 1 InStr(3,“Наша Наташа нашла ”,”на”,0-) – возвращает 6 Space Space(число). Возвращает значение типа String, содержащее указанное число пробелов. Space(20) – возвращает 20 про- белов Len Len(String). Возвращает значение типа Long, содержащее число символов в строке. Len(“Привет”) – возвращает 5 Chr Chr(Код). Возвращает значение типа String, содержащее символ, соответствующий указанному коду символа. Chr(65) – возвращает A. Chr(97) – возвращает a String String( Число, Символ ). Возвращает значение типа String, содержащее повторяющуюся строку указанной длины String(5, "*"); String(5, 42); String(5, "*123"). Все три функ- ции возвращают строку ***** Str Str(Число). Возвращает значение типа String, являющееся строковым представлением числа. Str(3.14) – возвращает строку “3.14” StrComp StrComp(string1, string2[, Comp]). Возвращает значение типа Integer, представляющее результат сравнения строк string1 и string2. Параметр Comp имеет такой же смысл, что и для функции InStr. Функция возвращает –1,если string1 меньше, чем string2; 0, если string1 равняется string2; 1, если string1 больше, чем string2 Asc Asc(String). Возвращает значение типа Integer, равное коду символа для первого символа строки. Asc("A") – возвраща- ет 65. Asc("a") – возвращает 97. Asc("Apple") – возвращает 65 23 Hex Hex(Число). Возвращает строку, содержащую шестнадцате- ричное представление аргумента. Hex(2000) – возвращает шестнадцатеричное число 7D0 Oct Oct(Число). Возвращает строку, содержащую восьмеричное представление аргумента. Oct(2000) – возвращает восьмеричное число 3720 1.4.3. Функции преобразования Все функции преобразования имеют один аргумент. Результатом дей- ствия функций преобразования является величина, тип которой совпадает с сокращенным названием функции. CBool(выражение) – преобразует в логический тип. Если результатом вы- ражения является ненулевое значение, CBool возвращает True; в против- ном случае возвращается False. Dim A, B, C : A = 15: B = 15 : C = CBool(A = B) ' C содержит True. A = 0 : C = CBool(A) ' C содержит False. CByte(выражение) – преобразует в байтовый тип. Dim A As Double , B As Byte : A = 12.78 B = CByte(A) ' A содержит 12. Ccur(выражение) ) – преобразует в тип Currency. CDate(выражение) – преобразует в тип Date. CDbl(выражение) – преобразует в тип Double. CInt(выражение) – преобразует в тип Integer. CLng(выражение) – преобразует в тип Long. CSng(выражение) – преобразует в тип Single. CVar(выражение) – преобразует в тип Variant. CStr(выражение) – преобразует в тип String. Функции преобразования переменных часто используются при вводе данных с клавиатуры при помощи функции InputBox. Более подробно эта функция будет рассмотрена в разделе 5.2. Функция InputBox вводит с кла- виатуры строку текста, введенного в текстовое поле окна ввода данных. Если вводится не текстовое значение, то его необходимо преобразовать к определенному типу. Пример. Ввести с клавиатуры в память переменные различного типа. Sub ВводСКлавиатурыЗначенийРазличногоТипа() Dim bol As Boolean, byt As Byte, dat As Date Dim dou As Double, int1 As Integer, lon As Long bol = CBool(InputBox("Введитепеременную типа Boolean")) byt = CByte(InputBox("Введитепеременную типа Byte")) dat = CDate(InputBox("Введитепеременную типа Date")) dou = CDbl(InputBox("Введитепеременную типа Double")) int1 = CInt(InputBox("Введитепеременную типа Integer")) lon = CLng(InputBox("Введитепеременную типа Long")) 24 Debug.Print "bol= "; bol; " byt="; byt; " dat= "; dat; _ " dou= "; dou; " int="; int1; " lon= "; lon End Sub 1.4.4. Функции даты и времени Date – возвращает текущую системную дату. Now - возвращает текущую дату и время по системному календарю и ча- сам компьютера. Month( Дата ) – возвращает номер месяца (от 1 до 12). MonthName( Дата ) – возвращает название месяца. Day (Дата) – возвращает номер дня в месяце (от 1 до 31). Weekday (Data, ND) – возвращает номер дня в неделе. Первый параметр задает необходимую дату, а второй параметр указывает, какой день недели считается первым. В качестве этого параметра можно задать следующие встроенные константы: vbSunday, vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday. Year( Дата ) – возвращает число типа Integer, соответствующее номеру года параметра Дата. Timer – возвращает переменную типа Single, содержащую показание сис- темных часов текущего времени компьютера в секундах, начиная с начала суток. Time – возвращает текущее время на системных часах компьютера. Hour , Minute и Second( время ) – эти три функции возвращают число целых часов, минут и секунд в параметре время. Рассмотрим пример демонстрирующий функции даты и время. Sub ПримерНаФункцииДаты() Dim d As Date d = #4/12/1961 10:35:17 PM# 'Время старта Debug.Print "Сегодня " & Now Debug.Print "Ю. Гагарина стартовал в космос: "; Chr(10); _ "День - "; Day(d); " Месяц - "; Month(d); MonthName(Month(d)); _ " Год - "; Year(d); Chr(13); "Часы - "; Hour(d); "Минуты - "; _ Minute(d); "Секунды"; Second(d); " День недели - "; _ WeekdayName(Weekday(d, vbMonday)); "." End Sub Результаты работы программы: Ю. Гагарина стартовал в космос: День - 12 Месяц - 4 Апрель Год - 1961 Часы - 22 Минуты - 35 Секунды 17 День недели – среда. 25 2. Управляющие операторы Управляющие операторы служат для изменения последовательности выполнения программы. При помощи таких операторов программируются разветвляющиеся и циклические алгоритмы. 2.1. Оператор безусловного перехода Общая форма: GO TO m где m - метка оператора данного программного модуля. В VB любой оператор можно пометить, поставив перед ним метку. Метка — это произвольная последовательность символов, после которой ставится символ двоеточие. В первых версиях языка Basic все операторы в обязательном порядке имели метки в виде числа, поэтому оператор пере- хода применялся очень часто. Оператор безусловного перехода является самым простым оператором. В результате выполнения оператора безусловного перехода происходит передача управления оператору, помеченному меткой m, который может быть расположен как выше, так и ниже данного оператора безусловного перехода. Примечание. Применение операторов безусловного перехода затруд- няет чтение программы, а также усложняет процесс оптимизации компи- лятором объектного кода, поэтому его необходимо применять только в редких случаях. Существует байка: уровень программиста обратно про- порционален количеству операторов безусловного перехода. Этот опера- тор программисты обязаны были использовать при написании программ на старом Basic. На самом деле во всех программах, написанных на языке Visual Basic, спокойно можно обойтись без применения этого оператора. Только в том случае, когда в зависимости от каких-то условий необходимо перейти в другой участок программы значительно ниже или выше данного оператора, можно использовать этот оператор. При выходе из внутреннего цикла также необходимо применять этот оператор. В учебных программах, приведенных в данной работе, он используется очень редко. Разработчики нового современного языка Java полностью отказались от этого оператора как от “вредного”. 2.2. Логические операторы if Операторы перехода if предназначены для передачи управления опера- торам программного модуля в зависимости от выполнения некоторого ло- гического условия. 26 2.2.1. Простой укороченный if Общая форма: IF(L) Then S где L ⎯ логическое выражение; S ⎯ любой выполняемый оператор, от- личный от блочного оператора if , оператора цикла или другого логическо- го оператора if Примечание. В качестве S могут быть несколько простых операторов, на- ходящихся на одной строке и разделенных запятой. Оператор работает следующим образом: 1) вычисляется логическое условие L; 2) если L =True, то выполняется оператор S. Затем выполнение про- граммы продолжается со следующего оператора, если только оператором S не является оператор Goto. Если значение выражения L=False, оператор S не выполняется, а выполняется оператор, следующий за оператором if Пример. Вводится номер дня недели. Необходимо напечатать его на- звание. Если день равен 6 или 7, то напечатать еще и текст (Выходной день), а если меньше 6, то - (рабочий день). Sub НазваниеДняНеделиПоНомеру() Dim nameDay As String, numberDay As Long numberDay = InputBox(" Введите номер дня недели") If numberDay = 1 Then nameDay = "Понедельник" If numberDay = 2 Then nameDay = "Вторник" If numberDay = 3 Then nameDay = "Среда" If numberDay = 4 Then nameDay = "Четверг" If numberDay = 5 Then nameDay = "Пятница" If numberDay = 6 Then nameDay = "Суббота" If numberDay = 7 Then nameDay = "Воскресенье" If numberDay = 6 Or numberDay = 7 Then nameDay = nameDay + _ “(Выходной" If numberDay<6 Then nameDay = nameDay +"(Рабочий" MsgBox (nameDay & " день)") End Sub Примечание. Данную задачу лучше решать с использованием операто- ра SELECT, описанного ниже. 2.2.2. Простой полный if Общая форма: IF(L) Then S Else S 1 где L ⎯ логическое выражение; S и S 1 ⎯ любые выполняемые операторы, отличные от блочного оператора if , оператора цикла или другого логиче- ского оператора if Оператор работает следующим образом: 1) вычисляется логическое условие L; 27 2) если L =True, то выполняется оператор S, а иначе оператор S 1 . Затем выполнение программы продолжается со следующего оператора. Пример. Написать программу, которая введенное с клавиатуры дейст- вительное число x преобразует в число y по правилу: если x положитель- ное, то y= lnx, иначе y=0. Sub ТестПолныйIf() Dim x As Double, y As Double x = CDbl(InputBox("Введите число")) If x > 0 Then y = Log(x) Else y = 0 MsgBox ("x=" & x & " y=" & y) End Sub 2.2.3. Блочные операторы If Блочные операторы If предназначены для написания структурирован- ных программ. При их использовании сокращается количество помечен- ных операторов и количество операторов Goto, что приводит к более про- стым программам. 2.2.4. Укороченный блочный If Общий вид: IF(L) Then S End If где L - логическое выражение; S - блок операторов. Оператор работает следующим образом. Вычисляется логическое выражение L. Если оно истинно, то выполняется блок операторов S, после чего управление переда- ется оператору следующему за End If If(L1) Then S1 S2 If(L2) Then S3 If(L3) Then S4 S5 End If S6 End If S7 End If Блочные операторы If могут быть вложенными друг в дру- га. В сложных программах количество вложений может быть достаточно большим, и бывает трудно разобраться, какой оператор End If закрывает данный блок If. В таких программах следует применять выравнивание всех опера- торов, относящихся к одному блоку. А также можно ста- вить комментарии на некоторые отдаленные End If. При проверке таких участков программ следует придерживать- ся правил: любой оператор End If относится к ближайше- му, находящемуся выше незакрытому оператору If. Коли- чество блочных If должно соответствовать количеств End If. Не допускается пересечение блоков If Пример. Вводятся три числа a, b и c, являющиеся коэффициентами квадратного уравнения. Найти его корни. Предусмотреть все возможные комбинации решений. Sub РешениеКвадратногоУравнения() 28 ' Вводится константа, определяющая машинный нуль. ‘Потеря точности при вычислении дискриминанта Const Dnull = 1E-20 Dim a As Double, b As Double, c As Double, x1 As Double, _ x2 As Double, d As Double ' Функция CDbl переводит текстовую переменную, возвращаемую ' функцией InputBox, в число MsgBox ("Введите коэффициент квадратного уравнения a, b и c") a = CDbl(InputBox("Введите a")) b = CDbl(InputBox("Введите b")) c = CDbl(InputBox("Введите c")) If Abs(a) < Dnull Then GoTo Aeq0 ' Если линейное уравнение d = b ^ 2 - 4 * a * c ' Дискриминант уравнения If d > Dnull Then ' Два корня d = Sqr(d): x1 = (-b + d) / (2 * a): x2 = (-b - d) / (2 * a) MsgBox (" x1= " & x1 & " x2=" & x2) Exit Sub 'Выйти из программы End If If d < -Dnull Then 'Дискриминант отрицательный If d < Dnull Then MsgBox ("Дискриминант < 0. Нет решений.") Exit Sub 'Выйти из программы End If 'Дискриминант = 0. Уравнение имеет один кратный корень x1 = -b / (2 * a): MsgBox (" x1= " & x1) Exit Sub 'Выйти из программы Aeq0: 'Это пример метки ' Линейное уравнение, т.к. сюда попадаем, если a=0 If Abs(b) > Dnull Then MsgBox ("x=" & -c / b) If Abs(b) <= Dnull And Abs(c) <= Dnull Then MsgBox ("Уравнение является тождеством") Exit Sub End If If Abs(b) <= Dnull And Abs(c) > Dnull Then MsgBox ("Уравнение не имеет решений") End If End Sub 6> |