Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книга Фортран Павловец 2008

.pdf
Скачиваний:
127
Добавлен:
31.05.2015
Размер:
1.55 Mб
Скачать

последней строки невозможно осуществить дальнейшую запись информации в файл.

11WRITE (6,*)’Введите U,I,cos f,T’ READ (5,*, ERR=10)U,TOK,CF,T WRITE(3,*)U,TOK,CF,T

Процесс ввода информации с клавиатуры дисплея и записи в файл может повторяться бесконечное количество раз по GO TO 11. При наступлении сбойной ситуации управление будет передано на метку 10.

KZAP=KZAP+1

GOTO 11

10WRITE (6,*)’Всего записей в файле’,KZAP CLOSE (3)

Желательно закрыть файл.

STOP END

Без перезаписи последней строки исходного файла эта программа будет работать на СМ, ЕС технике, кроме персональных ЭВМ. На персональных ЭВМ после попытки чтения информации из записи, содержащей конец файла и после наступления ситуации «конец файла», запись информации в этот файл невозможна (мало кто об этом знает).

Чтобы можно было записать информацию в этот файл, необходимо:

вернуться на одну запись назад – BACKSPAСE 3

повторить последнюю запись в файл. На место последней записи записать последнюю информацию, считанную из старого файла;

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

Второй способ дополнения файла информацией

Существует функция EOF(n) состояния файла. Если открыт канал оператором OPEN: OPEN (UNIT=3, FILE=’…)

и мы производим чтение оператором READ: READ (3,*) …

то в обычном режиме функция EOF(3) имеет значение .FALSE. . В том случае, если из файла прочитана последняя запись, функция EOF(3) принимает значение .TRUE..

Значение этой функции можно использовать для обнаружения конца файла и дополнения файла информацией.

По сравнению с предыдущим способом не требуется делать возврат назад на одну строку и восстанавливать последнею запись.

Задача:

В файле ZONA находятся записи. В каждой записи три числа A, B, C. Подсчитать количество записей в файле, дополнить его аналогичной информацией. Пополнение файла информацией остановить при вводе слова «конец».

СПрограмма №31

 

OPEN (4,FILE=’ZONA’, STATUS=’OLD’)

 

KZ=0

2

IF(EOF(4)) GO TO 4

91

 

READ (4,*) A,B,C

 

KZ=KZ+1

 

GO TO 2

4

WRITE (6,*)’В файле было записей’,KZ

8WRITE (6,*)’Введите новые значения A, B, C’ READ (5,*,ERR=12) A,B,C

WRITE (4,*) A,B,C Строку с новыми данными добавляем в файл.

KZ=KZ+1

GOTO 8 Переходим ко вводу данных с клавиатуры и выводу в файл При вводе текста вместо числа наступит сбойная ситуация и управление будет передано на метку 12.

12WRITE (6,*)’Всего записей’,KZ CLOSE(4)

PAUSE STOP END

При вводе слова «конец» или вообще при вводе любого текста произойдёт сбой по чтению, и в обычном режиме, без обработки сбойной ситуации программа будет снята с выполнения. Чтобы программа не снялась с выполнения в операторе READ необходимо предусматривать обработку сбойной ситуации. Что мы и сделали в строке READ(5,*,ERR=12) A,B,C. В противном случае текст (’всего записей’,KZ) не будет выведен никогда.

40. Работа с текстом

Средствами ФОРТРАН-4 в одну ячейку памяти можно записать до 4 символов текстовой информации. Начиная с ФОРТРАН-77 в одну ячейку памяти (одной текстовой переменной) может быть присвоен текст длиной до 254 символов, но эти переменные должны быть описаны специальным оператором описания CHARACTER. Например,

CHARACTER*10 A,B,C(12),D*8,K*5(12)

Это значит, что в программе переменные А, В, D и массивы С и К будут текстового типа (строковые).

*10 – групповой описатель длины. Распространяется на А, В, С. Резервирует для каждой переменной в оперативной памяти ЭВМ по 10 байт на каждую переменную, где могут помещаться до 10 текстовых символов.

