В этой главе мы рассмотрим некоторые дополнительные математические операторы и функции. Глава разбита на 4 части: 1) новые операторы 2) новые целые функции 3) новые функции для работы с числами с плавающей точкой (действительные числа), и 4) тригонометрические функции.
Новые операторы
В дополнение к базовым математическим операциям, которые мы использовали с первой главы книги, есть еще три оператора в BASIC-256. Операции, аналогичные этим есть в большинстве языков программирования. Это операция деления по модулю, целочисленного деления и возведения в степень.
Операция
Оператор
Описание
Деление по модулю
%
Возвращает остаток от деления на целое число
Целочисленное деление
\
Возвращает (целое) частное от деления одного целого на другое
Степень
^
Возводит одно (целое) число в степень другого (целого)
Деление по модулю
Операция деления по модулю возвращает остаток от деления нацело. Когда вы делите два целых числа «уголком», остаток, полученный в результате и есть модуль.
1 # c12_mod.kbs 2 input «Введите целое число ", n 3 if n % 2 = 0 then print «делится на 2» 4 if n % 3 = 0 then print «делится на 3» 5 if n % 5 = 0 then print «делится на 5» 6 if n % 7 = 0 then print «делится на 7» 7 end
Программа 78 Деление по модулю
Введите целое число 10 делится на 2 делится на 5
Пример вывода программы 78 Деление по модулю
выражение1%выражение2
Оператор деления по модулю (%) возвращает остаток от деления числа выражение1 на число выражение2
Если одно или оба выражения не целые, то сначала они округляются до целого отбрасыванием дробной части (как это делает функция int()) до того, как операция будет произведена.
Вы может и не задумывались, но операция деления по модулю используется программистами довольно часто. Основные два применения это 1) проверить делится ли одно число на другое (программа 78) и 2) получить числа из ограниченного диапазона (программа 79)
1 # moveballmod.kbs 2 # Переписанная программа moveball.kbs с использованием оператора 3 # деления по модулю для ограничения движения мяча экраном 4 5 print «клавиша i — вверх, j — влево, k — вправо, m — вниз, q — закончить» 6 7 fastgraphics 8 clg 9 ballradius = 20 10 11 # позиция мяча 12 # начинаем с центра экрана 13 x = graphwidth /2 14 y = graphheight / 2 15 16 # рисуем мяч в начальном положении на экране 17 gosub drawball 18 19 # цикл ожидания ввода пользователем нажатий на клавиши 20 while true 21 k = key 22 if k = asc(«I») then 23 # y может стать отрицательным, + graphheight делает это число положительным 24 y = (y — ballradius + graphheight) % graphheight 25 gosub drawball 26 end if 27 if k = asc(«J») then 28 x = (x — ballradius + graphwidth) % graphwidth 29 gosub drawball 30 end if 31 if k = asc(«K») then 32 x = (x + ballradius) % graphwidth 33 gosub drawball 34 end if 35 if k = asc(«M») then 36 y = (y + ballradius) % graphheight 37 gosub drawball 38 end if 39 if k = asc(«Q») then end 40 end while 41 42 drawball: 43 color white 44 rect 0, 0, graphwidth, graphheight 45 color red 46 circle x, y, ballradius 47 refresh 48 return
Программа 79 Двигаем мяч с использованием деления по модулю.
Целочисленное деление
Операция целочисленного деления (\) производит обычное деление, но работает только с целыми числами и возвращает целое число. Например 13 разделить на 4 будет 3 и в остатке 1. Результатом операции целочисленного деления будет 3.
Пример вывода программы 80 Проверь как ты делишь уголком
выражение1\выражение2
Целочисленное деление (\) делит выражение1 на выражение2 и в качестве результата возвращает целое число, которое показывает во сколько раз выражение1выражение2 (частное от деления) больше
Если одно или оба числа не целые, они округляются до целого, отбрасыванием десятичной части (как это делает int()) до того, как операция будет произведена.
Возведение в степень
Оператор возведения в степень возвращает степень первого числа относительно второго.
1 # c12_power.kbs 2 for t = 0 to 16 3 print «2 ^ " + t + " = "; 4 print 2 ^ t 5 next t
Оператор степень (^) возводит выражение1 в степень заданную числом выражение2.
Математическая запись степени a = bc в BASIC-256 записывается как a = b^c
Новые целочисленные функции
Три новые функции этой главы связаны с преобразованием строк и чисел с плавающей точкой (действительных чисел) в целые числа. Все три эти функции по разному обрабатывают десятичную часть числа.
Функция int() просто отбрасывает десятичную часть числа, что равносильно вычитанию дробной части от (положительного) числа или прибавления десятичной части к отрицательному числу. Это может привести к проблемам, если мы пытаемся округлить числа меньшие нуля (0).
Функции ceil() и floor() по своему решают проблему int(). Функцияceil() дополняет дробное число до ближайшего целого, большего, чем исходное число, в то время как floor() всегда уменьшает число до ближайшего целого, меньшего данного числа.
Всех нас учили округлять, прибавляя 0,5 и отбрасывать дробную часть. Если мы используем int(), то она работает с положительными числами и не работает с отрицательными. В BASIC-256 для округления («как привычно») следует использовать формулу типа a=floor(b+0,5) .
ФункцияОписание
int(выражение)
Преобразует выражение (строку, целое или десятичную дробь) в целое число. При этом дробная часть просто отбрасывается. Если строка не содержит числа возвращается нуль.
ceil(выражение)
Преобразует выражение в ближайшее большее целое
floor(выражение)
Преобразует выражение в ближайшее меньшее целое. Для округления следует использовать формулу a=floor(b+0,5)
1 # c12_intceilfloor.kbs 2 for t = 1 to 10 3 n = rand * 100 — 50 4 print n; 5 print " int=» + int(n); 6 print " ceil=» + ceil(n); 7 print " floor=» + floor(n) 8 next t
Примерный вывод программы 82 Различие междуint, ceil и floor
Новые функции для дробных чисел
Математические функции, в которые погрузила нас эта глава могут пригодиться при написании некоторых специальных программ. В подавляющем большинстве программ они не нужны.
ФункцияОписание
float(выражение)
Преобразует выражение (строку, целое или десятичную дробь) в дробное число. Обычно используется для преобразования строк в числа. Если строка не содержит числа возвращается нуль.
abs(выражение)
Возвращает беззнаковое значение выражения (абсолютное значение)
log(выражение)
Возвращает натуральный логарифм числа (логарифм по основанию e)
log10(выражение)
Возвращает десятичный логарифм числа (логарифм по основанию 10)
Тригонометрические функции (для знакомых с ними)
Тригонометрия — наука об измерении углов и сторон (и их соотношений) в треугольнике. BASIC-256 поддерживает основные тригонометрические функции. Углы измеряются в радианах (0—2π). Если вы хотите использовать градусы (0—360) в своей программе, то необходимо значения в градусах предварительно преобразовать в радианы, а потом использовать в тригонометрических функциях.
ФункцияОписание
cos(выражение)
Возвращает значение косинуса угла
sin(выражение)
Возвращает значение синуса угла
tan(выражение)
Возвращает значение тангенса угла
degrees(выражение)
Преобразует число из радиан (0—2π) в градусы (00 3600)
radians(выражение)
Преобразует число градусов (00 3600) в радианы (0—2π)
acos(выражение)
Функция, обратная косинусу (арккосинус)
asin(выражение)
Функция, обратная синусу (арксинус)
atan(выражение)
Функция, обратная тангенсу (арктангенс)
Первые три функции имеют прямое отношение к сторонам прямоугольного треугольника. Рисунок 20 демонстрирует прямоугольный треугольник, его стороны и углы.
Рисунок 20 Прямоугольный треугольник.
Косинус
Косинус угла равен отношению прилежащего катета к гипотенузе: . Косинус повторяет свои значения в диапазоне от —1 до 1 на каждом интервале длиной 2π радиан. Рисунок 21 показывает волновой график косинуса в диапазоне от 0 до 2π.
Рисунок 21 Функция cos()
Синус
Синус равен отношению прилежащего катета к гипотенузе: . Синус также, как и косинус повторяет свои значения из диапазона от —1 до 1 на каждом интервале длиной 2π
Рисунок 22 Функция sin()
Тангенс
Тангенс равен отношению противолежащего катета к прилежащему: . Тангенс повторяет свои значения лежащие в диапазоне от —∞ до ∞ на каждом отрезке в π радиан. Такой диапазон тангенса объясняется тем, что когда угол треугольника становится очень маленьким, противолежащий катет становится очень маленьким.
Рис. 23 Функция tan()
Функция degrees
Функция degrees() преобразует значения угла из радиан в градусы по формуле: градусы = (радианы/2π)*360.
Функция radians
Функция radians() преобразует значения угла из градусов в радианы по формуле радианы = (градусы/360)*2π Запомните, все тригонометрические функции BASIC-256 используют в качестве аргумента радианы, а не градусы.
Арккосинус
Арккосинус (acos()) — функция обратная косинусу. Ее значением является величина угла, косинус которого равен заданному числу.
Рисунок 24 Функция acos()
Арксинус
Арксинус (asin()) – функция, обратная синусу. Ее значением является величина, синус которого равен заданному числу.
Рисунок 25 Функция asin()
Арктангенс
Арктангенс (atan()) – функция, обратная тангенсу. Ее значением является угол, тангенс которого равен заданному числу.
Рисунок 26 Функция atan()
Большая программа этой главы воспроизводит процесс деления целых чисел уголком. Программа использует логарифм, чтобы вычислить количество знаков в числах, деление по модулю и целочисленное деление для определения цифр, и в целом очень сложная программа. Не расстраивайтесь и не опускайте руки, если сразу не поймете в полностью, как она работает.
1 # longdivision.kbs 2 # Показывает графически процесс деления уголком 3 # двух положительных целых чисел. 4 5 input «Делимое? ", b 6 input «Делитель? ", a 7 8 originx = 100 9 originy = 20 10 height = 12 11 width = 9 12 margin = 2 13 14 b = int(abs(b)) 15 a = int(abs(a)) 16 17 color white 18 rect 0,0,graphwidth, graphheight 19 color black 20 21 # Отображение задания на деление 22 row = 0 23 col = -1 24 number = a 25 underline = false 26 gosub drawrightnumber 27 row = 0 28 col = 0 29 number = b 30 gosub drawleftnumber 31 line originx — margin, originy, originx + (width * 11), originy 32 line originx — margin, originy, originx — margin, originy + height 33 34 # Сколько цифр в делимом? 35 lb = ceil(log10(abs(b))) 36 37 r = 0 38 bottomrow = 0 ## номер последнего ряда вычислений 39 40 # Цикл по всем цифрам слева направо 41 for tb = lb-1 to 0 step —1 42 # получаем следующюю цифру текущего остатка и убираем ее из делимого 43 r = r * 10 44 r = r + (b \ (10 ^ tb)) 45 b = b % (10 ^ tb) 46 # отображаем текущий остаток 47 row = bottomrow 48 bottomrow = bottomrow + 1 49 col = lb — tb — 1 50 number = r 51 underline = false 52 gosub drawrightnumber 53 # вычисляем следующую цифру ответа и отображаем ее 54 digit = r \ a 55 row = -1 56 col = lb — tb — 1 57 gosub drawdigit 58 # вычисляем количество которое надо удалить из текущего остатка и отображаем 59 number = digit * a 60 r = r — number 61 col = lb — tb — 1 62 row = bottomrow 63 bottomrow = bottomrow + 1 64 underline = true 65 gosub drawrightnumber 66 next tb 67 # 68 # печатаем остаток в нижнем ряду 69 row = bottomrow 70 col = lb — 1 71 number = r 72 underline = false 73 gosub drawrightnumber 74 end 75 76 drawdigit: 77 # вычисляем строку и столбец для отображения 78 text col * width + originx, row * height + originy, digit 79 if underline then 80 line col * width + originx — margin, (row + 1) * height + originy, (col + 1) * width + originx — margin, (row + 1) * height + originy 81 end if 82 return 83 84 drawleftnumber: 85 # передаем начальный ряд и колонку, а также число для левой колонки 86 if number < 10 then 87 digit = number 88 gosub drawdigit 89 else 90 lnumber = ceil(log10(abs(number))) 91 for tnumber = lnumber-1 to 0 step —1 92 digit = (number \ (10 ^ tnumber)) % 10 93 gosub drawdigit 94 col = col + 1 95 next tnumber 96 endif 97 return 98 99 drawrightnumber: 100 # передаем начальный ряд, колонку и число для отображения в правой колонке 101 if number < 10 then 102 digit = number 103 gosub drawdigit 104 else 105 lnumber = ceil(log10(abs(number))) 106 for tnumber = 0 to lnumber — 1 107 digit = (number \ (10 ^ tnumber)) % 10 108 gosub drawdigit 109 col = col — 1 110 next tnumber 111 endif 112 return
Программа 83 Большая программа Деление уголком
Делимое? 123456 Делитель? 78
Пример вывода программы 83 Большая программа Деление уголком