    22. Реализация исполнителей на  Фортране.  Примеры реализации структур данных 
    В Фортране отсутствуют специальные структурные единицы, соответствующие 
понятию исполнителя. Тем не менее, подобно тому как с помощью операторов IF и 
GOTO можно реализовать (управляющие конструкции, с помощью оператора COMMON 
можно реализовать работу с исполнителями. Основное отличи» исполнителя от 
группы программ состоит в том, что у исполнителя есть глобальные объекты, 
общие для всех программ данного исполнителя. Используя эти глобальные объекты, 
различные программы исполнителя могут передавать информацию друг другу. Таким 
образом, для реализации исполнителей нужен оператор, который позволит ввести 
объекты, общие для некоторой группы программ. Таким оператором и является 
оператор COMMON. 
    Напомним, что оператор COMMON в общем виде записывается так: 
    COMMON / (имя блока) /	1объекты: 
    в                       (имена переменных)	I 
    @,                     (имена переменных)	1    ... 
    в,                                      ...	I    ... 
    Имена переменных перечисляются через запятую. Для массивов указывается 
размерность по каждому индексу (если она не указана в явном описании типа). 
    По правилам языка Фортран описание общих для некоторых программ объектов с 
помощью оператора COMMON должно быть Включено в каждую программу. Чтобы не 
писать много раз одно и то же, воспользуемся оператором INCLUDE, который 
включает содержимое указанного в этом операторе файла в текст программы. Общий 
вид этого оператора таков: 
    INCLUDE "(имя файла)" 
    Использование этого оператора не является обязательным — в Фортране IV, 
где этого оператора нет, можно продублировать требуемый текст в каждой 
программе, например, средствами экранного редактора. Использование оператора 
INCLUDE, однако, делает тексты более компактными, легче понимаемыми и 
позволяет избежать ошибок, связанных с расхождением описаний в разных 
программах, например, при их модификации. 

    360 ГЛ. 5, ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН 
    22. РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ НА ФОРТРАНЕ 361 

    При реализации исполнителя на Фортране с использованием оператора INCLUDE 
следует сначала перекодировать описатель исполнителя и поместить полученный 
текст в отдельный файл. После этого при перекодировке отдельных программ 
исполнителя, в каждую из них надо с помощью оператора INCLUDE включить 
перекодированный описатель исполнителя. Перекодировку программ исполнителя 
разумно поместить во второй файл, соответствующий данному исполнителю. В 
результате закодированный на Фортране исполнитель будет размещаться в двух 
файлах: в одном описатель, а в другом — кодировка пррграмм. Мы будем 
придумывать испол-нителю двухбуквенное латинское имя и помещать описатель в 
файл с этим именем и расширением ".C 
    LS", а кодировку программ — в файл с расширением ".FTN". Например, 
придумав для исполнителя стек сокращение ST, поместим описатель в файл 
"ST.CLS", а перекодировку программ — в файл "ST.FTN". 
    Ограниченный стек 4-мерных комплексных векторов. Перекодируем на Фортран 
непрерывную реализацию стека на базе вектора, считая, что элементами стека 
являются 4-мерные комплексные векторы. 
    Сфайл "ST.CL3" 
    Сисполнитвль Ограниченный стек С4-векторпв (ST) 
    С СП: 
    С 1. начать работу	ETINIT 
    С 2. сделать стек пустым	STNUL 
    С 3. стек пуст I да/нвт	QSTNUL <NLF> 
    С 4. есть свободное место t да/нвт   QSTADD <NLPI 
    С S. довавить элемент <BXiE> в стек   STADD ( Е ) 
    С 6. взять элемент и» стека в <вых|Е> БТБЕТ ( Е > 
    С 7. вершина стека <вык:Е>	STQTOP( Е ) 
    С Э. установить вершину стека в <вх»Е> STSTOP( Е > 
    С 9. удалить вершину стек*	STDEL 
    С 10» КОНЧИТЬ равоту	STTERM 
    С 
    9то первая часть перекодировки описателя исполнителя на Фортран. Хотя 
результат этой перекодировки целиком состоит из строк комментария, т. в. 
Фортраном игнорируется, ее проведение требует содержательной работы: надо 
придумать сокращение для имени исполнителя и имена программ исполнителя (эти 
имена должны содержать не более 6 символов, состоять только из забавных 
латинских букв и цифр и начинаться с бувы). Будем в качестве первых двух букв 
имен подпрограмм использовать двухбуквенное латинское сокращение имени 
исполнителя, а для имен функций добавлять перед этими двумя буквами еще букву, 
опре
    | Являющую тип вырабатываемого значения: Q — для логических : функций, I — 
для целых и R — для действительных. Некоторые понятия в терминах Фортрана 
могут оказаться невыразимыми, например на Фортране нельзя реализовать 
программу «вершина стека», вырабатывающую и принимающую значение, — в Фортране 
вообще отсутствуют такие возможности. Поэтому мы разбили эту программу на 
"две: программу «вершина стека», вырабатывающую •качение, и программу 
«установить вершину стека», которая должна эту вершину менять. Но даже после 
этого программа «вершина стека» оказалась невыразимой — ведь она должна 
вырабатывать значение типа «4-мерный комплексный вектор», а в Фортране функ« 
ции могут вырабатывать значение только одного из четырех пред* определенных 
типов LOGICAL, INTEGER, REAL, СОМРЕЕД. Поэтому на" Фортране эту программу 
придется записать в виде подпрограммы С одним выходным параметром, а не в виде 
функции. Далее надо закодировать константы, типы, объекты и обозначения исполнителя: 
    Стипы,  ОБЪЕКТЫ и аеозначенияз С 
    IMPLICIT LOGICAL  <Ш	!тип "да/нет" DATA                                    
            !константы: Е                  MAXIND    /  100 /       !     
максинд = 100 
    COMMON    /STCQM/	'объекты» ®                                    NELEMS    
     !     мощность»  0..максинд 
    Обратите внимание, что мы включаем во все программы исполнителя не только 
один и тот же оператор COMMON, обеспечивающий работу с глобальными объектами 
исполнителя, но и строки. 
    IMPLICIT LOGICAL  <Ш>	«тип "да/нет" 
    DATA	!константыt 
    Q                 MAXIND    / 100 /	!    максинд - 100 . 
    Таким образом, во всех программах объекты и имена функций, которые 
начинаются с буквы Q, будут иметь тип да/нет и во всех программах можно будет 
использовать вместо константы 100 имя MAXIND.	" 
    Глобальные объекты каждого исполнителя будем размещать в отдельном 
COMMON-блоке, имя которого состоит из двухбуквен-ного латинского сокращения 
имени исполнителя и трех латинских, букв СОМ. В данном случае глобальные 
объекты исполнителя ST; размещены в СОММОЭД-фшке STCOM, 

    362 Г	ГЛ. 5. ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН 

    2 используемые исполнители* 
    С    VE i  вектор С4-векторов с индексом 1..максинд 
    С мнемоника некоторых Фортранних именг 
    С    Q	- inQuire           INIT        - INITialize 
    С    МЛ,      -i NUL1	ТЕКИ        - TERHinate 
    С    DEL      - DELete	NELEMS    - Number of  ELEMentS 
    Сканец описаний  i——————————-———•————————— 
    Раздел «мнемоника некоторых фортранных имен» призван облегчить чтение 
программы человеком. Дело в том, что по шести-символьному сокращению бывает 
очень трудно понять, исходя из чего это сокращение придумано, что затрудняет 
чтение и понимание программы. 
    Далее следует перекодировать программы исполнителя так, как было показано 
в предыдущем разделе: 
    С файя. "ST.FTN" 
    ^___,____________,_ — ___,___„,,___.____ — ___„._______—_ — 
.-«.-.••-„___—_-___  ___. 
    SUBROUTINE STIIMIT	'начать равоту 
    INCLUDE  "ST.CLS" /	! 
    CftLL VEINFT	l  вектор.начать работу 
    NELEMS = 0	!  МОЩНОСТЬ 5= 0 
    END	!конец программы 
    f*_mr_:__________,_,„„._..._.«._.____._____._,_._.,_«._ 
    SUBROUTINE STNUL	«сделать стек пустым ет 
    INCLUDE "ST.CLS"	! 
    NELEMS =0	!  мощность := 0 
    END	! 
    С— 
    FUNCTION .QSTNULtNLP)	'стек пуст в да/нет •== 
    INCLUDE "ST.CLS"	! 
    dSTNUL=(NELEMS.EQ.0)	!  мощность = 0 
    END	! 
    FUNCTION GISTADD(NLP)   !ecTt  св.место!да/нет=— INCLUDE  "ST.CLS"	! 
    Q5TftDD=(NELEMS.LT.MflXIND)      !   мощность<максинд END	! 
    С—— 
    SUBROUTINE БТАГЛНЕ)      'дававить <ВХ!Е> в стек INCLUDE "ST.CLS"	!.дано:  
есть св.  места IF(.NOT.QSTADD(NLP))CALL QTKAZ NELEMS »» NELEMS+1          !.  
 мощность:-мощность+1. CALL VEWRITCNELEMB.E)!.  вектор{мощность)а=Е END        
                            !конец программы 
    S2. РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ НА ФОРТРАНВ ses 
    SUBROUTINE STGET(E)	!взять из стека в <Е> 
    INCLUDE "ST.CLS-	!. 
    XF(QSTNUL(NLP»	!.дано« стек не пуст «          CALL OPTKAZ!.——— 
    CALL STQTDPt El'	!. E i= вершина стека 
    CALL STDEL	!. удалить вершину стека 
    END	'конец программы 
    С D
    SUBROUTINE STQTOP(E) 'вершина стека « Е INCLUDE "ST.CLS"     !. 
    IF(QSTNUL(NLP)>      '.даноI стек не пуст В	CALL OTKAZ!.——— CALL 
VEREAD(NELEMS,Е)!. ответ «=«       . 
    •.     вектор(мощноать) END	'конец программы 
    SUBROUTINE STSTOP(E) 'установить вершину <Е> INCLUDE "ST.CLS"     !. 
    IFCQSTNUL(NLP))      !.дана« стек не пуст ©	CALL DTKA2!.——— CALL 
VEWRIT(NELEMS,E)!. вектор(мощность)I«E END               !конец программы 
    SUBROUTINE STDEL   !удалить вершину стека INCLUDE "ST.CLS"     !. 
IF{QSTNUL(NLP)>     !.даног стек не пуст и	CALL OTKAZ!.——— NELEMS «» NELEMS — 
1  !. мощность s=nauiHocTb-l END                ! конец программы 
    SUBROUTINE STTERM	.'кончить равоту •== 
    INCLUDE  "ST.CLS"	! 
    CALL  VETERM	!  ВЯКТОр.КОНЧИТЬ работу 
    END	! 
    Сконец исполнителя i 
    Вектор 4-мерных комплексных векторов. Выше мы реализовали стек ST 4-мерных 
комплексных векторов на базе вектора VE 4-мерных комплексных векторов. 
    Язык Фортран не содержит встроенных способов конструирования для создания 
таких структур, поэтому реализуем исполни* 1еля VEj 

    364 ГЛ. 5. ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН 

    С файл "VE.CLS" 
    С исполнитель вектор С4-векторов (VE* 
    С 1. начать работу	VEINIT 
    С 2. алемент с индексом <sxsl> I E    VEREftD(I,E» 
    С 3. установить элемент <вх:1> я <Е>  VEWRIT(I,E> 
    С 4. кончить равоту	VETERM 
    С 
    с типы, ОБЪЕКТЫ и овозначвння: 
    с 
    IMPLICIT LOGICAL (Q)	«тип "да/нет" 
    COMPLEX EW	«тип "С4-вектор" 
    БИТА	!константы: 
    @      MAXIND / 100 /	I максинд    « 100 
    S,      NDIM   /  4 /	! размерность =  4 
    COMPLEX   VECTOR	! 
    COMMON /VECOM/	«ОБЪЕКТЫ: 
    6          VECTORC4,100)	' вектор С4-векторов 
    С	! с индексам 1..100 
    Сканег. описаний * ——— 
    Обратите внимание на строку COMPLEX E(4)	!тип "С4-вектор" 

    Поскольку эта строка включена в описатель исполнителя, то далее с помощью 
оператора INCLUDE она будет вставлена во все программы исполнителя. Таким 
образом, если в какой-то программе встретится имя Е, то Фортран, в 
соответствии с явным описанием имени, будет считать объект Е одномерным 
массивом (вектором) из 4-х элементов типа COMPLEX (комплексное число), 
    С файл   "VE.FTN11 1>-————————— 
    SUBROUTINE VEINIT	«начать равату *=з 
    INCLUDE "VE.CLS"	1              ничего не делать 
    END	! 
    SUBROUTINE VEREAD(I,Е)!элемент <BX!l> с  Е INCLUDE "VE.CLS"	!. 
    IF(l.BT.I.QR.I.GT.MAXCND)   !.дано!  1?1<максинд 0	''-                     
 CALL OTKAZ!.——— DO  \   d=l,NDIM                     !. 
    E(J>   ч VECTORCJ,!)    !.   OTBBT  1=» вВКТОрШ CONTINUE	!. END            
                          !конец программы 


    22   РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ НА ФОРТРАНЕ 365 

    Оставшиеся два предписания этого исполнителя реализуйте самостоятельно. 
    Вектор 3-мерных вещественных векторов. Обратите внимание, что, хотя речь 
все время шла о 4-мерных комплексных векторах, реализованный выше исполнитель 
ST на самом деле является универсальным стеком элементов любого типа Е — сами 
элементы хранятся в исполнителе VE и только VE знает, каков тип этих 
элементов. По сути дела, стек просто оперирует с адресами объектов. Поэтому, 
чтобы реализовать, например, стек 3-мерных вещественных векторов, достаточно 
заменить исполнителя VE. 
    Для получения реализации вектора 3-мерных вещественных векторов достаточно 
в реализации исполнителя VE, не меняя текстов программ, заменить разяел «типы, 
объекты и обозначения» на следующий: 
    С типы, овьекты и овозначенияз С 

    IMPLICIT LOGICAL Ш>	!тмп "да/нет" REAL          E(3)                       
   !тип "тачка R3" С                                                           
            !      « 
    DATA	!константы» Q                 MAXIND    / 100 /     !  максинд        
  = 103 е,               NDIM        /      3 i    \ размерность «      3 С    
                                                           ! 
    COMMON /VECOM/	!аБЪекть« a                      VECTOR«3,10S>   !  вектор 
тачек R3 С                                                               !    
с индексом 1..109 С 
    Ограниченный динамический вектор точек плоскости. 
    С файл "DV.CLS" 
    •С исполнитель Ограниченный динамический вектор С	точек плоскости (DV) С 
1. начать равоту                   DVINIT 
    •С 2. сделать вектор пустым	DVNUL 
    С 3. вектор пуст : да/нет	QDVNUL <NLP) 
    С 4. есть свободное место к да/нет   QDVADD <NLPJ 
    С 5. число элементов вектора : Z+    IDVNEL (NLP) 
    С 6. довавить элемент <ех:Е> в конец  DVADD < Е ) 
    С 7. удалить элемент из конца вектора DVDEL 
    С 8. элемент с индексом <exsl> a E    DVREftD(I,E) 


    366 ГЛ. 5. ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН 


    С Л. установить элемент <вх41> в <Е>  DVWRIT(I,E) С 10. кончить равоту	DVTERM 
    С типы» овьёкты и овазначения* С •* 
    IMPLICIT LOGICAL (D)   8тйп "да/нет" REAL EC 2 }	'тип "тачка R2" DATA      
          !константые е       MAXIND /100/    !  наксинд " 100 
    CDMMDN /DVCOM/        'овьвкты! ©         NELEM3      ! 
мощнасть!0.«наксинд @,        V(2,100)    ! вектор точек R2 
    С	i      <1„шмаксинд) 
    с 
    С мнемоника некоторых- Фортранных имен» 
    |С NELEMS»NEL - Number of ELEMentS. -число алиментов 
    С 
    Сканец описаний '—•———————————————————————• 
    С файл "DV.FTN" 
    ?-.,«~.«™-,-~——— — .«.——»—.-и—.-,—,«**»-»•. мм и. Mi   '""*""•'"""""""'**" 
*"ми"?""гл""~*-м"  '~* 
    SUBROUTINE DVINIT	!начать равоту 
    INCLUDE "DV.CLS"	! 
    NELEMS » 0	|     е=м  МОЩНОСТЬ !*" 0 
    END	! 
    SUBROUTINE DVNUL	!сделать вектор пустым 
    INCLUDE "DV.CLS"	! 
    NELEMS •=> 0	i    «==* мощность s=s 0 
    END	! 
    FUNCTION QDVNULCNLP)	'веКтор пуст = да/нет 
    INCLUDE "DV.CLS"	! 
    OUVNUL«(NELEMS,ED.0)	!     ее мощность » 0 
    END	! 
    FUNCTION CIDVADD(NLF>  !епть св.ншсто»да/нет=а INCLUDE "DV.CLS"      ! 
    ODVflDP=(NELEMS.Lt.MAXIND)  ! мощность<максинд ENO	I 
    J2. РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ НА ФОРТРАНЕ 
    Эв7 
    FUNC3TION IDVNEL(NLP)	! число элементов» 7+ 
    INCLUDE "DV.CLS»	! 
    JDVNEL - NELEM3	•    «я мощность 
    END	• 
    SUBROUTINE DVADD(E)	!довавить<вх!Е> а конец 
    INCLUDE "DV.CLS"    .	!^ 
    IFC.NOT.QDVADDthU-P))	!.даноа есть св.место 3         CALL OTKAZ!.——— 
    NELEMS •» NELEMS +1	!. мощность :«*мощносты4 
    V<l,NELEMB>eEU>	!. евктор<мо1чность):=Е 
    V<2S NELEMS) «=E (2)	!. 
    END	• конец программы
    SUBROUTINE DVDEL    !удалить вл-т из конца INCLUDE "DV.CLS»     Г:"" ' 
