[an error occurred while processing this directive]
187
29 Подстроки
Подстрока - это любая часть строки от нулевой строки до полной строки.
В Комале операции можно производить и с использованием подстрок, включая замену этой подстроки с помощью присваивания.
29.1 Выбор подстроки
Субстрока выбирается с помощью указания номера позиции, с которой мы хотим начать и номера позиции, на которой мы хотим закончить эту подстроку.
----------------------------------------------
a¤(start:finish) специфицирует подстроку a¤, начинающуюся с позиции, данной величиной start и продолжающуюся до позиции, данной finish включительно.
----------------------------------------------
Введите
town¤ := "EDINBURGH"
и
PRINT town¤(5:8)
Подстрока начинается с пятой буквы слева, т.е, с B, и продолжается до восьмой буквы слева включительно.
29.2 Спецификаторы подстрок
Числа, используемые в скобках, называются 'спецификаторами подстрок', потому что они специфицируют или определяют подстроку.
Читатели, знакомые по Бейсику с LEFT¤, RIGHT¤ и MID¤, могут удивиться методам определения подстрок. Однако, с помощью этих простых обозначений определяется целый ряд мощных команд.
Левые подстроки
Введите
PRINT town¤(1:5)
Печатаются первые пять букв town¤.
****************************************************************
188
Если специфицируется самая левая подстрока, то команду можно упростить, опустив 1.
Введите
PRINT town¤(:5)
Введите
FOR j := 1 TO 9 DO PRINT town¤(:1)
Правые подстроки
Введите
PRINT town¤(6:9)
Так как это производит самые правые четыре буквы, найти 'спецификатор строки' не просто. Существует два способа упростить эту проблему.
Введите
PRINT town¤(6:)
Если опущен правый спецификатор строки, то предполагается, что подстрока продолжается до конца строки.
Отричательные спецификаторы подстроки
Введите
PRINT town¤(-4)
Отрицательная подстрока - это подстрока, измеряемая справа.
Введите
FOR j := 1 TO 9 DO PRINT town¤(-j)
Использование спецификаторов подстоки с переменными не запрещается.
Введите
PRINT >"ABCDEFGHJKL"(3:-3)
что производит строку, которая начинается с третьего элемента слева и продолжается до третьего элемента справа.
29.3 Предшествование
Спецификаторы подстрок имееют более высокое предшествование, чем сложение. Например:
PRINT "DUN" + "DEER"(1:3)
****************************************************************
189
произведет DUNDEE
Так как скобки имеют наивысшее предшествование, то
PRINT ("LIME" + "RICKMANSWORTH")(:8)
произведет LIMERICK
PRINT (" ") + a¤)(-6:)
напечатает a¤ справа от шестиэлементной строки, при этом заполняются все промежутки слева.
Вот пример для более опытного программиста:
PRINT (label¤ + " ")(:7);("000" + -x)(-4:)
что может быть использовано для табуляции меток и шестнадцатеричных адресов.
29.4 Одноэлементные подстроки
С помощью такой команды, как PRINT tonw¤(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
.СС
190
Запустите программу и попробуйте ввести
MADAM MADam maDam ABLE WAS I ERE I SAW ELBA MADAM I'M ADAM
29.5 Элементы строчного массива
Когда требуется одиночный символ элемента массива, не нужно ставить пробел между субиндексом в скобках и скобкой спецификатора подстроки. Например:
array¤(2,3) = "abcdefghijkl"
PRINT array¤(2,3)(3) will produce "c"
29.6 Замена подстрок
Обозначение строки можно использовать при присваивании новой величины части существующей строки.
-----------------------------------------------
a¤(start:finish) := replace¤ использует replace¤ для замены символов в a¤ от позиции, данной величиной start, до позиции, данной величиной finish, при необходимости усекая replace¤.
-----------------------------------------------
Введите
town¤ := "AMSTERDAM"
и
town¤(:3) := "ROT"
и
PRINT town¤
Заменяются первые три символа town¤.
Введите
town¤(4:7) := "HERN"
****************************************************************
191
и
PRINT town¤
Были заменены символы от 4 до 7.
Короткое измерение
Сейчас введите
town¤ :="PORTSMOUTH"
и
PRINT LEN (ton¤)
Сейчас введите
iown¤(:5) := "PLY"
и
PRINT LEN (town¤)
В этом случае пять символов заменяются только тремя. Окончательная строка смыкается, не оставляя промежутка, и длина town¤ соответственно уменьшается до восьми символов.
Избыток
Сейчас введите
town¤(:4) := "NLIMON"
и
PRINT town¤
и
PRINT LEN (town¤)
При использовании подстрочного присваивания длина строки может быть не увеличина. Самая левая часть вставляемой строки используется до тех пор, пока не будут заполнены имеющиеся пробелы.
****************************************************************
192
Выводы
Вобщем, подстрочное присваивание может не увеличить длину строки, но строка может уменьшиться, когда в присвавание есть какой-либо недосаток.
Подстрочное присваивание является крайне многосторонним и может быть использовано со строчными выражениями.
****************************************************************
93
30 FUNCTIONS (функции)
--------------------------------------------
У функции много схожих черт с процедурой. Она представляет отвод потока программы на ряд операторов в другом месте. Различие заключается в том, что цель функции обеспечить одну величину и вернуть эту величину в изначальную часть программы. Функция может быть строчной или числовой в зависимости от того, какого типа величину вы хотите вернуть.
Функция вызывется подачей ее названия. Она определена где-то в программе оператором FUNC и названием, которое за ним следует. Затем следуют операторы, выполняющие функцию, а оператор END FUNC ее завершает. Если при вводе ее название опущено, то оно вставляется автоматически. Оператор RETURN используется для указания возвращаемой величины. Вариантные условия могут потребовать использования более одного оператора RETURN.
30.1 Пример программы
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 и величина возвращается для печати.
****************************************************************
194
Если вы хотите запустить эту программу, вым нужно вставить недостающую процедуру.
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).
30.2 Использование функций.
В аналогичной программе вместо функции можно было бы использовать процедуру. Процедуре можно было бы присвоить переменную enough. Этот пример использования функции немного искусственный. Функции наиболее полезны, когда они имеют определенные величины (аргументы), с которыми они работают. Аргументы передаются функциям как параметры. Использование параметров описано в следующей главе.
Програмные строки внутри определения FUNC игнорируются, если они встречаются во время нормального хода программы.
Главным преимуществом функции является то, что один и тот же процесс может быть использован в различных частях программы без повтора операторов.
****************************************************************
95
31 Параметры
------------------------------------------------
Процедуры и функции могут иметь заданные параметры. Параметр - это величина, которую использует процедура или функция для получения результата. Если мы возьмем в качестве примера вычисление среднего значения двух чисел, то результат будет зависеть от того, какие числа мы выберем.
Однако мы знаем, что делать с этими двумя числами. Таким же образом функция может определить, что делать с двумя переменными. Эти переменные являются параметрами. Они ставятся в скобки после названия функции и отделяются запятыми.
Введите следующую программу.
100 // 110 FUNC average(x,y) // formal parametars 120 sum := x + y 130 RETURN sum / 2 140 END FUNC average
X и Y называются формальными параметрами.
31.1 Вызов функции с параметрами
Когда мы хотим использовать функцию, нам нужно обеспечить ее двумя величинами. Мы можем использовать числа сразу.
Введите
10 PRINT average(5,6)
Просмотрите и запустите программу.
Функция вызывается в строке 10, х присваивается величина 5, а y - величина 6. Средняя величина х и y вычисляется и возвращается для вывода на печать.
5 и 6 называются фактическими параметрами.
Формальные параметры, используемые в операторе FUNC, должны быть переменными. Функция FUNC average(x,1), вызванная average(5,6) не может дать величину 6 числу 1. Проверка синтаксиса при вводе найдет эту ошибку.
****************************************************************
196
Фактические параметры могут быть переменными.
Измените и дополните строки 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) вычисляется и возвращается для печати.
31.2 Местные переменные
Введите прямую команду
PRINT x,y
Формальные параметры х и y являются местными переменными. Переменные х и y создаются, когда вызывается функция. Когда функция RETURN является величиной, этих местных параметров больше нет.
31.3 Глобальные переменные
Резидентные целые переменные от #а до #z и системные переменные (напр. MODE) называются глобальными переменными, потому что они доступны для использования или присваивания как внутри, так и вне процедуры или функции. Они могут быть использованы как формальные параметры. Например: PROC test(#a) при вводе строки произведет синтаксическую ошибку. Другие целые переменные, такие как аа# и zz# приемлемы как формальные параметры.
31.4 Переменные основного блока
Любая переменная (кроме глобальной), которая создается в открытой ситуации хранится (вместе с ее величиной) в основном блоке. Эти переменные основного блока автоматически доступны внутри и вне любой открытой процедуры или функции.
Добавьте
30 PRINT "sum is ";sum
Просмотрите и запустите.
****************************************************************
197
Переменная sum, которая была создана внутри функции, доступна вне функции.
Измените строку 30 на:
30 PRINT c
и добавьте:
115 c := а
Просмотрите и запустите программу.
Переменная а, которая была присвоена вне функции, доступна внутри функции. sum, a и c - примеры функций основного блока.
31.5 Закрытые процедуры и функции.
Измените 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# и системные переменные) автоматически доступны внутри процедуры.
31.6 IMPORT
Переменные основного блока могут быть использованы в закрытой функции или процедуре, если они следуют за оператором IMPORT.
Введите
112 IMPORT a
****************************************************************
198
Просмотрите и запустите программу.
Величина с на строке 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, новая величина а. Величина основного блока импортируемой переменной находится под влиянием всего, что происходит внутри закрытой переменной.
****************************************************************
199
Несколько переменных или массивов можно ввести такой командой, как:
IMPORT a,b¤,c#,d(,)
где d(,) обозначает двухразмерный массив.
31.7 Использоваение одних и тех же фактических и формальных параметров
Введите new I SLEDU ]U PROGRAMMU.
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, то это исходный х, а не величина, используемая в функции.
Если вы хотите избежать путаницы с величиной переменной, необходимо использовать различные названия для фактических и формальных параметров.
31.8 Справочные параметры
Если вы хотите использовать ту же переменную внутри процедуры (или функции), что и в основной части программы, то это можно сделать при условии, что вы понимаете, что величина вне процедуры или функции меняться оператором, который находится внутри.
Когда формальный параметр показан в скобках после PROC или FUNC,****************************************************************
200
то перед параметром нужно ставить ключевое слово 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).
31.9 Строчные параметры
Строчные переменные и строчные выражения могут переходить к процедурам и функциям таким же способом, что и числовые переменные, хотя и с двумя дополнительными точками.
Когда строчная переменная объявляется формальным параметром, предполагается, что требуется размер строки в 40 позиций, если он не был заранее объявлен с помощью OF.
Пример:
PROC string(name¤ OF 10,NUMBER)
Единственные переменные, которые могут быть использованы на всей длине строчного параметра - это резидентные целые переменные и системные переменные. Причиной этому является то, что они являются глобальными переменнами и доступны внутри закрытого процесса установки размеров.
****************************************************************
201
Любые другие переменные во время работы программы найдены не будут.
Введите 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 при вводе строки будет отвегнута.
31.10 Передача массива с помощью REF
Отдельны элемент массива можно использовать как параметр обычным способом. Однако, если требуется использовать целый массив внутри процедуры или функции, то массив передается с помощью REF.
Между исходным массивом и процедурой или фунекцией необходимо установить соединения. Необходимо указать количество размеров, которые имеет массив. Это делается показом числа запятых, использованных при установке размеров исходного массива, например:
REF line() относится к одноразмерному массиву
REF table (,) относится к двухразмерному массиву
REF block (,,) относится к трехразмерному массиву
Этот же метод используется для указания типа массива в операторе IMPORT.
****************************************************************
202
Следующаяя процедура может быть использована для установки масштаба массива.
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.
.сс
[an error occurred while processing this directive]