Массив С(12) состоит из 12 элементов, каждый из которых может содержать до 10 текстовых символов. Переменная D может содержать до 8 текстовых символов.

Массив K текстового типа, содержит 12 элементов длиной по 5 байт.

41. Текстовые константы

Текстовые константы могут быть представлены в двух формах:

а). старая форма – холлеритовская строка – представляет собой число выводимых символов n, признак константы латинскую букву H и сами выводимые символы:

nHнабор символов

n – целая беззнаковая константа в диапазоне 1-255.

92

Пример:

Энергофак

б). строка символов, заключённая между двумя апострофами 'ЭНЕРГОФАК-2000' 'ЭНЕРГОФАК''2003'

Символ апостроф внутри текста отображается двумя апострофами, идущими подряд. Последняя запись содержит текстовую константу ЭНЕРГОФАК’2003.

Текстовая константа – это строка символов, которая заключена между двумя апострофами или задана холлеритовской строкой.

Значения текстовых переменных могут быть заданы оператором присваивания или оператором DATA или в результате ввода информации.

K(1)='ВЕСНА'

K(2)=4HЗИМА DATA K(3)/'ОСЕНЬ'/ READ (5,7) K(4)

7 FORMAT (A5)

Правило:

Ввод и вывод текстовой информации только форматный.

Ввод-вывод текстовой информации осуществляется по спецификации А:

Aw

где w – количество позиций, из которых считывается текстовая информация при вводе или куда выводится текстовая информация при выводе.

Мини задача:

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

CHARACTER*8 IMFILE Переменная IMFILE может содержать до 8

символов.

WRITE (6,*)’Введите имя файла исходных данных’

READ (5,10) IMFILE

10FORMAT (A8)

OPEN (UNITE=4, FILE=IMFILE) Обратите внимание, что переменная IMFILE записывается без кавычек

READ (4,*) A,B,C

Сэкрана будет вводиться форматно имя файла (например, DANN.DAT) и присваивается текстовой переменной IMFILE (имя открываемого файла). Текстовая информация DANN.DAT вводится без кавычек и считывается по формату A8.

Допускается использовать спецификацию А без количества позиций w, например:

10FORMAT (A)

Тогда ширина считываемого поля принимается равной длине, указанной в операторе

CHARACTER.

Можно использовать форматизированный ввод без оператора FORMAT. Например:

93

READ (5,’(A)’)IMFILE

Процесс ввода текстовой информации и размещения ее в памяти ЭВМ протекает следующим образом. Сначала с помощью оператора READ по формату А читается с экрана дисплея информация в количестве символов Aw и помещается в буфер ЭВМ, а затем из буфера ЭВМ информация записывается в отведенное поле памяти для текстовой переменной. Количество символов считанной информации w может не совпадать с длиной текстовой переменной, описанной в CHARACTER.

Для нашего примера:

Если имя файла меньше 8 символов и набрано без пробела впереди (в конце можно)

– например, DAN.DAT , то информация прочитается правильно. Но если впереди

поставить пробел (

-DAN.DAT), то файл DAN.DAT на диске никогда не найдём.

Это происходит

 

из-за того, что для ЭВМ имя DAN.DAT совершенно отличается от

 

имени этого же файла, но с пробелом впереди.

Если ввод имени файла осуществляется по формату А8, но:

вводится меньше

8

символов, то они помещаются в переменную IMFILE, а

недостающие до 8

позиции дополняются пробелами.

2) вводится имя большего размера, чем 8 позиций, то при чтении будут восприняты только первые 8 символов и они будут записаны в переменную IMFILE.

Задача:

Файл с именем TEX.DAT содержит две записи: фамилию и адрес.

Сёмин А.В.

ул. Могилёвская д.37 кв.6

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

Разобьём строки на переменные, в которые мы и будем производить считывание.

Сёмин А.В.

АT

ул. Могилёвская д.37 кв.6

В1 В2 В3 В4 В5

CHARACTER*10 AT,B(5)*5

СПример 1: w=len

Количество позиций ширины поля w оператора Format совпадает с длиной переменной, описанной в CHARACTER*10 AT,B(5)*5

