Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

read(2, *) x, y, z

! Ввод из файла a.txt

print *, x, y, z

! Вывод на экран

end

 

Оператор OPEN создает в программе устройство В/В и соединяет его с файлом a.txt. Далее в операторе READ вместо первой звездочки используется номер устройства, что обеспечивает ввод данных их файла, который с этим устройством связан. Правила ввода из текстового файла и с клавиатуры совпадают, поскольку клавиатура по своей сути является стандартным текстовым файлом.

1.8.3. Вывод на принтер

Принтер, как и клавиатуру, можно рассматривать как файл, который может быть подсоединен к созданному оператором OPEN устройству. Тогда программа вывода на принтер может выглядеть так:

real :: x = 1.1, y = 2.2, z = 3.3

 

open(3, file = 'prn')

! Подсоединяем принтер к устройству 3

write(3, *) x, y, z

! Вывод на принтер

write(*, *) x, y, z

! Вывод на экран

end

 

1.9. Рекомендации по изучению Фортрана

Изучение языка программирования помимо чтения и разбора приведенного в книгах и пособиях материала включает и выполнение многочисленных, часто не связанных с практической деятельностью задач. Преимущественно такие задачи должны быть придуманы вами самостоятельно, поскольку постановка задачи помогает пониманию материала столь же эффективно, как и процесс ее анализа и решения.

К составлению и выполнению тестовых задач следует приступить начиная с первого дня изучения материала. Предположим, что прочитано несколько страниц 1-й главы. В соответствии с материалом вами набрана и запущена программа

program p1 real x, y, z x = 1.1

y = 2.2 z = x + y

print *, 'z = ', z end

Какие дополнительные шаги в рамках изучения языка могут быть предприняты? Возможно, следующие:

выполним инициализацию переменных в операторе объявления:

20

 

1. Элементы языка

real :: x = 1.1, y = 2.2

 

real z

 

print *, x, y

! Обязательно просматриваем результаты

или:

 

real x /1.1/, y /2.2/

 

real z

 

print *, x, y

! Обязательно просматриваем результаты

дадим теперь начальные значения переменным оператором DATA:

real x, y, z

data x / 1.1 /, y / 2.2 / ! или: data x, y / 1.1, 2.2 / print *, x, y

поместим в список вывода выражение иопустим заголовок программы:

real :: x = 1.1, y = 2.2

print *, x + y ! В списке вывода выражение end

запишем несколько операторов на одной строчке:

x = 1.1; y = 2.2; z = x + y ! или: z = x + y;

внесем ошибку в программу и посмотрим реакцию компилятора:

program p1

 

real :: x = 1.1, y = 2.2

 

print *, x + y

! Ошибка: имя p11 не совпадает с именем p1

end program p11

Составленные вами решения тестовых задач должны содержать достаточное число операторов вывода промежуточных результатов, которые позволят понять работу изучаемых элементов языка, убедиться в правильности вычислений или локализовать ошибку. Особенно внимательно следует наблюдать и проверять результаты выполняемого с клавиатуры и из файла ввода данных.

Уже на начальном этапе освоения материала следует не пожалеть времени для приобретения навыков ввода данных из текстового файла. Данные в текстовой файл могут быть занесены с клавиатуры в DS так же, как и в другом текстовом редакторе. В DS для создания нового файла используйте приведенные в разд. 1.2.1 и 1.2.2 сведения. Далее введите с клавиатуры данные, разделяя числа одним или несколькими пробелами, например:

1.2 -1.5 4.0 10 -3

Сохранить данные можно в любой существующей папке, однако на первых порах лучше размещать файл в папке, из которой выполняется запуск ваших учебных программ. Это освободит вас от необходимости задавать в программе путь в имени файла. Для записи файла на диск

21

О. В. Бартеньев. Современный ФОРТРАН

используйте File - Save - в поле "Имя файла" задать имя файла, например a.txt - сохранить.

Теперь попробуем ввести данные из только что сформированного файла a.txt в одномерный массив ar из 10 элементов. Для этого мы должны открыть файл a.txt и поместить в список ввода оператора READ элементы массива, в которые выполняется ввод данных, например:

integer, parameter :: n = 10

! Размер массива ar

real :: ar(n)

! Объявляем вещественный массив ar

character(50) :: fn = 'a.txt'

! Задаем имя файла

ar = 0.0

! Теперь все элементы ar равны нулю

open(1, file = fn)

! Подсоединяем файл к устройству 1

!Ввод первых пяти элементов из файла a.txt read(1, *) ar(1), ar(2), ar(3), ar(4), ar(5)

!Вывод первых пяти элементов массива ar на экран print *, ar(1), ar(2), ar(3), ar(4), ar(5)

end

Всписке ввода размещено 5 элементов массива. Что будет, если добавить в него еще один элемент, например ar(6)? Если ответ на вопрос не очевиден, то добавьте, запустите программу и объясните природу ошибки.

Использованные в примере списки В/В выглядят громоздко. Легко представить размер подобного списка при вводе, например, нескольких сотен элементов массива. В Фортране есть несколько способов задания компактных списков В/В. Например:

!Список ввода содержит все элементы массива ar

read(1, *) ar

!Циклический список ввода, содержащий пяти первых элементов массива ar read(1, *) (ar(i), i = 1, 5)

!В списке ввода сечение массива ar из пяти первых его элементов