IFtODVNULtNLP))     !.данов вектор нэ пуст в         CALL OTKAZ!.——— 
    NELEMS => NELEMS ~ 1   !. МОЩНОСТЬ!=МОЩНОСТЬ-1 
    END	!конец программы 
    С— 
    SUBROUTINE DVREADa,Е>!элемент <ex:I> s E INCLUDE "DV.CLS"     ! 
    IFU.ST.I.OR.I.GT.NELEMS) «дано* 1?1<мощносТ1» в	' CALL QTKAZ! ЕШ » V(1,I)  
     !. атвет *=» вектор'1) E(2) «.V(2,I>        !. END               iконец программы 
    SUBROUTINE DVWRITII.E)Остановить <вх:1> в<Е> INCLUDE "DV.CLS11     ! 
    IFa.GT.I.OR.I.GT.NELEMS) !дано5 1<1<мощност!» @	CALL OTKAZ! V(1,I) « Ed)   
    !. ввкторШ «» В -V<2,I) e E(2)        !. END              !каншц програгшы 
    SUBROUTINE DVTERM INCLUDE «DV.CLS» END 
    {кончить равоту •= !    ничего не делать 
    ! 
    С конец исполнителя !« 

    368 л	ГЛ. S. ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН Ссылочная реализация Л1-списка. 
    С файл "L1.CLS" 
    С исполнитель Ограниченный Л1-СПИСОК ТОЧВК R3 (L1) 
    С СП: 
    С 1. начать равоту	'     U1INIT 
    С 2. сделать список пустым	L1NUL 
    С 3. список пуст s да/нет	OL1NUL CNLP» 
    С 4. есть СВОБОДНОЙ место * да/нет   QL1ADD <NLP> 
    С 
    С 5. установить указатель в начало   L1BES 
    С 6. указатель в конце s да/нет     GL1END (NLP) 
    С 7. передвинуть указатель вперед    L1MOVF 
    •с В. ДОБЭЕИТЬ <вх!Е> за указателем   LlAEAPt E > 
    С 9. взять sa указателем s <вых|Е>    1ЛБЕАРС E > 
    С 10. «элемент sa указателен t E      LIQEAPt E.) 
    С 11. установить за указателем в <Е>  LISEAPt E ) 
    ,~С 12. удалить элемент аа указателем   L1DEAP С С - связать 
