Программирование на языке BASIC 1990 г.

Глава 9,10,11 - функции. Математические функции. Случайные числа.


Глава 9
                          Ф У Н К Ц И И
Краткое содержание: DEF, LEN, STR$, VAL, SGN, ABS, INT, SQR, FN
    Функции - это зашитые в бейсик - систему подпрограммы,  кото-
рые  получая  на вход одни  значения,   называемые   аргументами,
возвращают другие значения. Функции  используются в выражении
простым включением в него имени функции с последующими аргументами.
    При вычислении выражения, вычисляется и значение функции.
Пример:  функции  LEN возвращает длину заданного в ней строкового
аргумента, вы можете записать:
                PRINT LEN "SINKLAIR",
а компьютер выведет ответ ' 8 ',  т.е.  количество букв в слове
'SINKLAIR' (для ввода с клавиатуры имени функции LEN, вы должны
войти в необходимый режим,  нажав клавиши CAPS SHIFT и SYM SHIFT,
курсор изменится с (L) на (E), и нажать клавишу R ).
    Если в одном выражении используются и функции и операции,
функции будут вычислены перед выполнением любых операций, однако
вы можете изменить этот порядок, применяя скобки.
    Функция  STR$  преобразует число в символьный вид,  подобно
формату вывода чисел оператором PRINT:
                       LET A$ = STR$ 1E2
аналогично по действию команде
                       LET A$ = "100"
или выполните          PRINT LEN STR$ 100,0000
и получите ответ 3, т.к. стр $ 100,0000 = "100"
    Функция  VAL обратится в функцию STR$ и преобразует строку  в
число, так             VAL "3.5" = 3.5
или                    VAL "2*3" = 6
или даже так           VAL ("2" + "*3") = 6
    В  последнем  случае происходит  вычисление  двух  выражений,
сначала строкового с получением строки "2*3 ", затем числового
с получением строки  "6 ".
    Можно попасть в затруднительное положение, например:
            PRINT VAL "VAL""VAL""""2"""",
помня,  что  внутри строки кавычки удваиваются,  мы видим,  что в
нашем случае может понадобится учетверение или даже увосмирение.
    Имеется еще одна функция подобная VAL - это VAL$, и аргумен
том  и  результатом этой функции является  строка  символов,  она
работает  как VAL,  примененная дважды,  раскрывая все кавычки  в
строках.
        VAL$"""FRUIT PUNCH """="FRUIT PUNCH"
    Сделайте LET A$ = "99"
и затем выведите все следующие значения
                             VAL A$
                             VAL "A$"
                             VAL " " "A$" " "
                             VAL$ A$
                             VAL$ "A$"
                             VAL$ " " " а$ " " "
    Некоторые из них сработают,  а некоторые нет, проанализируйте
эти ответы.
    Функция  SGN  - это так  называемая  математическая   функция
сигнум (знак), и  аргумент  и результат его  числовые,  результат
равен:                        1, если аргумент положителен;
                              0, если аргумент равен 0;
                             -1, если аргумент отрицателен.
    Функция ABS преобразует аргумент в положительное число:
                              ABS -3.2 = ABS 3.2 = 3.2
    Функция  INT (от 'INTEGER PART' - целая  часть)  преобразует
дробное число к целому отбрасыванием дробной части:
                              INT 3.9 =3
    Сложности  возникают  при отрицательном  аргументе,  так  как
округение происходит к ближайшему целому не большему, чем аргумент:
                              INT -3,9 =- 4
    Функция SQR вычисляет корень квадратный от числа, например:
                              SQR 4 =2
                              SQR 0.25 = 0.5
                              SQR 2 = 1.4142136(приблизительно)
    Если аргумент отрицательный, то выдается сообщение:
                              ' A INVALID ARGUMENT'.
    Вы также  можете сами определить для себя какую нибудь  функ-
цию,  указав FN и имя этой функции (букву, если аргумент число
вой или букву и $,  если строковый). Аргументы должны быть обяза-
тельно заключены в скобки.
    Вы можете определить функцию вводом оператора DEF в некотором
месте программы.  Например:  зададим функцию вычисляющую  квадрат
числа                10 DEF FN S(X) = X*B: REM THE SQUARE OF X
    DEF вводится в соответвующем режиме (SIMBOL SHIFT и 1), теперь
