[an error occurred while processing this directive]

.сс

.шп6

29 Подстроки

.шп0

Подстрока - это любая часть строки от нулевой строки до полной строки.

В Комале операции можно производить и с использованием подстрок, включая замену этой подстроки с помощью присваивания.

.шп14

29.1  Выбор подстроки

.шп0

Подстрока выбирается с помощью указания номера позиции, с которой мы хотим начать и номера позиции, на которой мы хотим закончить эту подстроку.

.шп1

a¤(start:finish) специфицирует подстроку a¤, начинающуюся с позиции, данной величиной start и продолжающуюся до позиции, данной finish включительно.

.шп0

Введите

town¤ := "EDINBURGH"

и

PRINT town¤(5:8)

Подстрока начинается с пятой буквы слева, т.е, с B, и продолжается до восьмой буквы слева включительно.

.шп14

29.2  Спецификаторы подстрок

.шп0

Числа, используемые в скобках, называются 'спецификаторами подстрок', потому что они специфицируют или определяют подстроку.

Читатели, знакомые по Бейсику с LEFT¤, RIGHT¤ и MID¤, могут удивиться методам определения подстрок. Однако, с помощью этих простых обозначений определяется целый ряд мощных команд.

.шп2

Левые подстроки

.шп0

Введите

PRINT town¤(1:5)

Печатаются первые пять букв town¤.

Если специфицируется самая левая подстрока, то команду можно упростить, опустив 1.

Введите

PRINT town¤(:5)

Введите

FOR j := 1 TO 9 DO PRINT town¤(:j)

.шп2

Правые подстроки

.шп0

Введите

PRINT town¤(6:9)

Так как это производит самые правые четыре буквы, найти 'спецификатор строки' не просто. Существует два способа упростить эту проблему.

Введите

PRINT town¤(6:)

Если опущен правый спецификатор строки, то предполагается, что подстрока продолжается до конца строки.

.шп2

Отрицательные спецификаторы подстроки

.шп0

Введите

PRINT town¤(-4)

Отрицательная подстрока - это подстрока, измеряемая справа.

Введите

FOR j := 1 TO 9 DO PRINT town¤(-j)

Использование спецификаторов подстроки с переменными не запрещается.

Введите

PRINT >"ABCDEFGHJKL"(3:-3)

что производит строку, которая начинается с третьего элемента слева и продолжается до третьего элемента справа.

.шп14

29.3  Предшествование

.шп0

Спецификаторы подстрок имееют более высокое предшествование, чем сложение. Например:

PRINT "DUN" + "DEER"(1:3)

произведет DUNDEE

Так как скобки имеют наивысшее предшествование, то

PRINT ("LIME" + "RICKMANSWORTH")(:8)

произведет LIMERICK

PRINT (" ") + a¤)(-6:)

напечатает a¤ справа от шестиэлементной строки, при этом заполняются все промежутки слева.

Вот пример для более опытного программиста:

PRINT (label¤ + " ")(:7);("000" + -x)(-4:)

что может быть использовано для табуляции меток и шестнадцатеричных адресов.

.шп14

29.4  Одноэлементные подстроки

.шп0

С помощью такой команды, как PRINT town¤(5:5) можно специфицировать и отдельный символ. Однако есть вариант.

Оставьте пробел между символом строки и скобкой

PRINT town¤ (5)

Пробел необходим, потому что без него town¤(5) Будет выглядеть как элемент массива.

town¤ (5) - это одиночный элемент, пятый слева в town¤.

towns (-5) - это одиночный элемент, пятый срава в town¤.

Введите прямую команду

FOR j := 1 TO 9 DO PRINT "CAMBRIDGE" (j)

а затем введите

FOR j := 1 TO 9 DO PRINT TAB(j);"CAMBRIDGE" (j)

