Название: Квантовая механика - Учеб. пособие. (Краснопевцев Е. А.)

Жанр: Информатика

Просмотров: 1157


2. теоретические сведения

 

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

Стандартные средства Фортрана поддерживают 4 вида В/В данных:

– форматный;

– под управлением списка В/В;

– неформатный;

– двоичный.

Первых два вида передачи данных позволяют преобразовать текстовую информацию во внутреннее представление при вводе и, наоборот, из внутреннего представления в текстовое при выводе. Неформатный и двоичный виды В/В в данной лабораторной работе не рассматривается.

Перевод данных из внутреннего представления в текстовое представление задается дескрипторами преобразований (ДП). ДП содержатся в спецификации формата, которая представляет собой заключенный в скобки список ДП, перечисленных через запятую и соответствующих элементам списка В/В. ДП и элементы списка В/В должны быть согласованны по типу (каждому типу данных соответствует свой ДП: целому типу соответствует дескриптор преобразования I, вещественному типу соответствует ДП F и E

и т. д. – см. ниже “Дескрипторы данных” в данной лабораторной работе). Список ДП может быть задан двумя способами. Покажем эти способы на примере форматного вывода трех переменных целого, вещественного и логического типов:

Список ДП задан как символьная строка в операторе WRITE

 
 

а) WRITE (*, ‘()’)

 

Список ДП задан в операторе FORMAT, на который передается управление по метке 20 из оператора WRITE; оператор FORMAT является невыполняемым оператором и может располагаться в любом месте программы

 
б) WRITE (*, 20)

 

   20  FORMAT()

 

Оператор вывода WRITE создает запись, состоящую из полей вывода. Каждый элемент списка вывода выводится в свое поле в записи. В случае форматного вывода размер поля определяется примененным форматом. В предыдущем примере  запись будет состоять из трех полей вывода, размер поля вывода для целой переменной int по дескриптору преобразования I5 равен пяти позициям, для вещественной переменной rea по ДП F7.2 – семи позициям и для логической переменной log по ДП L4 – четырем позициям.

Наличие в списке ДП дескриптора 1x объясняется следующим образом: по умолчанию в Фортране при форматном выводе первая позиция выводимой записи предназначена для простановки символа управления кареткой печатающего устройства. Символ пробела в первой позиции означает “начать новую строку”, а символ ”1” – перейти на начало следующей страницы и др. Поэтому первая позиция строки вывода на экране и печатающем устройстве не отображается, и чтобы исключить генерацию ложных символов управления кареткой, в начале списка ДП и проставляется дескриптор 1x, что означает один пробел (см. ниже Дескрипторы управления в данной лабораторной работе).

Элементами списка В/В могут быть как полные объекты данных любых типов (скаляры и массивы), так и их подобъекты, например, элементы массива, сечение массива, подстрока. Список вывода может содержать выражение. Кроме того, в списке вывода могут использоваться циклические списки (или неявные циклы), которые работают точно так же, как и циклы с “параметром”. Общий вид:

(список объектов цикла, dovar = start, stop [,inc])

Пример 1. Осуществить форматный вывод одномерного массива а(-5:4):

Выводится 10 элементов массива а. Согласно формата преобразования для данных вещественного типа F6.2 под выводимое значение каждого элемента массива отводится 6 позиций

 
 

write (*,'(1x,10F6.2)')  (a(i), i = -5,4) –

           

     

Пример 2. Осуществить формат-

ный вывод двумерного целочислен-

ного массива D(5,6):

 

write (*,’(5(/15x,6I7))’) ((D(i, j), j=1,6), i=1,5)  

 

Выводится 30 элементов массива D: 5 строк по 6 чисел в каждой строке. В каждой строке вначале выводится 14 пробелов (один пробел из 15 отводится под символ управления кареткой), затем 6 чисел по формату преобразования целых чисел I7 (7 позиций под каждое число).

 
 

 

Дескрипторы преобразования ДП подразделяются на:

– дескрипторы данных (ДД);

– дескрипторы управления;

– строки символов.

 

Дескрипторы данных ДД

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

Дескриптор преобразования для данных целого типа. Общая форма: nIw, где w – ширина поля В/В, n – коэффициент повторения (ставится перед дескриптором преобразования, если несколько объектов списка В/В преобразуются  по одному и тому же дескриптору преобразования). При выводе число выстраивается к правому краю поля вывода. Под знак “–” обязательно отводится одна позиция, под знак “+” – необязательно.

