Н. Вирт - Программирование на языке Модула-2 (1160777), страница 34
Текст из файла (страница 34)
Вчастности, они относятся к вводу и выводу. Модуль Terminal представляет стандартныйалфавитно-цифровой терминал, используемый для ввода и вывода. FileSystem предоставляетнеобходимые операции для создания, чтения, записи, именования и удаления Файлов,организованных как потоки литер или слов.Модули Windows. TextWindows и GraphicWindows образуют иерархию, предназначеннуюдля обслуживания дисплея с высоким разрешением. Два последних используют в качествебазисного модуля Windows. С этими модулями тесно связаны модули CursorMouse и Menu.
Первыйпредполагает наличие указательного устройства, так называемой мыши, для ввода значенийкоординат и отображает его положение на экране дисплея с помощью курсора. Модуль Menuсвязывает мышь с дисплеем, обеспечивая универсальное средство ввода команд в виде такназываемых иерархических меню.Эти модули представлены здесь в виде модулей определений. Мы подчеркиваем, что онине являются частью языка Модула-2. Различные реализации могут отличаться либо деталямиреализации модулей, либо выбором предоставляемых модулей.DEFINITION MODULE Terminal; (*S.E.Knudsen*)PROCEDURE Read(VAR ch: CHAR);PROCEDURE BusyRead(VAR ch: CHAR);(*если клавиша не была нажата, то возвращает 0С*)176PROCEDURE ReadAgain;(*после этого вызова последняя прочитанная литера может быть прочитана еше развызовом Read*)PROCEDURE Write(ch: CHAR);PROCEDURE WriteLn; (*завершить строку*)PROCEDURE WriteString(s: ARRAY OF CHAR);END Terminal.DEFINITION MODULE FileSystem; (*S.E.Knudsen*) ]FROM SYSTEM IMPORT ADDRESS,WORD;TYPEResponse = (done,notdone,notsupported,callerror,unknownmedium, unknownFile, paramerror,toomanyfiles,eom,deviceoff,softparityerror,softprotected,softerror,hardpar1tyerror,hardprotected,timeout,harderror);Command = (create,open,сlose,lookup,rename,setread,setwrite,setmodify,setopen,doiо,setpos,getpos,length,setprotect,getprotect,setpermanent,getpermanent,getinternal);Flag = (er,ef,rd,wr,ag,bytemode);FlagSet = SET OF Flag;File = RECORD res: Response;bufа,еlа,ina,topa: ADDRESS;elodd,inodd,eof: BOOLEAN;flags: FlagSet; CASE com: Command OFcreate,open,getinternal:fileno,verslonno: CARDINAL |lookup: new: BOOLEAN |177setpos,getpos,length: highpos,lowpos: CARDINAL|setprotect,getprotect: wrprotect: BOOLEAN |setpermanent,getpermanent: on: BOOLEANEND;END;(*Процедуры, определяемые файловой системой, могут быть сгруппированы следующимобразом:1.
Открытие, закрытие и переименование Файлов.(Create,Сlose,Lookup,Rename)2. Чтение из Файла и запись в Файл.(SetRead,SetWrite,SetModifу,SetOpen,Doiо)3. Позиционирование файлов.(SetPos,GetPos,Length)4. Потокоподобная работа с Файлами.(Reset,Again,ReadWord,WriteWord,ReadChar,WriteChar)*)PROCEDURE Create(VAR f: File;ИмяУстройства: ARRAY OF CHAR);(* создает новый временный (или безымянный) Файл на указанном устройстве *)PROCEDURE Close(VAR f: File);(* завершает операции над Файлом f, т.е.
разрывает связь между переменной f и Файловойсистемой. Тем самым временный Файл уничтожается, а Файл с непустым именем остается вдиректории для последующего использования *)PROCEDURE Lookup(VAR f: File;filename: ARRAY OF CHAR; new: BOOLEAN);(* ищет Файл filename. Если Файла не существует и new-TRUE, то создается новыйфайл с данным именем *)PROCEDURE Rename(VAR f: File; filename: ARRAY OF CHAR);(* Файл переименуется именем filename, если новое имя пусто, то Файл fстановится временным *)178PROCEDURE SetRead(VAR f: File);(* инициализация файла f на чтение *)PROCEDURE SetWrite(VAR f: File);(* инициализация Файла f на запись *)PROCEDURE SetModify(VAR f: File);(* инициализация Файла f на модификацию *)PROCEDURE SetOpen(VAR f: File);(* прекращает любую операцию ввода-вывода над Файлом f*)PROCEDURE Doio(VAR f: File);(* используется совместно с SetRead, SetWrite и SetModifу для последовательного чтениязаписи и модификации Файла f *)PROCEDURE SetPos(VAR f: File; highpos,lowpos: CARDINAL);(* устанавливает текущую позицию Файла f на байт highpos*2^16 + lowpos *)PROCEDURE GetPos(VAR f: File; VAR highpos,lowpos: CARDINAL);(* выдает текущую позицию файла f в переменные highpos и lowpos*)PROCEDURE Length(VAR f: File; VAR highpos,lowpos: CARDINAL);(* выдает длину Файла f в переменные highpos и lowpos *)PROCEDURE Reset(VAR f: File);(* выполняет SetOpen и устанавливает позицию Файла в его начало *)PROCEDURE Again(VAR f: File);(* после этого вызова, процедуры ReadWord и ReadChar прочитают то же самое значение,которое было прочитано перед этим *)179PROCEDURE ReadWord(VAR f: File; VAR w: WORD);(* читает из Файла следующее слово *)PROCEDURE WriteWord(VAR f: File; w: WORD);(* пишет в Файл следующее слово *)PROCEDURE ReadChar(VAR f: File; VAR ch: CHAR);(* читает из Файла следующую литеру *)PROCEDURE WriteChar(VAR f: File; ch: CHAR);(* пишет в Файл следующую литеру *)END FileSystem.DEFINITION MODULE InOut; (*N.Wirth*)CONST EOL = 36C;VAR Done: BOOLEAN;termCH: CHAR;PROCEDURE 0penInput(defext: ARRAY OF CHAR);(*запрашивает имя Файла и открывает на ввод файл "in".
Done := "Файл успешно открыт".После этого вызова последующий ввод происходит из этого Файла. Если имязаканчивается точкой, то добавляется расширение defext *)PROCEDURE OpenOutput(defext: ARRAY OF CHAR);(*запрашивает имя Файла и открывает на ввод Файл "out". Done := "файл успешно открыт".После этого вызова последующий вывод происходит в этот Файл *)PROCEDURE CloseInput;(*закрывает входной Файл: возвращает ввод на терминал*)PROCEDURE CloseOutput;(*закрывает выходной Файл; возвращает вывод на терминал*)180PROCEDURE Read(VAR ch: CHAR);(*Done := NOT in.еоf*)PROCEDURE ReadStrlng(VAR s: ARRAY OF CHAR);(*чтение цепочки, т.е. последовательности литер, не содержащей пробелов и управляющихлитер; начальные пробелы игнорируются.
Ввод прекратится на любой литере <= " "; эталитера присваивается переменной termCH. Литера DEL используется для забоя литер привводе с терминала*)PROCEDURE ReadInt(VAR x: INTEGER);(*прочитать строку и преобразовать ее в целое. Синтаксис: целое = ["+"|"-"]циФра{циФра}.Предшествующие пробелы пропускаются. Done := "прочитано число"*)PROCEDURE ReadCard(VAR x: CARDINAL);(*прочитать строку и преобразовать ее в число типа CARDINAL. Синтаксис: целое =цифра{цифра}. Предшествующие пробелы пропускаются.
Done := "прочитано число"*)PROCEDURE Write(ch: CHAR);PROCEDURE WriteLn; (*завершить строку*)PROCEDURE WriteStrlng(s: ARRAY OF CHAR);PROCEDURE WriteInt(x: INTEGER; n: CARDINAL);(*записать целое число х, использовав не менее п литер, в Файл "out". Если п большеколичества необходимых позиций, то происходит дополнение пробелами слева *)PROCEDURE WriteCard(x,n: CARDINAL);PROCEDURE WriteOct(x,n: CARDINAL);PROCEDURE WriteHex(x,n: CARDINAL);END InOut.DEFINITION MODULE RealInOut; (*N.Wirth*)VAR Done: BOOLEAN;PROCEDURE ReadReal(VAR x: REAL);(*Прочитать действительное число х согласно синтаксису:["+"|"-"]цифра{цифра}["." цифра{цифра}]["Е"["+"|"-"]цифра[цифра]]181Done = "число прочитано".Учитывается не более 7 цифр, предшествующие нули не считаются.
Максимальныйпорядок равен 38. Ввод завершается пробелом или управляющей литерой. DELиспользуется для забоя *)PROCEDURE WriteReal(x: REAL; n: CARDINAL);(*Напечатать х, используя п.литер, если требуется меньше чем п позиций, то слевавставляются пробелы *)PROCEDURE WriteRealOct(x: REAL);(*Напечатать х в восьмеричной Форме с мантиссой и порядком *)END RealInOut.DEFINITION MODULE Windows: (*O.Gutknecht*)CONST Background = 0; FirstWindow = 1; LastWindow = 8;TYPE Window = [Background..LastWlndow];RestoreProc = PROCEDURE(Window);PROCEDURE OpenWindow(VAR u: Window; x,y,w,h: CARDINAL;Repaint: RestoreProc; VAR done: BOOLEAN);(*Открыть новое окно.
Repaint будет вызываться для его восстановления*)PROCEDURE DrawTitle(u: Window; title: ARRAY OF CHAR);(*Вывести заголовок title *)PROCEDURE RedefineWindow(u: Window; x,y,w,h: CARDINAL;VAR done: BOOLEAN),(*Переопределить прямоугольник окна*)PROCEDURE CloseWindow(u:Window);(*Закрыть окно u*)PROCEDURE PlaceOnTop(u:Uindow);(*Поместить окно и на верх*)182PROCEDURE PlaceOnBottom(u:Window);(*Поместить окно и в самый низ*)PROCEDURE OnTop(u:Window): BOOLEAN;(*Окно и - самое верхнее*)PROCEDURE UpWindow(x,y: CARDINAL): Window;(*Возврашает номер окна или Фона, соответствующего координатам экрана (х,у)*)END Windows.DEFINITION MODULE TextWindows: (*J.Gutknecht*)IMPORT Windows;TYPE Window = Windows.Window;RestoreProc = Windows.RestoreProc;VAR Done: BOOLEAN;(*Done="предыдущая операция успешно завершена"*)termCH: CHAR; (*завершающая литера*)PROCEDURE OpenTextUlndow(VAR u: Window;x,y,w,h: CARDINAL; name: ARRAY OF CHAR);(* Открыть текстовое окно и спараметрами x,y,u,w и именем name *)PROCEDURE RedefTextWindow(u: Window; x,y,w,h: CARDINAL);(* Переопределить текстовое окно *)PROCEDURE CloseTextWindow(u: Window);(* Закрыть текотвое окно *)PROCEDURE AssignFont(u: Window; frame,charW,lineH: CARDINAL);183(*Назначить окну шрифт с номером frame, с расстоянием между символами charW и междустроками lineН *)PROCEDURE AssignRestoreProc(u: Window; r: RestoreProc):(* Назначить процедуру восстановления окна *)PROCEDURE AssignEOWAction(u: Window; r: RestoreProc);(*Определить действие, выполняемое по достижению конца окна*)PROCEDURE ScrollUp(u: Window);(*Передвинуть текст в окне на одну строку вверх*)PROCEDURE DrawTitle(u: Window; title: ARRAY OF CHAR);(*Напечатать заголовок title *)PROCEDURE DrawLine(u: Window; line,col: CARDINAL);(*col=0:прочертить горизонтальную линию в строке line line=0:прочертить вертикальнуюлинию в столбце col*)PROCEDURE SetCaret(u: Window; on: BOOLEAN);(*Управление текстовым курсором: оn="курсор на экране"*)PROCEDURE Invert(u: Window; on: BOOLEAN);(*Инвертирование изображения в окне: on ="изображение негативное"*)PROCEDURE IdentifyPos(u: Window; x,y: CARDINAL; VAR line,col:CARDINAL);(*Определить координаты в окне (line,col) точки экрана с координатами х,у*)PROCEDURE GetPos(u: Window; VAR line,col: CARDINAL);(*Получить текущую позицию в окне*)PROCEDURE SetPos(u: Window; line,col: CARDINAL);(*Установить текущую позицию в окне*)184PROCEDURE ReadString(u: Window; a: ARRAY OF CHAR);PROCEDURE ReadCard(u: Window; VAR x: CARDINAL);PROCEDURE ReadInt(u: Window; VAR x: INTEGER);PROCEDURE Write(u: Window; ch: CHAR);(*Напечатать литеру в текущей позиции.
Управляющие литеры BS,LF,FF,CR,CAN,EOL иDEL соответствующим образом интерпретируются*)PROCEDURE WriteLn(u: Window);PROCEDURE WriteString(u: Window; a: ARRAY OF CHAR);PROCEDURE WriteCard(u: Window; x.n: CARDINAL);PROCEDURE WriteInt(u: Window; x: INTEGER; n: CARDINAL);PROCEDURE WriteOct(u: Window; x,n: CARDINAL); END TextWindows.DEFINITION MODULE GraphicWindows; (*E.Kohen*)IMPORT Windows;TYPE Window = Windows.Window;RestoreProc = Windows.RestoreProc;Mode = (replace,paint,invert,erase);VAR Done: BOOLEAN;(*Done="предыдущая операция успешно завершена"*)PROCEDURE OpenGraphicWindow(VAR u:Window:x,y,w,h: CARDINAL; name: ARRAY OF CHAR;Repaint: RestoreProc);(*Открыть графическое окно.