read(1, *) ar(1:5)

Таким же образом могут быть составлены и списки вывода.

Наиболее компактно выглядит первый список ввода в операторе READ(1, *) ar, но в нашем случае он нам не подходит. Почему?

В/В массива можно выполнить и в цикле

do i = 1, 5

read(1, *) ar(i) ! В списке ввода один элемент массива ar end do

Такой цикл эквивалентен последовательности 5 операторов ввода:

read(1, *) ar(1)

! В списке ввода один элемент массива ar

read(1, *) ar(2)

 

read(1, *) ar(3)

 

22

1. Элементы языка

read(1, *) ar(4) read(1, *) ar(5)

Однако такая последовательность, хотя в ней присутствует только 5 элементов массива, не может быть введена из созданного нами файла a.txt. Почему?

Вывод массива ar при помощи цикла

do i = 1, 5

 

write(1, *) ar(i)

! Вывод в файл a.txt

write(*, *) ar(i)

! Вывод на экран

end do

 

будет выполнен успешно. При этом, однако, выводимые данные будут размещены в столбик. Почему? Кстати, где расположатся выводимые в файл a.txt записи?

Добавим теперь в файл a.txt не менее пяти чисел. Если файл открыт в DS, то для перехода в окно с данными файла можно нажать Ctrl + F6 или выбрать окно с файлом, воспользовавшись пунктом меню Window. Пусть модифицированный файл выглядит так:

1.2 -1.5 4.0 10 -3

34.2 -55 79.1

90 100.2 -0.4

Теперь для ввода всех элементов массива можно применить оператор read(1, *) ar

Кстати, почему можно размещать вводимые одним оператором READ данные на разных строчках файла?

Напишите теперь программу вывода первых девяти элементов массива ar на трех строках экрана по 3 числа массива в каждой строке.

Подобным образом следует анализировать и другие элементы Фортрана, сочетая чтение литературы, разбор приведенных в ней примеров с постановкой и решением учебных задач.

1.10. Обработка программы

Программист записывает программу в исходном коде (тексте). Программа может существовать в одном или нескольких файлах, называемых исходными файлами. Имена исходных файлов имеют расширения F90, FOR или F, например koda.f90. По умолчанию Фортран считает, что файлы с расширением F90 написаны в свободной форме, а с расширениями FOR и F - в фиксированной.

Далее выполняется компиляция программы, в результате которой исходный текст преобразовывается в объектный код. В процессе компиляции проверяется правильность составления программы и при

23

О. В. Бартеньев. Современный ФОРТРАН

обнаружении синтаксических ошибок выдаются соответствующие сообщения. Объектный код - это запись программы в форме, которая может быть обработана аппаратными средствами. Такой код содержит точные инструкции о том, что компьютеру предстоит сделать. Отдельные компоненты программы могут быть откомпилированы раздельно. Часть компонентов может быть записана в библиотеку объектных файлов. Программа, преобразовывающая исходный код в объектный, называется компилятором или транслятором. Файлы с объектным кодом - объектные файлы - имеют расширение OBJ, например koda.obj.

На следующей стадии обработки выполняется сборка приложения. Часть объектных файлов может быть загружена из библиотек. При этом отдельные компоненты (главная программа, модули, подпрограммы, функции) связываются друг с другом, в результате чего образуется готовая к выполнению программа - исполняемый файл. Расширение таких файлов EXE. Программа, осуществляющая сборку, называется компоновщиком или построителем. На этапе генерации исполняемого кода также могут возникать ошибки, например вызов несуществующей подпрограммы.

В CVF и FPS подготовка исходного, объектного и исполняемого кодов может быть выполнена в специальной среде - Microsoft Developer Studio. Причем из одного проекта можно генерировать несколько реализаций. Например, на этапе разработки программы можно работать с реализацией, в которой отсутствует оптимизация исполняемого кода по его размеру

искорости выполнения (заданы опция компилятора /Od и опция компоновщика /OPT:NOREF). Отсутствие подобной оптимизации повышает скорость компиляции и компоновки. После завершения отладки можно создать рабочий проект, оптимизированный по размеру и скорости выполнения исполняемого файла, задав, например, при компиляции опцию /Oxp, а для компоновки - /OPT:REF. Можно задать и другие опции компилятора. Так, опция /G5 позволяет сгенерировать код, оптимально работающий на процессоре Intel Pentium.

По умолчанию при создании нового проекта в DS оказываются доступными две реализации: Debug и Release. В Debug активизирован отладочный режим. В Release исполняемый код оптимизируется по размеру

ибыстродействию. Ниже приведены задаваемые по умолчанию в FPS опции компилятора и компоновщика в реализациях Debug и Release при создании консоль-проекта.

Реализация Debug

Опции компилятора:

/Zi /I "Debug/" /c /nologo /Fo"Debug/" /Fd"Debug/koda.pdb"

Опции компоновщика:

24

1. Элементы языка

kernel32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/koda.pdb" /debug /machine:I386 /out:"Debug/koda.exe"

Реализация Release

Опции компилятора:

/Ox /I "Release/" /c /nologo /Fo"Release/"

Опции компоновщика:

kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/koda.pdb" /machine:I386 /out:"Release/koda.exe"

Замечание. Вопросы оптимального использования опций компилятора и построителя рассмотрены в [1].

25