WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 | 2 || 4 |

sortf(L,i) – создает новый список. При этом записи и списки 6.1. Создание списков с числом полей не больше i располагаются в порядке возрастания их i-х полей.

Списки могут быть созданы следующими способами:

Пример:

L:=[] – создается пустой список.

procedure main() L:=list() – создается пустой список.

L:=[[1,7,5],[7,6,9],[11,67,7]] L:=[e1,e2,...,eN] – создается список из N элементов.

every L1:=!sortf(L,2) do every write(" ",!L1) L:=list(N) – создается список из N элементов, инициализиend рованных значением &null (специальная константа, означающая Выход: 7 6 9 1 7 5 11 67 отсутствие значения у какого-либо элемента).

L:=list(N,Val) – создается список из N элементов, каждый из 6.5. Списки как стеки или очереди которых имеет значение Val.

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

get(L) – возвращает и удаляет из списка первый элемент.

Индексированный доступ к элментам списка вполне похож pop(L) – то же самое.

на доступ к элементам строки.

pull(L) – возвращает и удаляет из списка последний элемент.

L[1], L[2],...L[*L] – элементы списка от 1-го до последнего.

push(L,x) – момещает x в список L в качестве 1-го элемента, L[5][2] – второй элемент пятого подсписка в списке L.

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

L[3:5] – подсписок из двух элементов (3-й и 4-й).

push(L,x1,x2,...,xN) – эквивалентно многократному использованию push с двумя аргументами.

6.3. Операции со списками put(L,x),put(L,x1,x2,...,xN) – вставка элементов в конец спи!L Возвращает первый элемент списка. В соответствующем ска.

контексте генерирует все элементы списка:

Пример: вариант объединения списков L и M: every L возвращает случайный элемент списка.

put(L,!M).

L ||| M объединение списков.

L === M операция сравнения на равенство успешна, если списки одинаковы.

L ~=== M операция сравнения на не равенство успешна, если списки различны.

29 every eL:=Tab1[keY] do every WWrite(!eL) 7. Таблицы WWrite("###################") } Таблицы – структуры данных, на верхнем уровне иерархии WDone() представленные парой «ключ-значение». Ключ может быть люend бым неструктурированным типом данных. Значение – любым тиВыход:

пом: записью, списком, множеством.

################### Создание таблицы: t:=table() КЛЮЧ овощи Присвоение ключа и значения: t[k]:=v капуста Проверка на наличие ключа:

картофель \t[k] – утверждение успешно, если ключ k существует.

лук /t[k] – утверждение успешно, если ключ k не существует.

################### Приведем пару примеров работы с таблицами.

КЛЮЧ фрукты яблоки Первый пример еще и демонстрирует создание простого виноград графического интерфейса. Мы создаем графическое окно, чтобы груши кириллические символы выводились в читаемом виде.

################### link graphics procedure main() Пример из книги Thomas'а W. Christopher'а.

tab1:=table() Пусть s – строка и мы хотим создать таблицу, ключом в коnames_obj_table1:=["овощи","фрукты"] торой будут символы, а значениями – список их номеров в строке.

listEl:=[["капуста","картофель","лук"],["яблоки","виноград"," t:=table() груши"]] every i:=1 to *s & x:=s[i] do every i:=1 to *names_obj_table1 do { { /t[x]:=[] tab1[names_obj_table1[i]]:=list() put(t[x],i) tab1[names_obj_table1[i]]:=listEl[i] } } w:=WOpen("size=400,300")# создаем окно размером 300 на 7.1. Сортировка таблиц 400 пиксел.

Font("Times New Roman,16") # устанавливаем шрифт Для сортировки таблиц используется функция sort(t,k)".

WWrite("###################") # пишем в графическое k=1|2|3|окно Если Вы хотите отсортировать по ключам, параметр k дол# Функция key генерирует ключи жен быть опущен: sort(t), в противном случае сортировка произвоevery keY:=key(tab1) do дится по значениям.

