Механизмы присоединения данных Задание
1. Реализовать два проекта, которые содержат:
a) ввод данных из файла In.txt на диске и форматный вывод их в результирующий файл Out.txt;
b) вызовы процедур с различными данными для отладки;
c) если возможно, проверку результатов работы процедур обращением к стандартным подпрограммам или функциям;
d) форматный вывод в файл Out.txt результатов работы каждой процедуры с пояснениями выводимых величин (использовать формулировки из индивидуального задания).
2. В проекте Container – механизм присоединения объектов носителя.
3. В проекте ProModule – механизм присоединения объектов модуля.
Содержание отчета.
1. Название работы и номер варианта индивидуального задания.
2. Фамилия, имя, отчество и номер группы студента.
3. Текст варианта индивидуального задания.
4. Постановка задачи, методы вычислений.
5. Описание механизмов обмена данными.
6. Графическая интерпретация (если требуется), выполненная вручную или пакетом Agrapher.
7. Блок-схемы главной программы и подпрограмм.
8. Распечатки текстов всех программных единиц.
9. Распечатки файлов результатов Out.txt.
При подготовке к защите ответить на контрольные вопросы.
Комментарии к заданию
1. Приступая к выполнению задания, прочтите раздел 5.
2. В проекте Container расчетная процедура – это внутренняя процедура, присоединяющая объекты носителя, которым является внешняя программа.
3. В проекте ProModule расчетная процедура – это модульная процедура, присоединяющая объекты используемого модуля.
4. Расчетныепроцедуры в виде внутренней и модульной процедурыне являются самостоятельными программными единицами.
5. Вызов внутренней или модульной процедуры не требуют Interface.
Пример
В подпрограмме: ввести одномерный массив из файла in.txt; найти и вывести в файл out.txt номер и значение максимального по модулю элемента массива.
В главной программе: применить подпрограмму к нескольким массивам, предварительно вводя длину каждого массива из файла in.txt.
Применить механизмы присоединения объектов носителя и модуля.
Проект Container
Главная программа Container – единственная самостоятельная программная единица.В программу Container вложена внутренняя подпрограмма Subroutine OneArray. Программа Container является носителем данныхдля подпрограммы OneArray. В ней лишь одна глобальная переменная dArr, указывающая длину массива. Эту переменную заимствует подпрограмма OneArray.
Переменные ARR, NumARR локальны в подпрограмме OneArray. Динамический массив ARR локализован в подпрограмме OneArray. Его переменная длина dARR определена до входа в подпрограмму. Команды allocateиdeallocate не нужны – динамический массив размещается автоматически при входе в подпрограмму и освобождается при выходе.
Программа
Program Container ! внешняя программа
Implicit none
Integer dARR ! длина автоматического массива ARR
Open(1,File='In.txt') ! файл исходных данных
Open(2,File='Out.txt')! результирующий файл Read(1,*)dARR;Call OneArray('B') ! ввод dARR - длины массива 'B' Read(1,*)dARR; Call OneArray('C') ! ввод dARR - длины массива 'C'
Contains
Subroutine OneArray(ArrName) ! внутренняя подпрограмма
Implicit none
character,intent(in)::ArrName !однобуквенное “имя массива”
Real,dimension(1:dARR)::ARR ! локальный динамический массив
Integer::NumARR ! локальный номер max по модулю
Read(1,*)ARR; Write(2,2)ArrName,ARR ! ввод/вывод массива ARR
NumARR=sum(maxloc(Abs(ARR)))
Write(2,3) ARR(NumARR), NumARR, ArrName
2 format(/' Массив ', a/ ( 6F8.1) )
3 format(' max по модулю элемент ', F8.1, &
' его номер', i3,' в массиве ', a)
End Subroutine OneArray ! конец внутренней подпрограммы
End Program Container
Результаты работы программы Container
Массив В
1.0 -4.0 6.0 20.0 45.0 -71.0
4.0 -17.0 .0 .0 .0 11.0
max по модулю элемент -71.0 его номер 6 в массиве B
Массив С
-122.0 .0 45.0 71.0 4.0 -17.0
.0 .0 .0 11.0
max по модулю элемент -122.0 его номер 1 в массиве C
Проект ProModule – использование общедоступных объектов модуля.
В этом проекте две самостоятельные программные единицы – модуль Mo и головная программа ForModule, которые:
1. могут быть отдельными текстами и компилироваться порознь, но модуль должен компилироваться раньше главной программы;
2. могут быть единым текстом, но модуль должен располагаться перед главной программой.
Модуль Mo содержит модульную процедуру ProArray, которая размещена внутри модуля. Процедура ProArray – без аргументов. Интерфейс модульной процедуры считается явным и его описывать не надо.
Все объекты, кроме массива ARR, размещены в модуле. Главной программе forModule, использующей модуль, доступны объекты ArrN, dARR (public) Локальная (private) переменная модуля NumARR доступна в модульной процедуре ProArray и недоступна в программе forModule.
Массив ARR локализован в процедуре ProArray, аналогичный динамический массив используется в предыдущем примере.
Программа
Module Mo ! ФИО Лаб 7 № группы, № варианта
Implicit none
Integer,public::ArrN,dARR !порядковый № массива, длина массива
Integer,private::NumARR !локальная: № max по модулю элемента,
Contains! модульная процедура
Subroutine ProArray
Implicit none
Real,dimension(1:dARR)::ARR ! динамический автоматич. массив
Read(1,*)ARR; Write(2,2)ArrN,ARR ! ввод и вывод массива ARR
2 format(/’ Массив №’, i5/ ( 6F8.1) )
NumARR=sum(maxloc(Abs(ARR)))
Write(2,3) ARR(NumARR), NumARR, ArrN
3 format(’ max по модулю элемент ’,F8.1, &
’ его номер’, i3, ’ в массиве №’,i5)
End Subroutine proArray
End Module Mo
Program forModule
use Mo ! использует Mo, доступны: ArrN, dARR , процедура proArray
Open(1,file='in.txt'); Open(2,file='Out.txt')!файлы:данные,результат
do ArrN=1,10000 ! читаем до 10000 массивов
Read(1,*, end=10) dARR; Call ProArray
Enddo
10 Write(2,*) ’ Все данные прочитаны’
End Program forModule
Результаты работы программы forModule
Массив № 1
1.0 -4.0 6.0 20.0 45.0 -71.0
4.0 -17.0 .0 .0 .0 11.0
max по модулю элемент -71.0 его номер 6 в массиве № 1
Массив № 2
22.0 .0 45.0 71.0 4.0 -17.0
.0 .0 .0 11.0
max по модулю элемент 71.0 его номер 4 в массиве № 2
Все данные прочитаны
Контрольные вопросы к защите работы
1. Назовите четыре вида программных единиц в Фортране.
2. Назовите три вида программ.
3. Назовите два вида процедур.
4. Что называется подпрограммой?
5. Что такое внешняя и внутренняя программа?
6. Какие виды программных единиц могут быть только внешними? Какие виды программ могут быть внутренними?
7. Могут ли объекты внешней программы быть невидимыми во внутренней программе?
8. Чем модуль отличается от программ?
9. Каков механизм присоединения данных носителя? Примеры.
10. Опишите механизм присоединения объектов модуля, примеры.
11. Какие объекты модуля не видимы в программе, использующей его?
12. Когда интерфейс обязателен, когда желателен, когда не нужен?
13. Нужен ли оператор interfaceдля модульной программы?
14. Когда возникает коллизия имен при использовании модуля?
Пример контрольного задания
Вычисление количества повторений цикла оформить как:
1. внешнюю функцию function;
2. внешнюю подпрограмму subroutine;
3. внутреннюю процедуру – функцию или подпрограмму;
4. модульную процедуру – функцию или подпрограмму.
Варианты индивидуальных заданий
Варианты индивидуальных заданий см. в 2.6.
Элементы языка программирования Фортран
Текст программы на Фортране
Программу на Фортране оформляют в виде простого (plain) текста:
- символ «!» открывает комментарий – до конца строки;
- упрощают чтение текста программы пустые строки и пробелы (вне имен и ключевых слов);
- каждая программа, каждый простой оператор, каждый составной оператор, каждый блок пишут с новой строки, при необходимости делая перенос на следующую строку (символ переноса «&»);
- компиляторы поддерживают две формы записи текстов программ:
*.f90, *.f03 – современная свободная форма для новых текстов,
*.for -устаревшая фиксированная форма (преемственность с Ф77).
Таблица 15.
Пример оформления текста программы на Фортране
| Program FreeForm ! тема: Площадь круга
| Program -Начало программы
| 2
| ! ФИО №группы №варианта №работы
| строка-комментарий
|
| Real R;integer i ! комментарий
| Два простых оператора в строке
| 4
| Do i=1,10 ! цикл по 10 радиусам
| Do - Начало конструкции
|
| Write(*,*)’ R=?’; Read(*,*) R
| началоблока
|
| Write(*,*)’R =’, R, & ! & - перенос
| с переносом по &
|
| ’ S =’, 3.14* R**2
| строка-продолжение
|
| Enddo
| End+Do = конец конструкцииDo
|
| End Program FreeForm
| End+Program= конец программы
| Привязка операторов и блоков к строкам традиционно осуществляется одним из двух символов конца строки – клавиша <Enter> и «;» :
- используя символ «;», в одной видимой строке (строка 3, строка 5) компонуют простые операторы;
- <Enter> предшествует программной единице (строки 1-9), ее телу (строки 2-8), конструкции (строки 4-8) и блоку do(строки 5-7);
- специальных символов окончания оператора и блока в Фортране нет.
В языках Си и Паскаль все делается не так – операторы не привязаны к строкам, а каждый оператор или блок должен заканчиваться спецсимволом «;», что затрудняет чтение сложной программы. Те, кто приходят из Си и Паскаль, испытывают облегчение и быстро привыкают к оформлению текста на Фортране.
Программу из Табл.15 можно заметно упростить, если описать R не как скалярReal R, а как векторReal,dimension(1:10):: R. В этом случае совсем не понадобится цикл по элементам массива R, так как Фортран умеет то, чего нет в других языках – выполнять действия с массивами:
Program R10 ! тема: Площади 10 кругов
Real,dimension(1:10):: R
Write(*,*)’ R=?’; Read(*,*) R! ввести 10 радиусов
Write(*,*)’ R =’,R; Write(*,*)’ S =’,3.14*R**2
End Program R10
|