<вх:11,12:индекс>      L1LINKCI1,X?> 
    •- П ~ захватить места <вых:1:индекс>  L1GETMC X > С - ОСВОБОДИТЬ место 
<вх:1гиндекс>  L1FREMC I > с С 13. кончить равоту	L1TERK 
    С 
    с типы, объекты и обозначения: 
    г* 
    IMPLICIT LOGICAL (d)	'тип "да/нет" 
    DATA	!константы: 
    е       MAX1ND /100/	Ч максинд в 100 
    COMMON /L1COM/	«оеъвктьи 
    'Ё        IBP, IAP	! указ:запись(@до,@ва) .е,       INEXTC 100 > ! @след( 
1..максинд > 
    DATA	!ОБОЗНАЧЕНИЯ: 
    е       NILL1  / 1 /	•  нил списка  «» 1 
    И,      NILFRE / 2 /	• нил св.места "a z 
    с	используемые исполнители! 
    с	VEsвектор (элементов ТИПА Е с индексом 1..максинд 
    С 
    с	мнемоника некоторых Фортранных имен» 
    С	АЕАР      - Add    Element After Pointer 
    С	БЕАР       - Get    Element After Painter 
    С	DEAR      - inQuiire Element After Pointer 
    ю, РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ НА ФОРТРАНЕ 
    С ВЕАР      - Sat   Element After Fainter 
    С DEftP      - Delete Element After Painter 
    С Q	— inQuire 
    С BEG / END - BEGIn / END* 
    С MDVF      - MQVe Forward 
    С БЕТМ / FREM - GET Memory / FREe Memory 
    С IBP / IAP - Index Before/After Painter 
    с 
    Сконец описаний s —————"-————~———»———— 
    с файл "Ll.FTN11 
    SUBROUTINE    L.1INIT	'начать равоту 
    INCLUDE "Ll.CLS"	!. С 
    с дано   t максинд > 2 
    с получитьа траектория "список" = нил списка К         траектория 
"св.место" = С	нил ев*места, 3, 4, ..., наксинд 
    ь 
    CALL VEINIT         !. вектор.начать равоту CALL L1LINK	!. связать G       
 (NILL1,NILL1)!.     (нил сп,ния en) IBP e NILL1         Ч. указатель г= IAP « 
NILL1          !«      (нил СП,НИЛ СП> DO 10 1=NILFRE,MAXIND-1! цикл V I «... 
    CALL L1LINK(I,I+1>  !. . связатьС I, 1+1 > 10  CONTINUE	!. конец цикла 
    CALL L1LINK	!. связать @      (MAXIND,NILFRE)!.     (максинд,НИЛ св> END   
            !конец программы 
    SUBROUTINE L1NUL    I сделать список пустым INCLUDE "Ll.CLS11      !. CALL 
L1BEQ        !. 'встать в начала 1   CONTINUE	!. цикл 
    IF(DL1NUL(NLP))GDTO 11!. .пока список не пуст CALL L1DEAP     :. . удалить «элемент 
    С	!. .     за указателен 
    GOTO 1	!. конец 
    Я  CONTINUE	!. цикла 
    END	Iконец'программы 

    370	ГЛ. 5. ПРОГРАММИРОВАНИЯ  НА   ЯЭЫКВ  ФОРТРАН 
    FUNCTION OLINUUNLP) ! список Пуст 1 да/нет «=" INCLUDE "L1.CLS"     ! 
QL1NUL в INEXTWILHJ!  вслед Снил сп) Ш	.EQ.NILL1I              "НИЛ СП 
    END	! 
    ?*—————...	I • .л_                 -                   I                   
                I   III   II         III'            HI        rrirr-l        
—~_~ ..i. 41  I—•««» 
    FUNCTION QL1ADD(NLP> !есть СВОБОДНОЙ место «в INCLUDE «Ll.CLS»    1 
QL1ADD=« INEXTCNILFRE)! j, 6след(нил ев) Ш         .NE.NILFRE! ^	*нил ев 
    END	! С——————————————————————————————————————. 
    SUBROUTINE L1BE5   {установить указатель INCLUDE "H.CLS"    !.      в 
начало еписка IBP » NILL1  '     !. ук.@да!-ни/1 сп IAP •• INEXT(NILLl)   !. 
ук„Шза!=@след<нмл сп) END	«конец программы 
О—————————————————————————————————————— FUNCTION OLIEND(NLP) !укааатеяь а 
конца «в INCLUDE "H.CLS0    ! QLiEND«tIAP.EQ.NILLl)!  указатель.еза=нил сп 
    END	! 
    0—————————————————————————————————————— 
    SUBROUTINE U1MDVF  !передвинуть указатель INCLUDE "H.CLS"    !.	ВПЕРЕД 
IF<QL1END<NLP)>     I.дана| не в конца 3         CALL OTKflZ!.——— IBP «• IAP   
      !• ук.@дов=ук.аэа IAP » I NEXT (I АР)    !. ук.Шзаа=Шслнд(ук.-@за> END   
           !конец программы С——-——————————————————————————————————— SUBROUTINE 
L1AEAP<E) !доБавит!» <вх:Е> ва ук. INCLUD 
    E "Li.CLS"    !. 
    IF(.NOT.QL1ADD(NLP» !.дана» есть св.место О         CALLOTKAZ!.——— CALL 
LIGETM(I)      !. захватить место <Х> CALL L1LINKUBP,!)   i. свявдть <ук.Одо. 
Х> CALL L1LINKCI.IAP)  !. свявать <1, ук.@ва> IAP • X	!. ук.Эза I» X CALL 
\^)RIT(I,E)    !. вакторП) i« E END              Iконец программы 
    Ритшитч-L   г..__вв1   и  шнмотмммямя м _OPJ.K_ai ^«1VT КШ ГГГ Г'ГШ иг вж 