Пример вывода по дескриптору преобразования I4:

 

Выводимое

значение

В случае, если ширина заданного поля вывода < выводимого числа, будут выведены символы *, их количество равно числу позиций в поле вывода w. È – символ пробела.

 
Результат

вывода

7812

7 8 12

12

ÈÈ12

-32

È-32

0

ÈÈÈ0

-7812

* * * *

 

Дескриптор преобразования для данных вещественного типа в обычную десятичную форму. Общая форма: n Fw.d, где w – ширина поля вывода, n – коэффициент повторения, d – число знаков после запятой. При определении длины поля w кроме количества цифр необходимо учитывать позиции для знака и десятичной точки. Должно соблюдаться правило w ³ d+3.

Пример вывода по дескриптору преобразования F6.2:

 

Выводимое значение

Округление осуществляется по обычным правилам арифметики.

Если для вывода числа требуется больше позиций, чем задано в w, то будут выведены звездочки

 
Результат вывода

483,76

4 8 3.7 6

12,9

È1 2.9 0

-0,076

È - 0.0 8

0,00448

ÈÈ0.0 0

-126,3

******

 

Дескриптор преобразования для данных вещественного типа в экспоненциальную форму. Используется обычно, когда порядок выводимых чисел неизвестен (либо очень большие числа, либо очень маленькие). Общая форма: nEw.d, где w – ширина поля вывода, n – коэффициент повторения, d – число знаков после запятой. При определении длины поля w кроме количества цифр необходимо учитывать позиции для знака числа, десятичной точки, для символа E, для знака показателя степени, под показатель степени две позиции. Должно соблюдаться правило w ³ d+7.

Пример вывода по дескриптору преобразования E14.6:

 

Выводимое значение

Результат вывода

783,4

ÈÈ0.783400E+03

0,0007834

ÈÈ0.783400E-03

-7834086,78

È-0.783409E+07

Дескриптор преобразования для данных символьного типа. Общая форма: nAw, где n – коэффициент повторения, w – ширина поля вывода. Если w опущено, то число символьных позиций в строке вывода определяется длиной выводимой строки, если w есть, то ширина вывода = w.

Пример: character (10):: tex=’computer’

    write (*,’(1x, A)’) tex     !     Результат:  ÈÈcomputer

Дескриптор преобразования для данных логического типа. Общая форма: nLw, где w – ширина поля вывода, n – коэффициент повторения. При выводе сначала печатаются w-1 пробелов, а затем в позиции w – символ “T” или “F”.

Пример: logical:: t1=.true., t2=.false.

     write (*,’(1x,2L5)’)  t1, t2  !   Результат: ÈÈÈÈTÈÈÈÈF.

           

Дескрипторы управления.

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

Преобразование слэша. При выводе вызывает завершение печати очередной строки и переход на новую строку. Два слэша подряд означают пропуск одной строки, три слэша – пропуск двух строк и т. д.

Пример:

character(7):: tx1=’FORTRAN’, tx2=’*******’

write (*,’(10x, A/10x,A)’)  tx1, tx2  !  Результат:  FORTRAN

                                                       ÈÈÈÈÈÈÈÈÈ  * * * * * * *

                                                       ÈÈÈÈÈÈÈÈÈ 

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

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

 

Пример.

write (*,"('vvedite granicy otrezka a b: ',)")

read (*,*) a,b

 

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

 

Ввод–вывод под управлением списка. Признаком В/В под управлением списка является наличие символа “*” вместо спецификации формата. В предыдущих работах использовался преимущественно В/В под управлением списка, он намного проще форматного В/В (меньше шансов допустить ошибку). Однако рассмотренный выше форматный вывод удобнее, можно самому задавать внешний вид выводимой информации. А в В/В под управлением списка преобразования выполняются с учетом типа элементов списка В/В и значений передаваемых данных в соответствии с принятыми в Фортране соглашениями. Рассмотрим основные правила при В/В под управлением списка.

При вводе:

– ввод выполняется из последовательных текстовых файлов, внутренних файлов или с клавиатуры (файлы Фортрана см. ниже);

