- •Часть 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
7 Format (a40,i5,a15,i5,a7)
If (ngod.Ne.1962) goto 4
Здесь в условии применён элемент обратной логики: если считанный из файла год не равен 1962, тогда производится переход на метку 4 и считывается следующая запись. В область, расположенную ниже, попадаем только тогда, когда считанный год рождения равен 1962.
NI=INDEX(FIO,’ ’)
Чтобы найти имя Михаил, выделяем номер индекса, в котором находится символ пробел после фамилии. Этот индекс присваивается переменной NI.
IF (FIO(NI+1:NI+7).EQ.’Михаил’) WRITE (4,9) FIO, NGOD,
*DOM,NTAB,TEL
С помощью этой записи вылавливаем шпиона: если в текстовой переменной FIO, начиная с индекса NI+1 по индекс NI+7, встречается ‘Михаил’, то в файл WYWOD печатает Ф.И.О., год рождения, домашний адрес, номер по табелю, номер телефона. NI+1:NI+7 – текстовая подцепочка.
9 Format (1x,a40,i5,a15,i5,a7)
GOTO 4
10 Write(4,*)’Конец просмотра базы данных’
CLOSE (UNIT=3)
CLOSE (UNIT=4)
STOP
END
Если производить поиск не по имени, а по отчеству, то номер индекса найдем:
NI2=INDEX(FIO(NI+1:),’ ’), то есть поиск по второму пробелу.
текстовая подцепочка от N+1 позиции и до конца переменной FIO
Например, если записано :
Иванов Иван Иванович
то NI=7,aNI2=12.
43. Создание библиотек
Причины создания библиотек стандартных программ были рассмотрены ранее. В этой главе мы рассмотрим процесс создания этих библиотек.
Существуют три стандартные библиотеки языка ФОРТРАН:
Llibfora.lib, Llibfore.lib, Llibfor7.lib.
В этих библиотеках содержаться файлы в виде:
имя.obj
Библиотеки создаются командой lib в диалоговом режиме подDOS.
Набираем на клавиатуре lib и нажимаем на ввод.
При этом появятся 2 или 3 сообщения (подчеркнутый текст):
Library name: Libmain
задаётся имя создаваемой библиотеки (например, Libmain). Можно задать полный путь. Можно задать имя существующей библиотеки, при этом можно будет её дополнить своей программой, удалить любую программу из библиотеки или заменить старую программу новой.
Library does not exist. Create? (y/n)y
библиотека не существует, создать? (да/нет) Отвечаем: да, создать.
В эту, пустую библиотеку внесем (добавим) два файла matr.obj и integ.obj.
Operations: +matr+integ
существуют 3 вида операций:
+ добавить в библиотеку:
– удалить из библиотеки;
–+ заменить (удалить и вставить. Но лучше эту операцию не использовать)
Примечание: при занесении программы в библиотеку необходимо проследить, чтобы на этапе компиляции создался файл с расширением obj. Если это не произошло, попробуйте произвести компиляцию при помощи командыFL (см.раздел "Командные файлы").
List file: spisok.txt
в файл с именем spisok.txtвыведем список всех программ из библиотекиLibmain.
Output library: Libmain
исходящая библиотека. Если указать Libmain, то сохранится прежняя библиотека, дополненная файламиmatr.objиinteg.obj. Если создать новое имя файла исходящей библиотеки то создастся библиотека с введённым именем, которая будет полной копиейLibmain, но дополненной.
44. Решение дифференциальных уравнений
Дифференциальные уравнения представляют собой функцию вида:
y'=f(x,y)
Решить дифференциальное уравнение – это, значит найти очередную точку кривой, которая описывается этим уравнением.
– каждое новое значение будет равно: предыдущее (yk) + добавка.
Задача:
Решить дифференциальное уравнение:
на отрезке от х=0 дох=1.5с шагом0.1по методу Рунге-Кутта 4 порядка:
.
Решение:
Необходимо в программе задать цикл вычисления, при котором на каждом цикле будут вычисляться значения коэффициентов K1,K2,K3,K4и значенияy.
WRITE (6,*)’ Введите ИД: Xo,Yo,DX,Xкон’
READ (5,*) X0,Y0,DX,XK
Y=Y0
C Задаём цикл
DO 1 X=X0,XK,DX
AK1=FUN(X,Y)*DX
Коэффициенты К1, К2, К3, К4 заменены на AK1, AK2, AK3,AK4 потому, что первый символ (буква K) относит переменную к целому типу (I, J, K, L, M, N), а она должна быть вещественного типа. Fun – подпрограмма функция, описывающая наше уравнение.
AK2=FUN(X+DX/2.,Y+AK1/2.)*DX
AK3=FUN(X+DX/2.,Y+AK2/2.)*DX
AK4=FUN(X+DX,Y+AK3)*DX
Y=Y+(AK1+2.*AK2+2.*AK3+AK4)/6.
XN=X+DX Чтобы напечатать X, соответствующее новому значению Y
WRITE (6,*) ’При X=’,XN,’ Новое значение Y=’,Y,
PAUSE
STOP
END
FUNCTION FUN(X,Y)
FUN=2.*SIN(X)+SQRT(3.)*COS(Y)
RETURN
END
Х изменяется в цикле от ХО до ХК с шагом DX. Для того чтобы напечатать новое значениеY с соответствующим ему значением Х, определяем новое ХN=Х+DX.
Недостатки программы:
Данные вводятся, но тут же не распечатываются, не создаётся массив данных для построения графика. Можно было бы посчитать общее количество полученных значений.
Попробуйте свои силы в устранении эти недостатков.
Задача:
Решите дифференциальное уравнение:
Для решения дифференциального уравнения использовать стандартную программу из библиотеки стандартных программ RK2.
RK2(FUN,H,X1,Y1,K,N,VEC)
где FUN– имя внешней подпрограммы-функции, в которой описано решаемое дифференциальное уравнение. Обязательно описать при помощи оператораEXTERNAL;
Н – шаг интегрирования;
Х1, Y1 – начальные значенияXo,Yo;
K– количество шагов между двумя сохраняемыми значениями;
N– количество значений;
VEC– результирующий вектор-столбец, длинойN.
При помощи параметра Kвычисления можно производить для всех значений, а сохранять только одно из 3, 4, …. То есть можно будет построить график, например из 10 точек, но при расчётах будет использовано 200 точек. Точность расчетов сохраняется, а график выводится приближённо.
С Подпрограмма-функция вычисления дифференциального уравнения
FUNCTION FUN(X,Y)
FUN=2.*SIN(X)+SQRT(3.)*COS(Y)
RETURN
END
C Головная программа
DIMENSION VEC(1000)
EXTERNAL FUN
WRITE (6,*)’Введите значения Xo, Yo, Xк, dx’
READ (5,*) X0,Y0,XK,DX
K=10
При K=10 будет сохранять каждое 10 значение.
N=((XK–X0)/DX+1)/K
Происходит вычисление общего количества сохраняемых точек, где (XK–X0)/DX+1) – количество всех точек при расчёте.
CALL RK2(FUN,DX,X0,Y0,K,N,VEC)
После возврата из подпрограммы RK2 мы имеем заполненный массив VEC в количестве N элементов.
WRITE (6,*) (VEC(I), I=1,N) Грубый вывод на экран массива с результатами расчета
CПостроение графика и вывод результатов расчёта на экран
CALL GRAF(VEC,N)
XT=X0
DO 8 I=1,N
WRITE (6,*) XT,VEC(I)
8 XT=XT+K*DX В этом цикле выводится таблица со значениями аргумента и функции
PAUSE
STOP
END