тт«««П №>••••*• nmi«**i> 


    22,  РЕАЛИЗАЦИЯ ИСПОЛНИТЕЛЕЙ  НА ФОРТРАНЕ	371 


    SUBROUTINE LIGEAP(E) 'взять «элемент за INCLUDE "LI.CLS" !, указателем s 
<вых:Е> IF(QL1END!NLPJ)CALL OTKAZ '.дана: не в конца CALL LlDEAPf E? ). J. 
Е:=ал-т эа указателем CALL L1DEAP !. удалить за указателем END	«конец программы 
    SUBROUTINE L1QEAP(E> !элемент списка за INCLUDE "Li.CLS"     !.       
указателен S E IF(QLlEND(NLP)'i    . '.дана: не в конце е	CALL OTKA2!.——— CALL 
VEREADaAP,E)   !. атвет;=БекторСук,езй> END                I конец пррграммы 
    SUBROUTINE L1SEAP(E> 'установить алемент за INCLUDE "LI.CLS"    1.  
указателем в <ел:Е> IF(QLlENDtNLP))     !,даноз не в конце (§	CALL ОТ№2 !. ——— 
CALL VEWRIT<IAP,E)   !. вектор Сук.бза) t» E EN0                 !конец программы 
    SUBROUTINE L1DEAP	!удалить елемвнт списка 
    '    INCLUDE "L1.CLS"	!.       эа указателем 
    ;     IFCDLIEND(NLP))	'.данаг не в конце 
    V    Е	CALL, OTKAZJ.——— 
    I " IAP	!.!:=» ук.Шза 
    IAP •=• INEXT<I)	!. ук.йза s=« еследа) 
    CALL L1LINKUBP,IAP>	!.СБЯзатьСук.едо,ук.@за> 
    CALL L1FREMC I'>	!. ОСВОБОДИТЬ место(I> 
    END	!конец программы 
    v*  ,	SUBROUTINE: LlLINKdl,I2) 'связать <I1,I2> «==• 
    \ /	INCLUDE "LI.CLS"    ! 
    \/	INEXTC II ) ** 12    !        еследС11):=12 
    4	END.               ! 
    SUBROUTINE LiBETMCIJ !захватить место <еых:I> 
    INCLUDE "Ll.CLS"    !. 
    IF<.NOT.QL1ADD(NLPJ)   !.дано8  есть св.место @	CALLQTKAZ!.——— 
    I в INEXT(NILFRE)         !.   I:^ШслвдСнил СВ> 
    CALL L1LINK	4;     !. связать a         <NILFRE,INEXTCI3H.            <нил СВ,еслед(1)) 
    END	! коней прагршичы 


    372	ГЛ. 5. ПРОГРАММИРОВАНИЕ   НА   ЯЗЫКЕ   ФОРТРАН 

    SUBROUTINE HFREM(I)    'ОСВОБОДИТЬ место <ВИ*1> INCLUDE  "L1.CLS"	I. CALL 
