Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
02.05.2014
Размер:
553.98 Кб
Скачать

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

  1. 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=((XKX0)/DX+1)/K

Происходит вычисление общего количества сохраняемых точек, где (XKX0)/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

Соседние файлы в папке Программирование на Фортране