– поле ввода содержит константу (или повторяющуюся константу), тип которой должен соответствовать элементу списка ввода (целому элементу – целая константа, комплексному элементу – комплексная константа и т. д, константы были рас-смотрены в лабораторной работе № 2);

– в случае ввода числовых значений пробелы всегда обрабатываются как разделители между полями;

– символы конца записи имеют такое же действие, как и пробелы;

– допустимо использовать запятую в качестве разделителей между полями.

При выводе:

– вывод осуществляется в последовательные текстовые файлы, внутренние файлы, на экран или принтер (файлы Фортрана см. ниже);

– длина создаваемой при выводе записи не превышает 79 символов. Если же для размещения элементов вывода требуется большее число символов, то создаются новые записи. В каждой записи проставляются символы конца записи char(13) и char(10);

– логические данные выводятся как T (для .True.) и F (для .False.);

целочисленные данные выводятся в соответствии с дескриптором I11;

– вещественные и комплексные данные в зависимости от значения выводятся в соответствии с дескрипторами F или E: если выводимое значение 1 £ val < 107 , то для одинарной точности используется преобразование F15.6, а для двойной – E24.15; если выводимое значение val < 1 или val ³ 107, то для одинарной используется преобразование E15.6E2, для двойной – E24.15E4;

– для управления выводом можно использовать СИ-символы: ‘ ’c – строка, ‘ ’c – возврат каретки, ‘ ’c – табуляция и другие. Пример:

character(4) year(5)/'1996','1997','1998','1999','2000'/

write (*,*) 3.55,' 'c,'peis',' 'c, (year(i),' ',i=1,5)

end

 
 

 

Внутренние и внешние файлы Фортрана

Внешний файл – поименованная область во внешней памяти ЭВМ. Внутренний файл (т. е. файл, существующий в оперативной памяти ЭВМ) – символьная строка.

Файлы Фортрана подразделяются на файлы последовательного и прямого доступа.

Для передачи данных Фортран использует устройства В/В. Такие устройства имеют номера. К устройствам В/В могут быть подсоединены внешние и внутренние файлы, а также физические устройства, например клавиатура, экран, принтер. Устройства с номерами *, 0, 5, 6 всегда существуют в каждой Фортран-программе. Причем по умолчанию к устройствам *, 0 и 5 подсоединена клавиатура, а к устройствам *, 0 и 6 – экран. Во всех предыдущих лабораторных работах данные передавались на экран и считывались с клавиатуры (первый символ “*” в операторах write и read). В этой лабораторной работе познакомимся с передачей данных во внутренние и внешние файлы.

Внутренние файлы

Для доступа к внутреннему файлу не требуется специального оператора для подсоединения к устройству В/В. Номером устройства, к которому внутренний файл подсоединен, является имя строки. Внутренний файл после его создания по умолчанию всегда является открытым как для чтения, так и для записи.

Для передачи данных при работе со строками как с внутренними файлами используются операторы В/В:

READ (u, fmt)  список ввода

WRITE (u, fmt)  список вывода

u – имя строки;

fmt – спецификация формата В/В ( в случае В/В под управлением списка задается в виде звездочки (*) ).

Используя оператор WRITE, в строку можно передать данные любых типов. И, наоборот, оператором READ из строки можно считать, например, числовые данные (если в строке есть числовые поля данных). Часто внутренние файлы применяются для создания строк, содержащих смесь символьных и числовых данных (см. пример 1), а также для простого преобразования число – строка символов и строка – число (см. пример 2).

 

Пример 1:                                         Пример 2:

 

real:: a=234.55

integer kb

character(20) st

write (st,*) a ! преобразование число – строка

print *,st

read (st,'(i8)') kb !  преобразование строка – число

print *,kb

end

 
integer(2):: a=123, a2

real(8):: b=-4.56

character(10) sta, stb, ste, st*50

write (sta, '(A,i3)') ' a=', a

write (stb, '(f8.3)') b

write (ste, '(E10.4)') b

print *, sta, stb, ste

write (st,'(A,I3,F7.2,E12.5)')

         'a & b & b: ', a, b, b

print *,st

read (st,'(12x,I3)') a2

print *, a2

end

           

Внутренние файлы являются файлами последовательного доступа. Перед исполнением оператора В/В внутренний файл всегда позиционируется в начало файла.

Внешние файлы