OPEN (4, FILE=’TEX.DAT’) READ (4,8) AT,(B(J),J=1,5)

Открываем TEX.DAT, читаем из него переменную АT и массив В.

8FORMAT (A10/5A5)

WRITE (6,8) AT,B Пробуем вывести информацию по тому же формату При таком выводе первый символ каждой строки пропадает потому, что служит для управления печатью. Поэтому в каждой новой выводимой строке необходимо отступать как минимум одну позицию. Для этого нужно использовать другой формат для вывода.

94

При вводе ширина полей считывания спецификации оператора FORMAT равна длине описания текстовых переменных в операторе CHARACTER.

Правильный вывод:

WRITE (6,9) AT,B

9FORMAT (1X,A10/1X,5A5)

Врезультате такого вывода получим:

Сёмин А.В.

ул. Могилёвская д.37 кв. 6

Это наиболее простой и благоприятный ввод-вывод текстовой информации, когда w=len.

w – ширина поля ввода-вывода (длина записи). Количество позиций на устройстве ввода или вывода для размещения текстовой переменной.

len – длина текстовой переменной. Количество байт (символов) в памяти ЭВМ для размещения текстовой переменной.

При вводе текстовой информации этот процесс осуществляется следующим образом: а) С помощью операторов READ и FORMAT информация считывается с поля ввода

шириной w символов.

б) Считанная информация помещается в буфер ЭВМ.

в) Из буфера ЭВМ информация записывается в ячейку памяти, в которой отведено len позиций для размещения текста.

Рассмотрим случай, когда w меньше длины записи (w<len).

СПример 2: w<len. При чтении информации.

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

REWIND 4 READ (4,9) AT,B

9 FORMAT (A8/5A4)

w=8

Переменной АT присвоится значение

аt= Сёмин А.

len=10 позиций

Так как w=8, а len=10, то при чтении сначала будут восприняты первые 8 символов из первой строки и при размещении этой информации в память ЭВМ в переменную АT справа произойдёт дополнение двумя пробелами до 10 позиций.

При чтении второй строки по формату 5A4 будет прочитано пять раз по 4 символа текста и при заполнении памяти массива В каждый элемент будет дополнен пробелом.

ул. Могилёвская д.37 кв.6

В(1) В(2) В(3) В(4) В(5) не прочитается эта информация

Переменным массива В присвоятся значения: B(1)=ул._ _ (дополнило одним пробелом); В(2)=Моги_ (w=4, а len=5, поэтому читает Моги и недостающую позицию до 5 дополнит пробелом); В(3)=лёвс_ (дополнило пробелом); В(4)= ….

95

Если прочитанную и помещенную в память ЭВМ информацию вывести при помощи ранее используемых операторов

WRITE(6,10)AT,B

10 FORMAT(1X,A10/1X,5A5)

То получим : Семин А._ _

ул._ _Моги_левс_кая_ _д.37_

Рассмотрим случай, когда w>len:

СПример3: w>len. При чтении информации. REWIND 4

READ (4,11) AT,B 11 FORMAT (A12/5A6)

 

w=12

Прочитает первую строку:

w=Сёмин А.В.

 

len =10

Из первой строки по формату А12 будет прочитано 12 символов, включая два дополнительных пробела. Эти 12 символов будут помещены в буфер, а затем будут заноситься в память ЭВМ, где имеется только 10 зарезервированных мест. При занесении в память ЭВМ запишется только правая часть воспринятой информации: АT=мин_А.В._ _

Две буквы слева будут утеряны.

Аналогично, при чтении второй строки по формату 5А6 в буфер будет восприниматься по 6 символов текста

ул. Могилёвская д.37 кв.6

В(1) В(2) В(3) В(4) В(5)

А при занесении в память ЭВМ в каждом элементе массива В будет утеряно по одной букве слева.

Переменным массива В присвоятся значения: B(1)=л._Мо; В(2)=илёвс; В(3)=ая_д.;

В(4)= 7_кв.; В(5)=_ _ _ _ _

Если вывести эту информацию при помощи операторов

