Основные элементы языка программирования Icon. Чанышев О.Г. - 13 стр.

UptoLike

Составители: 

25
many(c,s) – возвращает позицию, следующую за наиболее
длинной подстрокой в s, все символы которой принадлежат сим-
вольному множеству c. Возвращает *s+1, если все символы из s
принадлежат c. Неуспешна, если s[1] не принадлежит c.
many(c,s,i) – все то же, только поиск начинается с позиции i.
many(c,s,i,j) – все то же, только рассматривается подстрока
s[i:j] (состоящая из символов s[1],s[2],…,s[j-1]).
Примеры
s:=”abcd”; write(many(&lcase,s))
Выход: 5
s:=”abcD”; write(many(&lcase,s))
Выход: 4
s:=”Dabcd”; if many(&lcase,s) then write(“O’KEY”)
else write(“NO!!”)
Выход: NO!!
match(s1,s2) – возвращает *s1+1, если s2[1:*s1+1]==s1
match(s1,s2,i) – возвращает *s1+I, если s2[i:*s1+i]==s1
match(s1,s2,i,j) – то же самое, только j ограничивает поиск
справа.
upto(c,s) – возвращает позиции в s от 1 to *s, которые содер-
жат символы из c.
Пример:
s:=”1D2a3b4c5d”
every writes(upto(&digits,s))
Выход 13579
upto(c,s,i) – то же, только поиск в s начинается с позиции i.
upto(c,s,i,j) – поиск в s начинается с позиции i и заканчивает-
ся в позиции j.
В [3] приведен пример
программы, выделяющий из строки
правильные идентификаторыцепочки символов, состоящие
только из букв латиницы, знаков подчеркивания и цифр (не в пер-
вой позиции):
#generate identifiers in string
26
procedure idents(s)
local i, j, initIdChars, idChars
initIdChars := &letters++’_’
idChars := initIdChars++&digits
i := 1
while j := upto(initIdChars,s,i) &
not any(idChars,s[j-1]) &
k := many(idChars,s,j) do {
suspend s[j:k]
i:=k
}
end
Давайте изменим эту программу так, чтобы она работала и с
кириллицей и выводила информацию в файл:
global allRus
procedure main()
allRus:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭ
ЮЯабвгдеёжзийклмнопрстуфхцчшщьъыэюя'
s:="Это кириллические идентификаторы с первым непра-
вильным: 17и а_85 б56"
s1:="a111_d t75"
my_file:=open("idents.txt","wt")
every write(my_file,idents(s))
end
procedure idents(s)
local i, j, initIdChars, idChars
initIdChars := &letters++'_'++allRus
idChars := initIdChars++&digits
s ? suspend tab(upto(initIdChars)) &
pos(1) | (move(-1),tab(any(~idChars))) &
tab(many(idChars))
end
Выход:
Это кириллические идентификаторы с первым неправиль-
ным а_85 б56
        many(c,s) – возвращает позицию, следующую за наиболее                procedure idents(s)
длинной подстрокой в s, все символы которой принадлежат сим-                 local i, j, initIdChars, idChars
вольному множеству c. Возвращает *s+1, если все символы из s                 initIdChars := &letters++’_’
принадлежат c. Неуспешна, если s[1] не принадлежит c.                        idChars := initIdChars++&digits
        many(c,s,i) – все то же, только поиск начинается с позиции i.        i := 1
        many(c,s,i,j) – все то же, только рассматривается подстрока          while j := upto(initIdChars,s,i) &
s[i:j] (состоящая из символов s[1],s[2],…,s[j-1]).                           not any(idChars,s[j-1]) &
        Примеры                                                              k := many(idChars,s,j) do {
        s:=”abcd”; write(many(&lcase,s))                                     suspend s[j:k]
        Выход: 5                                                             i:=k
                                                                             }
      s:=”abcD”; write(many(&lcase,s))                                       end
      Выход: 4
                                                                             Давайте изменим эту программу так, чтобы она работала и с
      s:=”Dabcd”; if many(&lcase,s) then write(“O’KEY”)                 кириллицей и выводила информацию в файл:
       else write(“NO!!”)                                                    global allRus
      Выход: NO!!                                                            procedure main()
                                                                             allRus:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭ
      match(s1,s2) – возвращает *s1+1, если s2[1:*s1+1]==s1             ЮЯабвгдеёжзийклмнопрстуфхцчшщьъыэюя'
      match(s1,s2,i) – возвращает *s1+I, если s2[i:*s1+i]==s1                s:="Это кириллические идентификаторы с первым непра-
      match(s1,s2,i,j) – то же самое, только j ограничивает поиск       вильным: 17и а_85 б56"
справа.                                                                      s1:="a111_d t75"
      upto(c,s) – возвращает позиции в s от 1 to *s, которые содер-          my_file:=open("idents.txt","wt")
жат символы из c.                                                            every write(my_file,idents(s))
      Пример:                                                                end
      s:=”1D2a3b4c5d”                                                        procedure idents(s)
      every writes(upto(&digits,s))                                          local i, j, initIdChars, idChars
      Выход 13579                                                            initIdChars := &letters++'_'++allRus
                                                                             idChars := initIdChars++&digits
      upto(c,s,i) – то же, только поиск в s начинается с позиции i.          s ? suspend tab(upto(initIdChars)) &
      upto(c,s,i,j) – поиск в s начинается с позиции i и заканчивает-        pos(1) | (move(-1),tab(any(~idChars))) &
ся в позиции j.                                                              tab(many(idChars))
      В [3] приведен пример программы, выделяющий из строки                  end
правильные идентификаторы – цепочки символов, состоящие                      Выход:
только из букв латиницы, знаков подчеркивания и цифр (не в пер-              Это кириллические идентификаторы с первым неправиль-
вой позиции):                                                           ным а_85 б56
      #generate identifiers in string

                                 25                                                                       26