Введите следующую программу

   10 IMPUT "Enter a possible palidrom > ":rhrase¤
   20 letter := 1 ; middle :=LEN (phrase¤) / 2
   30 WHILE letter <= middle AND phrase¤ (letter) = phrase¤ (-letter) do letter :+ 1
   40 PRINT 'phrase¤''"is ";
   50 IF letter <= middle THEN PRINT "not ";
   60 PRINT "a palidrome

Запустите программу и попробуйте ввести

  MADAM
  MADam
  maDam
  ABLE WAS I ERE I SAW ELBA
  MADAM I'M ADAM

.шп14

29.5  Элементы строчного массива

.шп0

Когда требуется одиночный символ элемента массива, не нужно ставить пробел между индексом в скобках и скобкой спецификатора подстроки. Например:

array¤(2,3) = "abcdefghijkl"

PRINT array¤(2,3)(3) will produce "c"

.шп14

29.6  Замена подстрок

.шп0

Обозначение строки можно использовать при присваивании новой величины части существующей строки.

.шп1

a¤(start:finish) := replace¤ использует replace¤ для замены символов в a¤ от позиции, данной величиной start, до позиции, данной величиной finish, при необходимости усекая replace¤.

.шп0

Введите

town¤ := "AMSTERDAM"

и

town¤(:3) := "ROT"

и

PRINT town¤

Заменяются первые три символа town¤.

Введите

town¤(4:7) := "HERN"

и

PRINT town¤

Были заменены символы от 4 до 7.

Сейчас введите

town¤ :="PORTSMOUTH"

и

PRINT LEN (town¤)

Сейчас введите

town¤(:5) := "PLY"

и

PRINT LEN (town¤)

В этом случае пять символов заменяются только тремя. Окончательная строка смыкается, не оставляя промежутка, и длина town¤ соответственно уменьшается до восьми символов.

Сейчас введите

town¤(:4) := "NLIMON"

и

PRINT town¤

и

PRINT LEN (town¤)

При использовании подстрочного присваивания длина строки может быть не увеличина. Самая левая часть вставляемой строки используется до тех пор, пока не будут заполнены имеющиеся пробелы.

.шп2

Выводы

.шп0

Вобщем, подстрочное присваивание может не увеличить длину строки, но строка может уменьшиться, когда в присваивании есть какой-либо недостаток.

Подстрочное присваивание является крайне многосторонним и может быть использовано со строчными выражениями.

.сс

.шп6

30 FUNCTIONS (функции)

.шп0

У функции много схожих черт с процедурой. Она представляет передачу выполнения программы на ряд операторов в другом месте. Различие заключается в том, что цель функции обеспечить одну величину и вернуть эту величину в изначальную часть программы. Функция может быть строчной или числовой в зависимости от того, какого типа величину вы хотите вернуть.

Функция вызывется подачей ее названия. Она определена где-то в программе оператором FUNC и названием, которое за ним следует. Затем следуют операторы, выполняющие функцию, а оператор END FUNC ее завершает. Если при вводе ее название опущено, то оно вставляется автоматически. Оператор RETURN используется для указания возвращаемой величины. Вариантные условия могут потребовать использования более одного оператора RETURN.

.шп14

30.1  Пример программы

.шп0

   10// Function example
   20 MODE := 6
   30 DIM A(1:100)
   40 FOR go := 1 TO 10 DO
   50   PRINT "Filling the array."
   60   FOR j := 1 TO 100 DO a(j) := RND( 1000)
   70   PRINT "Greatest was ";highest
   80 NEXT go
   90 //
  100 FUNC highest
  110   max := 0
  120   FOR j := 1 TO 100 DO
  130     IF a(j) >max THEN max := a(j)
  140   NEXT j
  150   RETURN max
  160 END FUNC highest

Запустите программу.

Просмотрите программу и особенно строку 70.

Вызывается функция highest и величина возвращается для печати.

