Механизмы присоединения данных

Задание

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.

Наши рекомендации