Говорухин В., Цибулин Б. Компьютер в математическом исследовании (1185927), страница 79
Текст из файла (страница 79)
Параметр 'РЯЕС' задает число бит для записи чисел. Например, текстовая строка 'Г) аа[б4' указывает, что данные следует записывать в формате двойной точности, по 8 байт на число, а четырехбайтовый формат записи целых чисел задается строкой ) птеоег*4. Перечень допустимых форматов можно получить по справке пе) р 1геа6. Дополнительный параметр '5)(1Р' определяет число байтов, которое должно быть пропущено после считывания очередного элемента. Команда тыг1 Ее используется для записи бинарных файлов: СОЭИТ-(нгзте(Е),РАДА.'РЯЕС','5К!Р') Команды ввода-вывода 421 » Г-Горан("ааа. 1",'г+');(аа.п]-(геаИ,(2.2].
Чпгечег»4'), аа- 1 3 4 2 и= 4 » ЬЬ-(геап((.'Г)оа164'). сс-(геаа(Г), Гс1оае(Г); ЬЬ 3 141бе+000 сс- П Действительно, в файле ааа.1 была записана матрица второго порядка и число ж Прн попытке считывания еще одного числа получен пустой массив. Если же при чтении не определить структуру матрицы или указать иной формат для чтения, то результатом будет вектор-строка из элементов, число которых и сами значения определяются форматом считывания. Например, для формата йаа164 получаем строку из трех элементов: » Г-тороп("ааа. 1");аа-тгеап(Г.'г1оасба'); Гс1оае(Г):аа' апа- 8.4880е-314 4.2440е-314 3.141бе+ООО При считывании с установками по умолчанию получается вектор из 24 целых чи- сел: » (-Гореп("ааа. 1");аа Ггеао(г); Гс1оае(г).аа' апаСо1 озпа 1 Ьвгоорп 12 1 0 0 0 4 0 0 0 3 0 0 0 С01иппа 13 Ьвгоочп 24 2 0 0 0 24 45 68 84 261 33 9 64 Для считывания части данных используется функция 6аееЬ ( г1, МОМ, ' ЕЬАО' ), служащая для перемещения на целое число КОМ позиций, причем положительное КОМ означает продвижение к концу файла, а отрицательное — к началу файла.
После открытия файла указатель установлен на первый байт. После считывания очередного числа указатель переместится на столько байтов, каков формат чтения. Текущее положение выводится по команде 61е11 (г 1) . Для проверки достижения конца файла служит команда тео6(г ] ).
Для возврата в начало файла можно испольэовать функцию тгеы1 ос(г]). Бинарные файлы являются просто потоками байтов, а для работы с текстом, разбитым на строки, используются текстовые файлы. Такие файлы могут содержать как текст, так и числовую информацию, которую для записи предварительно следует перевести в строковые переменные при помощи команд п(в)2эсг и (012атг. Для чтения информации из текстовых файлов применяются функции где01, рдесэ и 6асапй Для записи служит функция ург1 псу, причем если файловый идентификатор равен единице или отсутствует, то вывод идет на экран, Для чтения и записи применяются форматные спецификации, см. табл.
16.2. Приведем пример. Подготовим вектор-строку 422 Глава 16. Программирование в МАТотВ »у 1:4 У" 1 2 3 4 и организуем вывод на экран » тргглтн "Ж7 2Г Ж12.7ттп",у1: 1.00 2.0000000 3.оа 4.аооаооо Таблица 16.2. Спецификации при вводе н выводе Код Описание Жо жт Жз Жа Жс Теперь дадим пример считывания разнородных данных при помощи команды сехсгеаб. Пусть в файле пту бат данные размещены на двух строках следующим об- разом: Опе 1.2 -3 5 тыз 1е-6 123 Иезт Кроме того, пусть в файле пзу.бао имеется третья пустая строка. Напомним, что для чтения вещественной, целой и строковой переменных следует использовать соответственно спецификации ЖГ, Жб, Жз.
Выполним команду » Гпам,х.п.яег)-тектгеаб1»яу.бат", 'Жз ЖГ Жб Жз'); После считывания данных выведем переменные паяз, х, и и п1аг: Размерности массивов паяз, х, и, пи г заранее не задаются, а определяются в процессе чтения по числу строк. Заметим, что при чтении вещественной переменной из вто- рой строки никакого усечения не произошло, в чем можно убедиться, обратившись к этому элементу массива: пдм "Опе" "тьо" х 1.2000 0.0000 П -3 123 "5" киева" Чтение целого числа (при выводе — переменная бовЫ е) Чтение положительного целого числа (при выводе — переменная бонЫе) Чтение вещественного числа (при выводе — переменная бооЫе) Чтение строки с пробелами (при выводе — переменная типа се11зтг) Чтение страни (при выводе — переменная типа се11зтг) Чтение символов, разделенных пробелами (при выводе — переменная типа се11зтг) Объектно-ориентированное программирование 423 » х(2) апа- 1.0000е-00б Для считывания того же файла могут быть использованы другие команды: » Г!О=тороп( 'пу.оат"); »ю)е 1 11пе = (че11(ГШ) !т -жвтг(1)пе), Ьгеах.
епе епп тс)05е( ЙЕ), В результате получим набор текстовых строк: 11пе = Опе 1.2 -3 5 11пеТио 1е-б 123 Иевг 1)пе = берту етг1пч. 1-Ьу-0 11пе- -1 Предпоследняя строка появилась из-за того, что в считываемом файле имелась пустая строка, а последняя строка есть реакция команды )0ег) на достигнутый конец файла.
Команды для работы со стандартными файлами О сохранении и считывании рисунков в различных графических форматах написано в главе 14 «Графика МАТ|АВ». Для считывания аудио- и видеофайлов в стандартах ац, утаи и ач! имеются соответственно команды аигеао, изугеас' и ау) геап. Аналогично для записи используются команды: аоиг)ге, натиг)те )и ау)т)1е. Это позволяет применять МАТЮКАВ для обработки и подготовки звуковой и видеоинформации. В МАТ)АВ поддерживается работа сданными электронных таблиц Гл( цз 123 и Ехсе!. Для считывания и записи файлов в стандарте !.о!пз 123 используются команды иЕ1геап и ик1)гг) Ье, а для считывания таблиц Ехсе! имеется команда х1 згеап.
Кроме того, в МАТ!.АВ существует возможность работы с данными в формате НН (Н!егагсЫса! !)а!а Рогшаг). Этот машинно-независимый формат разработан для хранения научных данных. Краткие описания некоторых перечисленных типов файлов даны в третьей части книги. Объектно-ориентированное программирование Современное объектное программирование основано на введении новых типов данных (классов) и определении операций для них, В системе МАТЕАВ существу- $524 Глава 16. Програннировааив в МАТ(АВ ют следующие стандартные классы: числовые массивы (((ооЫе), двумерные разреженные матрицы (врагве), строки или массивы символов (сйаг), структуры или массивы записей (5$гисг), массивы ячеек (сей). Кроме того, некоторые расширения МАТХ.АВ используют свои классы, см., например, главу 17 «Расширения МАТЕАВ», где описан 5угпЬойс Иагй Тоо1Ьох, использующий класс объектов аул).
В МАТТ.АВ тип переменной или соответствующий класс не объявляется и не описывается, а определяется автоматически при создании объекта. Например, при задании матрицы А-еуе(5) создается объект класса доиЫе, а по команде Я5-5РагаЕ(Я) производится преобразование матрицы А в разреженную матрицу Аа, то есть создается новый объект класса арагае.
Объекты нового класса создаются при помощи специальной в-функции — конструктора класса, имя которой совпадает с названием класса. Для нового класса также нужно определить методы обработки объектов, написав соответствующие функции. Конструктор класса и функции обработки должны размещаться в каталоге, имя которого начинается с символа «(О)», а далее идет имя класса. Каталог класса является подкаталогом для каталога, описанного в пути доступа. Объекты класса реализуются в виде структур, поля которых видны только для методов, работающих с данным классом. При этом возможно доопределение существующих встроенных операторов, например, чтобы задать операцию умножения для объектов нового класса, в каталоге класса следует написать функцию пг(1неа.
Так, в каталоге аугп Ьойс находятся три подкаталога: ФСЬаг, Фаул), Фаупг((Ь5. В подкаталоге Яауп) содержится конструктор класса — файл аупг.гп и множество других файлов, реализующих операции с символьными переменными. Например, для представления символьных объектов имеется функция 015р1 ау; Гипса(оп 01501ау(Х) $015РСАГ Огар!ау Гопсг(оп Гоп ау65. $ Соруг(дав (с) 1993-98 Ьу Тйе Иагйногаа. 1пс, $ 58ею 51оп: 1.12 5 $0аге: 1997/11/29 01:05:32 5 (Г 15вдиа1(дег(0.'Рогна55рас1пд'),'совраог') 0150(((протпаве(1) " "1): гйар(Х) е15е он5Р( ) 015р(<1протпаве( 1) " "1): 015Р(" "); 015Р(Х) епо При вызове конструктора динамически создается объект.
Если конструктор вызывается без аргументов, то создается шаблон объекта, обычно с пустыми полями. Если на вход конструктора подается объект того же класса, то конструктор обычно возвращает сам введенный объект. Для проверки принадлежности объекта ОВ) классу СУББ служит команда 15а(083. С(А55) Функция с1авв (напомним, что МАТТ.АВ различает большие и малые буквы) определяет класс объекта при вызове с) ввв(083) и переводит структуру В в объект класса СУБ5 при обращении с1 а за(5. ССА55). Объектно-ориентированное программирование 42ш В табл.
16.3 перечислены команды для работы с классами. Таблица 16.3. Команды работы с классами Команда Назначение Определение класса или создание объекта Определение принадлежности объекта к классу Выявление принадлежности объекта к какому-нибудь классу Вывод списка методов длл данного класса Указание подчиненности класса по отношению к некоторым классам Указание старшинства класса по отношению к некоторым классам с1азз (за (що)есс меспосз (птег(отто зорегзогто Гипс(гоп ц-циатегп(оп(х.удъи) гциатегпзоп х+1у+3г+Кн с1азз сопзтгистог 1( пагд(п-0, ц.х-О; ц.у"О, цлм0; ц.и-О: е)зезт пагд(п-!.
ГГ 1за(х,'циатегптоп'), ц х: е1зе(Г (за(х,'Оооо)е'). ц'.х-х(1): 1епд 1епдтщх) с 1Г )епд 1, ц.у 0: ц.е 0; ц.и 0; е1зе1Г 1епд-2. 'ц.у х(2): ц'.з 0; Ц.и-О: е1зе(Г 1епд 3, ц.у-х(2); ц.з-х(3); ц.и-О; е1зе ц.у-х(2); цлшх(3); ц.н х(4); епс епо е1зетг пагд(п-2, ц.х х( 1); ц.у-у(1): ц.г 0: ц.и-О; е1зетт пагд(п-з, ц.х х(1); ц.у у(1): ц.з-з(1); ц.и-о: При работе с объектами учитываются иерархия (старшинство) и наследование, когда объекты одного класса приобретают свойства других классов. При простом наследовании (один класс-родитель) дочерний объект включает все поля родительского объекта,и при работе с ним можно обращаться к методам родительского класса, кроме того, добавляются специфические для дочернего класса поля.
При этом методы нового класса не могут применяться к объектам родительского класса. Для реализации множественного наследования (несколько классов родзттелей) применяется команда с1азз(5,С(А55,РАКЕЙТ1,РАКЕЙТ2,...), здесь из структуры 5 создается объект класса СЕА55, наследующий свойства классов РАКЕЙТ1, РАКЕЙТ2, ... В дополнение к наследованию поддерживается объединение частей в одно целое или агрегирование, то есть использование объектов в качестве полей для других объектов. Рассмотрим пример создания класса цнатегпюп для работы с кватернионами, которые можно рассматривать как обобщение комплексных чисел, см., например, [МЭ).
Конечно, сегодня кватернионы не очень популярная тема, но их создатель У. Гамильтон помимо кватернионов ввел в оборот также векторы и тензоры, а в 1895 г. был даже основан «Всемирный союз в поддержку кватернионов» [К891. В каталоге 1шогК организуем подкаталог (шцнатегп(оп и приготовим конструктор класса — функцию цнатегп1оп нк 426 Глава 16.
Программирование'в ИАТ[АВ Е1ЗЕ а.Х-Х(1).а.у-у(1): а.авиа(1): а.м-м(1): епо а=с1азз(а,'аиа(егп! оп'); Приводимые далее функции имеют демонстрационный характер, так что не все слу- чаи обработки вызовов описаны полностью. В частности, для функции аоа1егп) оп. и обработка вызова с двумя и тремя входными параметрами упрощена.