Если вы хотите запустить эту программу, вым нужно вставить недостающую процедуру.

   10 REPEAT
   20   make_up_question
   30   ask_question
   40   take_in_answer
   50 UNTIL more¤ = "N" // until TRUE
   60 //
  100 FUNC more¤
  110   PRINT '"Another question ? Y/N > ";
  120   REPEAT
  130     reply¤ := GET¤
  140   UNTIL reply¤ IN "yYnN"
  150   //
  160   IF reply¤ IN "yY" THEN
  170     RETURN "y" // loop again
  180   ELSE
  190     RETURN "N" // end the lop
  200   END IF
  210 END FUNC more¤

FUNC enough возвращает или FALSE, или TRUE (что заканчивает цикл REPEAT).

.шп14

30.2  Использование функций.

.шп0

В аналогичной программе вместо функции можно было бы использовать процедуру. Процедуре можно было бы присвоить переменную enough. Этот пример использования функции немного искусственный. Функции наиболее полезны, когда они имеют определенные величины (аргументы), с которыми они работают. Аргументы передаются функциям как параметры. Использование параметров описано в следующей главе.

Програмные строки внутри определения FUNC игнорируются, если они встречаются во время нормального хода программы.

Главным преимуществом функции является то, что один и тот же процесс может быть использован в различных частях программы без повтора операторов.

.сс

.шп6

31 Параметры

.шп0

Процедуры и функции могут иметь заданные параметры. Параметр - это величина, которую использует процедура или функция для получения результата. Если мы возьмем в качестве примера вычисление среднего значения двух чисел, то результат будет зависеть от того, какие числа мы выберем.

Однако мы знаем, что делать с этими двумя числами. Таким же образом функция может определить, что делать с двумя переменными. Эти переменные являются параметрами. Они ставятся в скобки после названия функции и отделяются запятыми.

Введите следующую программу.

  100 //
  110 FUNC average(x,y) // formal parametars
  120   sum := x + y
  130   RETURN sum / 2
  140 END FUNC average

X и Y называются формальными параметрами.

.шп14

31.1  Вызов функции с параметрами

.шп0

Когда мы хотим использовать функцию, нам нужно обеспечить ее двумя величинами. Мы можем использовать числа сразу.

Введите

   10 PRINT average(5,6)

Просмотрите и запустите программу.

Функция вызывается в строке 10, х присваивается величина 5, а y - величина 6. Средняя величина х и y вычисляется и возвращается для вывода на печать.

5 и 6 называются фактическими параметрами.

.шп2

Формальные параметры - переменные

.шп0

Формальные параметры, используемые в операторе FUNC, должны быть переменными. Функция FUNC average(x,1), вызванная average(5,6) не может дать величину 6 числу 1. Проверка синтаксиса при вводе найдет эту ошибку.

.шп2

Фактические параметры могут быть переменными.

.шп0

Измените и дополните строки 10 и 20, чтобы получить:

   10 A := 6; B := 5
   20 print AVERAGE(A,B) // ACTUAL PARAMETERS
  100 //
  110 FUNC average(x,y)
  120   sum := x + y
  130   RETURN sum / 2
  140 END FUNC average

и запустите программу.

Функция вызывается в строке 20, х присвивается величина а, y присваивается величина b. Средняя величина х и Y (а следовательно и а и b) вычисляется и возвращается для печати.

.шп14

31.2  Локальные переменные

.шп0

Введите прямую команду

PRINT x,y

Формальные параметры х и y являются локальными переменными. Переменные х и y создаются, когда вызывается функция. Когда функция RETURN является величиной, этих местных параметров больше нет.

.шп14

31.3  Глобальные переменные

.шп0

Резидентные целые переменные от #а до #z и системные переменные (напр. MODE) называются глобальными переменными, потому что они доступны для использования или присваивания как внутри, так и вне процедуры или функции. Они не могут быть использованы как формальные параметры. Например: PROC test(#a) при вводе строки произведет синтаксическую ошибку. Другие целые переменные, такие как аа# и zz# приемлемы как формальные параметры.

.шп14

31.4  Переменные основного блока

.шп0

Любая переменная (кроме глобальной), которая не является формальным параметром хранится (вместе с ее величиной) в основном блоке. Эти переменные основного блока автоматически доступны внутри и вне любой процедуры или функции.

