Функции работы с символьными величинами
Вид функции |
Назначение функции |
IACHAR(c) |
Возвращает ASCII–код символа |
ICHAR(c) |
Возвращает код символа из кодировки, поддерживаемой операционной системой |
ACAR(i) |
Возвращает символ типа CHARACTER(1) сASCII–кодом, равнымi |
CHAR(i[,kind]) |
То же, что ACHAR, но позволяет задать параметр разновидности символьного типа |
LGE(str1, str2) |
Возвращает .TRUE., если длинаstr1 больше или равна длинеstr2, иначе - .FALSE. |
LGT(str1, str2) |
Возвращает .TRUE., если длинаstr1 больше длинsstr2, иначе - .FALSE. |
LLE(str1, str2) |
Возвращает .TRUE., если длинаstr1 меньше или равна длинеstr2, иначе – .FALSE. |
LLT(str1, str2) |
Возвращает .TRUE., если длинаstr1 , меньше длиныstr2, иначе – .FALSE |
INDEX(str1, str2 [,back]) |
Номер позиции первого вхождения str2 вstr1. Еслиback= .false. или отсутствует, то поиск происходит слева, еслиback=.true., то справа |
REPEAT(str, N) |
Возвращает строку, в которой Nраз повторяетсяstr |
Пример 3. Дано целое число. Требуется перевести его в символьное представление, т.е. получить строку, состоящую из тех же цифр, что и данное число. Например, из числа 32564 получить строку ‘32564’.
program numch
integer:: num, k, p
character(10) string
read *, num
k=num; p=0
do while k>0 ! Определение количества цифр
k=k/10; p=p+1
enddo
call numchar(num, p, string)
print *, string
end program numch
subroutine numchar(n, m, c)
integer n !исходное число
integer m !количество цифр
character(*) c !выходная строка
integer i,j,k
k=n
do i=m,1,-1 !позиция символа
j=MOD(k,10) !выделение разряда единиц
c(i:i)=char(j+48) !занесение цифры в строку
k=k/10 !отбрасывание разряда единиц
enddo
end subroutine
Код символа ‘0’ (ноль) равен 48. Поскольку цифры в кодовой таблице расположены последовательно по возрастанию, то код любого цифрового символа равен 48 плюс значение соответствующей цифры. Обратите внимание на то, что параметр символьного типа в подпрограмме может быть описан с произвольной длиной (len=*).
Упражнения
Составить программу, по которой в данной строке поменяются местами первый и последний символы.
Перевернуть данную строку.
В данную строку S1 вставить строку S2 начиная с указанной позиции.
В данной строке удалить N символов начиная с позиции K.
В данной строке вставить пробел после каждого символа.
В данной строке удалить все пробелы.
Составить программу преобразования строки, содержащей последовательность цифр, в соответствующее целое число.
3.13. Файлы Фортрана
В программах на Фортране используются внутренние файлы и внешние файлы. В качестве внутреннего файла может выступать символьная строка или символьный массив. Внешний файл – это поименованная область во внешней памяти ЭВМ . Внешние файлы используются для длительного хранения данных на магнитных, оптических или флэш-носителях, а также для передачи данных между оперативной памятью и устройствами ввода-вывода. Далее речь будет идти только о внешних файлах.
Чтение (read) данных из внешнего файла и занесение их в оперативную память называются вводом. Обратная ситуация: запись (write) данных из оперативной памяти во внешний файл называется выводом.
Каждому используемому в программе файлу ставится в соответствие свой номер устройства, который может лежать в диапазоне от 0 до 32767 или обозначаться * (звездочкой). При вводе данных номера устройств 0, 5, а также * связаны с клавиатурой. При выводе данных номера устройств 0, 6, * связаны с монитором (экраном). При выполнении любой программы файлы клавиатуры и монитора всегда открыты. Файлы на устройствах внешней памяти требуют открытия в программе.
Открытие файла. Открытие файла происходит при выполнении оператора OPEN. При этом создается устройство с заданным номером N и к нему присоединяется внешний файл, имя которого указано опцией file= имя файла:
OPEN(N, file= имя_файла)
Имя файла может быть задано в форме символьной константы или символьной переменной. Например:
open(2, file=’d:\a.txt’)
В операторе OPEN может быть указано 17 различных опций. Значения опций, которые явно не указываются, принимаются «по умолчанию». Опции записываются через запятую с указанием после знака «=» значения опции. Перечислим некоторые опции оператора OPEN.
Опция ACTION определяет возможные действия с файлом:
‘READ’ – только для чтения,
‘WRITE’ – только для записи,
‘READWRITE’ – для чтения и записи (по умолчанию).
Опция FORM определяет формат файла. Есть три варианта значений опции:
‘BINARY’ – двоичный файл,
‘FORMATTED’ – форматный (по умолчанию),
‘UNFORMATTED’ – неформатный.
Опция ACCESS определяет способ доступа к файлу. Возможные значения:
‘DIRECT’ – прямой доступ,
‘SEQUENTIAL’ – последовательный доступ (по умолчанию),
‘APPEND’ – последовательный с добавлением данных в конец файла.
Опция STATUS:
‘OLD’ – указывает, что файл уже существует на устройстве,
‘NEW’ – файл новый, т.е. не должен существовать.
“UNKNOWN” – если файл уже существует, то он открывается, если нет, то создается (по умолчанию).
Опция IOSTAT = iostat – целая переменная, возвращающая 0 при отсутствии ошибок выполнения оператора OPEN, или номер возникшей ошибки.
Пример 1
Character(20) fname
Integer(1) ios
Print *, ‘Введите имя файла’
Read *, fname
! Открывается существующий двоичный файл только для ! чтения
Open(1,file=fname, action=’read’, status=’old’, & form=’binary’, iostat=ios)
! В случае ошибки будет выдано сообщение
If (ios .NE. 0) print *, ‘ошибка при открытии файла’
Закрытие файла происходит при выполнении оператора CLOSE(N). Оператор отсоединяет файл от устройства номер N и закрывает это устройство. При нормальном завершении программы происходит автоматическое закрытие всех открытых в ней файлов. Поэтому явное присутствие в программе операторов CLOSE не является обязательным.
Структура файла. Содержание файла – последовательная цепочка записей на устройстве. В памяти существует ячейка, в которой хранится файловый указатель (ФУ) на текущую запись файла. Файловый указатель устанавливается на запись, которая будет читаться при выполнении команды чтения или на ту позицию в файле, куда будет произведена запись.
Запись 1 |
Запись 2 |
….. |
Запись N |
Конец файла |
↑ (ФУ) |
|
|
|
|
Файл заканчивается специальным кодом «конец файла». При установке ФУ на конец файла логическая функция EOF(номер устройства) принимает значение .TRUE. (EOF – end of file). Для файлов любых типов действуют следующие правила:
– при открытии файла ФУ позиционируется на первую запись файла, если файл не пустой, или на конец файла, если в файле нет записей;
– при выполнении оператора REWIND n ФУ с любой текущей позиции устанавливается на первую запись файла (n – номер устройства);
– в результате выполнения оператора BACKSPASE n ФУ перемещается на одну запись назад.
Файлы последовательного доступа допускают лишь последовательное чтение записей, начиная с первой, в порядке возрастания номеров и добавление новых записей в конец файла. Нельзя вносить изменения в отдельную запись внутри файла. Если это сделать, то все последующие записи в файле исчезнут (выставится код «конец файла»).
Файлы прямого доступа допускают прямую установку ФУ на любую запись по ее номеру с последующим чтением или изменением этой записи.
Форматы файлов. Ввод и вывод данных могут происходить либо без преобразования формы их представления, либо с преобразованием формы. По форматам представления данных различаются файлы :
– форматные (текстовые, ASCII-файлы);
– двоичные;
– неформатные.
Ввод-вывод форматных файлов происходит с преобразованием представления данных. Ввод-вывод двоичных и неформатных файлов происходит без преобразования.