функция может использоватся в программе.
                         PRINT FN S(2)
                         R BE ABLE
                         FN S(3+4)
                         PRINT 1+ INT FN S(LEN "CHICREN "/2+3)
    Функция  INT  всегда округляет до целого ;  для округления  с
точностью 0.5 надо добавить к результату '.5' ,  вы можете задать
для  себя такую функцию:   DEF FN R(X)= INT(X+0,5):  REM CIVES  X
RONDED TO THE NEAREST INTEGER
и можете  затем попробовать ввести :
           FN R(2,9)=3                   FN R(2,4)=2
           FN R(-2,9)=-3                 FN R(-2,4)=-2
    Введите и выполните следующее:
                  10 LET X=0: LET Y=0: LET A=10
                  20 DEF FN P(X,Y)=A+X*Y
                  30 DEF FN R()=A+X*Y
                  40 PRINT F, P(2,3), FN Q()
    Есть одна тонкость в этой программе, во-первых, функция FN ()
не использует аргументов,  но скобки при этом должны  обязательно
использоваться. Во-вторых, операторы DEF не выполнимые, компьютер
после выполнения строки 10,  просто переходит к выполнению строки
40, помни DEF может быть только оператором, не командой. В
третьих, 'X' и 'Y' - имена целых переменных в программе и в то же
время имена аргументов в функции FN P
    Функция  FN  P  использует в вычислении  результата  значения
аргументов 'X' ,  'Y' и переменной 'A', не являющейся аргументом.
Так, когда вычисляется FN P(2,3), значение A равно 10, как опреде-
лено в программе,  а значения 'X' и 'Y' соответственно 2 и 3, так
как они аргументы и результат будет 10+2*3=18.
    При вычислении FN Q() учавствуют только переменные  программы
так как аргументов нет, и ответ в этом случае будет 10+0*0.
    Теперь изменим строку 20 на     20 DEF FN P(X,Y)=FNQ()
в этом случае FN P(2,3) будет возвращать значение 10.
    Некоторые версии языка бейсик имеют функции LEFT$, RIGHT$, TL$.
              LEFT$ (A$,N)-возвращает подстроку, содержащую 'N'
                           первых символов строки'а$';
              RIGHT$(A$,N)-возвращает подстроку, содержащую 'N'
                           последних символов в строке 'а$';
              TL$(A$)      -возвращает подстроку,  содержащую все
                            символы строки 'а$', кроме первого.
    Вы можете определить такие функции на своем компьютере:
               10 DEF FN T$(A$)=A$(2 TO): REM TL$
               20 DEF FN L$(A$,N)=A$( TO N): REM LEFT$
    Проверьте их работу со строками длиной 0 и 1.
    Примечание: функция может иметь до 26 числовых аргументов и  в
                тоже время до 26 строковых.
Глава 10
           М А Т Е М А Т И Ч Е С К И Е   Ф У Н К Ц И И
Краткое содержание: **, PI, EXP, LN, SIN, COS, TAN, ASN, ACN, ATN
    В этой главе описывается математические функции, которые
могут быть выполнены на ZX SPEKTRUM, вполне возможно, что вам
никогда не придется воспользоваться ими и если вы сочтете их
слишком сложными, можете пропустить эту главу, все сказанное
относится к функциям: ** (возведение в степень), EXP, LN,
тригонометрическим  функциям: SIN, COS, TAN, и обратных к ним:
ASN, ACS, ATN. ** и EXP
Вы можете возвести число в некоторую степень путем многократного
умножения его самого на себя необходимое число раз, это обычно
изображается записью числа обозначаюшего степень справа вверх от
числа обозначающего основание, но такую форму записи трудно
реализовать в компьютере , поэтому там используют специальный
символ (направленная вверх стрелка, в данном описании замененная
двумя звездочками: '**'), например степени двойки можно
представить
                            2**1=2
                            2**2=2*2=4    ( два в квадрате)
                            2**3=2*2*2=8  ( два в кубе)
    Таким образом, запись A* B означает: ' умножь 'A' само на себя
'B' раз, но это предполагает, что 'B' положительное целое число .
    Для  нахождения  определения этого действия  при  других
