современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран
Скачать 2.24 Mb.
|
П.-3.1. Запуск программ Выполняет функция RUNQQ; вызывает другую программу и ожидает ее завершения. 427 О. В. Бартеньев. Современный ФОРТРАН П.-3.2. Управление программой Функции RAISEQQ и SIGNALQQ используются для обработки прерываний операционной системы с целью управления исполнением пользовательской программы. Процедура SLEEPQQ - подпрограмма, остальные - функции. Процедура Назначение RAISEQQ Передает сигнал прерывания выполняемой программе, моделирующий прерывание операционной системы SIGNALQQ Управляет обработкой сигналов CALL SLEEPQQ Задерживает исполнение программы на указанный в миллисекундах промежуток времени Пример: program sleep use dflib ! Обязательная ссылка на модуль DFLIB print *, 'Before sleep' call sleepqq(500) ! Задержка на 500 миллисекунд print *, 'After sleep' end program sleep П.-3.3. Работа с системой, дисками и директориями Процедуры используются для работы с физическими устройствами, директориями и для идентификации полных имен путей. Процедура SETENVQQ - подпрограмма, остальные - функции. Процедура Назначение CHANGEDIRQQ Делает указанную директорию текущей или установленной по умолчанию CHANGEDRIVEQQ Делает указанный диск текущим DELDIRQQ Удаляет указанную директорию GETDRIVESIZEQQ Возвращает размер указанного диска GETDRIVESQQ Возвращает имена имеющихся в системе дисков MAKEDIRQQ Создает новую директорию с указанным именем GETENVQQ Получает значение из текущего окружения CALL SETENVQQ Добавляет новую переменную окружения или устанавливает значение существующей переменной SYSTEMQQ Выполняет команду путем передачи командной строки интерпретатору команд операционной системы Пример: 428 Приложение 3. Дополнительные процедуры program drive_dir use dflib character(40) :: temp integer(4) :: fres, total, available logical(4) :: sres temp = getdrivesqq( ) print *, trim(temp) ! A CDE ! Функция GETDRIVESIZEQQ в случае успеха вернет .TRUE. sres = getdrivesizeqq(temp(3:3), total, available) ! Общее и свободное число байт на диске C: print '(2i15)', total, available ! 1099956224 256737280 ! Создаем переменную окружения path2 sres = setenvqq('path2=c:\') ! строку 'path2=c:\' записываем без пробелов fres = getenvqq('path2', temp) print *, temp ! c:\mine temp = 'c:\' ! Будем искать рабочую директорию на диске c:\ fres = getdrivedirqq(temp) ! Поиск рабочей директории print *, temp ! C:\Program Files\ArrayVisualizer\SAMPLES sres = makedirqq('c:\temp2') ! Создаем директорию c:\temp2 sres = changedirqq('c:\temp2') ! Делаем директорию c:\temp2 рабочей temp = 'c:\' ! Ищем рабочую директорию на диске c:\ fres = getdrivedirqq(temp) print *, temp ! c:\temp2 sres = deldirqq('c:\temp2') ! Удаляем директорию c:\temp2 end program drive_dir П.-3.4. Управление файлами Процедуры используются для управления файлами и получения информации, хранящейся о файлах в операционной системе. Процедуры PACKTIMEQQ и UNPACKTIMEQQ - подпрограммы, остальные - функции. Процедура Назначение DELFILESQQ Удаляет указанные файлы в указанной директории FINDFILEQQ Ищет указанный файл в директориях, содержащихся в переменной окружения FULLPATHQQ Возвращает полное имя для указанного файла или директории GETDRIVEDIRQQ Возвращает текущий диск и путь к текущей директории GETFILEINFOQQ Возвращает информацию о файлах, имена которых содержат заданную строку CALL PACKTIMEQQ Упаковывает время для использования функцией SETFILETIMEQQ RENAMEFILEQQ Изменяет старое имя файла на новое 429 О. В. Бартеньев. Современный ФОРТРАН SETFILEACCESSQQ Устанавливает способ доступа к заданному файлу SETFILETIMEQQ Устанавливает дату изменения для указанного файла SPLITPATHQQ Выделяет в полном имени файла его 4 компонента CALL UNPACKTIMEQQ Распаковывает упакованное время и дату в отдельные компоненты Пример. Открываем файл c:\test.txt как новый, но прежде выполняется попытка его удаления функцией DELFILESQQ. program files use dflib character(40) :: fn = 'c:\test.txt', pathname character(40) :: directory, file character(4) :: drive, extension integer(4) :: ios, fres logical(4) :: sres fres = delfilesqq(fn) ! Удаляем файл fn, если он существует sres = setenvqq('path=c:\') ! Устанавливаем переменную окружения path ! Функция FINDFILEQQ вернет нуль, если файл не найден fres = findfileqq('test.txt', 'path', pathname) ! Подсоединяем файл fn к устройству 10 open(10, file = fn, status = 'new', iostat = ios) if(ios == 0) then ! ios равен нулю, если файл удалось открыть ! Функция FINDFILEQQ возвращает длину полного пути к файлу fres = findfileqq('test.txt', 'path', pathname) print *, 'Full path to file test.txt: ', pathname! C:\test.txt else stop 'Cannot open file c:\test.txt' end if sres = renamefileqq('c:\test.txt', 'c:\test2.txt') ! Изменяем имя файла sres = splitpathqq(pathname, drive, directory, file, extension) print *, 'path = ', trim(pathname), '; drive = ', trim(drive)! path = c:\test.txt; drive = c: print *, 'directory = ', trim(directory), '; file = ', trim(file)! directoty = \; file = test2 print *, 'extension = ', trim(extension) ! extension = .txt fres = delfilesqq('c:\test2.txt') ! Удаляем файл 'c:\test2.txt' end program files П.-3.5. Генерация случайных чисел Помимо предусмотренных стандартом подпрограмм (разд. 6.19) CALL RANDOM_NUMBER и CALL RANDOM_SEED для получения случайных чисел можно использовать следующие подпрограммы: Подпрограмма Назначение 430 Приложение 3. Дополнительные процедуры CALL RANDOM Возвращает псевдослучайное вещественное число, большее или равное нулю и меньшее единицы CALL SEED Изменяет начальную точку генератора псевдослучайных чисел Пример: program rnd_seed use dflib real(4) :: rnd integer(4) :: seedvalue = 1025 call seed(seedvalue) ! Затравка датчика случайных чисел call random(rnd) ! Первое случайное число print *, rnd ! 2.303988E-02 call seed(2*seedvalue) ! Новая затравка датчика случайных чисел call random(rnd) ! Первое случайное число print *, rnd ! 4.607977E-02 end program rnd_seed П.-3.6. Управление датой и временем Процедуры используются для управления системными датой и временем. Процедура Тип Назначение CALL GETDAT Подпрограмма Возвращает системную дату CALL GETTIM " " системное время SETDAT Функция Установка даты SETTIM " " времени Пример: program date_time use dflib ! Год, месяц, число integer(2) :: year, month, date ! Час, минуты, секунды, сотые доли секунд integer(2) :: hours, minutes, seconds, seconds100 logical(4) :: sres call getdat(year, month, date) call gettim(hours, minutes, seconds, seconds100) print *, year, month, date ! 2000 12 15 print *, hours, minutes, seconds, seconds100! 21 12 59 28 sres = setdat(year, month, date + 4_2) ! Изменяем число sres = settim(hours - 1_2, minutes, seconds, seconds100)! Изменяем час end program date_time 431 О. В. Бартеньев. Современный ФОРТРАН П.-3.7. Ввод с клавиатуры и генерация звука Процедуры используются для непосредственного чтения с клавиатуры, минуя систему ввода/вывода Фортрана, и воспроизведения звуковых сигналов. Процедура BEEPQQ - подпрограмма, остальные - функции. Процедура Назначение CALL BEEPQQ Воспроизводит сигнал с заданными в миллисекундах продолжительностью и частотой GETCHARQQ Возвращает введенный символ GETSTRQQ Читает символьную строку с клавиатуры, используя буфер PEEKCHARQQ Проверяет, была ли нажата какая-либо клавиша консоли Пример: program beep_char use dflib ! Частота (в Гц) и продолжительность в миллисекундах сигнала integer(4) :: frequency = 500, duration = 1000 character(1) :: char character(120) :: string integer(4) :: length logical(4) :: pressed call beepqq(frequency, duration) ! Звуковой сигнал с частотой 500 Гц print *, 'Shall I stop a program (press Y or N)? ' char = getcharqq( ) read * if(char == 'Y' .or. char == 'y') stop 'Program is terminated by a user' print *, 'Enter a test string ' length = getstrqq(string) ! Возвращает длину строки string if(length > 0) then print *, trim(string) else print *, 'Missing value' end if pressed = .false. ! Демонстрация функции PEEKCHARQQ do ! Вывод сообщения продолжается до тех пор, print *, 'Press any key to EXIT DO-loop' ! пока не нажата какая-либо клавиша pressed = peekcharqq( ) ! Функция вернет .TRUE., если нажата клавиша if(pressed) exit ! Клавиша нажата - выход из цикла end do print *, 'Key is pressed' read * end program beep_char 432 Приложение 3. Дополнительные процедуры П.-3.8. Обработка ошибок Процедуры управляют обработкой критических, приводящих к завершению программы ошибок, и позволяют получить дополнительную информацию о причинах иных ошибок. Процедура GETLASTERRORQQ - функция, остальные - подпрограммы. Процедура Назначение GETLASTERRORQQ Возвращает последнюю обнаруженную дополнительной процедурой ошибку CALL MATHERRQQ Заменяет обработку ошибок по умолчанию на обработку встроенными функциями CALL SETERRORMODEQQ Устанавливает способ обработки критических ошибок П.-3.9. Аргументы в командной строке Процедуры используются для работы с параметрами, передаваемыми программе из командной строки. Процедура Тип Назначение CALL GETARG Подпрограмма Возвращает n-й аргумент командной строки (команда является аргументом с номером 0) NARGS Функция Возвращает общее число аргументов командной строки, включая команду П.-3.10. Сортировка и поиск в массиве Процедуры используются для управления хранящимися в массивах данными. Подробно рассмотрены в разд. 6.9. Процедура Тип Назначение BSEARCHQQ Функция Выполняет двоичный поиск заданного элемента в отсортированном одномерном массиве, содержащем элементы неструктурного типа CALL SORTQQ Подпрограмма Сортирует одномерный массив неструктурного типа П.-3.11. Управление операциями с плавающей точкой Процедуры используются для контроля выполнения операций с плавающей точкой и управления реакцией системы на ошибки выполнения. 433 О. В. Бартеньев. Современный ФОРТРАН Процедура Тип Назначение GETCONTROLFPQQ Функция Возвращает значение контрольного слова процессора операций с плавающей точкой GETSTATUSFPQQ " Возвращает значение статусного слова процессора операций с плавающей точкой CALL LCWRQQ Подпрограмма Выполняет то же, что и SETCONTROLFPQQ SCWRQQ Функция Выполняет то же, что и GETCONTROLFPQQ CALL SETCONTROLFPQQ Подпрограмма Устанавливает значение контрольного слова процессора операций с плавающей точкой SSWRQQ Функция Выполняет то же, что и GETSTATUSFPQQ 434 Литература 1. Бартеньев О. В. Visual Fortran: Новые возможности. - М.: Диалог- МИФИ, 1999. - 288 с. 2. Он же. Графика OpenGL: программирование на Фортране. - М.: Диалог- МИФИ, 2000. - 368 с. 3. Он же. Фортран для профессионалов. Математическая библиотека IMSL: Ч.1. - М.: Диалог-МИФИ, 2000. - 448 с. 4. Он же. Фортран для студентов. - М.: Диалог-МИФИ, 1999. - 400 с. 5. Бродин В. Б., Шагурин И. И. Микропроцессор i 486. Архитектура, программирование, интерфейс. - М.: Диалог-МИФИ, 1993. - 240 с. 6. Вельбицкий И. В. Технология программирования. - Киев: Техника, 1984. - 279 с. 7. Демидович Б. П., Марон И. А. Основы вычислительной математики. - М.: Наука, 1966. - 664 с. 8. Лингер Р., Миллс Х., Уитт Б. Теория и практика структурного программирования. - М.: Мир, 1982. - 408 с. 9. Любимский Э. З., Мартынюк В. В., Трифонов Н. П. Программирова- ние. - М.: Наука, 1980. - 608 с. 10. Майерс Г. Искусство тестирования программ. - М.: Финансы и статистика, 1982. - 176 с. 11. Меткалф М., Рид Дж. Описание языка программирования Фортран 90. - М.: Мир, 1995. - 302 с. 12. Першиков В. И., Савинков В. М. Толковый словарь по информатике. - М.: Финансы и статистика, 1991. - 543 с. 13. Скляров В. А. Язык С++ и объектно-ориентированное программирование. - Минск.: Высш. шк., 1997. - 478 с. 14. Справочник по Автоматизации. - М.: Изд. отд. "Русская Редакция" ТОО Channel Trading Ltd., 1998. - 440 с. 15. Фортран 90. Международный стандарт. - М.: Финансы и статистика, 1998. - 416 с. 16. Холстед М. Начала науки о программах. - М.: Финансы и статистика, 1981. - 128 с. 17. Шикин Е. В., Боресков А. В. Компьютерная графика. Полигональные модели. - М.: Диалог-МИФИ, 2000. - 464 с. 435 Предметный указатель А Автоматизация · 374 BSTR-строка · 381 OLE-массив · 378 варианты · 383 клиент ActiveX · 374 компонент ActiveX · 374 конструктор модулей · 375 объект ActiveX · 374 объекты-наборы · 374 Алгоритм базовые структуры · 29 блок-схема · 29 интерфейс · 38 линейная схема · 29 метод флажка · 37 объединение условий · 36 Ассоциирование use · 225, 254 памяти · 258 параметров · 226 через носитель · 225, 254 Б Базовые структуры алгоритма блок операторов и конструкций · 30 ветвление · 30 цикл · 32 В Ввод/вывод без продвижения · 335 непродвигающийся · См. Ввод/вывод без продвижения под управлением именованного списка · 317 под управлением неименованного списка · 16, 321 продвигающийся · См. Ввод/вывод с продвижением с продвижением · 335 форматный · 289 Венгерская нотация · 12 Внешнее произведение · 147 Встроенная процедура неэлементная подпрограмма · 172 преобразовывающая функция · 172 справочная функция · 172 элементная · 172 Выражение · 13 арифметическое · 13, 158 инициализирующее · 167 константное · 15, 167 логическое · 13, 30, 163 операнд · 13 описательное · 168 отношения · 162 производного типа · 13 символьное · 13 Г Глобальные объекты модуля · 224 Д Двоичный порядок · 186 Дескриптор данных B, O, Z · 303 D · 308 E · 306 EN · 308 ES · 308 F · 305 G · 310 I · 303 Дескриптор управления : · 316 436 Предметный указатель BN, BZ · 316 H · 313 P · 306, 307, 316 Q · 313 SP, SS, S · 314 T, TL, TR · 314 X · 314 обратный слеш (\) · 315 слеш (/) · 315 строка · 312 Дескрипторы преобразований дескрипторы данных · 299, 301 дескрипторы управления · 311 Е Единица памяти · 259 неспецифицированная · 260 текстовая · 259 числовая · 259 З Запись CR-поток · 333 LF-поток · 334 переменной длины · 331 поле записи · 18 поток · 333 сегментированная · 332 текстового последовательного файла · 18 фиксированной длины · 331 И Имя входа · 276 глобальное · 12, 256 конструкции · 204 локальное · 12, 256 модуля · 223 операторное · 257 программы · 221 процедуры · 232 родовое · 173, 246 специфическое · 173, 246 спискаВ/В · 317 Интерфейс неявный · 239 родовой · 246 явный · 240 Интерфейс Автоматизации метод · 374 свойство · 374 событие · 374 К Ключевое слово · 172, 243 Компилятор · 24 Компоновщик · 24 Консоль-проект · 6 Константа буквальная · 10, 56 вещественная · 57 именованная · 10, 61 истина · 59 комплексная · 58 логическая · 59 ложь · 59 повторяющаяся · 63, 323 СИ · 67 символьная · 59 холлеритовская · 59 целая · 56 Конструкция · 30 Коэффициент повторения · 299 М Мантисса · 57, 186 Массив · 108 автоматический · 131 атрибут и оператор ALLOCATABLE · 109, 126 атрибут и оператор POINTER · 109 атрибут и оператор POINTER · 126 динамический · 108 437 О. В. Бартеньев. Современный ФОРТРАН заданной формы · 133 инициализация · 109 конструктор · 11 конструктор массива · 119 оператор ALLOCATE · 127 оператор DEALLOCATE · 130 оператор и конструкция FORALL · 123 оператор и конструкция WHERE · 121 перенимающий размер · 135 перенимающий форму · 134 протяженность · 108 размер · 108 ранг · 11, 108 сечение · 12, 114 согласованные · 108 статический · 108 форма · 108 функция ALL · 140 функция ALLOCATED · 147 функция ANY · 140 функция COUNT · 140 функция CSHIFT · 151 функция DOT_PRODUCT · 144 функция EOSHIFT · 152 функция LBOUND · 147 функция MATMUL · 145 функция MAXLOC · 141 функция MAXVAL · 143 функция MERGE · 148 функция MINLOC · 141 функция MINVAL · 143 функция PACK · 149 функция PRODUCT · 144 функция RESHAPE · 150 функция SHAPE · 148 функция SIZE · 148 функция SPREAD · 151 функция SUM · 144 функция TRANSPOSE · 153 функция UBOUND · 147 функция UNPACK · 150 экстент · См. Массив, протяженность элемент · 113 Массивоподобная функция · 139 Машинная бесконечность · 186 Машинная точность · 188 Модуль атрибут и оператор PRIVATE · 230 атрибут и оператор PUBLIC · 230 Модуль TextTransfer · 17, 413 Н Неявный цикл конструктора массива · 119 оператора DATA · 110 оператора В/В · 297 О Объект данных D-форма · 57 F-форма · 57 автоматический · 69 Е-форма · 57 константа · 10, 47 массив · 11 переменная · 10, 47 подобъект · 12 скаляр · 11 функция · 47 Объект модуля · 230 Оператор выполняемый · 9 невыполняемый · 9 присваивания · 9 Операция арифметическая · 158 встроенная · 13, 158 двуместная · 13 задаваемая · 166 конкатенации · 70 одноместная · 13 |