home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V+}
- {$M 65520,10590,10590}
-
- { Juergen Linz , Herzogstandstr. 32 }
- { 8500 Nuernberg 50 , Tel. 0911 / 84314 }
- { 03/89 - 05/89 }
-
- PROGRAM ALKAN_NOMENKLATUR;
-
- USES CRT;
-
- TYPE
- zchkett1 = STRING[60];
- zchkett2 = STRING[255];
- zeiger = ^c_kette;
- c_kette = RECORD
- posit,laenge,niveau,anso,anlibr,anrebr,
- sumpos,revpos,sumanca,komplex : INTEGER;
- anca : zchkett1;
- atome : zchkett2;
- vater,sohn,libr,rebr : zeiger;
- END;
- c_atom = RECORD
- bind : INTEGER;
- in_kette : zeiger;
- END;
-
- VAR
- x,y,ax,ay,dx,dy,nx,ny,sx,sy,
- stelle,wertig,namlen : INTEGER;
- alt_anca : zchkett1;
- alkan_name : zchkett2;
- ketten_name : ARRAY[0 .. 70] OF STRING[15];
- prfix1,prfix2 : ARRAY[2 .. 20] OF STRING[15];
- akt_atom : ARRAY [0 .. 40,0 .. 9] OF c_atom;
- akt_kette,alte_kette,
- wurzel,heapstart : zeiger;
-
- PROCEDURE namen_ermitteln(ptr : zeiger);
-
- VAR
- posstr : STRING[2];
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- STR(ptr^.posit,posstr) ; alkan_name := alkan_name + posstr + '-';
- IF ((ptr^.niveau>0) AND (ptr^.sohn<>NIL))
- THEN alkan_name := alkan_name + '(';
- namen_ermitteln(ptr^.sohn);
- IF (COPY(alkan_name,LENGTH(alkan_name),1)=')')
- THEN alkan_name := alkan_name + '-';
- alkan_name := alkan_name + ketten_name[ptr^.laenge] + 'YL';
- IF ((ptr^.niveau>0) AND (ptr^.sohn<>NIL))
- THEN alkan_name := alkan_name + ')';
- IF (ptr^.rebr<>NIL) THEN alkan_name := alkan_name + '-';
- namen_ermitteln(ptr^.rebr);
- END;
- END;
-
- PROCEDURE namteil_finden(VAR name : zchkett2;
- VAR an,en,ver : INTEGER; proc : INTEGER); FORWARD;
-
- PROCEDURE alphsort(VAR name : zchkett2 ; procnr : INTEGER);
-
- VAR
- an1,en1,ver1,an2,en2,ver2 : INTEGER;
- hstr1,hstr2,hstr3,hstr4 : zchkett2;
-
- BEGIN
- an1 := 1 ; en1 := 0 ; ver1 := 0;
- namteil_finden(name,an1,en1,ver1,procnr);
- hstr1 := COPY(name,1,en1-an1+1);
- name := COPY(name,en1+1,LENGTH(name)-en1);
- WHILE ((POS('L',name)<>0) AND (POS('L',name)<>LENGTH(name))) DO
- BEGIN
- an1 := 1;en1 := 0;ver1 := 0;an2 := 1;en2 := 0;ver2 := 0;
- namteil_finden(name,an1,en1,ver1,procnr);
- WHILE (an2<LENGTH(hstr1)) DO
- BEGIN
- namteil_finden(hstr1,an2,en2,ver2,0);
- hstr2 := COPY(name,an1,en1-an1+1) ; hstr3 := hstr2;
- IF (COPY(hstr3,LENGTH(hstr3)-1,1)=')')
- THEN hstr3 := COPY(hstr3,1,LENGTH(hstr3)-2) + ']-';
- IF (COPY(hstr2,LENGTH(hstr2),1)<>'-') THEN
- BEGIN
- hstr2 := hstr2 + '-' ; hstr3 := hstr3 + '-';
- END;
- hstr4 := COPY(hstr1,ver2,en2-ver2+1);
- IF (COPY(hstr4,LENGTH(hstr4)-1,1)=')')
- THEN hstr4 := COPY(hstr4,1,LENGTH(hstr4)-2) + ']-';
- IF (COPY(hstr3,ver1-an1+1,LENGTH(hstr3)-ver1+an1) < hstr4)
- THEN
- BEGIN
- hstr1 := COPY(hstr1,1,an2-1) + hstr2
- + COPY(hstr1,an2,LENGTH(hstr1)-an2+1);
- name := COPY(name,en1+1,LENGTH(name)-en1);
- an2 := LENGTH(hstr1);
- END
- ELSE
- BEGIN
- an2 := en2 + 1;
- IF (an2>LENGTH(hstr1)) THEN
- BEGIN
- hstr1 := hstr1 + COPY(name,an1,en1-an1+1);
- name := COPY(name,en1+1,LENGTH(name)-en1);
- an2 := LENGTH(hstr1);
- END;
- END;
- en2 := 0 ; ver2 := 0;
- END;
- END;
- IF (COPY(hstr1,LENGTH(hstr1),1)='-')
- THEN hstr2 := COPY(hstr1,1,LENGTH(hstr1)-1) ELSE hstr2 := hstr1;
- IF (COPY(hstr2,LENGTH(hstr2),1)=')') THEN
- BEGIN
- hstr2 := hstr2 + '-' ; en1 := en1 + 1;
- END;
- name := hstr2 + name;
- END;
-
- PROCEDURE namen_verkuerzen(VAR name : zchkett2 ; procnr : INTEGER);
-
- VAR
- an1,en1,ver1,an2,en2,ver2,anzahl,shift : INTEGER;
- hstr : zchkett2;
-
- BEGIN
- an1 := 1 ; en1 := 0 ; ver1 := 0;
- WHILE ((POS('L',name)<>0) AND (an1<LENGTH(name))) DO
- BEGIN
- anzahl := 1 ; namteil_finden(name,an1,en1,ver1,procnr);
- an2 := en1 + 1 ; en2 := 0 ; ver2 := 0 ; shift := 0;
- WHILE (an2<LENGTH(name)) DO
- BEGIN
- namteil_finden(name,an2,en2,ver2,procnr);
- IF (ver2<an2) THEN ver2 := an2;
- hstr := COPY(name,ver2,en2-ver2+1);
- IF ((en2<>LENGTH(name))AND(COPY(hstr,LENGTH(hstr),1)<>'-'))
- THEN hstr := hstr + '-';
- IF (COPY(name,ver1,en1-ver1+1) = hstr) THEN
- BEGIN
- anzahl := anzahl + 1;
- name := COPY(name,1,an1 - 1)
- + COPY(name,an1,ver1-an1-1) + ','
- + COPY(name,an2,ver2-an2-1)
- + COPY(name,ver1-1,en1-ver1+2)
- + COPY(name,en1+1,an2-en1-1)
- + COPY(name,en2+1,LENGTH(name)-en2+1);
- ver1 := ver1 + ver2 - an2 ; en1 := en1 + ver2 - an2;
- an2 := en1 + 1;
- END
- ELSE an2 := en2 + 1;
- END;
- IF (anzahl>1) THEN
- IF (POS('(',COPY(name,an1,en1-an1+1))<>0) THEN
- BEGIN
- name := COPY(name,1,an1-1) + COPY(name,an1,ver1-an1-1)
- + '-' + prfix2[anzahl] + '-'
- + COPY(name,ver1,LENGTH(name)-ver1+2);
- shift := LENGTH(prfix2[anzahl]) + 1;
- END
- ELSE
- BEGIN
- name := COPY(name,1,an1-1) + COPY(name,an1,ver1-an1-1)
- + '-' + prfix1[anzahl]
- + COPY(name,ver1,LENGTH(name)-ver1+2);
- shift := LENGTH(prfix1[anzahl]);
- END;
- an1 := en1 + 1 + shift ; en1 := 0 ; ver1 := 0;
- END;
- IF (COPY(hstr,LENGTH(hstr),1)='-')
- THEN hstr := ''
- ELSE IF (COPY(name,LENGTH(name)-LENGTH(hstr)-1,1)=')')
- THEN name := COPY(name,1,LENGTH(name)-LENGTH(hstr)) + hstr
- ELSE IF (COPY(name,LENGTH(name)-LENGTH(hstr),1)='-')
- THEN name := COPY(name,1,LENGTH(name)-LENGTH(hstr)-1)+hstr;
- END;
-
- PROCEDURE namteil_finden;
-
- VAR
- kl_auf,kl_zu,start,n : INTEGER;
- hstr : zchkett2;
- flag : BOOLEAN;
-
- BEGIN
- kl_auf := 0 ; kl_zu := 0 ; start := 0 ; flag := FALSE ; en := an;
- WHILE ((flag=FALSE) AND (en<LENGTH(name))) DO
- BEGIN
- en := en + 1;
- IF (COPY(name,en,1)='(') THEN
- BEGIN
- kl_auf := kl_auf + 1 ; IF (kl_auf=1) THEN start := en;
- END;
- IF (COPY(name,en,1)=')') THEN kl_zu := kl_zu + 1;
- IF ((proc<>0) AND (kl_auf<>0) AND (kl_auf=kl_zu)) THEN
- BEGIN
- hstr := COPY(name,start+1,en-start-1);
- CASE proc OF
- 1 : BEGIN
- alphsort(hstr,proc);
- name := COPY(name,an,start-an+1) + hstr
- + COPY(name,en,LENGTH(name)-en+start);
- IF (COPY(name,en,1)='L') THEN en := en + 1;
- IF (COPY(name,en,1)='-') THEN en := en - 1;
- END;
- 2 : BEGIN
- namen_verkuerzen(hstr,proc);
- name := COPY(name,1,start) + hstr
- + COPY(name,en,LENGTH(name)-en+start);
- en := start + LENGTH(hstr) + 1;
- END;
- END;
- END;
- IF (((COPY(name,en,1)=')') OR
- (COPY(name,en,1)='L')) AND (kl_auf=kl_zu)) THEN flag := TRUE;
- END;
- IF (COPY(name,en+1,1)='-') THEN en := en + 1;
- n := en - 3;
- WHILE (n>an) DO
- BEGIN
- IF ((kl_auf=0) AND (COPY(name,n,1)='-')) THEN
- BEGIN
- ver := n + 1 ; n := an;
- END
- ELSE IF ((kl_auf<>0) AND
- ((COPY(name,n,1)='L') OR (COPY(name,n,1)='-'))) THEN
- BEGIN
- ver := n + 1 ; n := an;
- END;
- n := n - 1;
- END;
- IF ((proc=2) AND (POS('(',COPY(name,an,en-an+1))<>0))
- THEN ver := start;
- END;
-
- PROCEDURE alkan_benennen;
-
- BEGIN
- alkan_name := '' ; namen_ermitteln(wurzel);
- alkan_name := COPY(alkan_name,3,LENGTH(alkan_name)-4) + 'AN';
- namlen := LENGTH(alkan_name);
- alphsort(alkan_name,1) ; namen_verkuerzen(alkan_name,2);
- GOTOXY(1,21) ; CLREOL ; GOTOXY(1,22) ; CLREOL;
- GOTOXY(1,23) ; CLREOL ; GOTOXY(1,24) ; CLREOL;
- GOTOXY(1,21) ; WRITE(alkan_name) ; GOTOXY(x+1,y+1);
- END;
-
- PROCEDURE neue_kette_initialisieren;
-
- BEGIN
- WITH akt_kette^ DO
- BEGIN
- posit := 0 ; laenge := 0 ; niveau := 0 ; anso := 0;
- anlibr := 0 ; anrebr := 0 ; sumpos := 0 ; revpos := 0;
- anca := '' ; sumanca := 0 ; komplex := 0 ; atome := '';
- vater := NIL ; sohn := NIL ; libr := NIL ; rebr := NIL;
- END;
- END;
-
- PROCEDURE initialisieren;
-
- CONST
- zahlwort : ARRAY[0 .. 9] OF STRING[5] = ('','HEN','DO','TRI',
- 'TETRA','PENTA','HEXA','HEPTA','OCTA','NONA');
-
- VAR
- m,n : INTEGER;
- strich : STRING[80];
-
- BEGIN
- CLRSCR ; ketten_name[0] := '';
- ketten_name[10] := 'DEC' ; ketten_name[20] := 'COS';
- ketten_name[30] := 'TRIACONT' ; ketten_name[40] := 'TETRACONT';
- ketten_name[50] := 'PENTACONT' ; ketten_name[60] := 'HEXACONT';
- FOR m := 0 TO 6 DO
- FOR n := 0 TO 9 DO
- ketten_name[m*10+n] := zahlwort[n] + ketten_name[m*10];
- ketten_name[1] := 'METH' ; ketten_name[2] := 'ETH';
- ketten_name[3] := 'PROP' ; ketten_name[4] := 'BUT';
- FOR n := 5 TO 9 DO
- ketten_name[n]:=COPY(ketten_name[n],1,LENGTH(ketten_name[n])-1);
- ketten_name[20] := 'EICOS' ; ketten_name[21] := 'HENEICOS';
- ketten_name[11] := 'UNDEC';
- FOR n := 2 TO 20 DO
- IF (n<10) THEN
- BEGIN
- prfix1[n] := zahlwort[n];
- prfix2[n] := prfix1[n] + 'KIS';
- END
- ELSE
- BEGIN
- prfix1[n] := ketten_name[n] + 'A';
- prfix2[n] := COPY(ketten_name[n],1,
- LENGTH(ketten_name[n])-1) + 'KAKIS';
- END;
- prfix1[2] := 'DI' ; prfix2[2] := 'BIS' ; prfix2[3] := 'TRIS';
- strich := '' ; FOR n := 1 TO 80 DO strich := strich + '-';
- FOR x := 0 TO 40 DO
- FOR y := 0 TO 9 DO
- akt_atom[x,y].bind := 0 ; akt_atom[x,y].in_kette := NIL;
- MARK(heapstart) ; NEW(wurzel);
- akt_kette := wurzel ; alte_kette := akt_kette;
- neue_kette_initialisieren;
- akt_kette^.laenge := 1 ; akt_kette^.atome :='0008';
- akt_atom[0,4].in_kette := akt_kette;
- x := 0 ; y := 8 ; dx := 1 ; dy := 0 ; sx := 0 ; sy := 4 ; wertig := 0;
- GOTOXY(1,20) ; WRITELN(strich) ; GOTOXY(x+1,y+1) ; WRITE('C');
- alkan_benennen;
- END;
-
- PROCEDURE wertigkeit(ax,ay : INTEGER);
-
- VAR
- bit,richtung : INTEGER;
-
- BEGIN
- dx := 0 ; dy := 0 ; richtung := 0;
- FOR bit := 0 TO 3 DO
- IF (((akt_atom[ax,ay].bind) AND (1 SHL bit))<>0) THEN
- BEGIN
- wertig := wertig + 1 ; richtung := bit;
- END;
- CASE richtung OF
- 0 : dx := -1;
- 1 : dy := 1;
- 2 : dx := 1;
- 3 : dy := -1;
- END;
- END;
-
- PROCEDURE hauptkette_umdrehen;
-
- VAR
- pos,hilfe : INTEGER;
- hstr : zchkett2;
- zgr1,zgr2,zgr3 : zeiger;
-
- BEGIN
- IF (wurzel^.anso>0) THEN
- BEGIN
- zgr1 := wurzel^.sohn;
- REPEAT
- zgr1^.posit := wurzel^.laenge - zgr1^.posit + 1;
- zgr2 := zgr1^.rebr ; zgr1^.rebr := zgr1^.libr;
- zgr1^.libr := zgr2 ; hilfe := zgr1^.anrebr;
- zgr1^.anrebr := zgr1^.anlibr ; zgr1^.anlibr := hilfe;
- IF (zgr2 = NIL) THEN zgr3 := zgr1;
- zgr1 := zgr2;
- UNTIL (zgr1 = NIL);
- wurzel^.sohn := zgr3 ; hilfe := wurzel^.sumpos;
- wurzel^.sumpos := wurzel^.revpos ; wurzel^.revpos := hilfe;
- pos := LENGTH(wurzel^.atome) - 3 ; hstr := '';
- WHILE (pos>0) DO
- BEGIN
- hstr := hstr + COPY(wurzel^.atome,pos,4) ; pos := pos - 4;
- END;
- wurzel^.atome := hstr;
- END;
- END;
-
- PROCEDURE sumpos_gleich_revpos;
-
- VAR
- sumpos1,revpos1,sumpos2,revpos2 : INTEGER;
- zgr1,zgr2 : zeiger;
-
- BEGIN
- IF (wurzel^.anso>1) THEN
- BEGIN
- sumpos1 := 0 ; sumpos2 := 0 ; revpos1 := 0 ; revpos2 := 0;
- zgr2 := wurzel^.sohn ; zgr1 := zgr2^.rebr;
- WHILE (zgr1<>NIL) DO
- BEGIN
- IF ((ketten_name[zgr1^.laenge] < ketten_name[zgr2^.laenge])
- OR ((ketten_name[zgr1^.laenge] = ketten_name[zgr2^.laenge])
- AND (zgr1^.komplex<zgr2^.komplex))) THEN zgr2 := zgr1;
- zgr1 := zgr1^.rebr;
- END;
- zgr1 := wurzel^.sohn;
- WHILE (zgr1<>NIL) DO
- BEGIN
- IF (ketten_name[zgr1^.laenge] = ketten_name[zgr2^.laenge])
- THEN IF (zgr1^.komplex = zgr2^.komplex)
- THEN BEGIN
- sumpos1 := sumpos1 + zgr1^.posit;
- revpos1 := revpos1 + wurzel^.laenge
- - zgr1^.posit + 1;
- END
- ELSE
- BEGIN
- sumpos2 := sumpos2 + zgr1^.posit;
- revpos2 := revpos2 + wurzel^.laenge
- - zgr1^.posit + 1;
- END;
- zgr1 := zgr1^.rebr;
- END;
- IF (revpos1<sumpos1) THEN hauptkette_umdrehen;
- IF (revpos1=sumpos1)
- THEN IF (revpos2<sumpos2) THEN hauptkette_umdrehen;
- END;
- END;
-
- PROCEDURE anca_str_neu(VAR neu_anca : zchkett1;lang1,lang2 : INTEGER);
-
- VAR
- pos,h0,h1,h2 : INTEGER;
- l1,l2 : STRING[3];
-
- BEGIN
- STR(lang1,l1) ; STR(lang2,l2);
- WHILE (LENGTH(l1)<3) DO l1 := '0' + l1;
- WHILE (LENGTH(l2)<3) DO l2 := '0' + l2 ; IF (l2='000') THEN l2 := '';
- pos := 1 ; VAL(l1,h2,h0) ; VAL(COPY(neu_anca,pos,3),h1,h0);
- WHILE ((h2<>h1) AND (pos<LENGTH(neu_anca))) DO
- BEGIN
- pos := pos + 3 ; VAL(COPY(neu_anca,pos,3),h1,h0);
- END;
- neu_anca := COPY(neu_anca,1,pos-1)
- + COPY(neu_anca,pos+3,LENGTH(neu_anca)-pos-2);
- pos := 1 ; VAL(l2,h2,h0) ; VAL(COPY(neu_anca,pos,3),h1,h0);
- WHILE ((h2>h1) AND (pos<LENGTH(neu_anca))) DO
- BEGIN
- pos := pos + 3 ; VAL(COPY(neu_anca,pos,3),h1,h0);
- END;
- neu_anca := COPY(neu_anca,1,pos-1) + l2
- + COPY(neu_anca,pos,LENGTH(neu_anca)-pos+1);
- END;
-
- PROCEDURE ketten_vergleich(VAR vater,sohn : zeiger);
-
- VAR
- pos_vater,pos_sohn,lang_vater,lang_sohn,niv_vater,niv_sohn,
- anso_vater,anso_sohn,anlibr_vater,anlibr_sohn,
- anrebr_vater,anrebr_sohn,sumpos_vater,sumpos_sohn,
- revpos_vater,revpos_sohn,sumanca_vater,sumanca_sohn,
- komplex_vater,komplex_sohn,pos,hilfe : INTEGER;
- anca_vater,anca_sohn : zchkett1;
- atome_vater,atome_sohn,atom_neu : zchkett2;
- atom1,atom2 : STRING[4];
- flag,flag1,flag2 : BOOLEAN;
- zgr1,zgr2,zgr3 : zeiger;
-
- PROCEDURE neue_kettendaten_berechnen;
-
- PROCEDURE komplex_vater_errechnen(ptr : zeiger);
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- komplex_vater_errechnen(ptr^.sohn);
- komplex_vater := komplex_vater + (ptr^.niveau + 1) * ptr^.laenge;
- komplex_vater_errechnen(ptr^.rebr);
- END;
- END;
-
- PROCEDURE komplex_sohn_errechnen(ptr : zeiger);
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- komplex_sohn_errechnen(ptr^.sohn);
- komplex_sohn := komplex_sohn + (ptr^.niveau - 1) * ptr^.laenge;
- komplex_sohn_errechnen(ptr^.rebr);
- END;
- END;
-
- BEGIN
- pos_vater := sohn^.posit ; pos_sohn := vater^.posit;
- lang_vater := vater^.laenge - sohn^.posit;
- niv_vater := sohn^.niveau ; niv_sohn := vater^.niveau;
- anso_vater := vater^.anso - sohn^.anlibr - 1;
- anlibr_vater := sohn^.anlibr;anlibr_sohn := vater^.anlibr;
- anrebr_vater := sohn^.anso ; anrebr_sohn := vater^.anrebr;
- atom_neu := COPY(vater^.atome,1,sohn^.posit*4);
- atome_vater := COPY(vater^.atome,sohn^.posit*4+1,
- LENGTH(vater^.atome)-sohn^.posit*4);
- atome_sohn := atom_neu + sohn^.atome;
- sumpos_vater := vater^.sumpos - sohn^.posit;
- revpos_vater := vater^.revpos - (vater^.laenge - sohn^.posit + 1);
- sumpos_sohn := sohn^.anso * sohn^.posit + sohn^.sumpos + pos_vater;
- revpos_sohn := sohn^.revpos + lang_sohn - pos_vater + 1;
- alt_anca := vater^.anca;
- anca_str_neu(alt_anca,sohn^.sumanca+sohn^.laenge,0);
- anca_vater := alt_anca ; anca_sohn := sohn^.anca;
- sumanca_vater := vater^.sumanca - (sohn^.sumanca + sohn^.laenge);
- sumanca_sohn := sohn^.sumanca;
- komplex_vater := 0 ; komplex_sohn := 0;
- zgr1 := sohn ; sohn := sohn^.libr;
- WHILE (sohn<>NIL) DO
- BEGIN
- sumpos_vater := sumpos_vater - sohn^.posit;
- sumpos_sohn := sumpos_sohn + sohn^.posit;
- revpos_vater := revpos_vater - (vater^.laenge-sohn^.posit+1);
- revpos_sohn := revpos_sohn + lang_sohn - sohn^.posit+1;
- alt_anca := anca_vater;
- anca_str_neu(alt_anca,sohn^.sumanca+sohn^.laenge,0);
- anca_vater := alt_anca;
- alt_anca := anca_sohn;
- anca_str_neu(alt_anca,0,sohn^.sumanca+sohn^.laenge);
- anca_sohn := alt_anca;
- sumanca_vater := sumanca_vater - (sohn^.sumanca + sohn^.laenge);
- sumanca_sohn := sumanca_sohn + sohn^.sumanca + sohn^.laenge;
- komplex_sohn := komplex_sohn + sohn^.komplex
- + sohn^.laenge * sohn^.niveau;
- sohn := sohn^.libr;
- END;
- sohn := zgr1 ; zgr1 := sohn^.rebr;
- atom1 := COPY(zgr1^.vater^.atome,4*(zgr1^.posit-1)+1,4);
- atom2 := COPY(sohn^.vater^.atome,4*(sohn^.posit-1)+1,4);
- IF ((zgr1<>NIL) AND (atom1 = atom2)) THEN
- BEGIN
- anso_vater := anso_vater - 1 ; anrebr_vater := anrebr_vater + 1;
- sumpos_vater := sumpos_vater - zgr1^.posit;
- sumpos_sohn := sumpos_sohn + zgr1^.posit;
- revpos_vater := revpos_vater-(vater^.laenge-zgr1^.posit+1);
- revpos_sohn := revpos_sohn + lang_sohn - zgr1^.posit + 1;
- alt_anca := anca_vater;
- anca_str_neu(alt_anca,zgr1^.sumanca+zgr1^.laenge,0);
- anca_vater := alt_anca;
- alt_anca := anca_sohn;
- anca_str_neu(alt_anca,0,zgr1^.sumanca+zgr1^.laenge);
- anca_sohn := alt_anca;
- sumanca_vater := sumanca_vater-(zgr1^.sumanca+zgr1^.laenge);
- sumanca_sohn := sumanca_sohn + zgr1^.sumanca + zgr1^.laenge;
- komplex_sohn := komplex_sohn + zgr1^.komplex
- + zgr1^.laenge * zgr1^.niveau;
- END;
- alt_anca := anca_sohn;
- anca_str_neu(alt_anca,0,sumanca_vater+lang_vater);
- anca_sohn := alt_anca;
- sumanca_sohn := sumanca_sohn + sumanca_vater + lang_vater;
- sumpos_vater := sumpos_vater - (anso_vater * pos_vater);
- zgr3 := sohn^.rebr;
- IF (atom1 = atom2) THEN zgr3 := zgr3^.rebr;
- komplex_vater_errechnen(zgr3) ; komplex_sohn_errechnen(sohn^.sohn);
- komplex_sohn := komplex_sohn + komplex_vater + niv_vater * lang_vater;
- END;
-
- PROCEDURE neuen_baum_generieren;
-
- VAR
- xkoor,ykoor,h : INTEGER;
- zgr : zeiger;
-
- PROCEDURE niv_pos_anpassen(ptr : zeiger);
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- niv_pos_anpassen(ptr^.sohn);
- ptr^.niveau := ptr^.niveau + 1;
- IF (ptr^.niveau <= niv_vater + 1) THEN
- BEGIN
- ptr^.anlibr := anso_vater - (vater^.anso-ptr^.anlibr);
- ptr^.posit := ptr^.posit - pos_vater;
- END;
- niv_pos_anpassen(ptr^.rebr);
- END;
- END;
-
- PROCEDURE niv_anpassen(ptr : zeiger);
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- niv_anpassen(ptr^.sohn);
- ptr^.niveau := ptr^.niveau - 1;
- niv_anpassen(ptr^.rebr);
- END;
- END;
-
- PROCEDURE komplex_neu_berechnen(ptr : zeiger);
-
- BEGIN
- IF (ptr<>NIL) THEN
- BEGIN
- ptr^.komplex := 0;
- komplex_neu_berechnen(ptr^.sohn);
- IF (ptr^.vater<>NIL)
- THEN ptr^.vater^.komplex := ptr^.vater^.komplex + ptr^.komplex
- + (ptr^.niveau * ptr^.laenge);
- komplex_neu_berechnen(ptr^.rebr);
- END;
- END;
-
- BEGIN
- niv_pos_anpassen(zgr3) ; niv_anpassen(sohn^.sohn);
- zgr := sohn ; sohn := sohn^.sohn;
- WHILE (sohn<>NIL) DO
- BEGIN
- sohn^.posit := zgr^.posit + sohn^.posit;
- sohn^.anlibr := anso_sohn - sohn^.anrebr - 1;
- sohn := sohn^.rebr;
- END;
- sohn := zgr^.libr;
- WHILE (sohn<>NIL) DO
- BEGIN
- sohn^.vater := zgr;
- sohn^.anrebr := anso_sohn - sohn^.anlibr - 1;
- sohn := sohn^.libr;
- END;
- sohn := zgr ; pos := 1;
- WHILE (pos<LENGTH(atom_neu)) DO
- BEGIN
- val(COPY(atom_neu,pos,2),xkoor,h);
- val(COPY(atom_neu,pos+2,2),ykoor,h);
- akt_atom[TRUNC(xkoor/2),TRUNC(ykoor/2)].in_kette := sohn;
- pos := pos + 4;
- END;
- WITH sohn^ DO
- BEGIN
- posit := pos_sohn ; laenge := lang_sohn;
- niveau := niv_sohn ; anso := anso_sohn;
- anlibr := anlibr_sohn ;anrebr := anrebr_sohn;
- sumpos := sumpos_sohn ; revpos := revpos_sohn;
- anca := anca_sohn ; atome := atome_sohn;
- sumanca := sumanca_sohn ; komplex := komplex_sohn;
- END;
- WITH vater^ DO
- BEGIN
- posit := pos_vater ; laenge := lang_vater;
- niveau := niv_vater ; anso := anso_vater;
- anlibr := anlibr_vater ; anrebr := anrebr_vater;
- sumpos := sumpos_vater ; revpos := revpos_vater;
- anca := anca_vater ; atome := atome_vater;
- sumanca := sumanca_vater ; komplex := komplex_vater;
- END;
- zgr := vater^.libr ; vater^.libr := sohn^.libr;
- IF (sohn^.libr<>NIL) THEN sohn^.libr^.rebr := vater;
- sohn^.libr := zgr;
- IF (zgr<>NIL) THEN zgr^.rebr := sohn
- ELSE IF (vater^.vater<>NIL)
- THEN vater^.vater^.sohn := sohn ELSE wurzel := sohn;
- zgr := vater^.rebr;
- IF ((sohn^.rebr<>NIL) AND (atom1 = atom2)) THEN
- BEGIN
- vater^.rebr := sohn^.rebr ; sohn^.rebr^.libr := vater;
- zgr2 := sohn^.rebr^.rebr ; sohn^.rebr^.rebr := sohn^.sohn;
- IF (sohn^.sohn<>NIL) THEN sohn^.sohn^.libr := sohn^.rebr;
- sohn^.rebr^.vater := sohn;
- END
- ELSE
- BEGIN
- zgr2 := sohn^.rebr ; vater^.rebr := sohn^.sohn;
- IF (sohn^.sohn<>NIL) THEN sohn^.sohn^.libr := vater;
- END;
- sohn^.rebr := zgr;
- IF (zgr<>NIL) THEN zgr^.libr := sohn;
- zgr := vater^.sohn ; vater^.sohn := zgr2;
- IF (zgr2<>NIL) THEN zgr2^.libr := NIL;
- IF (sohn<>zgr) THEN sohn^.sohn := zgr ELSE sohn^.sohn := vater;
- zgr2 := vater ; zgr := vater^.vater;
- vater^.vater := sohn ; sohn^.vater := zgr;
- komplex_neu_berechnen(wurzel);
- END;
-
- BEGIN
- flag1 := FALSE ; flag2 := FALSE;
- lang_sohn := sohn^.posit + sohn^.laenge;
- IF (lang_sohn>vater^.laenge) THEN flag1 := TRUE;
- IF (lang_sohn=vater^.laenge) THEN flag2 := TRUE;
- IF ((flag1=TRUE) OR (flag2=TRUE)) THEN
- BEGIN
- anso_sohn := sohn^.anlibr + sohn^.anso + 1;
- IF ((sohn^.rebr<>NIL) AND (atom1 = atom2))
- THEN anso_sohn := anso_sohn + 1;
- END;
- IF ((flag1<>TRUE) AND (flag2=TRUE)) THEN
- BEGIN
- flag2 := FALSE;
- IF (anso_sohn>vater^.anso) THEN flag1 := TRUE;
- IF (anso_sohn=vater^.anso) THEN flag2 := TRUE;
- END;
- IF ((flag1=TRUE) OR (flag2=TRUE)) THEN neue_kettendaten_berechnen;
- IF ((flag1<>TRUE) AND (flag2=TRUE)) THEN
- BEGIN
- flag2 := FALSE ; flag := FALSE;
- IF (vater^.revpos<vater^.sumpos) THEN
- BEGIN
- flag := TRUE;
- hilfe := vater^.revpos ; vater^.revpos := vater^.sumpos;
- vater^.sumpos := hilfe ; hilfe := revpos_sohn;
- revpos_sohn := sumpos_sohn ; sumpos_sohn := hilfe;
- END;
- IF (sumpos_sohn<vater^.sumpos) THEN flag1 := TRUE;
- IF ((niv_sohn = 0) AND (revpos_sohn<vater^.sumpos))
- THEN flag1 := TRUE;
- IF (sumpos_sohn=vater^.sumpos) THEN flag2 := TRUE;
- IF ((niv_sohn = 0) AND (revpos_sohn=vater^.sumpos))
- THEN flag2 := TRUE;
- IF (flag = TRUE) THEN
- BEGIN
- hilfe := vater^.revpos ; vater^.revpos := vater^.sumpos;
- vater^.sumpos := hilfe ; hilfe := revpos_sohn;
- revpos_sohn := sumpos_sohn ; sumpos_sohn := hilfe;
- END;
- END;
- IF ((flag1<>TRUE) AND (flag2=TRUE)) THEN
- BEGIN
- flag2 := FALSE;
- IF (sumanca_sohn>vater^.sumanca) THEN flag1 := TRUE;
- IF (sumanca_sohn=vater^.sumanca) THEN flag2 := TRUE;
- END;
- IF ((flag1<>TRUE) AND (flag2=TRUE)) THEN
- BEGIN
- flag2 := FALSE;
- IF (anca_sohn=vater^.anca) THEN flag2 := TRUE
- ELSE
- BEGIN
- pos := 1;
- WHILE ((flag1<>TRUE) AND (COPY(anca_sohn,pos,3) >=
- COPY(vater^.anca,pos,3))AND(pos<LENGTH(anca_sohn))) DO
- BEGIN
- IF (COPY(anca_sohn,pos,3) > COPY(vater^.anca,pos,3))
- THEN flag1 := TRUE;
- pos := pos + 3;
- END;
- END;
- END;
- IF ((flag1<>TRUE) AND (flag2=TRUE)) THEN
- BEGIN
- flag2 := FALSE;
- IF (komplex_sohn<vater^.komplex) THEN flag1 := TRUE;
- END;
- IF (flag1=TRUE) THEN
- BEGIN
- flag1 := FALSE ; neuen_baum_generieren ; sohn := zgr2;
- END;
- END;
-
- PROCEDURE sohn_loeschen(VAR sohn : zeiger);
-
- BEGIN
- IF (sohn^.libr<>NIL) THEN sohn^.libr^.rebr := sohn^.rebr
- ELSE sohn^.vater^.sohn := sohn^.rebr;
- IF (sohn^.rebr<>NIL) THEN sohn^.rebr^.libr := sohn^.libr;
- alte_kette := sohn ; sohn := sohn^.libr;
- WHILE (sohn<>NIL) DO
- BEGIN
- sohn^.anrebr := sohn^.anrebr - 1 ; sohn := sohn^.libr;
- END;
- sohn := alte_kette^.rebr;
- WHILE (sohn<>NIL) DO
- BEGIN
- sohn^.anlibr := sohn^.anlibr - 1 ; sohn := sohn^.rebr;
- END;
- sohn := alte_kette ; sohn := sohn^.vater;
- sohn^.anso := sohn^.anso - 1;
- sohn^.sumpos := sohn^.sumpos - alte_kette^.posit;
- sohn^.revpos := sohn^.revpos - sohn^.laenge + alte_kette^.posit-1;
- sohn := alte_kette ; alte_kette := sohn^.vater;
- DISPOSE(sohn) ; sohn := alte_kette;
- END;
-
- PROCEDURE vergleich_mit_soehnen;
-
- VAR
- zgr1,zgr2 : zeiger;
-
- BEGIN
- zgr1 := akt_kette ; akt_kette := akt_kette^.sohn;
- WHILE ((akt_kette<>NIL) AND (akt_kette^.rebr<>NIL))
- DO akt_kette := akt_kette^.rebr;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- zgr2 := akt_kette^.libr;
- ketten_vergleich(akt_kette^.vater,akt_kette);
- IF (akt_kette^.laenge = 0) THEN
- BEGIN
- sohn_loeschen(akt_kette) ; zgr1 := akt_kette;
- END;
- akt_kette := zgr2;
- END;
- akt_kette := zgr1;
- END;
-
- PROCEDURE baum_bindung_loeschen;
-
- VAR
- h0,h1,h2,h3 : INTEGER;
-
- BEGIN
- akt_kette^.laenge := akt_kette^.laenge - 1;
- VAL(COPY(akt_kette^.atome,1,2),h1,h0);
- VAL(COPY(akt_kette^.atome,3,2),h2,h0);
- IF ((2*ax=h1) AND (2*ay=h2)) THEN
- BEGIN
- akt_kette^.atome :=
- COPY(akt_kette^.atome,5,LENGTH(akt_kette^.atome)-4);
- alte_kette := akt_kette ; akt_kette := akt_kette^.sohn;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- akt_kette^.posit := akt_kette^.posit - 1;
- alte_kette^.sumpos := alte_kette^.sumpos - 1;
- akt_kette := akt_kette^.rebr;
- END;
- akt_kette := alte_kette;
- END
- ELSE
- BEGIN
- akt_kette^.atome :=
- COPY(akt_kette^.atome,1,LENGTH(akt_kette^.atome)-4);
- alte_kette := akt_kette ; akt_kette := akt_kette^.sohn;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- alte_kette^.revpos := alte_kette^.revpos - 1;
- akt_kette := akt_kette^.rebr;
- END;
- akt_kette := alte_kette;
- END;
- alte_kette := akt_kette;
- WHILE (akt_kette^.vater <> NIL) DO
- BEGIN
- h3 := akt_kette^.laenge + akt_kette^.sumanca;
- alt_anca := akt_kette^.vater^.anca;
- anca_str_neu(alt_anca,h3 + 1,h3);
- akt_kette^.vater^.anca := alt_anca;
- akt_kette^.vater^.sumanca := akt_kette^.vater^.sumanca - 1;
- akt_kette^.vater^.komplex := akt_kette^.vater^.komplex
- - alte_kette^.niveau;
- akt_kette := akt_kette^.vater;
- END;
- akt_kette := alte_kette;
- IF (akt_kette^.laenge = 0) THEN sohn_loeschen(akt_kette);
- IF (wurzel^.revpos<wurzel^.sumpos) THEN hauptkette_umdrehen;
- IF (wurzel^.revpos=wurzel^.sumpos) THEN sumpos_gleich_revpos;
- vergleich_mit_soehnen;
- IF ((akt_kette<>NIL) AND (akt_kette^.niveau=0)) THEN
- BEGIN
- hauptkette_umdrehen ; vergleich_mit_soehnen;
- END;
- IF (wurzel^.revpos<=wurzel^.sumpos) THEN hauptkette_umdrehen;
- IF (wurzel^.revpos=wurzel^.sumpos) THEN sumpos_gleich_revpos;
- END;
-
- PROCEDURE array_bindung_loeschen;
-
- BEGIN
- ax := TRUNC(x/2) ; ay := TRUNC(y/2);
- IF ((x/2=ax) AND (y/2=ay)) THEN
- BEGIN
- wertig := 0 ; wertigkeit(ax,ay);
- IF (wertig=1) THEN
- BEGIN
- nx := TRUNC((x+2*dx)/2) ; ny := TRUNC((y+2*dy)/2);
- akt_atom[ax,ay].bind := 0;akt_atom[ax,ay].in_kette := NIL;
- akt_atom[nx,ny].bind := ((akt_atom[nx,ny].bind) AND
- (NOT(1 SHL (ABS((1-dx)+2*dy)))));
- IF (akt_atom[nx,ny].bind = 0) THEN
- BEGIN
- sx := nx ; sy := ny;
- END;
- baum_bindung_loeschen ; GOTOXY(x+1,y+1) ; WRITE(' ');
- x := x + dx ; y := y + dy ; GOTOXY(x+1,y+1) ; WRITE(' ');
- END;
- END;
- END;
-
- PROCEDURE baum_bindung_setzen;
-
- VAR
- h0,h1,h2,h3 : INTEGER;
- xstr,ystr : STRING[2];
- zgr1,zgr2 : zeiger;
-
- PROCEDURE position_festellen;
-
- VAR
- xstr,ystr : STRING[2];
-
- BEGIN
- stelle := 1 ; STR(2*ax,xstr) ; STR(2*ay,ystr);
- IF (LENGTH(xstr)<2) THEN xstr := '0' + xstr;
- IF (LENGTH(ystr)<2) THEN ystr := '0' + ystr;
- WHILE ((xstr+ystr)<>COPY(akt_kette^.atome,stelle,4))
- DO stelle := stelle + 4;
- stelle := (stelle-1) DIV 4 + 1;
- END;
-
- PROCEDURE sohn_einfuegen;
-
- BEGIN
- position_festellen;
- IF (akt_kette^.sohn=NIL) THEN
- BEGIN
- alte_kette := akt_kette ; NEW(akt_kette);
- neue_kette_initialisieren;
- alte_kette^.sohn := akt_kette ; akt_kette^.vater := alte_kette;
- akt_kette^.niveau := alte_kette^.niveau + 1;
- END
- ELSE
- BEGIN
- akt_kette := akt_kette^.sohn ; alte_kette := akt_kette;
- WHILE ((akt_kette<>NIL) AND (alte_kette^.posit<stelle)) DO
- BEGIN
- alte_kette := akt_kette ; akt_kette := akt_kette^.rebr;
- END;
- NEW(akt_kette);
- neue_kette_initialisieren;
- IF (alte_kette^.posit>=stelle) THEN
- BEGIN
- IF (alte_kette^.libr<>NIL) THEN
- BEGIN
- alte_kette^.libr^.rebr := akt_kette;
- akt_kette^.anrebr := alte_kette^.libr^.anrebr;
- END
- ELSE
- BEGIN
- alte_kette^.vater^.sohn := akt_kette;
- akt_kette^.anrebr := alte_kette^.vater^.anso;
- END;
- akt_kette^.rebr := alte_kette;
- akt_kette^.libr := alte_kette^.libr;
- alte_kette^.libr := akt_kette;
- akt_kette^.vater := alte_kette^.vater;
- akt_kette^.anlibr := akt_kette^.vater^.anso
- - akt_kette^.anrebr;
- alte_kette := akt_kette ; akt_kette := akt_kette^.libr;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- akt_kette^.anrebr := akt_kette^.anrebr + 1;
- akt_kette := akt_kette^.libr;
- END;
- akt_kette := alte_kette^.rebr;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- akt_kette^.anlibr := akt_kette^.anlibr + 1;
- akt_kette := akt_kette^.rebr;
- END;
- akt_kette := alte_kette;
- END
- ELSE
- BEGIN
- akt_kette^.libr := alte_kette ; akt_kette^.rebr := NIL;
- alte_kette^.rebr := akt_kette;
- akt_kette^.vater := alte_kette^.vater;
- akt_kette^.anlibr := akt_kette^.vater^.anso;
- akt_kette^.anrebr := 0 ; alte_kette := akt_kette;
- akt_kette := akt_kette^.libr;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- akt_kette^.anrebr := akt_kette^.anrebr + 1;
- akt_kette := akt_kette^.libr;
- END;
- akt_kette := alte_kette;
- END;
- akt_kette^.niveau := akt_kette^.vater^.niveau + 1;
- END;
- END;
-
- BEGIN
- IF (wertig>1) THEN
- BEGIN
- sohn_einfuegen;
- akt_kette^.posit := stelle ; alte_kette := akt_kette;
- akt_kette := akt_kette^.vater;
- akt_kette^.anso := akt_kette^.anso + 1;
- akt_kette^.sumpos := akt_kette^.sumpos + alte_kette^.posit;
- akt_kette^.revpos := akt_kette^.revpos + akt_kette^.laenge
- - alte_kette^.posit + 1;
- akt_kette := alte_kette;
- END;
- akt_kette^.laenge := akt_kette^.laenge + 1;
- akt_atom[nx,ny].in_kette := akt_kette ; STR(x,xstr) ; STR(y,ystr);
- IF (LENGTH(xstr)<2) THEN xstr := '0' + xstr;
- IF (LENGTH(ystr)<2) THEN ystr := '0' + ystr;
- VAL(COPY(akt_kette^.atome,1,2),h1,h0);
- VAL(COPY(akt_kette^.atome,3,2),h2,h0);
- IF ((2*ax=h1)AND(2*ay=h2)AND(wertig<>0)AND(akt_kette^.niveau=0)) THEN
- BEGIN
- akt_kette^.atome := xstr + ystr + akt_kette^.atome;
- alte_kette := akt_kette ; akt_kette := akt_kette^.sohn;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- akt_kette^.posit := akt_kette^.posit + 1;
- alte_kette^.sumpos := alte_kette^.sumpos + 1;
- akt_kette := akt_kette^.rebr;
- END;
- akt_kette := alte_kette;
- END
- ELSE
- BEGIN
- akt_kette^.atome := akt_kette^.atome + xstr + ystr;
- alte_kette := akt_kette ; akt_kette := akt_kette^.sohn;
- WHILE (akt_kette<>NIL) DO
- BEGIN
- alte_kette^.revpos := alte_kette^.revpos + 1;
- akt_kette := akt_kette^.rebr;
- END;
- akt_kette := alte_kette;
- END;
- IF (wurzel^.revpos<=wurzel^.sumpos) THEN hauptkette_umdrehen;
- IF (wurzel^.revpos=wurzel^.sumpos) THEN sumpos_gleich_revpos;
- alte_kette := akt_kette;
- WHILE (akt_kette^.vater <> NIL) DO
- BEGIN
- h3 := akt_kette^.laenge + akt_kette^.sumanca;
- alt_anca := akt_kette^.vater^.anca;
- anca_str_neu(alt_anca,h3 - 1,h3);
- akt_kette^.vater^.anca := alt_anca;
- akt_kette^.vater^.sumanca := akt_kette^.vater^.sumanca + 1;
- akt_kette^.vater^.komplex := akt_kette^.vater^.komplex
- + alte_kette^.niveau;
- akt_kette := akt_kette^.vater;
- END;
- akt_kette := alte_kette ; zgr1 := akt_kette;
- WHILE (akt_kette^.vater<>NIL) DO
- BEGIN
- zgr2 := akt_kette^.vater;
- ketten_vergleich(akt_kette^.vater,akt_kette);
- IF (akt_kette^.vater^.niveau=0) THEN
- BEGIN
- hauptkette_umdrehen;
- ketten_vergleich(akt_kette^.vater,akt_kette);
- IF (wurzel^.revpos<=wurzel^.sumpos)THEN hauptkette_umdrehen;
- IF (wurzel^.revpos=wurzel^.sumpos)THEN sumpos_gleich_revpos;
- END;
- IF (zgr2<>akt_kette^.vater) THEN
- BEGIN
- akt_kette := zgr2 ; vergleich_mit_soehnen;
- END;
- akt_kette := akt_kette^.vater;
- END;
- akt_kette := zgr1;
- END;
-
- PROCEDURE array_bindung_setzen;
-
- VAR
- hx,hy : INTEGER;
- flag : BOOLEAN;
-
- PROCEDURE bindung_erlaubt;
-
- VAR
- h1,h2 : INTEGER;
-
- BEGIN
- flag := FALSE ; h1 := 0 ; h2 := 0 ; alte_kette := akt_kette;
- WHILE (akt_kette^.vater<>NIL) DO
- BEGIN
- h1 := h1 + akt_kette^.posit;
- IF (akt_kette^.vater^.vater=NIL)
- THEN h2 := h2 + akt_kette^.vater^.laenge - akt_kette^.posit+1
- ELSE h2 := h2 + akt_kette^.posit;
- akt_kette := akt_kette^.vater;
- END;
- akt_kette := alte_kette;
- IF (akt_kette^.vater<>NIL) THEN
- BEGIN
- h1 := h1 + akt_kette^.laenge ; h2 := h2 + akt_kette^.laenge;
- END
- ELSE h1 := akt_kette^.laenge;
- IF ((h1<63) AND (h2<63))
- THEN flag := TRUE
- ELSE IF (wertig>1) THEN flag := TRUE;
- IF ((wertig>1) AND (akt_kette^.anso>19)) THEN flag := FALSE;
- IF ((wertig=1) AND (namlen - LENGTH(ketten_name[akt_kette^.laenge])
- + LENGTH(ketten_name[akt_kette^.laenge+1])>255))
- THEN flag := FALSE;
- IF ((wertig>1) AND (namlen + 10 > 255)) THEN flag := FALSE;
- END;
-
- BEGIN
- ax := TRUNC((x - dx)/2) ; ay := TRUNC((y - dy)/2);
- hx := dx ; hy := dy ; wertig := 0 ; wertigkeit(ax,ay);
- dx := hx ; dy := hy ; bindung_erlaubt;
- IF (flag = TRUE)
- THEN IF (((x-dx)/2=ax) AND ((y-dy)/2=ay)) THEN
- BEGIN
- nx := TRUNC((x + dx)/2) ; ny := TRUNC((y + dy)/2);
- IF (((akt_atom[ax,ay].bind<>0) AND (akt_atom[nx,ny].bind=0))
- OR ((akt_atom[ax,ay].bind=0) AND ((ax=sx) AND (ay=sy))))THEN
- BEGIN
- akt_atom[ax,ay].bind := ((akt_atom[ax,ay].bind) OR
- (1 SHL (ABS((1+dx)-2*dy))));
- akt_atom[nx,ny].bind := ((akt_atom[nx,ny].bind) OR
- (1 SHL (ABS((1-dx)+2*dy))));
- IF (dx<>0) THEN WRITE('-') ELSE WRITE(':');
- x := x + dx ; y := y + dy ; GOTOXY(x+1,y+1);WRITE('C');
- baum_bindung_setzen;
- END;
- END;
- END;
-
- PROCEDURE alkan_eingabe;
-
- VAR
- h : INTEGER;
- ch : CHAR;
-
- PROCEDURE highlight_aktkette(farbe1,farbe2 : INTEGER);
-
- VAR
- x_neu,x_alt,y_neu,y_alt,dx,dy,pos,h : INTEGER;
-
- BEGIN
- TEXTBACKGROUND(farbe1) ; TEXTCOLOR(farbe2);
- dx := 0 ; dy := 0 ; pos := 1 ; h := 0;
- VAL(COPY(akt_kette^.atome,pos,2),x_neu,h);
- VAL(COPY(akt_kette^.atome,pos+2,2),y_neu,h);
- WHILE (pos<LENGTH(akt_kette^.atome)) DO
- BEGIN
- x_alt := x_neu ; y_alt := y_neu;
- VAL(COPY(akt_kette^.atome,pos,2),x_neu,h);
- VAL(COPY(akt_kette^.atome,pos+2,2),y_neu,h);
- GOTOXY(x_neu+1,y_neu+1) ; WRITE('C');
- dx := (x_neu - x_alt) DIV 2 ; dy := (y_neu - y_alt) DIV 2;
- GOTOXY(x_alt + dx + 1,y_alt + dy + 1);
- IF (NOT((dx=0) AND (dy=0)))
- THEN IF (dx=0) THEN WRITE(':') ELSE WRITE('-');
- pos := pos + 4;
- END;
- TEXTBACKGROUND(0) ; TEXTCOLOR(15);
- GOTOXY(x+1,y+1);
- END;
-
- BEGIN
- REPEAT
- IF (NOT((x+dx<0) OR (x+dx>78))) THEN x := x + dx;
- IF (NOT((y+dy<0) OR (y+dy>18))) THEN y := y + dy;
- GOTOXY(x+1,y+1);
- IF (akt_atom[TRUNC(x/2),TRUNC(y/2)].bind<>0) THEN
- BEGIN
- alte_kette := akt_kette;
- IF (akt_kette<>akt_atom[TRUNC(x/2),TRUNC(y/2)].in_kette)
- THEN highlight_aktkette(0,15);
- akt_kette := akt_atom[TRUNC(x/2),TRUNC(y/2)].in_kette;
- END;
- highlight_aktkette(15,0);
- ch := READKEY;
- CASE ch OF
- '2',#080 : BEGIN
- dx := 0 ; dy := 1;
- END;
- '4',#075 : BEGIN
- dx := -1 ; dy := 0;
- END;
- '6',#077 : BEGIN
- dx := 1 ; dy := 0;
- END;
- '8',#072 : BEGIN
- dx := 0 ; dy := -1;
- END;
- '5','+' : BEGIN
- highlight_aktkette(0,15);
- array_bindung_setzen;
- alkan_benennen;
- END;
- '0','-' : BEGIN
- highlight_aktkette(0,15);
- array_bindung_loeschen;
- alkan_benennen;
- END;
- #115 : BEGIN
- VAL(COPY(akt_kette^.atome,1,2),x,h);
- VAL(COPY(akt_kette^.atome,3,2),y,h);
- END;
- #116 : BEGIN
- VAL(COPY(akt_kette^.atome,
- LENGTH(akt_kette^.atome)-3,2),x,h);
- VAL(COPY(akt_kette^.atome,
- LENGTH(akt_kette^.atome)-1,2),y,h);
- END;
- 'L','l' : BEGIN
- RELEASE(heapstart);
- initialisieren;
- END;
- ELSE BEGIN
- dx := 0 ; dy := 0;
- END;
- END;
- UNTIL ch=#27;
- END;
-
- PROCEDURE titelbild;
-
- BEGIN
- CLRSCR ; TEXTBACKGROUND(15) ; TEXTCOLOR(0);
- GOTOXY(24,3);WRITELN(' N O M E N K L A T U R ');
- GOTOXY(38,5);WRITELN(' von ');
- GOTOXY(30,7);WRITELN(' A L K A N E N ');
- GOTOXY(32,9);WRITELN(' nach IUPAC-Norm ');
- TEXTBACKGROUND(0) ; TEXTCOLOR(15);
- GOTOXY(30,13);WRITELN(' C C ');
- GOTOXY(30,14);WRITELN(' : : ');
- GOTOXY(30,15);WRITELN(' C C C C ');
- GOTOXY(30,16);WRITELN(' : : : : ');
- GOTOXY(30,17);WRITELN('C-C-C-C-C-C-C-C-C-C-C');
- GOTOXY(30,18);WRITELN(' : : : ');
- GOTOXY(30,19);WRITELN(' C C C-C ');
- GOTOXY(30,20);WRITELN(' : ');
- GOTOXY(30,21);WRITELN(' C ');
- GOTOXY(31,24);WRITE('(c) 1989 Jürgen Linz');
- DELAY(5000);
- END;
-
- PROCEDURE bedienungsanleitung;
-
- VAR
- ch : CHAR;
-
- BEGIN
- CLRSCR ; TEXTBACKGROUND(15) ; TEXTCOLOR(0);
- GOTOXY(20,1);WRITELN(' Nomenklatur von Alkanen nach IUPAC-Norm ');
- TEXTBACKGROUND(0) ; TEXTCOLOR(15) ; WRITELN;
- WRITE('Das Programm ermittelt zu jedem von Ihnen eingegebenen Alkan');
- WRITELN(' (gesättigter');
- WRITE('Kohlenwasserstoff) den nach der IUPAC-Norm zugehörigen');
- WRITELN(' chemischen Namen.'); WRITELN;
- WRITE('Es erwartet die Eingabe eines beliebigen Alkans als Gerüst-');
- WRITELN('Struktur-Formel') ; WRITELN('(ohne Wasserstoffatome).');
- GOTOXY(1,9);WRITE('Für die Eingabe benutzen Sie bitte');
- WRITELN(' Ziffernblock und/oder Pfeiltasten :');
- GOTOXY(5,11);WRITELN('<8> / <',chr(24),'> : Cursor nach oben');
- GOTOXY(5,12);WRITELN('<2> / <',chr(25),'> : Cursor nach unten');
- GOTOXY(45,11);WRITELN('<4> / <',chr(27),'> : Cursor nach links');
- GOTOXY(45,12);WRITELN('<6> / <',chr(26),'> : Cursor nach rechts');
- GOTOXY(5,13);WRITELN('<CTRL><',chr(27),'> : Cursor Kettenanfang');
- GOTOXY(45,13);WRITELN('<CTRL><',chr(26),'> : Cursor Kettenende');
- GOTOXY(5,15);WRITELN('<5> / <+> : Atom anfügen');
- GOTOXY(45,15);WRITELN('<0> / <-> : Atom löschen');
- GOTOXY(5,17);WRITELN('<L> / <l> : Molekül löschen');
- GOTOXY(45,17);WRITELN('<ESC> : Ende der Eingabe');
- GOTOXY(1,19);WRITE('Bindungen werden immer in Richtung der letzten');
- WRITELN(' Cursorbewegung gesetzt.');
- WRITE('Es können nur Endatome gelöscht werden, wobei der Cursor');
- WRITELN(' direkt auf dem') ; WRITELN('Atom stehen muß.');
- WRITE('Das erste Atom ist vorgegeben,das letzte kann nicht gelöscht');
- WRITELN(' werden.');
- WRITE('<SHIFT><PRNT> bringt das Alkanmolekül mitsamt Namen zu');
- WRITELN(' Papier.');
- GOTOXY(30,25);WRITE('Weiter mit <RETURN>');
- REPEAT
- ch := readkey;
- UNTIL ch = #13;
- END;
-
- BEGIN
- titelbild;
- bedienungsanleitung;
- initialisieren;
- alkan_eingabe;
- CLRSCR;
- END.