значениях A и B, мы запишем выражение:
                              A**(B+C)=A**B*A**C
     Зздесь надо помнить,  что операция ' **' имеет более  высокий
приоритет,  чем '*' и '/',  вы можете быть уверены в правильности
этого выражения если 'B' и 'C' целые положительные числа, но если
это не так,  а вы все-таки решили выполнить возведение в степень,
то вы должны знать что:       A**0=1
                              A**(-B)=1/(A**B)
                              A**(1/B)=корню B-ой степени из A
                              A**(B*C)=(A**B)**C
полезно помнить, что:         A**(-1)=1/A
                              A**(1/2)=SQR A
    Поэкспериментируйте  с  этим,   попробов  выполнить   такую
программу:                    10 PRINT A, B, C
                              20 PRINT A**(B+C), A**B*A**C
                              30 GO TO 10
    Компьютер  станет  выводить  два числа,  если  вы  правильно,
конечно набрали программу,  число A, кстати, не должно быть отри-
цательным.
    Другой  типичный  пример  использования  этой   операции, это
вычисление дохода. Предположим, что вы  вложили часть своих денег
в общественное строительство,  которое приносит вам 15%  годовых,
после года вы будете иметь уже не точно 100% от того, что имели в
начале,  а  плюс 15% дохода,  что составит 115%,  для вычисления
другим способом, вы умножаете вашу сумму денег на 1.15 и получае-
те  тот же результат,  в конце следующего года вы снова  получите
прибыль,  что  в сумме составит 1.15*1.15=1.15*2=1.3225 от  вашей
первоначальной суммы, в итоге после Y лет вы будете иметь в
1.15 **Y раз больше денег, выполнив :
           FOR Y=0 TO 100: PRINT Y,10*1,15**Y: NEXT Y
вы увидите, что начиная с 10  фунтов можно получать все больший и
больший доход  с капитала.
    Такой тип поведения функции, когда после фиксированного числа
интервалов времени,  значения функции пропорцианальны  количеству
умножения этого числа самого на себя, называется экспоненциальным
законом. Предположим вы написали:  10 DEF FN A(H)=A**H
здесь A определенно в операторе LET,  его значение передается для
вычисления степени.
    Имеется определение A,  которое делает функцию FN A
иллюстрирующей  специальную математическую функцию,  это значение
называется 'е'.
    ZX SPEKTRUM имеет специальную функцию, называемую EXP и опре-
деляемую как.            EXP X = E** X
    К сожалению,  'е' не  может быть определено точным числом, вы
можете увидеть пять его первых десятичных знаков, выполнив
                              PRINT EXP 1
так как EXP 1=е**1=е,  конечно,  это лишь первое приближение,  вы
никогда не сможете записать 'е' абсолютно точно.
 LN
обратной к экспоненциальной является логарифмическая функция.
Логарифм  (по основанию а) числа X есть степень,  в которую  надо
возвести а, чтобы получить X, это записывается так LOG A X,
( выражение а**LOGAX=X TAK же верно как и LOGA(A**X)=X)
    Вам  должно  быть уже известно как используется  логарифм  по
основнию 10 для умножения, такой логарифм называется общим.
ZX  SPEKTRUM  имеет функцию LN,  которая  вычисляет  логарифм  по
основанию 'е', называемый натуральным, для вычисления логарифма с
другим  основанием,  надо разделить натуральный логарифм искомого
числа на натуральный логарифм основания:
                               LOG X=LN X/LN A
   Допустим имеется некоторый круг, вы можете найти его периметр
(длину окружности), умножив его диаметр на число, называемое PI
подобно  'е',PI  представляется  бесконечной  десятичной  дробью,
начало       3,141592653569...
Слово  'PI'  в  ZX SPEKTRUM  обозначает  это  число,.  выполните,
например:                        PRINT PI
SIN, COS, TAN,ASN, ACN, ATN
    Тригонометрические функции измеряют те случаи, когда точка
