![]() |
|
Главная Терминология Хоора 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ 19 ] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 -реперь мы можем привести две схемы программ для писй и чтения текстов, подобно схемам для записи чтения Других файлов [см. (1.52) и (1.53)]. В этих схе-дх участвует текстовый файл f и уделяется должное внимание формированию и распознаванию строчной структуры. Пусть R{x) - оператор, присваивающий переменной х (типа cftc) некоторое значение. В нем также определяются условия и g, означающие это был последний символ строки и это был последний символ файла . При чтении файла в начале каждой строки выполняется оператор U, а для каждого символа X выполняется оператор S{x). В конце каждой строки выполняется оператор V. Запись текста f: rewnte(jy, while -ig do begin while -\рйо begin R(x); wnte{f,x) end ; writeln(f) (1.54) Чтение текста f: reset(f); while -ieof(f) do begin U; while -coln(f) do begin tead(f,x); S(x) end ; V; readlnif) (1.55) Бывают случаи, когда построчная структура текста не содержит никакой существенной информации. Наше соглашение о значении буферной переменной при пояЁлении признака конца строки (см. определение eoln{f)\ позволяет в таких случаях использовать простую схему. Заметим, что в соответствии с определением eoln каждый конец строки дает Добавочный символ пробела. while ~ieof(J) do begin readify, S{p() (1-56) В большинстве языков программирования принято доц екать для процедур чтения и записи аргументы типа integf или real. Такое обобщение было бы строгим, если бы тиц, integer и real представлялись как массивы символов, ком% ненты которых обозначают отдельные цифры числа. Языкц ориентированные только на коммерческие приложения, щ ствительно удовлетворяют такому определению: они требую, представления чисел в десятичных цифрах и в десятично^ системе счисления. Но введение типов integer и real в каче.. стве фундаментальных обладает важным преимуществом' можно опустить подобные детальные спецификации. Flpii этом в системе можно использовать такие представления чисел, которые больше ей соответствуют. В действительности в системах, ориентированных на научные расчеты, всегда выбирают двоичное представление, так каконо почти во все отношениях имеет преимущества перед десятичным. Но из этого следует, что программист должен понимать, что невозможно читать числа или записывать их в файлы без соответствующих операций преобразования. Обычно эти операции неявно содержатся в операциях read и write с аргументами числовых типов. Однако профессиональный программист сознает, что такие операции (так называемые I/O-oiie-рации) состоят из двух различных действий: обмена данными между различными запоминающими устройствами и преобразования представлений данных. Последнее действие может быть довольно сложным и занимать много времени. В последующих главах этой книги операции чтения и записи с числовыми аргументами будут использоваться в соответствии с правилами языка программирования Паскаль. Эти правила допускают некоторые спецификации формата .для управления процессом преобразования. Спецификации формата указывают число желательных цифр при операции записи. Это число символов, называемое также шириной поля , записывается сразу после аргумента следующим образом: writeif, х: п) Аргумент X должен записываться в файл f; его значение прообразуется в последовательность из (по крайней мере) символов. Если необходимо, цифрам предшествует знак и со ответствующее число пробелов. Для того чтобы понять примеры программ, приводимы* далее в этой книге, дальнейшие подробности не нужны. нако мы включили сюда две подпрограммы (программы и 1.4), преобразующие представления чисел, чтобы показать насколько сложны подобные действия, неявно предполагаК) щиеся в операторах записи. Эти процедуры преобразуют вв Ш*е, 0<e<322 } procedure гей(й-ей/(var /: text; var x . real); {чтение вещественного числа x из файла f] {далее идут константы, связанные с отдельной jf, вычислительной системой] const /48 = 281474976710656; {= 2**48} limit = 56294995342131; {== /48 div 5} z = 27; {= ord(0) } i lim\ = 322; [максимальный порядок] liml = -292; [минимальный порядок] type/jom/ == 0..323; var ch: char; y: real; a,i,e: integer; f s,ss: boolean; [знаки] fimction ten{e: posint): real; [ var /: integer; t: real; begin i := 0; t := 1.0; repeat if odd(e) then , case / of 0: t := t * l.OEl; 1: / < * 1.0E2; 2: / := / * 1.0E4; 3: / :== / * 1.0E8; 4: t := t * 1.0E16; 5: / := < * 1.0E32; 6: t:= t * 1.0E64; 7: t := t * 1.0E128; i 8: < := < * 1.0E256 i- end ; e := e div 2; i := i+l i until e = 0; /ел :== / end ; begin [пропуск начальных пробелов] while /t= do get{f); ch:=f\; llch =- then begin s := /we; ge/(/); ch f\ end else begin 5 := false; if с/г = + then begin get(J); ch :=/t end end; if-i(cA in [0..9]) then / |