WRITE (6,9) AT,B

9 FORMAT (1X,A10/1X,5A5)

то получим: мин_А.В.

л._Моилёвсая д.7 кв.

Мы рассмотрели особенности ввода текстовой информации и размещения ее в памяти ЭВМ. При форматном выводе по спецификации Aw принимали, что ширина вывода w равна длине переменной CHARACTER .

Предположим, в выше приведенном примере мы правильно прочитали переменную АT длиной 10 символов и в памяти ЭВМ она содержит текст:

96

Семин А.В.

Выведем эту переменную с различной шириной поля оператора FORMAT .

C Пример 4. : w>len , При вводе текстовой переменной.

WRITE(6,8)AT

7FORMAT (1X,A12)

Врезультате получим:

len = 10

Семин А.В.

w = 12

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

C

Пример 5. :w < len. При выводе текста.

 

WRITE(6,9)AT

8

FORMAT(1X,A8)

Выводимая информация не помещается в отведенное поле. При выводе цифровой информации во всех восьми позициях отпечатались бы символы « * ». При выводе текста отпечатается только левая часть текстовой переменной, которая помещается в отведенное поле. Поэтому получим :

Семин А.

Правила ввода-вывода текстовой информации: 1). Ввод информации

Текстовая информация читается форматно по спецификации А. В соответствии со спецификацией оператора FORMAT Аw с экрана дисплея в буфер ЭВМ считывается

количество w позиций текстовой информации. Затем информация из буфера переносится в память ЭВМ. Это количество w записывается в текстовую переменную длиной len. Идеальный случай: w=len.

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

Стакан - длина текстовой переменной, описанной в операторе CHARACTER. Линейка – количество текстовых символов, обрабатываемых оператором FORMAT.

При чтении информации:

1. Если w<len

Считанный текст короче, чем длина переменной. Этот текст помещается в текстовую переменную, а справа дополняется пробелами. (Линейка вставляется в стакан слева. Линейка короче стакана). Количество пробелов равно недостающему количеству символов до длины len.

97

2.Если w>len

Вбуфер ЭВМ считано больше символов, чем может поместиться в текстовой переменной. В этом случае в длину len помещается правая часть считанного текста, левая часть обрезается. (Линейка вставляется в стакан слева. Линейка длинее стакана. Обрежутся первых w-len символов слева).

Вывод информации

Вывод информации осуществляется форматно по спецификации Aw. При выводе из ячейки памяти длиной len текст помещается в буфер и выводится на внешнее устройство в соответствии со спецификацией оператора FORMAT Aw.

1. Если w>len

Ширина поля вывода больше, чем количество выводимой информации.

Выводимая информация (len) прижимается к правому краю поля, а слева дополняется пробелами (Линейка вставляется в стакан справа. Линейка короче стакана). Количество пробелов равно w-len.

2. Если w<len

Выводимая информация не помещается в ширину поля вывода. При выводе текста не произойдёт появление символов « * » вместо информации как для спецификаций I, F, E. Будет выведена левая часть текстовой переменной (стакан открыт справа, а линейка длинная).

При этом необходимо учесть, что если при выводе мы не отступим хотя бы одну позицию с начала строки, то первый символ заменится пробелом (первая позиция строки используется для управления режимом вывода информации (см. §31“Разделители”)).

Примечание:

Средствами языка ФОРТРАН для персональных ЭВМ при вводе-выводе информации по спецификации Аw можно не указывать ширину поля.

Пример:

CHARACTER*8 A1,B1,T*125 READ (5,7) A1

7FORMAT (A)

Здесь ширина А не указана. При этом автоматически считается, что w=len. Поэтому переменную А1 считываем и выводим как по формату А8. WRITE (6,7) A1 Необходимо учесть, что при таком выводе по формату с меткой 7 первый символ выводимого текста будет утерян.

Вместо двух строк:

READ (5,7) A1 7 FORMAT (A8)

можно записать одну форматизованную строку:

READ (5,’(A8)’) A1

98

Причём это применимо для всех типов переменных. Например:

READ (5,’(F7.2)’) X

строка оператора FORMAT