L1LINK                         !.   связать &          <r,INEXT<NILFRE» 1.     
        (I,вслед (ни/1 си) ) CALL  L1LINK<NILFRE,I)!.   связать (ни/1  ев, I) 
END                                            !конец  программы 
    SUBROUTINE L1TERM	!кончить равоту == 
    INCLUDE "DV.CLS"	! 
    CALL VETERM	! вектор. кончит*ь работу 
    END	! 
    J-V_____„,._mui.   _^.___.   ...__il_m_j.mi.-_-m.ii_n-..._________ 1_J 
_.-!--Ill-- .1——	-                 ——      -    '   -        1 "-I      "I     
 "Т     .-.      II -.  -Г    II         I      -__-     Jll     II      Г1-  
-I.---L-..--..-I      -__",-f 
    Сканец исполнителя 
    ! 5=======================—=========» 


    ЗАДАЧИ И УПРАЖНЕНИЯ 

    1. Перекодируйте на Фортран описатели исполнителей «Выпук< лая оболочка», 
«Многоугольник», «Планиметр» гл. 2. 
    '   2. Перекодируйте на Фортран реализацию исполнителя «Выпуклая оболочка». 
    3. Выпишите на Фортране систему предписаний исполнителя «Дек точек 
плоскости» и перекодируйте на Фортран реализацию исполнителя «Многоугольник». 
    4. Перекодируйте  на   Фортран   исполнителя   «Стереометр». 
    5. Считая, что рациональное число х — это вектор из двух целых элементов 
