' Ordinamento di dati -> Matematica e Calcolatore, sch.8, es.5 DECLARE SUB Freccia (i!) DECLARE SUB Viafreccia () DECLARE SUB Freccia1 (i!) DECLARE SUB Freccia2 (i!) DECLARE SUB GRAF (a!(), i!) DECLARE SUB ORDINS (a!(), n!) DECLARE SUB ORDMIN (a!(), n!) DECLARE SUB MIN (a!(), i!, j!, posto!) DECLARE SUB ORDFUS (x!(), i!, j!) DECLARE SUB FUSIONE (x!(), i!, h!, y!(), j!, k!, z!()) PRINT PRINT ">>> Introduci un 'numero di dati' o di 'metodo' negativo per smettere <<<" Via: INPUT "****** Ordinamento per 1: min 2: ins 3: fus (-1: end)"; n.metodo SELECT CASE n.metodo CASE 1 nm$ = "MIN" CASE 2 nm$ = "INS" CASE 3 nm$ = "FIS" CASE IS < 0 END CASE ELSE GOTO Via END SELECT modo: PRINT nm$; : INPUT " --> Dati 1: a caso 2: crescenti 3: decrescenti; 4: Demo (-1: end)"; n.modo SELECT CASE n.modo CASE 1 INPUT "intero negativo che caratterizza la sequenza di numeri 'casuali'"; seq ' vedi i "dettagli" dell'help di RND e la successiva riga 37 del programma CASE 2, 3 CASE IS < 0 GOTO Via CASE 4 PRINT : PRINT "Premi man mano 'A Capo' per avanzare nella esecuzione": INPUT "", xxxxxx n = 24: GOTO Dati1 CASE ELSE GOTO modo END SELECT Dati: INPUT ; "n. dati (o -1)"; n: IF n < 0 THEN PRINT : GOTO modo IF n = 0 THEN LOCATE , 1: GOTO Dati Dati1: DIM x(n) SELECT CASE n.modo CASE 2 FOR i% = 1 TO n: x(i%) = i%: NEXT CASE 3 FOR i% = 1 TO n: x(n + 1 - i%) = i%: NEXT CASE 1 x(1) = RND(seq) ' per ogni n parto sempre con la stessa sequenza di valori scelta all'inizio FOR i% = 2 TO n: x(i%) = RND: NEXT CASE 4 FOR i = 1 TO n: x(i) = INT(RND * n) + 1 FOR j = 1 TO i - 1: IF x(i) = x(j) THEN j = i: i = i - 1 NEXT NEXT END SELECT IF n.modo = 4 THEN CLS : FOR i = 1 TO n: GRAF x(), i: NEXT t1 = TIMER SELECT CASE n.metodo CASE 1 ORDMIN x(), n CASE 2 ORDINS x(), n CASE 3 i = 1: ORDFUS x(), i, n END SELECT t2 = TIMER IF n.modo <> 4 THEN PRINT TAB(23); FIX((t2 - t1) * 100); "(sec/100)" ELSE LOCATE 25, 1 INPUT ; " stampo i dati"; risp LOCATE , 1: PRINT SPACE$(79); : LOCATE , 1 IF risp = 1 THEN FOR i = 1 TO n: PRINT x(i); : NEXT: PRINT ERASE x: GOTO Dati SUB Freccia (i) LOCATE i, 77: PRINT "<-"; END SUB SUB Freccia1 (i) LOCATE i, 77: PRINT "\/"; END SUB SUB Freccia2 (i) LOCATE i, 77: PRINT "/\"; END SUB SUB FUSIONE (x(), i, h, y(), j, k, z()) ' fusione di x(i)-x(h) e y(j)-y(k) in z(0),z(1), ... n% = 0: s% = i: t% = j WHILE s% <= h AND t% <= k IF x(s%) < y(t%) THEN z(n%) = x(s%): s% = s% + 1 ELSE z(n%) = y(t%): t% = t% + 1 n% = n% + 1 WEND FOR p% = s% TO h: z(n%) = x(p%): n% = n% + 1: NEXT FOR p% = t% TO k: z(n%) = y(p%): n% = n% + 1: NEXT END SUB SUB GRAF (a(), i) COLOR (a(i) MOD 15) + 1 LOCATE i, 1: PRINT STRING$(a(i), CHR$(96 + a(i))); SPACE$(75 - a(i)); COLOR 7 END SUB SUB MIN (a(), i, j, posto) STATIC ' a(posto)=min{a(i),...a(j)} posto = i FOR h = i + 1 TO j: IF a(h) < a(posto) THEN posto = h NEXT h END SUB SUB ORDFUS (x(), i, j) : SHARED n.modo, n IF i = j THEN EXIT SUB m = (i + j) \ 2: ORDFUS x(), i, m: ORDFUS x(), m + 1, j DIM y(j - i) FUSIONE x(), i, m, x(), m + 1, j, y() FOR n% = i TO j: x(n%) = y(n% - i): NEXT IF n.modo = 4 THEN CALL Viafreccia: Freccia1 i: Freccia2 j: : INPUT ; "", wwww$: FOR ii = i TO j: GRAF x(), ii: NEXT ERASE y END SUB SUB ORDINS (a(), n) 'Dopo aver ordinato {a(1),.., a(i)} ottengo un ordinamento di {a(1),.., a(i+1)} 'INSERENDO a(i+1) al posto giusto: faccio retrocedere a(i+1) finch‚ incontro 'elementi > di esso (l'avanzamento Š realizzato attraverso 'scambi' di 'posto). Il primo insieme ordinato Š {a(1)}. SHARED n.modo FOR i = 2 TO n ' inserisco a(2), poi inserisco a(3), . , a(n) FOR j = i TO 2 STEP -1 ' eventuale avanzamento di a(i) IF a(j) >= a(j - 1) THEN j = 2 ELSE SWAP a(j), a(j - 1): IF n.modo = 4 THEN : Viafreccia: Freccia j: Freccia j - 1: INPUT "", wwww$: GRAF a(), j: GRAF a(), j - 1 ' quando non c'erano piu' scambi da fare, per uscire dal loop ho posto j%=2 NEXT NEXT END SUB SUB ORDMIN (a(), n) ' ordina a(1),...,a(n) SHARED n.modo FOR i = 1 TO n MIN a(), i, n, posto SWAP a(i), a(posto) IF n.modo = 4 THEN : Freccia i: Freccia posto: INPUT ; "", wwww$: Viafreccia: GRAF a(), i: GRAF a(), posto NEXT END SUB SUB Viafreccia FOR i = 1 TO 24: LOCATE i, 77: PRINT " "; : NEXT END SUB