1 REM Ins{nd av Johan Olofsson <5809> 1987-09-02 04.09.18 (DUMP) 10 ! +-------------------------------+ 11 ! ! ! 12 ! ! S o r t F i l e ! 13 ! ! ! 14 ! ! Program f|r sortering av ! 15 ! ! rader i ASCII-ordning. ! 16 ! ! ! 17 ! ! Programmet f|ruts{tter ! 18 ! ! att inputfilen {r en text- ! 19 ! ! fil och kan l{sas med INPUT ! 20 ! ! LINE, men filen kan i |vrigt ! 21 ! ! vid initiering av DOSet. ! 22 ! ! se ut hur som helst. ! 23 ! ! ! 24 ! ! Programmet f}r kopieras fritt ! 25 ! ! [VEN i kommersiellt syfte ! ! 26 ! ! ! 27 ! +-------------------------------+ 28 ! * 29 ! * Date / VerRev / Sign / Note 30 ! * -------- ------ ---- ---- 31 ! * 87-09-02 / 1.00 / LogIn/ SortFile / 40 ! * 100 INTEGER : EXTEND 110 DIM Rad$=162 120 Slen=3 ! L{ngd p} del av str{ngen som sorteras i taget 121 ! Litet v{rde ==> m}nga rader kan sorteras 130 T=-1 : F=0 ! True / False 140 ! ----------------------------------------------------------------------- 150 INPUT 'Fil att sortera str{ngar i:'Infil$ 160 OPEN Infil$ AS FILE 1 170 INPUT 'Output: 'Utfil$ 180 PREPARE Utfil$ AS FILE 2 190 WHILE -1 200 INPUT LINE #1 Rad$ 210 Rad$=LEFT$(Rad$,LEN(Rad$)-2) : IF Rad$='' GOTO 200 220 ; Rad$ 230 INPUT 'Sorterar fr}n och med position: 'Startpos; 240 ; CHR$(13) TAB(Startpos) '>' TAB(79) 250 ; Rad$ 260 INPUT 'Sorterar till och med position: 'Slutpos; 270 ! H|gst tre tecken efter slutpos kan p}verka den sorterade ordningen 280 IF Slutpos<=Startpos THEN Slutpos=160 290 ; CHR$(13) TAB(Startpos) '>'; 300 IF Slutpos<=80 THEN ; TAB(Slutpos) '<'; 310 ; TAB(80) 320 INPUT 'O K ? 'Z$ : IF (95 AND ASCII(Z$))<>ASCII('J') WEND 330 INPUT 'Ska f|r korta rader skrivas p} '+Utfil$+' ?'Z$ 340 Dump=(95 AND ASCII(Z$))=ASCII('J') 350 ! ----------------------------------------------------------------------- 360 ON ERROR GOTO 420 370 POSIT #1,0 : Antal=0 380 WHILE -1 390 INPUT LINE #1,Rad$ 400 IF LEN(Rad$)-2>Startpos THEN Antal=Antal+1 410 WEND 420 ! 430 ; Antal+1 ' rader att sortera' 440 DIM Adr.(Antal),Str$(Antal)=Slen,N(Antal) 450 ! ----------------------------------------------------------------------- 460 ON ERROR GOTO 580 470 POSIT #1,0 480 FOR Line=0 TO Antal 490 WHILE -1 500 Adr.(Line)=POSIT(1) 510 INPUT LINE #1,Rad$ ! : Rad$=LEFT$(Rad$,LEN(Rad$)-2) 520 WHILE LEN(Rad$)-2Str$(N(Line)) THEN Klara=0 1160 NEXT Line 1170 IF Klara ; CHR$(13); ELSE ; 1180 IF NOT Klara THEN Z=FNSort(Start,Stop) 1190 Adam=Start 1200 WHILE Adam1 1270 Z=FNBearb(Adam,Bertil-1,Pos+3) 1280 IF 0 WEND 1290 Adam=Bertil 1300 WEND 1310 IF 0 WEND 1320 RETURN 0 1330 FNEND 1499 ! 1500 DEF FNDiff$(S1$,S2$) LOCAL Startval,Slutval 1510 ! b}da str{ngarna skall vara lika l}nga ! 1520 FOR H=1 TO LEN(S1$) 1530 IF ASCII(RIGHT$(S1$,H))=ASCII(RIGHT$(S2$,H)) THEN NEXT H : RETURN S1$ 1531 Startval=ASCII(RIGHT$(S1$,H)) 1532 Slutval=ASCII(RIGHT$(S2$,H)) 1540 RETURN LEFT$(S1$,H-1)+CHR$((Startval+Slutval)/2) 1550 FNEND 1599 ! 1600 DEF FNByt(K1,L1) 1605 Z=N(K1) : N(K1)=N(L1) : N(L1)=Z ! byter nycklar ! 1640 RETURN F 1650 FNEND 1699 ! 2000 DEF FNSort(Start,Slut) LOCAL Gr{ns,Bytt,K,L 2003 WHILE Slut>Start 2005 ; CHR$(13) 'Sort:',Start,Slut; 2010 ! IF FNCheck(Start,Slut)=Slut THEN RETURN 0 2011 ! {ter mer tid som tj{nas! 2012 ! om det inte {r f{rdigsorterat i stora avsnitt! 2050 Diff$=FNDiff$(FNB$(Start),FNB$(Slut)) 2060 K=Start : L=Slut 2065 WHILE K=Diff$+'' 2110 L=L-1 2120 IF KFNB$(L) THEN Z=FNByt(K,L) ELSE K=K+1 2140 WEND 2141 Gr{ns=K 2151 IF Start