ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come...
-
Upload
guido-pavone -
Category
Documents
-
view
224 -
download
1
Transcript of ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come...
![Page 1: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/1.jpg)
![Page 2: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/2.jpg)
ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI
1 2 3 . . . . . . 100Indice
ARRAY
In Pascal si può usare come sub-range un qualunque ordinal type
Un ordinal type, cioè un tipo per il quale è noto il successore e il predecessore di ogni valore escluso il primo e l’ultimo.
![Page 3: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/3.jpg)
ProblemaContare il numero di volte che ciascuna lettera dell’alfabeto
compare in un preassegnato testo e calcolare la percentuale della ricorrenza di ciascuna lettera rispetto al totale.
Sia C:\TP\ESEMPI\TESTO.TXT il file di testo da analizzare.
OutputIntroduci il Nome del file: C:\TP\ESEMPI\TESTO.TXT
Lettera Occorrenze PercentualeA 32 15B 18 11-----------------Z 2 1
![Page 4: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/4.jpg)
a b c . . . . . . zIndice
ContaLettere
TYPE ArrayContatore = ARRAY[‘a’..’z’] OF integer;VAR ContaLettere: ArrayContatore;
N.B. Il programma deve contare sia le lettere minuscole che lemaiuscole. Poiché di solito le minuscole sono più frequenti abbiamo definito il sub-range in termini di minuscole mentreopereremo la conversione maiuscola-minuscola nel caso cheappaiano lettere maiuscole.
![Page 5: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/5.jpg)
Pseudo-codice
LeggiNomeFile(UnFile)reset(UnFile)AzzeraContatori(ContaLettere)ContaOccorrenze(UnFile,ContaLettere)close(UnFile)MostraOccorrenze(NomeFile,ContaLettere)
Cerchiamo solo i caratteri IN[‘a’..’z’] o IN[‘A’..’Z’] quindise leggiamo eoln, non appartenendo esso ai sub-range indicatinon viene preso in esame, per cui non è necessario il controllosull’eoln. E’ invece obbligatorio il controllo sull’eof.
![Page 6: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/6.jpg)
ContaOccorrenze(UnFile,ContaLettere)
Pseudo-codice
WHILE NOT eof(UnFile) DO read(UnFile,Carattere) IF Carattere è una lettera THEN
aggiungi 1 all’elemento corrispondente in ContaLettere
![Page 7: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/7.jpg)
PROGRAM ContaLeLettere(input,output, UnFile);{conta e mostra le occorrenze di tutte le lettere presenti in un file testo}
CONSTLunMass=30;
TYPEArrayContatore=ARRAY['a'..'z'] OF integer;StringaNome=STRING[LunMass];
VARUnfile : text; {variabile di file da cui sono contate le lettere}ContaLettere: ArrayContatore; {memorizza le occorrenze}NomeFile: StringaNome; {directory e nome file testo}
LeggiNomeFile(UnFile)reset(UnFile)AzzeraContatori(ContaLettere)ContaOccorrenze(UnFile,ContaLettere)close(UnFile)MostraOccorrenze(NomeFile,ContaLettere)
PROCEDURE LeggiNomeFile(VAR NomeFile: StringaNome; VAR UnFile: text);PROCEDURE LeggiNomeFile(VAR NomeFile: StringaNome; VAR UnFile: text);BEGIN
write(' Dammi il nome del file da elaborare: ');readln(NomeFile);assign(UnFile, NomeFile)
END;
PROCEDURE AzzeraContatori(VAR ContaLettere: ArrayContatore);VAR IndiceLettera: ‘a’..’z’; BEGIN FOR IndiceLettera:=‘a’ TO ‘z’ DO
ContaLettere[IndiceLettera]:=0; END;
![Page 8: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/8.jpg)
LeggiNomeFile(UnFile)reset(UnFile)AzzeraContatori(ContaLettere)ContaOccorrenze(UnFile,ContaLettere)close(UnFile)MostraOccorrenze(NomeFile,ContaLettere)
PROCEDURE ContaOccorrenze(VAR ContaLettere : ArrayContatore; VAR UnFile: text);
VAR Scambio: integer; Carattere: char; BEGIN Scambio:= ord('a')-ord('A'); WHILE NOT eof(UnFile) DO BEGIN
read(UnFile,Carattere);IF Carattere IN['A'..'Z'] THEN Carattere:=chr(ord(Carattere)+Scambio);IF Carattere IN['a'..'z'] THEN ContaLettere[Carattere]:=ContaLettere[Carattere]+1
END END;
![Page 9: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/9.jpg)
LeggiNomeFile(UnFile)reset(UnFile)AzzeraContatori(ContaLettere)ContaOccorrenze(UnFile,ContaLettere)close(UnFile)MostraOccorrenze(NomeFile,ContaLettere)
PROCEDURE MostraOccorrenze(NomeFile: StringaNome; ContaLettere : ArrayContatore);
VAR IndiceLettera: 'a'..'z'; MostraLettera: 'A'..'Z'; Scambio, SommaLettere: integer;
BEGIN Scambio:=ord('A')-ord('a'); write('Le occorrenze delle lettere nel file '); writeln(NomeFile, ' sono: '); writeln; SommaLettere:=0; {serve per il calcolo delle frequenze }
FOR IndiceLettera:= 'a' TO 'z' DOBEGINSommaLettere:=SommaLettere+ContaLettere[IndiceLettera];
END;
FOR IndiceLettera:= 'a' TO 'z' DO BEGIN MostraLettera:=chr(ord(IndiceLettera) + Scambio); {cambio min/maiusc} write(' ':24,MostraLettera,'''s -- '); writeln(ContaLettere[IndiceLettera]:1,' % ', (ContaLettere[IndiceLettera] / SommaLettere)*100:10:2); END;END;
![Page 10: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/10.jpg)
{ ******************** BODY ******************}
BEGINLeggiNomeFile(NomeFile,UnFile);reset(UnFile);AzzeraContatori(ContaLettere);ContaOccorrenze(ContaLettere, UnFile);close(UnFile);MostraOccorrenze(NomeFile, ContaLettere);
readlnEND.
![Page 11: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/11.jpg)
ESERCIZIO
Gioco della TOMBOLA
Dati i 90 numeri della Tombola effettuare una estrazione completa di tutti i numeri con un generatore random. Impedire che venga estratto due volte lo stesso numero.
![Page 12: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/12.jpg)
LA TOMBOLA
NumeroRandom 1..90 30NumeroEstratto Interi[30] 30
NumeroRandom 1..89 2NumeroEstratto Interi[2] 2
NumeroRandom 1..88 30NumeroEstratto Interi[2] 90
2 ... ... 30 ... ... 901[0] [1] [..] [..] [30] [..] [..] [90]
2 ... ... 90 ... 89 901[0] [1] [..] [..] [30] [..] [89] [90]
89 ... ... 90 ... 89 901[0] [1] [..] [..] [30] [..] [89] [90]
89 ... ... 88 ... 89 901[0] [1] [..] [..] [30] [..] [89] [90]
![Page 13: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/13.jpg)
ESEMPIO 10.2
Si vuole simulare l’attività del cambio di monete.A partire dal valore giornaliero dei valori di cambio, data unacerta cifra in una moneta corrente si chiede l’equivalente in un’altra moneta.
Supponiamo che le monete trattate siano: Lire, Dollaro,Rublo,Yen, Sterlina, Franco Svizzero.
![Page 14: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/14.jpg)
Il dialogo che vogliamo si svolga tra utente e macchina è del tipo:
Buongiorno. Dammi i cambi della Lira di oggi:Dollaro: 1909Rublo: 989.99Sterlina: 3097Yen: 18.64Franco Svizzero: 1210Grazie.
![Page 15: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/15.jpg)
Abbiamo finito per oggi? (S/N) N Moneta da convertire: Yen Moneta in cui convertire: Sterlina
Cambio da Yen a Sterlina.Valore da cambiare: 1000
1000 Yen si convertono in 43.76 Sterline……………………….Batti un tasto per effettuare cambi.Abbiamo finito per oggi? (S/N) S
![Page 16: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/16.jpg)
Pseudo-codice
DammiCambi(DaLireA)
REPEAT
DammiMonete(DaMoneta, NuovaMoneta)
Cambia(DalireA, AmmontareDaCamb, AmmontareCambiato);
MostraQuadroRiepilogativo(DaMoneta, NuovaMoneta,
AmmontareDaCamb,AmmontareCambiato, Risposta)
UNTIL Risposta IN ['S','s']
![Page 17: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/17.jpg)
RAPPRESENTAZIONE GRAFICA
Istruzioni DammiCambi Ripeti finchè la Risposta è NO
DammiMonete Cambia MostraQuadroRiepilogativo
DaLireA
DaMonetaNuovaMoneta
DaLireA AmmontareDaCambAmmontareCambiato
DaLireA
DaMonetaNuovaMonetaAmmontareDaCambAmmontareCambiato
Valido Nome
Moneta Moneta
![Page 18: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/18.jpg)
1000
1909
989.99
3097
1210
18.64
Lira
Dollaro
Rublo
Sterlina
Franco Svizzero
Yen
Indice ArrayConversione
STRUTTURA DATI
Rapporto di conversione = valore moneta richiesta valore moneta offerta
![Page 19: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/19.jpg)
Usiamo il TYPE enumerativo
TYPETipoMoneta=(Nessuno, Lira, Dollaro, Rublo, Sterlina,
FrancoSvizzero, Yen)ArrayConversione=ARRAY[Lira..Yen] of REAL;
VAR DaLireA: ArrayConversione DaMoneta, AMoneta: TipoMoneta
![Page 20: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/20.jpg)
PROGRAM SimulazioneCambiBancari(input,output);{ }TYPETipoMoneta=(Nessuno, Lira, Dollaro, Rublo, Sterlina, FrancoSvizzero, Yen)ArrayConversione=ARRAY[Lira..Yen] of real;
VAR DaLireA: ArrayConversione; DaMoneta, NuovaMoneta: TipoMoneta; AmmontareDaCamb, AmmontareCambiato : real; Risposta: char;
………………………………………………………………………………………...{ ******************* BODY *********************** }BEGINIstruzioni; DammiCambi(DaLireA);REPEAT
DammiMonete(DaMoneta, NuovaMoneta); Cambia(DalireA, AmmontareDaCamb,AmmontareCambiato); MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta,AmmontareDaCamb,
AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
![Page 21: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/21.jpg)
BEGINIstruzioni; DammiCambi(DaLireA);REPEATDammiMonete(DaMoneta, NuovaMoneta);Cambia(DalireA,AmmontareDaCamb,AmmontareCambiato);MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta, AmmontareDaCamb,AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
DammiCambi Pseudo-codice
DaLireA[Lire] 1.000FOR Moneta Dollaro TO Yen DO
MostraCambireadln(DaLireA [Moneta] )
PROCEDURE DammiCambi(VAR DaLireA1: Tipo ArrayConversione);{ }VAR Moneta: TipoMoneta;BEGIN DaLireA1[Lire]:=1000; writeln(‘ Salve! Dammi i rapporti di cambio di oggi: ‘);FOR Moneta:=Dollaro TO Yen DO
BEGIN write (‘Lire / ‘);MostraCambio(Moneta); write(‘: ‘); readln(DaLireA1[Moneta])END;
writeln(‘ Grazie! Ciao ‘);END;
![Page 22: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/22.jpg)
DammiMonete
Pseudo-codiceREPEAT introduci SiglaMonetaUNTIL Valido(SiglaMoneta)
DaMoneta Nome(SiglaMoneta)REPEAT introduci SiglaMonetaUNTIL Valido(SiglaMoneta)
NuovaMoneta Nome(SiglaMoneta)mostra i valori delle monete
![Page 23: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/23.jpg)
FUNCTION Valido(SiglaMoneta1: char): boolean;BEGIN
Valido:=SiglaMoneta1 IN [‘L’,’D’,’R’,’S’,’Y’]END;
FUNCTION Nome(SiglaMoneta1: char): TipoMoneta;{ }BEGIN CASE SiglaMoneta1 OF ‘E’: Nome:=Lira; ’D’: Nome:= Dollaro; ’R’: Nome:= Rublo; ’S’: Nome:= FrancoSvizzero; ’Y’: Nome:= Yen END {CASE}END;
![Page 24: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/24.jpg)
PROCEDURE DammiMonete(VAR DaMon, NuovaMon: TipoMoneta);VAR Moneta: char;BEGIN REPEAT
write('Cambio da: ');readln(Moneta);
UNTIL Valido(Moneta);DaMon:=Nome(Moneta); REPEAT
write('A: ');readln(Moneta);
UNTIL Valido(Moneta);NuovaMon:=Nome(Moneta)END;
BEGINIstruzioni; DammiCambi(DaLireA);REPEATDammiMonete(DaMoneta, NuovaMoneta);Cambia(DalireA,AmmontareDaCamb,AmmontareCambiato);MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta, AmmontareDaCamb,AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
![Page 25: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/25.jpg)
PROCEDURE Cambia(DaLirA:ArrayConversione;VAR AmmDaCamb, AmmCambiato:real);
BEGIN write(' Introduci ammontare da cambiare: '); readln(AmmDaCamb); AmmCambiato:= AmmDaCamb*DaLirA[NuovaMoneta]/DaLirA[DaMoneta];END;
BEGINIstruzioni; DammiCambi(DaLireA);REPEATDammiMonete(DaMoneta, NuovaMoneta);Cambia(DalireA,AmmontareDaCamb,AmmontareCambiato);MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta, AmmontareDaCamb,AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
![Page 26: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/26.jpg)
PROCEDURE MostraQuadroRiepilogativo(DaMon, NuovaMon :TipoMoneta; AmmDaCamb, AmmCambiato: real;VAR Risp:char);BEGIN write('Converti '); write(AmmDaCamb:4:2,' '); MostraCambio(DaMon); write(' in '); write(AmmCambiato :4:2,' '); MostraCambio(NuovaMon); writeln; write('Mi posso riposare? '); readln(Risp)END;
BEGINIstruzioni; DammiCambi(DaLireA);REPEATDammiMonete(DaMoneta, NuovaMoneta);Cambia(DalireA,AmmontareDaCamb,AmmontareCambiato);MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta, AmmontareDaCamb,AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
![Page 27: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/27.jpg)
{ ******************* BODY *********************** }
BEGINIstruzioni; DammiCambi(DaLireA);REPEAT
DammiMonete(DaMoneta, NuovaMoneta); Cambia(DalireA, AmmontareDaCamb,
AmmontareCambiato); MostraQuadroRiepilogativo(DaMoneta,NuovaMoneta,
AmmontareDaCamb,AmmontareCambiato, Risposta)UNTIL Risposta IN ['S','s']END.
![Page 28: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/28.jpg)
ALGORITMI DI RICERCA LINEARE
Problema: Cercare tra i valori contenuti in un Array un preassegnatovalore.
Es.: Data una lista di N numeri verificare se esiste un preassegnatoValore.
Data la lista Cerca se in essa è contenuto il numero 12
10
19
98
30
29
12
18
1
2
3
4
5
6
7
Indice
![Page 29: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/29.jpg)
Algoritmo 10.1
Indice valore iniziale dell’indiceTrovato falseWHILE NOT finito AND NOT Trovato DO
IF UnArray[Indice]=ValoreCercato THEN Trovato trueELSE Indice nuovo valore dell’indiceIF NOT Trovato THEN Indice 0
Condizioni di uscita:- la ricerca è finita se nessun elemento uguale a quello cercato esiste- la ricerca è finita se almeno un elemento uguale a quello cercato è
stato trovato
Controlla se abbiamo esaminato tutti gli elementi dell’array
![Page 30: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/30.jpg)
I criteri per stabilire il nuovo valore da attribuire all’indice possonoessere i più diversi. E’ però importante che una volta stabilito che un elemento individuato da un certo indice non è quello cercato questo elemento non venga più esaminato.Una maniera ovvia è quella di partire dall’ultimo elemento dellalista e risalire fino in cima nella ricerca dell’elemento.
Algoritmo 10.2Indice NumeroTotaleElementiTrovato falseWHILE NOT (Indice=0) AND NOT Trovato DO
IF UnArray[Indice]= ValoreCercato Trovato trueELSE Indice Indice-1 Se Indice=0 significa che non abbiamo
trovato l’elemento cercato.
![Page 31: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/31.jpg)
Poiché ad ogni passo della ricerca eliminiamo un elemento il massimo numero di passi è pari al numero di elementi, di qui anche il nome di Algoritmo di Ricerca Lineare.
Indice:=CercaIndice(Nome, NumeroElementi,ValoreCercato);IF Indice<>0 THEN BEGIN write(ValoreCercato,’ è stato trovato nella posizione ‘,Indice:2); ENDELSE write(ValoreCercato,’ non è stato trovato ‘);
Array di nomi Stringa
![Page 32: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/32.jpg)
FUNCTION CercaIndice(VAR Nome: NomeArray; NumeroElementi:integer; ValoreCercato:NomeStringa):integer;
VAR Indice:integer; Trovato: boolean;BEGIN WHILE NOT (Indice=0) AND NOT Trovato DO
IF Nome[Indice]=ValoreCercato THEN Trovato:= trueELSE Indice:= Indice-1;
CercaIndice:= IndiceEND.
FUNCTION CercaIndice(VAR Nome: NomeArray; NumeroElementi:integer; ValoreCercato:NomeStringa):integer;VAR Indice:integer;BEGIN Nome[0]: =ValoreCercato; Indice:=NumeroElementi; WHILE Nome[Indice]<>ValoreCercato DO
Indice:= Indice-1; Nome[0]=‘’; CercaIndice:= IndiceEND;
Uso di una sentinella per eliminare la variabilebooleana
sentinella
![Page 33: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/33.jpg)
ORDINAMENTO = SORTING
10
19
9
30
29
12
18
1
2
3
4
5
6
7
19
30
10
29
12
9
18
![Page 34: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/34.jpg)
PROCEDURE OrdinaInteri(VAR Interi: ArrayInteri);
CONST UltimoElemento=7;TYPE ArrayInteri=ARRAY[1.. UltimoElemento] OF integer;VAR Interi:= ArrayInteri;BEGIN
……………
END;
![Page 35: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/35.jpg)
I° Approccio
FOR Ordine 1 TO UltimoElemento-1 DOscambia gli elementi nel sub-range Ordinati..UltimoElemento
Ipotesi di lavoro:Per ogni algoritmo che progetteremo, una volta ordinata una parte della lista, ad esempio da 1 a Ordine, i rimanenti elementi presenti nella parte da Ordine+1 fino a UltimoElemento sono tutti maggiori in valore di qualunque elemento appartenente alla parte della lista già ordinata.
1 Ordine Ordine +1
Tutti ordinati
UltimoElemento
Tutti di valore maggiore agli ordinati
![Page 36: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/36.jpg)
BUBBLE SORT
Pseudo-codice
FOR Indice UltimoElemento-1 DOWNTO Ordinato DO IF Interi[Indice]> Interi[Indice+1] THEN
Scambia(Interi[Indice], Interi[Indice+1] )
![Page 37: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/37.jpg)
Ordinato=1
10199
30291218
10199
30291218
1019930122918
10199
12302918
10199
12302918
109
1912302918
9101912302918
Ordinato=2
9101912302918
9101912301829
9101912183029
9101912183029
9101219183029
9101219183029
9101219183029
Ordinato=3
9101219182930
9101219182930
9101219182930
9101218192930
9101219182930
Ordinato=4
9101219182930
9101219182930
9101218192930
![Page 38: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/38.jpg)
Ordinato=5
9101218192930
9101218192930
9101218192930
Ordinato=6
9101218192930
9101218192930
9101218192930
Ordinato=7
N° confronti: (n-1)+(n-2)+…+1=(n-1)*n/2
![Page 39: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/39.jpg)
PROCEDURE BubbleSort(Var Interi:ArrayInteri);VAR Ordina, Indice :1..UltimoElemento;BEGIN FOR Ordinato:=1 TO UltimoElemento-1 DO BEGIN
FOR Indice:=UltimoElemento-1 DOWNTO Ordinato DO IF Interi[Indice]> Interi[Indice+1] THEN Scambia(Interi[Indice],Interi[Indice+1] )
END;END;
PROCEDURE Scambia(Var Int1,Int2:integer);VAR Temp:integer;BEGIN Temp:= Int1; Int1:= Int2; Int2:= Temp;END;
![Page 40: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/40.jpg)
SELECTION SORT Ordinamento per selezione
E’ un poco più efficiente del Bubble perché effettua solo una sostituzione ad ogni giro del loop.
Pseudo-codice
FOR Ordina 1 TO UltimoElemento-1 IndiceMinimo valore dell’indice dell’elemento più piccolo nel
sub-range Ordina..UltimoElemento-1 Scambia(Interi(Ordina),Interi(IndiceMinimo))
![Page 41: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/41.jpg)
Ordina=1
Ordina=2
Ordina=3
SELECTION SORT
10199
30291218
3
110199
30291218
3
110199
30291218
3
110199
30291218
3
110199
30291218
3
1
9191030291218
3
29191030291218
3
29191030291218
3
29191030291218
3
29191030291218
3
2
9101930291218
3
3
10199
30291218
1
1
9101930291218
3
3
9101930291218
6
3
9101830291912
6
3
![Page 42: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/42.jpg)
Ordina=4
Ordina=5
Ordina=6 SELECTION SORT
N° confronti: (n-1)+(n-2)+…+1=(n-1)*n/2
9101230291918
5
4
9101230291918
6
4
9101230291918
7
4
9101218302919 6
5
9101218293019
7
5
9101218193029
7
6
9101218192930
7
![Page 43: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/43.jpg)
PROCEDURE SelectionSort(Var Interi:ArrayInteri);VAR Ordina, Indice, IndiceMinimo :1..UltimoElemento;BEGIN FOR Ordina:=1 TO UltimoElemento-1 DO
BEGINIndiceMinimo:=Ordina;
FOR Indice:= Ordina+1 TO UltimoElemento DOIF Interi[Indice]< Interi[IndiceMinimo] THEN
IndiceMinimo:=Indice; Scambia(Interi[IndiceMinimo],Interi[Ordina] ) ENDEND;
SELECTION SORT
![Page 44: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/44.jpg)
INSERTION SORTOrdinamento per inserimento
E’ l’algoritmo più intuitivo. Se ad esempio si ha un mazzo di cartenon ordinato possiamo ordinarlo scorrendo le carte una alla voltae inserendo ogni carta immediatamente dopo la carta più piccolatra quelle che la precedono.
Supponiamo che il primo elemento sia già ordinato. Pseudo-codice
FOR PostoSuccessivo 2 TO UltimoElemento DO sposta tutti gli elementi maggiori di Interi[PostoSuccessivo ] di un posto in avanti e metti Interi[PostoSuccessivo ] nella sua giusta posizione
![Page 45: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/45.jpg)
AlgoritmoSupponiamo di essere al passo j. Confrontiamo il valore dell’elemento di Interi[j] con i suoi predecessori. Se chi lo precede ha un valore più elevato lo spostiamo di un posto in avanti. Se incontriamo nella posizione i un valore più basso allora poniamo in Interi[i+1] Interi[j].
Interi[1] UltimoElemento
Tutti ordinati Non ancora ordinati
6311 61 65
Inserisci tra questi due elementi
Interi[PostoSuccessivo]
33
![Page 46: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/46.jpg)
Pseudo-codice
Temp Interi[PostoSuccessivo]Posizione PostoSuccessivo-1WHILE Interi[Posizione ] > Temp DO
Interi[Posizione+1] Interi[Posizione]Posizione Posizione -1
Potrebbe succedere che uno degli elementi sia più piccolo di tutti e che quindi noi, risalendo la lista cerchiamo di confrontarlo con l’elemento posto in Interi[0] provocando così un crash.
Per evitare questo definiamo il range dell’array Interi variabile tra 0..UltimoElemento e ogni volta che scegliamo un valore per eseguirei confronti lo memorizziamo temporaneamente in Interi[0], così che se esso fosse il più piccolo di tutti comunque verrebbe posto in Interi[0+1]
![Page 47: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/47.jpg)
PostoSuccessivo
10 19 9 30 29 12 1810
[0] [1] [2] [3] [4] [5] [6] [7]
2
3 10 19 9 30 29 12 1810
[0] [1] [2] [3] [4] [5] [6] [7]
9 10 9 19 30 29 12 18
9 9 10 19 30 29 12 18
49 10 19 30 29 12 189
[0] [1] [2] [3] [4] [5] [6] [7]
59 10 19 30 29 12 1830
[0] [1] [2] [3] [4] [5] [6] [7]
29 9 10 19 29 30 12 18
![Page 48: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/48.jpg)
69 10 19 29 30 12 1829
[0] [1] [2] [3] [4] [5] [6] [7]
12 9 10 19 29 12 30 18
12 9 10 19 12 29 30 18
12 9 10 12 19 29 30 18
7
[0] [1] [2] [3] [4] [5] [6] [7]
12 9 10 12 19 29 30 18
18 9 10 12 19 29 18 30
18 9 10 12 19 18 29 30
18 9 10 12 18 19 29 30
N° confronti: (n-1)+(n-2)+…+1=(n-1)*n/2
![Page 49: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/49.jpg)
PROCEDURE InsertionSort(VAR Interi: ArrayInteri);VAR
PostoSuccessivo,Posizione: 0..UltimoElemento;
BEGIN FOR PostoSuccessivo:=2 TO UltimoElemento DO BEGIN
Interi[0]:=Interi[PostoSuccessivo];Posizione:= PostoSuccessivo-1;WHILE Interi[Posizione]>Interi[0] DO
BEGIN Interi[Posizione+1]:= Interi[Posizione]; Posizione:=Posizione-1END;
Interi[Posizione+1]:=Interi[0] ENDEND;
![Page 50: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/50.jpg)
IL CORSO TERMINA IL 17 GENNAIO
PRIMA PROVA SCRITTA IL 22 GENNAIO
PER SOSTENERE L’ESAME BISOGNA AVERE CONSEGUITO
UNA VOTAZIONE TRA A-D
SIA PER LA
PROVA SCRITTA
SIA PERIL PROGETTO CHE VA CONSEGNATO ALLEGANDO UNA
RELAZIONE E IL FLOPPY DISK AL PIU’ TARDI 10 GIORNI PRIMA DELL’ESAME ORALE
![Page 51: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/51.jpg)
REQUISITI MINIMALI PER IL PROGETTO
• Pseudo Codice• Rappresentazione grafica• Relazione • Programma Pascal
![Page 52: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/52.jpg)
ALGORITMO DI RICERCA BINARIA
Data una lista di N elementi ordinati cercare se tra essi esiste un determinato elemento.
Dividiamo gli elementi ordinati in due parti. Quello che cerchiamopuò appartenere o alla prima o alla seconda parte, essendo tutti gli
elementi ordinati. Dividiamo la parte scelta ancora in due e
applichiamo ancora il ragionamento precedente. L’algoritmo
termina o quando l’ultimo elemento rimasto dalle successive
suddivisioni è uguale a quello cercato, oppure quando l’intervallo
rimasto non è più suddivisibile il che implica che il nostro elemento
non appartiene alla lista.
![Page 53: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/53.jpg)
1 9 10 12 19 20 29 30[1] [2] [3] [4] [5] [6] [7]
Supponiamo di vedere se 19 appartiene alla seguente lista
19 20 29 30[4] [5] [6] [7]
2
19 20[4] [5]
3
19[4]
4
![Page 54: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/54.jpg)
Condizioni di uscita
A - il valore cercato è stato trovato (Flag booleano = TRUE)B - il valore cercato non è stato trovato (espressione che indichi questa condizione)
Quando riducendo i sub-range Basso>Alto e il valore cercato non è stato trovato allora esci
NOT Basso>Alto
oppure Basso<=Alto
![Page 55: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/55.jpg)
Pseudo-codice Uso di un flag booleano
Basso 1Alto ElementiTotaliTrovato falseWHILE (Basso<=Alto) AND NOT Trovato DO
BEGINMetà (Basso+Alto) DIV 2IF Interi[Metà ] = ValoreCercato THEN Trovato = trueELSE
IF Interi[Metà ] < ValoreCercato THEN Basso Metà+1
ELSEAlto Metà-1
ENDIF Trovato THEN Indice MetàELSE Indice 0
[2 4 8 11 12 21 30]
Metà Basso Alto4 1 76 5 7
7 7 7
ValoreCercato=30Indice=7
Metà Basso Alto4 1 7
ValoreCercato=11Indice=4
![Page 56: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/56.jpg)
Senza flag booleano
Condizioni di uscita
Si cerca l’intervallo entro il quale il valore cercato potrebbe
trovarsi.
Questa ricerca termina quando modificando di volta in volta gli
indici Basso e Alto non si verifica una inversione dei valori.
A questo punto si esce dal ciclo e si verifica se l’elemento che si
trova nella posizione Basso è quello cercato. Nel caso di risposta
positiva l’indice sarà Basso altrimenti sarà 0.
![Page 57: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/57.jpg)
Basso:=1;Alto:=ElementiTotaliWHILE Basso <= Alto DOBEGIN Meta:=(Basso+Alto) DIV 2; IF Interi[Meta]< ValoreCercato THEN Basso:=Meta+1; ELSE Alto:=Meta-1; IF Basso <= ElementiTotali THEN IF Interi[Basso]= ValoreCercato THEN Indice:=Basso ELSE Indice:=0; END;
Basso Alto Meta Interi[Meta]1 7 4 105 7 6 405 5 5 306
[2 4 8 10 30 40 50]
![Page 58: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/58.jpg)
NOTAZIONE ASINTOTICA
)()()(
boundLower
nngcnfngnf
)()()(
boundUpper
nngcnfngOnf n
f(n)
g(n)
f(n)
g(n)
n
O(n log n)
(n log n)
![Page 59: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/59.jpg)
Definiamo complessità di un algoritmo il numero di passi massimo previsto perché esso termini. La valutazione di complessità di un algoritmo va fatta sul caso peggiore che detto algoritmo si potrebbe trovare ad affrontare.
Ad esempio nel caso dell’algoritmo di ricerca lineare il casopeggiore si presenta quando il valore cercato si trova all’ultimoposto della lista. Quindi la complessità di tale algoritmo è O(N) seN sono gli oggetti della lista.
N
f(N)
g(N)
100
100
![Page 60: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/60.jpg)
Ogni volta che si introduce un loop su N elementi avremo unacomplessità pari a O(N). Ovviamente due loop annidati uno dentrol’altro avranno complessità O(N2) e così via.
Gli algoritmi di sort proposti: Bubble, Selection e Insertion hannotutti complessità pari a O(N2) avendo ognuno due loop annidate.
L’algoritmo per LA TOMBOLA ha complessità pari a O(N)
![Page 61: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/61.jpg)
L’algoritmo di Ricerca Binaria ha una complessità pari a O(log2N).
Infatti ad ogni passo noi dividiamo il numero N totale di elementisu cui cercare il valore richiesto per 2 e facciamo un solo confrontoper passo.Se N è il numero totale di elementi quante volte dobbiamo dividereN per due affinchè diventi uguale o minore di 1?
N N/2 N/4 …… N/ 2k
N= 2k k= log2N
![Page 62: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/62.jpg)
0
10
20
30
40
50
60
1 6 11 16 21 26 31 36 41 46
O(N)
O(log(N))
5
32
N=10.000.000log2(N)=23,25
Ciclo = 10-6 sec T= 10-6 * 107=10 secCiclo = 10-6 sec T= 10-6 * 23 sec
LINEARE1000*10=10.000sec=2,7 h
BINARIA1000*23* 10-6 = 23* 10-3 sec=23 ms
![Page 63: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/63.jpg)
Le chiamate degli array per valore e per variabile sottostanno agli stessi criteri validi per le variabili classiche: la chiamata per valore non modifica il contenuto dell’array dopo il suo utilizzo nell’ambito della procedura mentre quella per variabile lo modifica.
Nel caso della chiamata di un array per valore un FOR interno trasferisce elemento per elemento l’array nell’area dati prendendo quindi tempo di computazione e occupando, anche se temporaneamente spazio di memoria.
Nel caso della chiamata di un array per variabile nell’area dati viene memorizzato solo l’indirizzo del primo elemento dell’array e per gli altri elementi se richiesti gli indirizzi vengono calcolati di volta in volta. Quindi minore tempo di calcolo, in media, e minore spazio occupato in area dati.
IN GENERE PER GLI ARRAY SI USA LA
CHIAMATA PER VARIABILE
![Page 64: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/64.jpg)
Supponiamo di avere un Programma che chiama la procedura di Ricerca Binaria. Se tra programma e procedura passiamo l’arraycon i dati mediante una chiamata per valore allora noi avremoun numero di chiamate pari a O(N), più il numero di passi necessari per la ricerca, pari a O(log2N).
La complessità totale sarà quindi data da
O(N+log2N)O(N)
Se invece tra programma e procedura passiamo l’array con i dati mediante una chiamata per variabile (passiamo solo l’indirizzo) allora noi avremo un numero di chiamate pari a O(1) più sempre il numero di passi necessari alla ricerca pari a O(log2N).
La complessità totale sarà quindi data da
O(1+log2N)= O(log2N)
![Page 65: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/65.jpg)
Quando si hanno due algoritmi che risolvono lo stesso problemama hanno diverse complessità, ovviamente si deve scegliere quellocon complessità più piccola.A parità di complessità vanno considerati diversi altri fattori sialegati all’uomo che alla macchina.
Ad esempio un programma un poco più lento di un altro ma conuna codifica semplice può essere preferito perché se suscettibile dimodifiche o manutenzioni frequenti il costo per modificarlo è piùbasso.
![Page 66: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/66.jpg)
SUGGERIMENTI
Controllare che i dati digitati siano coerenti con quelli che il programma si aspetta.
Usando gli array controllare sempre che gli indici attraverso cui si gestisce l’array non assumano valori esterni al sub-range di definizione.
![Page 67: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/67.jpg)
Quando si progettano algoritmi di sorting fare test sui casi estremi (es. array già ordinato, array ordinato in ordine inverso, etc.) ricordando che le possibili disposizioni degli oggetti in un array sono n! dove n è il numero di elementi dell’array .
Per la ricerca binaria fare i seguenti test:•Cercare l’elemento in prima posizione•Cercare l’elemento in ultima posizione•Cercare un elemento tra la prima e l’ultima posizione•Controllare il caso in cui si è in presenza di elementi duplicati.
![Page 68: ARRAY CON SUB-RANGE DIVERSI DAGLI INTERI 123......100 Indice ARRAY In Pascal si può usare come sub-range un qualunque ordinal type Un ordinal type, cioè](https://reader034.fdocuments.net/reader034/viewer/2022052504/5542eb59497959361e8c4c16/html5/thumbnails/68.jpg)
ESERCIZIO
Scrivere un algoritmo di ricerca binaria su un array ordinato che indichi se l’elemento cercato appartiene all’array e se è presente più volte.Es. INPUT ArrayOrdinato [2 4 5 6 6 6 8 8 9]
ValoreCercato: 6 OUTPUT Il valore cercato 6 appartiene all’array e ricorre 3 volte.