тип (х = т/п), реализуйте на Фортране предписания следующего исполнителя: 
    Соисполнитель    Операции над рациональными числами С     1.   скопировать 
<вх!М1> в <Bbix:N2>    RNMOVE<N1,N2) С    2.   <BX:N1,N2> равны	ада/нет    
QRNEQ     <N1,N2> С     3.   <вх:Ш> меньше <BXskz>sда/нет     QRNLT     
(N1,N2> С     4.   прибавить  <1М1>  К  <BX/Bbix:N2>          RNADD   <N1,N2> 
С    5.   домножить на<М1> <вх/вых!Ы2>         RN 
    MULT(N1,N2) С    6.   сократить <BX/BUXsN2>                          
RNREDIK       N2) С    7.   целая часть <BX!N1>       гцелое       IRNVAL   
(N1) С     8.   приближенное значение^ 1>  :R       RRNVAL   (N1) С 
    С  типы,   ОЕЪОКТЫ и обозначения: С 
    IMPLICIT LOGICAL   (0>    !тип   "да/нет" INTEGER N1(2),   N2(2)    
!овъекты N1,   N2 типа С	!       рациональное число Сканец описаний  I ———-————————————————•————— 
    6. Придумайте систему предписаний и реализуйте на Фортране исполнителя 
«Операции над N-мерными векторами». 

    22. РЕАЛИЗАЦИЯ   ИСПОЛНИТЕЛЕЙ   НА  ФОРТРАНЕ 373 

    7. Перекодируйте на Фортран реализации множества на базе вектора 
(последовательный поиск, бинарный поиск, битовая реализация, хеширование) гл. 3. 
    8. Придумайте систему предписаний и реализуйте на Фортране исполнителя для 
работы с вещественными векторами размером 32000 элементов, из которых не более 
1000 элементов отличны от нуля. Для задания каждого вектора используйте не 
более одного вещественного и одного целочисленного массивов длины 1000. 
Исполнитель должен позволять складывать векторы, умножать вектор на число, 
находить скалярное и векторное произведем:;!! векторов и т. п. 
    9. Придумайте систему предписаний и реализуйте на Фортране исполнителя для 
работы с вещественными матрицами размером 32000*32000 элементов, из которых не 
более 1000 элементов отличны от нуля. Для задания каждой матрицы используйте 
не более одного вещественного и двух целочисленных массивов длины 1000. 
Исполнитель, должен позволять складывать и перемножать матрицы, умножать 
матрицу на число и т. п. 
    10. Придумайте систему предписаний и реализуйте на Фортране 'исполнителя 
для работы с кривой на плоскости, считая, что: 
    а) кривая класса С° и состоит из отрезков; "-      б) кривая класса С1 и 
состоит из дуг окружностей; 
    в) кривая класса С1 и состоит из дуг парабол; 
    ;       г) кривая класса С' и состоит из дуг парабол, дуг окружностей и отрезков. 
    11. Используя исполнителя задачи 10 в качестве базового, со« ставьте на 
Фортране программу, которая уменьшает ломаную, остав* ляя начало кривой: 
    а) до первого пересечения с заданной прямой; 
    б) до первого пересечения с заданным кругом; 
    в) заданной длины. 
    12. Используя исполнителя задачи 10 в качестве базового, со« Ставьте на 
Фортране программу, которая находит: 
    а) длину кривой; 
    б) интеграл от заданной функции вдоль кривой; 
    в) интеграл от заданной 1-формы вдоль кривой; 
    г) число точек пересечения кривой с заданной прямой; 
    д) число точек самопересечения кривой; 
    е) площадь замкнутой кривой без самопересечений; 
    ж) длину части кривой внутри заданного круга; 
    а) длину части кривой внутри заданного прямоугольника; 
    и) расстояние от заданной точки до кривой; 
    к) угол, под которым кривая видна из заданной точки. 
