- •Часть 3
- •Содержание
- •30. Работа с файлами
- •Примечание:
- •31. Открытие файлов
- •File not found
- •32. Непосредственная работа с файлом
- •33. Форматный вывод информации
- •34. Форматное чтение информации из файла
- •35. Обработка сбойных ситуаций и ситуаций “конец файла” при вводе-выводе информации
- •Обработка сбойной ситуации:
- •7 Write (6,*) ’Введите a,I,b’
- •Обработка ситуации “конец файла”:
- •36. Операторы для работы с записями в файле
- •37. Дополнение файла информацией
- •Первый способ дополнения файла информацией:
- •10 Write (6,*)’Всего записей в файле’,kzap
- •Второй способ дополнения файла информацией
- •4 Write (6,*)’в файле было записей’,kz
- •38. Работа с текстом
- •39. Текстовые константы
- •Правило:
- •10 Format (a8)
- •10 Format (a)
- •1) Вводится меньше 8 символов, то они помещаются в переменную imfile, а недостающие до 8 позиции дополняются пробелами.
- •2) Вводится имя большего размера, чем 8 позиций, то будут восприняты только первые 8 символов и они будут записаны в переменную imfile;
- •8 Format (a10/5a5)
- •9 Format (1x,a10/1x,5a5)
- •9 Format (1x,a10/1x,5a5)
- •Семин а.В.
- •Правила ввода-вывода текстовой информации:
- •1). Ввод информации
- •Примечание:
- •40. Текстовые подцепочки
- •41. Вывод графиков
- •42. Эквивалентирование текстовых переменных
- •If(fam1.Eq.Fam2) write(6,9) fam2,k1,k2,k3,k4
- •7 Format (a40,i5,a15,i5,a7)
- •If (ngod.Ne.1962) goto 4
- •9 Format (1x,a40,i5,a15,i5,a7)
- •10 Write(4,*)’Конец просмотра базы данных’
- •43. Создание библиотек
- •44. Решение дифференциальных уравнений
- •45. Работа с комплексными данными
- •Правило:
- •46. Ввод-вывод переменных комплексного типа
- •Примечание:
- •47. Встроенные функции комплексного типа
- •48. Оператор equivalence
- •Правило:
- •49. Результаты арифметических операций в выражениях с данными разного типа
- •50. Файлы прямого доступа
- •51. Способы передачи форматных записей
- •52. Модификации оператора цикла do
- •6 Continue
- •If (y.Lt.0.05) cycle
- •55. Командные файлы
- •If errorlevel 1 go to exit
- •If errorlevel 1 go to done
42. Эквивалентирование текстовых переменных
С помощью оператора EQUIVALENCE можно приводить в соответствие два объекта данных текстового типа.
Если в списке оператора EQUIVALENCEописать две переменные, например А и В, то при выполнении программы в оперативной памяти ЭВМ переменной В будет соответствовать блок памяти переменной А. То есть, если переменной А присвоить какое-либо значение, то из-за того, что обе переменные занимают в памяти ЭВМ один и тот же блок, значение переменной В будет соответствовать значению переменной А и наоборот.
Пример:
CHARACTER*12 A,B*3
EQUIVALENCE(A(1:3),B)
В примере первые 3 символа текстовой переменной А будут соответствовать переменной В.
Задача:
В файле DEKANATхранятся записи, в каждой записи записаны:
Фамилия и инициалы, и 4 оценки по экзаменам.
Написать подпрограмму, которая по запросу выдаёт сообщения об успеваемости студента, фамилия которого вводится с клавиатуры.
CHARACTER*12 FAM1,FAM2
OPEN (3,FILE=’DEKANAT’)
WRITE (6,*)’Введите искомую фамилию’
READ (5,’(A12)’) FAM1
Происходит считывание искомой фамилии студента. Запись READ(5,‘(A12)’)FAM1 можно заменить на следующие две строки:
READ (5,7) FAM1
7 FORMAT (A12) или 7 FORMAT(A) , что абсолютно аналогично предыдущему.
4 READ (3,8,END=1) FAM2,K1,K2,K3,K4
В этой строке из файла DEKANAT происходит считывание Ф.И.О.(переменная FAM2) и оценок за экзамены (переменные K1,K2,K3,K4) при помощи оператора FORMAT с меткой 8. При возникновении ситуации “конец файла” управление передаётся на метку 1.
FORMAT(A15,4I5)
If(fam1.Eq.Fam2) write(6,9) fam2,k1,k2,k3,k4
FORMAT(1X,A15,4I5)
В этой строке происходит сравнивание исходной фамилии (введённой с клавиатуры после запроса) и очередной считанной фамилии из файла DEKANAT. Если фамилии совпадают, то выводим на экран: Ф.И.О. и 4 оценки. Затем происходит переход на новую строку файла и считывание очередной фамилии и проверка её по условию.
GOTO 4
STOP
END
Недостатком программы является то, что фамилия в файле и фамилия, введённая с клавиатуры, должны совпадать полностью. Если будет различие хоть в одном символе (другая буква или лишний символ пробел), то программа не выведет никакого результата (так как не выполнится условие оператора IF). Еще необходимо бы доработать программу, чтобы выводимый текст выводился с поясняющей информацией (Ф.И.О.: …, Оценка №1: …, Оценка №2: … и т.д.).
Пример данной программы не является идеальным решением этой задачи, это всего лишь простейший способ решения, призванный показать основные приёмы, которые лучше использовать в аналогичных ситуациях.
Задача:
В отдел кадров предприятия из КГБ пришла телеграмма: “Сотрудник вашего предприятия Михаил, 1962 года рождения, замешан в связях с вражеской разведкой. Используя вашу базу данных, представьте все сведения о сотрудниках по имени Михаил 1962 года рождения”.
База данных предприятия содержится в файле KADRYв виде записей:
Ф.И.О.год рождениядомашний адрестабельный № телефон40 поз.5 позиций 15 поз. 5 поз. 7 поз.
CHARACTER*40 FIO,DOM*15,TEL*7,IMJA*6/’Михаил’/ В операторе character можно не только описывать длину текстовых переменных, но и задавать значение 'Михаил' также, как и в операторе Data.
OPEN (4,FILE=’WYWOD’)
WRITE (4,*)’Сведения по вашему запросу’
OPEN (3,FILE=’KADRY’,STATUS=’OLD’)
4 READ (3,7,END=10) FIO, NGOD, DOM, NTAB, TEL
Считывает первую запись: Ф.И.О., год рождения, домашний адрес, номер по табелю, телефон.