Добавьте

   30 PRINT "sum is ";sum

Просмотрите и запустите.

Переменная sum, которая была создана внутри функции, доступна вне функции.

Измените строку 30 на:

   30 PRINT c

и добавьте:

  115 c := а

Просмотрите и запустите программу.

Переменная а, которая была присвоена вне функции, доступна внутри функции. sum, a и c - примеры функций основного блока.

.шп14

31.5  Закрытые процедуры и функции.

.шп0

Измените 110 на

  110 func AVERAGE(x,y) closed

получим

   10 a := 6; b := 5
   20 PRINT average(a,b) // actual parameters
   30 PRINT c
  100 //
  110 FUNC average(x,y) CLOSED
  115   c := a
  120   sum := x + y
  130   RETURNE sum / 2
  140 END FUNC average

и запустите программу.

а невозможно найти на строке 115, потому что ее нет в блоке локальных переменных.

Когда процедура закрыта (CLOSED), только локальные и глобальные переменные (а# до z# и системные переменные) автоматически доступны внутри процедуры.

.шп14

31.6  IMPORT

.шп0

Переменные основного блока могут быть использованы в закрытой функции или процедуре, если они следуют за оператором IMPORT.

Введите

  112 IMPORT a

Просмотрите и запустите программу.

Величина с на строке 30 недоступна. Во время работы программы с хранилась в блоке локальных переменных, потому что она была создана в закрытой среде. Любые переменные, которае сначала присваиваются внутри закрытой функции или процедуры, вне ее недоступны.

Измените 30 на:

   30 PRINT c#

и 115 на:

  115 c# := a

Просмотрите и запустите программу.

c# является глобальной переменной, поэтому она доступна вне процедуры.

Единственными переменными основного блока, к которым имеется доступ изнутри закрытой функции или процедуры являются те, которые передаются им как параметры или с помощью оператора IMRORT.

Измените 30 на

   30 PRINT а

и 115 на

  115 a + 1

получаем

   10 a:= 6; b := 5
   20 PRINT average(a,b)
   30 PRINT a
  100 //
  110 FUNC average (x,y) CLOSED
  112   IMPORT a
  115   a := + 1
  120   sum := x + y
  130   RETURN sum / 2
  140 END FUNC average

Запустите программу.

Печатается средняя величина 5.5 , за которой следует величина 7, новая величина а. Величина основного блока импортируемой переменной находится под влиянием всего, что происходит внутри закрытой переменной.

Несколько переменных или массивов можно ввести такой командой, как:

IMPORT a,b¤,c#,d(,)

где d(,) обозначает двухразмерный массив.

.шп14

31.7 Использоваение одних и тех же фактических и формальных параметров

.шп0

Введите new и следующую программу.

   10 x := 5
   20 pint test(x)
   30 print x
  100 //
  110 func test)x)
  120 x := 10
  130 return x
  140 end func test

При использовании одной и той же переменной в качества формального параметра в функции, а также в качестве фактического параметра вне функции, необходимо быть очень осторожным. Хотя используется один и тот же символ, он относится к различным переменным.

Запустите программу.

Необходимо объяснить результат.

Исходная величина х основного блока - 5.

Величина 5 дана местному пораметру функции, который имеет такое же название, что и величина основного блока переменных. Величина хранится в блоке местных переменных, увеличивается до 15 и возвращается. Функция завершается и исходный основной блок переменных становится недоступным.

Когда требуется х на строке 30, то это исходный х, а не величина, используемая в функции.

Если вы хотите избежать путаницы с величиной переменной, необходимо использовать различные названия для фактических и формальных параметров.

.шп14

31.8  Ссылочные параметры

.шп0

Если вы хотите использовать ту же переменную внутри процедуры (или функции), что и в основной части программы, то это можно сделать при условии, что вы понимаете, что величина вне процедуры или функции меняется оператором, который находится внутри.