{ Если k=1|2, то результат сортировки представляется в виде WWrite("КЛЮЧ ",keY) [[key1,val1],[key2,val2],...[keyN,valN]] 31 Если k=1|2, то 8. Множества [key1,val1,key2,val2,...,keyN,valN] Мы уже познакомились с объектами типа множество, расЕсли Вы хотите представить таблицу в виде списка списков, сматривая символьные множества. Множество в Icon'е – неупоряне сортируя, сделайте нечто подобное следующему:

доченная «коллекция» объектов без дублирования. Если Вы пыtab1:=table() таетесь включить уже существующий объект, он просто не вклюs:="Я не хочу тебя видеть, пока ты не умоешься!" чится. Операции над множествами мы тоже рассмотрели.

every i:=1 to *s & x:=s[i] do { Остается познакомиться с функциями, ориентированными /tab1[x]:=[] на роботу со множествами.

put(Tab1[x],i) copy(S) – создает копию множества S.

} delete(S,x) – удаляет элемент x.

list1:=[] insert(S,x) – включает x.

# list1 будет содержать ключ-символ в качестве первого member(S,x) – проверяет на принадлежность элемента x элемента множеству S.

# и список(!) номеров позиций его вхождения в строку в каset() – создает пустое множество.

честве следующих set(L) – создает множество из элементов списка L.

# элементов.

sort(S) – создает список из множества S. Однотипные элеevery list1:=[k:=key(Tab1),tab1[k]] do менты собираются вместе и располагаются в порядке создания.

{ sortf(S,i) – то же самое, только записи и списки сортируются every el:=!list1 do every WWrites(" ",!el) по i-м полям.



WWrite() } WDone() End Для символа 'т', например, получите: т 11 20 7.3. Некоторые другие функции copy(tab) – создает копию таблицы.

delete(tab,x) – удаляет из таблицы ключ вместе со значением.

insert(tab,x,y) то же, что и T[x]:=y.

member(tab,x) – проверка, является ли x ключом в tab.

33 9. Записи 10. Процедуры Запись в Icon'е – именованная структура, состоящая из мно- 10.1. Вызов процедур жества полей. Записи объявляются на самом верхнем уровне, как Наиболее общая форма вызова процедуры:

глобальные объекты или функции.

(e0)(e1,e2,...,eN), где:

Объявление записи: record r(f1,f2,f3,f4,...), где r – имя записи, e0 – выражение, вычисляющее имя процедуры, а e1,e2,...,eN f1,f2,f3,f4,... – имена полей записи.

– выражения, вычисляющие фактические параметры.

r является и конструктом записей. Запись в любом месте Пример программы (очевидно, в пределах какой-либо процедуры) создаетinvocable "proc1" ся следующим образом rec:=r(a,b,c,d,...). В данном случае a,b,c,d,...

invocable "proc2" конкретные начения полей.

invocable "proc3" Доступ к полю записи: r.f2 или r.f3. Если f3 – список, то доступ к элементу списка: r.f3[i].

procedure main() Но имя поля можно рассматривать как ключ таблицы, и L:=["proc1","proc2","proc3"] тогда функционально аналогичным выражением будет r["f3"][i].

every i:=1 to 3 do L[i](L[i]) Возможно и такое выражение pole:=r[2], эквивалентное end pole:=r.f2 и pole:=r["f2"] Очевидным образом к записям применяются уже знакомые procedure proc1(X) нам операции (*,!,) и функция copy.

writes(" ",X) Приведем пример, в котором процедуре передаются значеend ния полей записи:

record r(nb,name) procedure proc2(X) procedure main() writes(" ",X) r1:=r(1,"JOHN") end every proc_print(!r1) end procedure proc3(X) writes(" ",X) procedure proc_print(I) end write(I) Выход: proc1 proc2 procend procedure main() (proc1|proc2|proc3)("O'KEY") end procedure proc1(X) writes(" ",X||"&proc1") end 35 procedure proc2(X) 10.2. Выход из процедуры writes(" ",X||"&proc2") Процедура может быть завершена тремя способами.

end 1. Процедура завершает работу, когда управление достигнет end.

procedure proc3(X) 2. Процедура возвращает значение при помощи return.

writes(" ",X||"&proc3") return может возвращать конкретное значение, переменную end или &null. Значение может вычисляться «в теле» "return". ПримеВыход: O'KEY&proc1 O'KEY&proc2 O'KEY&procры: return, return x, return x+y.

3. Процедура возвращает множество значений по одному.

Пример со встроенными функциями:

Для этого используется оператор suspend.

procedure main() Пример:

f:=open("outp2.txt","wt") procedure main() plist:=[sin,cos,tan] every writes(“ “,proc1()) every i:=1 to 3 do write(f,plist[i](0.5)) end end procedure proc1() suspend seq()\В файл outp2.txt будет выведено:

end 0.Выход: 1 2 3 4 5 6 0.0.Множество параметров процедуры (f) можно представить в виде списка (L) и тогда вызовы процедуры:

f(L) f ! L "f"(L) "f" ! L Список формальных параметров может быть пустым, их число может быть больше или меньше формальных параметров.

Лишние параметры игнорируются, пропущенным или недостающим присваивается значение &null. Пропуск параметров обозначается лишней запятой: f(x,,z).

Заметим, что Icon всегда ожидает, когда параметрам-переменным будет присвоено окончательное значение:

writes(X:=3," ",X:=4," ",X:=5) напечатает 5 5 5.

Но writes(X:=3,Y:=4,Z:=5) напечатает 37 xdecode(f) – читает из f и декодирует некоторую структуру, 11. Основные функции для работы с файлами которая предварительно была записана в f при помощи xencode(x,f). Для использования этих функций программу необхо!f – генерирует все строки входного файла в контексте генедимо скомпилировать с модулем xcode, т. е. использовать link ратора.

xcode.

close(f) – закрывает файл.

flush(f) – принудительно разгружает буфер.

open(s1,s2) – открывает файл с именем s1 для доступа «в моде» s2. Неуспешна, если файл не может быть открыт.

Моды:

"a" – открыть файл для дозаписи, "b" – открыть файл для чтения и записи, "c" – создать файл, "r" – открыть для чтения (по умолчанию), "w" – открыть для записи, "t" – транслировать символ конца строки в символ перевода строки, "u" – не транслировать.

open(s1) – эквивалентно (s1,"rt"), read() – читать со стандартного входа, read(f) – читать строку из файла f, reads(f) – читать символ из файла f, reads() – читать символ со стандартного входа, reads(f,i) – читать i символов из файла f, seek(f,i) – установить указатель в файле в позицию i, where(f) – получить текущую позицию в файле, write(x1,x2,x3,...,xn) – запись либо на стандартное устройство вывода, либо в файл (файлы), если одно или несколько из xi являются файлами. Например:

procedure main() f1:=open("fout1.txt","w") f2:=open("fout2.txt","w") writes(f1,1," ",2,f2,3," ",4) close(f1) close(f2) end 39 return(@C) 12. Немного о совыражениях – coexpression end В отличие от генераторов, рассмотренных ранее, Вызов proc{e1,e2,...,eN} эквивалентен proc([e1,e2,...,eN]), где coexpression генерирует новое значение, если это возможно, при все ei – совыражения.

каждом новом обращении к нему. Правда, так называемые «регенерационные» совыражения могут генерировать от начала, но это Для того чтобы понять, как работают «совыражения» в редостигается за счет создания нового совыражения.





жиме псевдопараллельного выполнения, приведем два примера, не Coexpression нужно создать при помощи оператора create, а пожалев места на странице.

затем активировать при помощи @, чтобы получить результат:

.........................

procedure main() S1:="0123456789" s:="qwertyuiop" S2:="abcdefghik" x:=create(!s) a:=create !Swrites(" ",*x) b:=create !Swrites(" ",@x) while sim1:=@a do writes(" ",*x) { writes(" ",@x) writes(" ",sim1) writes(" ",*x) while sim2:=@b do writes(" ",sim2) end write() Выход: 0 q 1 w } В данном случае *x – дает число сгенерированных значений.

.........................

Выход:

Пример.

0 a b c d e f g h i k Пронумеруем строки входного файла, перезаписывая их в выходной файл outf.txt:

procedure main(args) f:=open(args[1]) outf:=open("outf.txt","wt") x1:=create(seq()) while Sf:=!f do write(outf,@x1," ",Sf) end Совыражения могут передаваться в процедуры в качестве Совыражение b мы разрядили в один прием, и далее печапараметров:

таются только значения совыражения a.

...............

А теперь заменим второе while на every:

proc1(create !s).........................

..............

while sim1:=@a do procedure proc1(C) 41 { 13. Графический интерфейс writes(" ",sim1) every sim2:=@b do writes(" ",sim2) Для того чтобы работать с графикой в Icon'е, Вашу проwrite() грамму следует «отлинковать» с модулем graphics: link graphics.

} Основным понятием графического интерфейса, площадкой,.........................

на которой развертываются «графические» события, является окВыход:

но. Окно определяется множеством атрибутов, большая часть 0 a которых приведена в нижеследующей таблице (Шаблон: i – значе1 b ние задается, o – значение берется):

2 c 3 d 13.1. Атрибуты окна 4 e Шаблон Атрибут Комментарий 5 f o, i label метка окна 6 g o, i pos, posx, posy позиция окна на экране 7 h o, i resize флаг возможности изменения размеров пользова8 i телем.

9 k Значения "on", "off" (по умолчанию).

Все дело в том, что coexpression – не классический генератор и every «зря старается», создавая контекст генерации. Полуo, i size, height, width размер окна в пикселах чим тот же результат, если:

o, i lines, columns размер окна в символах while sim1:=@a do{writes(" ",sim1);do writes(" ",@b);write()} i image Имя файла, содержащего рисунок, который явится начальным содержанием окна.

------------------------------------------------------------ o, i canvas атрибут, задающий состояние видимости. «hidden», «iconic», «normal», «maximal». Начальное значение: "normal".

i iconpos строка, содержащая пару координат ("X1,Y1"), определяющих положение окна с иконкой.

o, i iconlabel метка «иконки» o, i iconimage имя файла, содержащего рисунок «иконки».

------------------------------------------------------------ o, i echo атрибут, определяющий, будет ли отображаться на экране текст, 43 который затем учтется "verylight", "white","vertical", при помощи WRead или WReads. "diagonal", "horizontal", Значения "on","off" (по умолчанию). "grid", "trellis", "checkers", "grains", o, i cursor атрибут, определяющий видимость "scales", "waves".

текстового курсора на экране. По умолчанию – "black".

Значения "on","off" (по умолчанию). ------------------------------------------------------------ o, i clipx, clipy верхний левый угол прямоугольника o, i x, y позиция курсора в пикселах отсечения o, i row, col позиция курсора в символах o, i clipw, cliph ширина и высота прямоугольника ------------------------------------------------------------- отсечения o, i pointer вид указателя мыши o, i dx, dy смещение для каждой пары координат, o, i pointerx, pointery позиция укателя в пикселах добавляемые перед интерпретацией.

o, i pointerrow, pointercol позиция укателя в символах По умолчанию – 0.

------------------------------------------------------------- Атрибуты в WOpen обычно задаются <имя_атр>=<значение>.

o displayheight высота экрана в пикселах Приведем пример создания графического окна.

o displaywidth ширина экрана в пикселах..........

font := "Times New Roman,20" Атрибуты графического контекста WOpen("label=Пример окна","size=600,400","bg=very light --------------------------------------------------------- gray", o, i fg цвет основной (линий или текста) П.у. – "black" "font="||font) | stop("can't open window") o, i bg цвет фона. П.у. – "white"..........

--------------------------------------------------------- o, i font цвет текста 13.2. Текст – запись в окно и чтение из o fheight, fwidth высота и ширина шрифта Для операций текстового ввода-вывода в графическом ре--------------------------------------------------------- жиме предназначены функции WWrite, WWrites, WRead, WReads, o, i linewidth ширина линии в пикселах. П. у. – 1.

являющиеся аналогами write, writes, read, reads.

o, i linestyle стиль линии. Значения – "solid", Запись и чтение производится, начиная с текущей позиции "dashed", "striped". По умолчанию – "solid".

курсора. Курсор может быть установлен при помощи GotoRC(R,C) o, i fillstyle атрибут, определяющий, будет ли использоватьи Gotoxy(X,Y).

ся pattern при рисовании. Значения "solid", "textured", "masked".

Pages:     | 1 | 2 || 4 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.