Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 168
Текст из файла (страница 168)
Новая версия языка — г ОКТКАХ 90— поддерживает рекурсию и динамическое распределение памяти. Выполнение программы завершается оператором 5ТОР. Возвращение из подпрограммы в вызывающую программу пропсхолит с помощью оператора КЕТОКМ. Ввод и вывод В языке поддерживаются как последовательные файлы, так и файлы прямого доступа, а также предусмотрен широкий набор операций ввода-вывода. Для операций ввода-вывода используется девять операторов; КЕАО, )(К!ТЕ и РК1МТ опрелеляют фактическое преобразование данных, операторы ОРЕМ, СЕ05Е и 1МОО!КЕ позволяют установить или запросить статус, метод доступа и другие свойства файла, а операторы ВАСК5РАВЕ, КЕК1МО и СМОГ! ЕЕ обеспечивают установку указателя позиции файла.
Текстовыйфайл(последовательностьсимволов) в языке гОКТКАХ называется формантиро(тат!)тесн файлом, остальные файлы — нефорлтантировпт(ными. Во время передачи данных в форматированный файл операторы КЕАО, ))К!ТЕ и РК)МТ преобразуют значения данных из внутреннего представления в символьную форму. Передача данных в неформатированный файл оставляет данные в их внутреннем представлении. Ввод и вывод данных с помощью операторов КЕАО, ИК! ТЕ и РК1МТ в форматированный файл может осуществляться под управлением списка. Это означает, что явно не задается никакого определения формата, а, как видно из листинга П.б, используется внутренний, определенный системой формат.
Альтернативным способом является задание программистом явного формата; иетиа ГОКМАТ (поспеповатепанасть специЕииапий фориата) Метка используется в операторах КЕАО, )(К!ТЕ и РК1МТ, Например, чтение последовательности целых чисел, отформатированных так, что в одной строке размещаетсяя восемь чисел, каждое из которых занимает пять позиций, можно задать с помощью следующих опера~оров КЕАО и ЕОКМАТ: КЕА0 200. К, (М(К). К"!.7) 200 ГОРМА. (8!8) То же самос можно описать, поместив определения формата внутрь оператора КЕАО: КЕА0 "(8!8)" Н. (М(Х). К-!.7) 610 Приложение.
Обзоры языков Этот оператор йЕАО определяет, что первое целое число записывается в переменную И, а следующие — в компоненты 1-7 вектора М, В операторе ЕОИМАТ заданы дескриптор ! Преобразования в цсл<шисленный формат, ширина поля вывода каждого числа (5) и коэффициент повторения (8), означа»ощий, что в строке ввода располагаются восемь целых чисел, начиная с первой позиции.
Для различных типов числовых и символьных данных предусматривается большое количество возможных дескрипторов форматов данных. Некоторые паиболес распространенныс приведены далее (и — ширина п<>ля енола-вывода, 0 — количество десятичных цифр).
Пример использования Дескриптор Тип даннык !и Еи <( Еи <) иХ Цель<й Фиксированный (вещественный) Экспонвнциальный (вещественный) Пропуск Символьный !5 - !2345 Е6 2 = 123 56 Е10.2 = . 12.34Е+02 = 1234 Пропускает и символьных позиции А6 - аЬссе» Ан "литерал" "зьссеп' печатается как б символов аЬсее( Константа Обычно безопаснее при размещении данных выравнивать их но правому краю поля. При чтении числовых данных начальные пробелы будут интерпретировать- ся как 0. Каждый оператор йЕАО и ИИПЕ начинает обрабатывать соответственно новую строку ввода или печатать на новой строке вывода.
Для каждого элемента входно- го или выходного списка используется следующий дескриптор оператора ЕОИМАТ, пока не будет достигнут конец списка данных. Если элементов данных больше, чем лескрипторов оператора ЕОИМАТ, тогда оператор ЕОИМАТ заново начинает пере- бор своих дескрипторов, но с новой строки данных. Для задания обработчика исключений при достижении конца файла или в слу- чае возникновения ошибки в операшп» ввода-вывода в операторах йЕАО и Ий)ТЕ ука- зывается метка того оператора в подпрограмме, выполняющей ввод или вывод, которому следует передать управление при возникновении исключительной си- туации.
Например, йЕАОШИЕТ=2. ЕМТ-200, ЕИО-50. Ейй=90) И. (М(К). К-1.7) является расширенной формой оператора йЕАО, в котором опредет»яется, что в слу- чае обнаружения конца файла следует передать управление оператору с меткой 50, а в случае возникновения ошибки ввода — оператору с меткой 90. Параметр ОИ!Т = 2 указывает, что файл нужна искать на входном устройстве, которому присвоен но- мер 2. Спецификации форматов, управляющих вводом и выводом данных, трактуют- ся как символьные строки.
Во время трансляции они сохраняются в форме сим- вольных строк и интерпретируются процедурами йЕАО, Ий!ТЕ и Рй!ИТ по мере необ- ходимости во время выполнения программы. Спецификация формата (символьная $ строка) может создаваться динамически нли считываться во время выполнения программы и потом использоваться для управления преобразованиями ввода-вы- вода. В результате получается гибкая и мощная система ввода-вывода.
П,б, ЬШ Е11 Пример с пояснениями В листинге П.7 приведен пример программы для суммирования элементов массива на языке)ача. В данном примере при вводе пользователем последовательности чисел 41234 программа выдает следу)оп(ий результат: 1234, 5ОИ=10 Этот пример похож на пример программы на языке С++, приведенный в листинге П.5, что демонстрирует сходство этих языков. Листинг П.7.
Пример суммирования элементов массива на языке Эача 1 .враг( )ача во.*; 2 с!авв ОасаСопчегв ( 3 рцЫ вс впт сопчегв(оуве сЫ (гегцгп сп-'О';)]; 4 с1авв Оагабвоге ехвеппв Оавасапчегв ( 5 рцЫвс чота впвма1(!пг а) б (с!=0: 7 в!ве-а:): 8 вовс ваче(впг а) 9 (ввоге[св++]-г;); 10 впв веврг!пм ) ( с!=О; гесцгп и ве:): 11 впв ргвпвча!() ( геьцгп вгоге[св++].); 12 !ПС вцв() 13 (!пс аггвов - 0; 14 Гог(св-О:с(<в!ве.с!+<)аггвцв=аггвцвнввоге[св]; 15 гегц!и аггвцв;); 16 рг!чаве ввав!с !пв вахввве = 9: 17 7пв в!ве; // Разнер пассива 18 !пс с7; // Текущий инленс пассива 19 !пг[] в(аге = пен !пв[ввхвтве];); 20 с!а!в ывр!е ( 21 рцЫвс атас!с чо1о вавп(5втп9 агйчП) 22 ( впв вв.м 23 Ьуве[] Ыпе = печ Ьуве[10], 24 Оага5воге х - пен Оава51оге(): 25 Сгу( 26 чпв!е((вв- 5уввев.вп.геас([впе)) !- О) 27 (впв К - х,сопчегв(Ы пе[0]): 28 х.!пвм а1(К): 29 Тог(3-1;)<-К Ы+ч)х.вече(х.сопчег(([впе[)])); ЭО Гог()-х.вевргвпт(); )>О: З--) Э1 5уввев,оцв,рппг(х.рт пвча1()): 32 5увввв.оцв рг!пв("; 5ОИ "), 33 5уввев.оцы рт пв!п(х.вцв()):)) 34 савсЫ[хсермоп е)(5увсев оцырг!пв!п("Рв1е еггог "):] 35 ) // Конец главной програннн 36 ) // Конец нласса вавр1е Строка 1.
В этом примере будет использован стандартный пакет ввода-вывода ]ачайо.*. Строки 2 — Х Классы языка)ача похожи на классы языка С++. Тип доступа рцЫ ! с является атрибутом функции или объекта данных и определяет их открытость, 612 Приложение. Обзоры языков Строка 4. Для определения производных классов в языке бача используется ключевое слово ех[епбз. Строка 12 — 15, Структура функций языка)ача в основном похожа на структуру функций в языках С и С++.
Строка 19. Массивы обрабатываются не так, как в языках С и С++, Массив зсоге определяется как целый массив ()п[[) ), а затем оператор пеи отводит для него требуемый объем памяти. Строка 21. Главная программа на10 должна быть объявлена как рпЫ1с и зга[1с. Строка 24. В этом классе осуществляется ссылка на класс Оа'са5[сге через его экземпляр х, создаваемый операцией пеи. Строка 25.
Операторы [гу и сассМ (строка 34) необходимы для обработки ошибок ввода и вывода. Строка 26. Метод 5узтев. а и геаб считывает строку ввода в байтовый массив [)пе. Строки 27 — 33. Это тот же алгоритм, что и в программе на языке С++. Метод 5узгев.оп[. рг1 пг записывает свои аргументы в стандартный выходной файл. Метод 5узсее.спг, рг1001п добавляет в конец строки символ конца строки, П.5.1. Объекты данных Элементарные данные.
Числовые данные могут быть Вь 16-, 32- или 64-битовы- ми. Целые могут быть 100 и 1000. Также существуют 32-битовые вещественные данные (11 ба 0) и 64-битовые вещественные (бопЫ е), которые удовлетворяют стаи- дарту [ЕЕЕ 754. В языке )ача также можно сохранять данные как суте и зпогц хотя для осуществления каких-либо операций над ними их требуется приводить к типу 1п[. Символьные данные сохраняются в формате Вп1собе. Это международный стан- дарт, который создает 16-битовые символы. Например, спаг х - 'а' создаст объект х, хранящий код Ни|себе символа а. Булевы данные могут иметь значения Ггпе и 101зе, В отличие от языка С в)ача булсвы данные не являются целыми значениями.
Структурированные объекты данных. В языке массивы определяются явно Например, оператор яеича1иеа Мубата[) описывает массив Мубаса типа Меича1иез, где Иеиуа1иез — определенный программи- стом класс объектов. Однако для фактического размещения массива необходимо использовать функцию пеи, как, например, в следующем примере для размещения 100-элементпого массива: Муса[а - пеи яеиха1чеа[ 100). Для фактического размещения каждого элемента массива необходимо для каж- дого 1 выполппть оператор: Мубаса[1) = пеи яьаа1пеа[) Оба эти шага можно объединить в одгиг, например, 1пг[ ) пузата - пеи 1п[ ООО); размещает Муба [а как массив из 100 элементов. П.5.
дАЧА 613 Метод 1епрьь() массивов возвращает длину массива: Муса(а.1елрщ() В данном случае будет возвращено значение 100, как и в языке С++, Строки — это объекты с синтаксисом, близким к синтаксису строк в языке С. Соответственно 5(гтлч РцЫ тзиег = "Ргел(тсе На11' создает строковый объект РцЫтзЬег и инициализирует сто строкой Ргепттсе На11. Операция + для строк означает их конкатенацию. Так, 5узтеа.оцырюл(1л(РцЫтзлег « " тз тье рцЫтзнег о( Фтз Ьоох "); напечатает «Ргепбсе На!1 св ()те рцЫ)зЬег о((Ь)з Ьоо)с .