перемещается вокруг окружности единичного радиуса, точка стартует
с  позиции 3-х часов и перемещается против часовой  стрелки,  на-
чало координат находится в центре этой окружности, тогда SIN угла
между  радиусом,  соединяющим движующуюся по окружности  точку  с
началом  координат,  будет ордината этой точки,  а  COS- абсциса,
необходимо  помнить,что если точка находится слева от оси XY,  то
косинус  отрицательный,  а если точка находится под  осью  X,  то
отрицательный синус, необходимо также помнить, что:
                        SIN(A+2*PI)=SINA
                        COS(A+2*PI)=COSA
    имеются и другие тригонометрические функции:
                        TAN- тангенс;
                        ASN- арксинус;
                        ACS- Aрккосинус;
                        ATN- арктангенс.
    Помните, в ZX SPEKTRUM тригонометрические функции вычисляют в
радианах,  для  переводя  из градусов в радианы необходимо  число
разделить на 180 и умножить его на PI, а для обратного преобразо-
вания необходимо разделить на PI и умножить на 180.
Глава 11
                  С Л У Ч А Й Н Ы Е   Ч И С Л А
Краткое содержание: RANDOMIZE,RND.
    В этой главе описывается функция RND и ключевое слово  RANDO-
MISE, их не надо путать, хотя они обе расположены на клавише 'т',
для RANDOMIZE допустимо сокращение RAND.
    При обращении к функции RND, она возвращает случайное число в
интервале от 0 до 1 (может принимать значение 0, но никогда 1)
попробуйте выполнить:      10 PRINT RND
                           20 GO TO 10
вы увидите как меняется результат.
    Фактически  RND не абсолютно случайное число,  а выбирается в
определенной  последовательности длиной в  65536  чисел,  поэтому
обычно говорят что RND -псевдослучайное число.
    Для получения случайного числа в интервале отличном от 0,
можно использовать выражение, например:
                           1.3+0.7*RND
даст интервал от 1,3 до 2.
    Для получения случайных целых чисел используйте функцию
                 1+INT(OND*N)       где N любое число
например         1+INT(RND*6)даст 1,2,3,4,5,6.
    Пусть имеется программа:   10 REM DICE THROWING PROGRAM
                                      ( выбрасывание кости)
                               20 CLS
                               30 FOR N=1 TO 2
                               40 PRINTINT(RND*6;";)
                               50 NEXT N
                               60 INPUT A$: GO TO 20
нажимая  ENTER,  вы каждый раз будете получать номер выпавший  на
кости.
    Утверждение  RANDOMIZE  используется для установления  начала
последовательности  случайных чисел для функции  RND,  Kак  можно
увидеть из программы:            10 RANDOMIZE 1
                                 20 FOR N=1 TO 5:PRINT RND:NEXT N
                                 30 PRINT : GO TO 10
после каждого выполнения RANDOMIZE 1 случайная последовательность
будет начинаться с числа 0,0022735596. в утверждении RANDOMIZE вы
можете использовать любые числа в интервале от 1 до 65635, нельзя
использовать  RANDOMIZE без числа  а также RANDOMIZE 0,  например
имеется программа:                10 RANDOMIZE
                                  20 PRINT RND: GO TO 10
 В  каждой  итерации будет печататься  не  случайное  число.  Для
улучшения случайности распределения можно заменить GO TO 20.
    В  дополнение,  большинство  версий бейсика использует RND  и
RANDOMIZE для генерации случайных чисел,  но это не  единственное
их применение.
    Ниже  приводится  текст программы  моделирующей  выбрасывание
монеты и подсчета числа выпадений 'орла' и 'решки'.
(перевод имен программы: HEADS-орлы, TAILS- решки, COIN- монета)
                   10 LET HEADS=0: LET TAILS=0
                   20 LET COLN=INT(RND*2)
                   30 IF COLN=0 THEN LET HEADS=HEADS+1
                   40 IF COIN=1 THEN LET TAILS=TAILS+1
                   50 PRINT HEADS:',':TAILS
                   60 IF TAILS <> 0 THEN PRINT HEADS/TAILS
                   70 PRINT: GO TO 20
Если  программа выполняется достаточно долго,  то отношение ' ор-
лов' к 'решкам' приблизительно равно 1.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Софт - новая оперциаонная система для Спектрума - NeoS...
Demo-строение - о некоторых методах сортировки.
MinskZxNet - Hовый год начался с большого количества пойнтовок, на моей памяти их было уже 3.
Советы бывалого - Стратегия и тактика половой борьбы.
Дискуссия - Про америку #2.

В этот день...   21 ноября