Строка оператора FORMAT может быть записана внутри оператора READ или WRITE в виде текстовой константы, взятой в апострофы.

42. Текстовые подцепочки

Текстовые подцепочки позволяют выделить несколько символов из текстовой переменной. При этом указывается имя текстовой переменной, а в скобках - начальные и конечные символы. Пример записи:

А1(2:4) – из текстовой переменной А1 выделить текстовую подцепочку, начиная со 2 по 4 символ включительно.

А1(:5) – выделяется текстовая подцепочка с начала переменной А1 по 5-й символ включительно.

А1(4:) – выделяется текстовая подцепочка, начиная с 4-го символа до конца переменной А1.

Текстовую подцепочку можно записывать, сравнивать, выводить. Значение этой подцепочки можно присвоить другой переменной.

Например:

CHARACTER*8 A1,B1,T*125

READ (5,7) A1 Например, для ввода наберем текст февраль

7 FORMAT (A8)

WRITE (6,'(A)') A1 при таком выводе или при выводе по формату с меткой 7 мы не напечатаем первый символ введенного текста и получим евраль_. Но в памяти ЭВМ введенный текст сохранится правильно: февраль_

T='Расписание занятий на январь_ _месяц'

B1=T(23:29) Семь символов текстовой подцепочки выделятся как январь_ и поместятся в 8 байт переменной В1 как январь_ _ (дополнятся одним пробелом). WRITE (6,7) B1 По этому оператору будет напечатано слово нварь_ _ (первый символ пропадает)

T(23:29)=A1 Начальных семь символов текста из переменной А1, введенного первым оператором READ, будут помещены в текстовую переменную T в качестве символов с 23-го по 29-й и заменят собой предыдущий текст январь_ WRITE(5,'(1X,A)') T Будет выведен текст Расписание занятий на февраль

месяц

С текстовыми переменными можно производить следующие операции:

1). Производить операции сцепления при помощи двух последовательных символов слэш « // »:

Т=А1//В1

Это означает в текстовую переменную Т записать текст, который содержится в текстовых переменных А1 и В1.

T=A1//’ ’//B1(:5)

Переменной Т присвоится текст из переменной А1+ пробел + информация от начала и до 5-го символа переменной В1(1 можно не ставить)

99

2). Текстовые переменные можно сравнивать с помощью логических операторов IF, используя две операции:

.EQ. и .NE.

Текстовые символы А, В, С … можно сравнивать на "больше" или "меньше" между собой и в алфавитном порядке выполняется следующее:

A<B<C… и a<b<c

Существуют следующие функции для работы с текстовыми переменными:

1. функция длины LEN(имя переменной) – определяет длину текстовой переменной или текстового выражения.

K=LEN(Т) Обратите внимание, что К целого типа

2. функция INDEX(имя переменной, подцепочка).

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

N=INDEX(T,'февр') Для ранее приведенного примера N будет равен 23

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

Например:

N2=INDEX(T(24:),’февр’) В переменной Т, начиная с 24 позиции и до конца найти номер указанной подцепочки, (это будет второй раз встречающаяся подцепочка 'февр').

Две текстовые переменные можно сравнивать между собой с помощью логических функций:

Лексически больше либо равно LGE(C1,C2) – имеет значение .TRUE. если текстовое С1 больше либо равно текстовому С2.

Используется вместо .GE.. Можно записать вместо IF(C1.GE.C2) строку IF(LGE(C1,C2)). Так же существуют следующие текстовые логические функции, аналогичные арифметическим:

LLT, LLE, LGT, LGE.

Их можно использовать только на персональных ЭВМ, начиная с ФОРТРАН-95. Текстовые переменные можно сравнивать с помощью обычных логических операций

отношений:

.GT. .NE.

.GE. .LE.

.EQ. .LT.

Это же работает и на Фортране под WINDOWS.

Пример:

Подсчитать, сколько раз встречается буква «а» в текстовой переменной Т.

N=LEN(T)

K=0

DO I=1,N IF(T(I:I).EQ.’a’) K=K+1 END DO

WRITE(6,*)K

100