Когда формальный параметр показан в скобках после PROC или FUNC, то перед параметром нужно ставить ключевое слово REF. Величина передается как ссылочная.

Введите new и следуещее:

   10 a := 3; b := 4
   20 print a,b
   30 swap(a,b)
   40 print a,b
  100 //
  110 proc swap(ref x,ref y)
  120 temp := x; x := y; y := temp
  130 end proc swap

Запустите программу.

Когда вызывается процедура на строке 30, то х присоединяется к величине а, а y - к величине b.

Строка 120 выполняет обмен величин.

В конце процедуры а и b имеют величины, которым были присоединены х и y. х, y и temp сановятся недоступными и программа продолжается.

Важно отметить, что если формальный параметр становится ссылочным, то фактический параметр должен быть переменной. Например: 50 swap(3,4) не может быть использован как вызов процедуры PROC swap(REF x, REF y). 3 и 4 не являются переменными и не имеют позиции в основном блоке переменных, поэтому нет позиций, куда можно было бы отнести х и y. Такая ошибка обнаружилась бы при работе программы.

Правильный вариант показан выше, где величины 3 и 4 присвоины переменным а и b, а процедура вызывается swap(a<b).

.шп14

31.9  Строковые параметры

.шп0

Строковые переменные и строковые выражения могут переходить к процедурам и функциям таким же способом, что и числовые переменные, хотя и с двумя дополнительными точками.

Когда строковая переменная объявляется формальным параметром, предполагается, что требуется размер строки в 40 позиций, если он не был заранее объявлен с помощью OF.

Пример:

PROC string(name¤ OF 10,NUMBER)

Единственные переменные, которые могут быть использованы на всей длине строкового параметра - это резидентные целые переменные и системные переменные. Причиной этому является то, что они являются глобальными переменнами и доступны внутри закрытого процесса установки размеров.

Любые другие переменные во время работы программы найдены не будут.

Введите new и попробуйте этот пример строкового параметра.

  100 REPEAT
  110   INPUT "A word of up to 10 letters > ":word¤
  120 UNTIL LEN (word¤) > 11
  130 //
  140 REPEAT
  150   INPUT "Number of cories > ":n
  160 UNTIL n>0
  170 //
  180 string(word¤,n)
  190 //
  200 PROC string(name¤ OF 10,number)
  210   FOR go := 1 TO number
  220     PRINT name¤
  230   NEXT go
  240   PRINT 
  250 END PROC string

Если строковые переменные передаются как ссылочные, то длина не должна задаваться с помощью PROC или FUNC, например: PROC reverse(REF a¤,REF b¤). Любое использование ссылочной строковой переменной будет приложено к величине, содержащейся в основном блоке переменных, где ее длина уже установлена и нет нужды использовать OF. Любая попытка использовать OF при вводе строки будет отвегнута.

.шп14

31.10 Передача массива с помощью REF

.шп0

Отдельный элемент массива можно использовать как параметр обычным способом. Однако, если требуется использовать целый массив внутри процедуры или функции, то массив передается с помощью REF.

Между исходным массивом и процедурой или функцией необходимо установить связь. Необходимо указать количество размеров, которые имеет массив. Это делается показом числа запятых, использованных при установке размеров исходного массива, например:

REF line() относится к одноразмерному массиву

REF table (,) относится к двухразмерному массиву

REF block (,,) относится к трехразмерному массиву

Этот же метод используется для указания типа массива в операторе IMPORT.

Следующаяя процедура может быть использована для установки масштаба массива.

 2000 PROC scale(REF matrix(,),factor,dimention
 2010   FOR j := 1 TO dimention DO
 2020     FOR k := 1 TO dimention DO
 2030       matrix(j,k) * factor
 2040     NEXT k
 2050   NEXT j
 2060 END PROC scale

Процедуру можно вызвать таким оператором, как

  150 scale(mat(,),3,6)

который коэффициентом 3 задаст масштаб двухразмерного 6 на 6 массива с названием mat.

.ст комал13

[an error occurred while processing this directive]