Внешний файл доступен из программы, если он открыт. Для этого он подсоединяется к устройству В/В в результате выполнения оператора OPEN. После подсоединения и устройство, и файл считаются открытыми. Доступ к файлу, после того как он открыт, выполняется по номеру устройства, к которому он подсоединен. Номером устройства является целочисленное выражение, значение которого должно находится в интервале от 0 до 32767. Между номером устройства и именем внешнего файла существует однозначное соответствие. Все программные компоненты, ссылающиеся на один и тот же номер устройства, ссылаются на один и тот же файл.

При открытии файл по умолчанию позиционируется на первую запись или на конец файла, если в файле нет ни одной записи.

Внешние файлы могут быть открыты как для последовательного, так и для прямого доступа. Проще работать с последовательными устройствами В/В. Поэтому рассмотрение устройств В/В прямого доступа опустим.

Записи последовательного текстового файла могут быть разной длины. При выводе в конце каждой записи Фортран проставляет два неотображаемых символа – “возврат каретки” и “новая строка”. В случае вывода под управлением списка оператор вывода вставляет в начало каждой записи пробел (символ управления кареткой). После завершения ввода файл всегда позиционируется на начало следующей записи (или в конец файла), даже если были прочитаны не все поля текущей записи. При форматном вводе число данных, читаемых одним оператором ввода из текущей записи, регулируется форматом ввода.

Кроме оператора OPEN, при работе с внешними файлами могут быть использованы операторы позиционирования (BACKSPACE, REWIND), операторы передачи данных (READ, WRITE), оператор закрытия файла CLOSE, функция EOF. Кратко рассмотрим эти операторы.

Оператор OPEN

Создает устройство В/В с номером u и подсоединяет к нему внешний файл file. Общий вид:

     OPEN ([unit = ] u[, file = ‘имя’][, список других параметров]).

Оператор OPEN с полным списком параметров выглядит громоздко. Единственным обязательным параметром является номер устройства, всегда стоящий на первом месте в списке параметров. Порядок записи других параметров несуществен. В самом простом случае оператор выглядит следующим образом:

OPEN (4, file = ’c.txt’).

Данный оператор создает устройство с номером 4 и подсоединяет к нему внешний файл с именем c.txt. После выполнения этого оператора доступ к файлу c.txt осуществляется по номеру 4. В качестве других параметров будем использовать те, которые устанавливаются по умолчанию (файл последовательного доступа; пробелы при форматном вводе игнорируются; первый символ не интерпретируется как символ управления кареткой и выводится на экран; файл форматный; статус ‘unknown’, который позволяет открыть уже существующий файл и создать новый, если файл ранее не был создан).

Оператор BACKSPACE

Форма: BACKSPACE u.

Оператор возвращает файл, который присоединен к устройству с номером u,  на одну запись назад.

Оператор REWIND

Форма: REWIND u.

Оператор возвращает файл, который подсоединен к устройству с номером u, в начало первой записи.

Оператор CLOSE

Форма: CLOSE (u).

Оператор отсоединяет файл от устройства с номером u и закрывает это устройство.

Оператор READ

Оператор выполняет передачу данных из подсоединенного к устройству u файла в указанные в списке ввода переменные. Передача данных выполняется до тех пор, пока не выполнены все операции ввода, либо пока не достигнут конец файла, либо пока не возникла ошибка ввода. В случае ввода под управлением списка ввод прекращается при обнаружении в поле ввода слэша (/).

Общий вид: 

READ ([unit=] u,[ [ FMT = ] fmt ] [,список других

параметров]) [список ввода]

u – номер устройства В/В;  fmt – спецификация формата, в качестве других параметров будем использовать те, которые устанавливаются по умолчанию.

Оператор WRITE

Оператор передает данные из списка вывода в файл, который подсоединен к устройству с номером u.

Общий вид:

WRITE ([unit=] u,[ [ FMT = ] fmt ] [,список других

 параметров]) [список вывода] ,

 

u – номер устройства В/В; fmt – спецификация формата, в качестве других параметров будем использовать те, которые устанавливаются по умолчанию.

Функция EOF

Общий вид: EOF(u).

Функция возвращает .TRUE., если подсоединенный к устройству u файл позиционирован на записи “конец файла”. Иначе EOF возвращает .FALSE.