Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I...

39
Esercitazioni sui File Esercitazioni sui File Nicola Fanizzi Nicola Fanizzi - DIB - DIB Corso (B) di Programmazione Corso (B) di Programmazione CdL in Informatica – I livello CdL in Informatica – I livello A.A. 2003/2004 A.A. 2003/2004

Transcript of Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I...

Page 1: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Esercitazioni sui FileEsercitazioni sui File

Nicola FanizziNicola Fanizzi - DIB - DIBCorso (B) di ProgrammazioneCorso (B) di ProgrammazioneCdL in Informatica – I livelloCdL in Informatica – I livelloA.A. 2003/2004A.A. 2003/2004

Page 2: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1

Progettare un programma che: Progettare un programma che: data una sequenza di coppie (data, quantitativo)data una sequenza di coppie (data, quantitativo) gestisca l’immissione della sequenza di coppiegestisca l’immissione della sequenza di coppie fornisca:fornisca:

quantitativo minimo e la data relativaquantitativo minimo e la data relativa quantitativo massimo e la data relativaquantitativo massimo e la data relativa quantitativo medio quantitativo medio

conti quanti giorni sono intercorsi tra la data relativa conti quanti giorni sono intercorsi tra la data relativa al minimo e quella relativa al massimoal minimo e quella relativa al massimo

stampi un rapporto sui risultati precedentistampi un rapporto sui risultati precedenti

Page 3: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1AnalisiAnalisi

Supponiamo che la data sia composta da tre Supponiamo che la data sia composta da tre parti: (giorno, mese, anno) dove:parti: (giorno, mese, anno) dove: giornogiorno: da 1 a 31 : da 1 a 31

(dipende da mese e anno secondo la regola)(dipende da mese e anno secondo la regola) mesemese: da 1 a 12: da 1 a 12 annoanno: supponiamo successivo all’anno 2000: supponiamo successivo all’anno 2000

il significato del minimo e del massimo il significato del minimo e del massimo dipende dall’ordine normale sugli interidipende dall’ordine normale sugli interi

l’ordine sulle date é quello consuetol’ordine sulle date é quello consueto il quantitativo medio viene calcolato da:il quantitativo medio viene calcolato da:

dove N non é noto a prioridove N non é noto a priori anche la differenza non può essere negativaanche la differenza non può essere negativa

N

1iiq

N1

Page 4: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progettazione Strutture DatiProgettazione Strutture Dati

tipo data = triple tipo data = triple (giorno,mese,anno)(giorno,mese,anno) giornogiorno: intero da 1 a 31 : intero da 1 a 31

(dipende da mese e anno secondo la regola)(dipende da mese e anno secondo la regola) mesemese: intero da 1 a 12: intero da 1 a 12 annoanno: 2000-massimo_intero: 2000-massimo_intero

tipo quantitativo = tipo quantitativo = NN (numeri naturali)(numeri naturali) le coppie saranno quindi di tipole coppie saranno quindi di tipo

tipo_data x tipo_quantitativo:tipo_data x tipo_quantitativo:( (giorno, mese, anno), quantitativo )( (giorno, mese, anno), quantitativo )

dato che il numero di coppie non é noto useremo dato che il numero di coppie non é noto useremo la sequenza di queste coppiela sequenza di queste coppie

Page 5: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progettazione Strategia SolutivaProgettazione Strategia Solutiva

La soluzione top-down discende dalla La soluzione top-down discende dalla formulazione del problemaformulazione del problema

1.1. Immettere sequenzaImmettere sequenza2.2. Scandire la sequenza conScandire la sequenza con

1.1. memorizzazione del minimo, massimo memorizzazione del minimo, massimo corrente e delle date relativecorrente e delle date relative

2.2. conteggio delle coppie e della somma conteggio delle coppie e della somma parziale dei quantitativiparziale dei quantitativi

3.3. Calcolare la distanza in giorni tra le date Calcolare la distanza in giorni tra le date trovate al passo 2.1trovate al passo 2.1

4.4. Stampare rapportoStampare rapporto

Page 6: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 1Progetto Algoritmo 1

1.1. algoritmo di immissionealgoritmo di immissioneinputinput: -: -outputoutput: sequenza S di coppie: sequenza S di coppiebeginbeginInizializzare la sequenza SInizializzare la sequenza Srepeatrepeat

Leggere data validaLeggere data validaLeggere quantitativo validoLeggere quantitativo validoInserire (data,quantitativo) in SInserire (data,quantitativo) in S

untiluntil fine immissione fine immissioneRestituire sequenza SRestituire sequenza Sendend

Page 7: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 2Progetto Algoritmo 2

2.2. algoritmo di scansione della sequenzaalgoritmo di scansione della sequenza inputinput: sequenza S di coppie: sequenza S di coppieoutputoutput: min, max, med, data-min, data-max: min, max, med, data-min, data-maxbeginbegininizializzare contatori e accumulatoriinizializzare contatori e accumulatoriwhilewhile ci sono ancora coppie in S ci sono ancora coppie in S dodo

Leggere prossima coppiaLeggere prossima coppiaAggiornare min, max e le date relativeAggiornare min, max e le date relativeIncrementare il contatore delle coppie Incrementare il contatore delle coppie Aggiornare la somma parziale dei quantitativiAggiornare la somma parziale dei quantitativi

Calcolare med usando la somma quantitativi e il Calcolare med usando la somma quantitativi e il contatore delle coppiecontatore delle coppie

endend

Page 8: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 3Progetto Algoritmo 3

3.3. algoritmo calcolo delle differenza datealgoritmo calcolo delle differenza date inputinput:: data1data1 = (giorno1,mese1,anno1)= (giorno1,mese1,anno1)

data2data2 = (giorno2,mese2,anno2)= (giorno2,mese2,anno2)outputoutput: differenza (di tipo intero): differenza (di tipo intero)beginbegind1 := giorni da 1/1/2000 a data1d1 := giorni da 1/1/2000 a data1d2 := giorni da 1/1/2000 a data2d2 := giorni da 1/1/2000 a data2differenza := d1-d2differenza := d1-d2endend

Page 9: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 3.1Progetto Algoritmo 3.1

Calcolo giorni dal 1.1.2000 fino ad una dataCalcolo giorni dal 1.1.2000 fino ad una datainputinput:: data = (giorno,mese,anno)data = (giorno,mese,anno)outputoutput: ngiorni (intero): ngiorni (intero)beginbeginngiorni := giorno;ngiorni := giorno;forfor m :=1 m :=1 toto mese-1 mese-1 dodo

Incrementare ngiorni del numero di giorni del mese Incrementare ngiorni del numero di giorni del mese m dell'anno datom dell'anno dato

forfor a := 2000 a := 2000 to to anno-1 anno-1 dodoif if bisestile bisestile then then ngiorni := ngiorni + 366 ngiorni := ngiorni + 366

else else ngiorni := ngiorni + 365ngiorni := ngiorni + 365Restituire ngiorni;Restituire ngiorni;endend

Page 10: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 3.2Progetto Algoritmo 3.2

Funzione anno bisestileFunzione anno bisestileinputinput: anno: annooutputoutput: vero/falso: vero/falsobeginbeginifif (anno divisibile per 4) e (anno divisibile per 4) e

(tranne (divisibile per 100) (tranne (divisibile per 100) (tranne (divisibile per 400)))(tranne (divisibile per 400)))

thenthen Ritornare vero Ritornare veroelseelse Ritornare falso Ritornare falso endend

Page 11: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Progetto Algoritmo 4Progetto Algoritmo 4

stampa rapportostampa rapporto inputinput: min, max, medio, differenza: min, max, medio, differenzaoutputoutput: - : - beginbeginstampa sulla periferica standard di outputstampa sulla periferica standard di output

min min maxmaxmediomediodifferenzadifferenza

endend

Page 12: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1CodificaCodifica

Esercizio in laboratorioEsercizio in laboratorio Usare file di record opportunamente dichiarati Usare file di record opportunamente dichiarati

secondo i passi precedentisecondo i passi precedenti implementare gli algoritmi scomponendoli implementare gli algoritmi scomponendoli

ulteriormente, se necessarioulteriormente, se necessario procedure immissione()procedure immissione() procedure calcolo()procedure calcolo() function differenza()function differenza() procedure stampa_rapporto() procedure stampa_rapporto() ……

Decidere:Decidere:qualiquali sono i parametri e sono i parametri e comecome passarli passarli

Page 13: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica: TipiCodifica: Tipi

typetype TQuantitativo = 0..maxint;TQuantitativo = 0..maxint;

TData = recordTData = recordgiorno, mese, anno: integergiorno, mese, anno: integer

end; (* record TData *)end; (* record TData *)

TCoppia = recordTCoppia = recorddata: TData;data: TData;quant: TQuantitativoquant: TQuantitativo

end; (* record TCoppia *)end; (* record TCoppia *)

TSequenza = File of TCoppia;TSequenza = File of TCoppia;

Page 14: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica SottoprogrammiCodifica Sottoprogrammi

procedure inserimento(var F:TSequenza);procedure inserimento(var F:TSequenza);varvar c: Tcoppia;c: Tcoppia;beginbeginrewrite(F);rewrite(F);repeatrepeat

writeln('immettere una coppia (data, quantitativo)');writeln('immettere una coppia (data, quantitativo)');writeln('quantitativo negativo per terminare'); writeln('quantitativo negativo per terminare'); leggi_quantitativo(c.quant);leggi_quantitativo(c.quant);leggi_data(c.data);leggi_data(c.data);if c.quant >= 0 then write(F,c)if c.quant >= 0 then write(F,c)

until (c.quant<0); until (c.quant<0); end;end;

Page 15: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica Sottoprogrammi (cont.)Codifica Sottoprogrammi (cont.)

procedure leggi_data(var d:TData);procedure leggi_data(var d:TData);const max_ripetizioni =10;const max_ripetizioni =10;var i:integer;var i:integer;beginbegini:=1;i:=1;repeatrepeat

writeln('immettere una data');writeln('immettere una data');read(d.giorno, d.mese, d.anno);read(d.giorno, d.mese, d.anno);i := i+1;i := i+1;

until data_corretta(d) or (i > max_ripetizioni);until data_corretta(d) or (i > max_ripetizioni);if (i > max_ripetizioni) then if (i > max_ripetizioni) then

beginbeginwriteln('troppe ripetizioni! Imposto la data a 1/1/2000');writeln('troppe ripetizioni! Imposto la data a 1/1/2000');d.giorno :=1; d.mese:=1; d.anno:=2000;d.giorno :=1; d.mese:=1; d.anno:=2000;endend

end;end;

Page 16: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica Sottoprogrammi (cont.)Codifica Sottoprogrammi (cont.)

function data_corretta(d:TData):boolean;function data_corretta(d:TData):boolean;beginbeginif d.anno < 2000 then data_corretta:=false;if d.anno < 2000 then data_corretta:=false;if if ((d.mese in [4,6,9,11]) and (d.giorno in [1..30])) or((d.mese in [4,6,9,11]) and (d.giorno in [1..30])) or

((d.mese<>2) and (d.giorno in [1..31])) ((d.mese<>2) and (d.giorno in [1..31])) then data_corretta:= truethen data_corretta:= trueelse else

if bisestile(d.anno)if bisestile(d.anno)then data_corretta := d.giorno in [1..29]then data_corretta := d.giorno in [1..29]else data_corretta := d.giorno in [1..28]else data_corretta := d.giorno in [1..28]

end;end;

Page 17: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica Sottoprogrammi (cont.)Codifica Sottoprogrammi (cont.)

function bisestile (anno:integer): boolean;function bisestile (anno:integer): boolean;beginbeginbisestile := (anno mod 4 = 0) and bisestile := (anno mod 4 = 0) and

((anno mod 100 <> 0) or (anno mod 400 = 0)); ((anno mod 100 <> 0) or (anno mod 400 = 0)); end;end;

function dal2000 (d:Tdata): integer;function dal2000 (d:Tdata): integer;var g,m,a:integer;var g,m,a:integer;beginbeging := d.giorno;g := d.giorno;for m :=1 to d.mese-1 dofor m :=1 to d.mese-1 do

g:=g+giorni_mese(m,d.anno); g:=g+giorni_mese(m,d.anno); for a :=2000 to d.anno-1 dofor a :=2000 to d.anno-1 do

if bisestile(a) then g:=g+366 else g:=g+365;if bisestile(a) then g:=g+366 else g:=g+365;return g;return g;end;end;

Page 18: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Codifica Sottoprogrammi (cont.)Codifica Sottoprogrammi (cont.)

function bisestile (anno:integer): boolean;function bisestile (anno:integer): boolean;beginbeginbisestile := (anno mod 4 = 0) and bisestile := (anno mod 4 = 0) and

((anno mod 100 <> 0) or (anno mod 400 = 0)); ((anno mod 100 <> 0) or (anno mod 400 = 0)); end;end;

function giorni_mese(mese,anno:integer):integer;function giorni_mese(mese,anno:integer):integer;beginbeginif mese in [4,6,9,11] then return 30;if mese in [4,6,9,11] then return 30;if (mese<>2) then return 31if (mese<>2) then return 31else else

if bisestile(anno) then return 29 if bisestile(anno) then return 29 else return 28else return 28

end;end;

Page 19: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Test EmpiricoTest Empirico

Classi di equivalenza:Classi di equivalenza: procedura immissione()procedura immissione()

[c.quant non negativo], [c.quant negativo][c.quant non negativo], [c.quant negativo] [file F non accessibile], [file F accessibile][file F non accessibile], [file F accessibile]

per ognuna delle sotto-procedure/funzioni per ognuna delle sotto-procedure/funzioni cercare le classi di equivalenzacercare le classi di equivalenza Procedura leggi_dataProcedura leggi_data

[data corretta], [data non corretta][data corretta], [data non corretta] [ripetizioni<10], [ripetizioni=10], [ripetizioni>10][ripetizioni<10], [ripetizioni=10], [ripetizioni>10]

Funzione data_correttaFunzione data_corretta [corretta generica], [non corretta/mese], [non [corretta generica], [non corretta/mese], [non

corretta/giorno], [non corretta/anno non bisestile], [non corretta/giorno], [non corretta/anno non bisestile], [non corretta/anno bisestile]corretta/anno bisestile]

Ecc…Ecc…

Page 20: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 1Problema 1Test EmpiricoTest Empirico

Classi di equivalenza:Classi di equivalenza: procedura calcolo()procedura calcolo()

file vuotofile vuoto file non vuotofile non vuoto per ognuna delle sotto-procedure/funzioni cercare le classi per ognuna delle sotto-procedure/funzioni cercare le classi

di equivalenzadi equivalenza ecc...ecc...

Page 21: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

ProblemaProblema 2 2

Progettare un programma che Progettare un programma che dato un testo in memoria secondariadato un testo in memoria secondaria

(prodotto con un editor di testi, es. (prodotto con un editor di testi, es. notepadnotepad)) fornisca:fornisca:

il numero totale di caratteri alfanumerici del fileil numero totale di caratteri alfanumerici del file un diagramma a barre, su un nuovo file di testo, che un diagramma a barre, su un nuovo file di testo, che

riproduca le percentuali trovate riproduca le percentuali trovate delle sei delle sei vocalivocali a,e,i,o,u (1 barra cadauna) a,e,i,o,u (1 barra cadauna) delle delle consonanticonsonanti (1 barra) (1 barra) dei dei numerinumeri (1 barra) (1 barra)

Page 22: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

ProblemaProblema 2 2Algoritmo di massimaAlgoritmo di massima

input:input: File1File1output:output: File2File2Inizializzare File1 in letturaInizializzare File1 in letturaInizializzare contatore n e i contatori cInizializzare contatore n e i contatori cii (i=1,…,7) per le (i=1,…,7) per le

categorie: a, e, i, o, u, consonanti e numericategorie: a, e, i, o, u, consonanti e numeriwhilewhile non è finito non è finito dodo

whilewhile non è finita la prossima linea non è finita la prossima linea dodoLeggere prossimo carattereLeggere prossimo carattereIncrementare contatore i-esimo corrispondente alla sua categoriaIncrementare contatore i-esimo corrispondente alla sua categoriaIncrementare contatore totale caratteri nIncrementare contatore totale caratteri n

Passare a nuova lineaPassare a nuova lineaInizializzare File2 per la scritturaInizializzare File2 per la scritturafor for i := 1 i := 1 toto 7 7 dodo

Scrivere un numero di '*' proporzionale a cScrivere un numero di '*' proporzionale a c i i / n/ nPassare a nuova lineaPassare a nuova linea

Page 23: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

ProblemaProblema 2 2Codifica 1/3Codifica 1/3

program istogramma(input,output,f1,f2);program istogramma(input,output,f1,f2);varvar f1,f2: text;f1,f2: text; ch: char;ch: char; i,j,n: integer;i,j,n: integer; c: array[1..7] of integer;c: array[1..7] of integer;beginbeginassign(f1,'testo.txt');assign(f1,'testo.txt');reset(f1);reset(f1);for i:= 1 to 7 do c[i]:=0;for i:= 1 to 7 do c[i]:=0;n:=0;n:=0;

Page 24: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

ProblemaProblema 2 2Codifica 2/3Codifica 2/3

while not eof(f1) dowhile not eof(f1) do beginbegin while not eoln(f1) dowhile not eoln(f1) do beginbegin {ch:=f1^; get(f1);}{ch:=f1^; get(f1);} read(f1,ch);read(f1,ch); n:=n+1;n:=n+1; if ch in ['a','e','i','o','u'] thenif ch in ['a','e','i','o','u'] then case ch ofcase ch of 'a': c[1]:=C[1]+1;'a': c[1]:=C[1]+1; 'e': c[2]:=C[2]+1;'e': c[2]:=C[2]+1; 'i': c[3]:=C[3]+1;'i': c[3]:=C[3]+1; 'o': c[4]:=C[4]+1;'o': c[4]:=C[4]+1; 'u': c[5]:=C[5]+1'u': c[5]:=C[5]+1 end { case }end { case } else if ch in ['0'..'9']else if ch in ['0'..'9'] then c[7]:=C[7]+1then c[7]:=C[7]+1 else if ch in (['a'..'z']-['a','e','i','o','u'])else if ch in (['a'..'z']-['a','e','i','o','u']) then c[6]:=C[6]+1then c[6]:=C[6]+1 end;end; readln(f1);readln(f1); end;end;

Page 25: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

ProblemaProblema 2 2Codifica 3/3Codifica 3/3

assign(f2,'isto.txt');assign(f2,'isto.txt');rewrite(f2);rewrite(f2);for i:= 1 to 7 dofor i:= 1 to 7 do beginbegin write(f2,'cat.',i,': ');write(f2,'cat.',i,': '); for j:= 1 to trunc(80*c[i]/n) do write(f2,'*');for j:= 1 to trunc(80*c[i]/n) do write(f2,'*'); writeln(f2,100*c[i]/n:5:2,'%')writeln(f2,100*c[i]/n:5:2,'%') end;end;

end. (*programma*)end. (*programma*)

Page 26: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 3Problema 3

Produrre un programma che:Produrre un programma che: Accetti in ingresso numeri rappresentati da Accetti in ingresso numeri rappresentati da

cifre arabe e le scriva su file testocifre arabe e le scriva su file testo Legga da file di testo numeri in cifre arabe Legga da file di testo numeri in cifre arabe

e scriva le corrispondenti cifre romane su e scriva le corrispondenti cifre romane su un altro fileun altro file

Per esercizio risolvere il caso della Per esercizio risolvere il caso della conversione contrariaconversione contraria

Page 27: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 3Problema 3Codifica 1/4Codifica 1/4

program arabi2romani program arabi2romani (input,output,testo1,testo2);(input,output,testo1,testo2);

uses conversioni;uses conversioni;

VarVar testo1, testo2:text;testo1, testo2:text; n:integer;n:integer;

begin {main}begin {main}assign(testo1,'arabi.txt');assign(testo1,'arabi.txt');assign(testo2,'romani.txt');assign(testo2,'romani.txt');

writeln('Conversione numeri arabi / numeri romani');writeln('Conversione numeri arabi / numeri romani');

arabi(testo1);arabi(testo1);romani(testo1,testo2);romani(testo1,testo2);end.end.

Page 28: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Unit Conversioni;Unit Conversioni;Interface;Interface;procedure arabi(var f:text);procedure arabi(var f:text);procedure romani(var ifile,ofile:text);procedure romani(var ifile,ofile:text);

implementationimplementationprocedure arabi(var f:text);procedure arabi(var f:text);var n:integer;var n:integer; risposta:char;risposta:char;beginbeginrewrite(f);rewrite(f);repeatrepeat repeatrepeat write('immetti numero: ');write('immetti numero: '); readln(n)readln(n) until (n>0) and (N<=5000);until (n>0) and (N<=5000); writeln(f,n);writeln(f,n); write('Fine ? (s/N) ');write('Fine ? (s/N) '); readln(risposta)readln(risposta)until risposta in ['s','S'];until risposta in ['s','S'];end; {arabi}end; {arabi}

Problema 3Problema 3Codifica 2/4Codifica 2/4

Page 29: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 3Problema 3Codifica 3/4Codifica 3/4

procedure romani(var ifile,ofile:text);procedure romani(var ifile,ofile:text);var n:integer;var n:integer;beginbeginreset(ifile); rewrite(ofile);reset(ifile); rewrite(ofile);while not eof(ifile) dowhile not eof(ifile) do beginbegin while not eoln(ifile) dowhile not eoln(ifile) do beginbegin read(ifile,n);read(ifile,n); while n>=1000 dowhile n>=1000 do begin write(ofile,'M'); n:=n-1000 end;begin write(ofile,'M'); n:=n-1000 end; if n>=900 thenif n>=900 then begin write(ofile,'CM'); n:=n-900 endbegin write(ofile,'CM'); n:=n-900 end else if n>=500 thenelse if n>=500 then begin write(ofile,'D'); n:=n-500 end;begin write(ofile,'D'); n:=n-500 end;

while n>=100 dowhile n>=100 do begin write(ofile,'C'); n:=n-100 end; begin write(ofile,'C'); n:=n-100 end;

Page 30: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

if n>=90 thenif n>=90 then begin write(ofile,'XC'); n:=n-90 endbegin write(ofile,'XC'); n:=n-90 end else if n>=50 thenelse if n>=50 then begin write(ofile,'L'); n:=n-50 endbegin write(ofile,'L'); n:=n-50 end else if n>=40 thenelse if n>=40 then begin write(ofile,'XL'); n:=n-40 end;begin write(ofile,'XL'); n:=n-40 end;

while n>=10 dowhile n>=10 do begin write(ofile,'X'); n:=n-10 end;begin write(ofile,'X'); n:=n-10 end;

if n>=9 thenif n>=9 then begin write(ofile,'IX'); n:=n-9 endbegin write(ofile,'IX'); n:=n-9 end else if n>=5 thenelse if n>=5 then begin write(ofile,'V'); n:=n-5 endbegin write(ofile,'V'); n:=n-5 end else if n>=4 then begin write(ofile,'IV'); n:=n-4 end;else if n>=4 then begin write(ofile,'IV'); n:=n-4 end;

while n>0 dowhile n>0 do begin write(ofile,'I'); n:=n-1 end;begin write(ofile,'I'); n:=n-1 end; end;end; readln(ifile);readln(ifile); writeln(ofile)writeln(ofile) endendend; {romani}end; {romani}

end. {Unit}end. {Unit}

Problema 3Problema 3Codifica 4/4Codifica 4/4

Page 31: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4Ricerca di una Parola ChiaveRicerca di una Parola Chiave

Contare il numero di volte che una parola Contare il numero di volte che una parola data appare in un testodata appare in un testo Non ci si curi del problema dell’immissione Non ci si curi del problema dell’immissione

del testodel testo Si ipotizzi di digitare il testo in input dalla Si ipotizzi di digitare il testo in input dalla

tastiera oppuretastiera oppure File preparato precedentemente con un editorFile preparato precedentemente con un editor

EsempioEsempio““Questo è un segmento di testo….”Questo è un segmento di testo….”

Verificare quante volte appare la parola “un”Verificare quante volte appare la parola “un”

Page 32: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4ConsiderazioniConsiderazioni

L’esame va fatto un carattere alla voltaL’esame va fatto un carattere alla volta (Tranne la prima,) una parola in un testo può essere (Tranne la prima,) una parola in un testo può essere

preceduta o seguitapreceduta o seguita Da un blankDa un blank Da caratteri specialiDa caratteri speciali

Due parole possono essere simili anche per una Due parole possono essere simili anche per una frazione di parolafrazione di parola La discordanza può apparire in qualunque momento, La discordanza può apparire in qualunque momento,

durante il processo di confrontodurante il processo di confronto EsempioEsempio:: unun ununaa

Page 33: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4Gestione del confrontoGestione del confronto

Portare avanti la lettura del testo carattere per caratterePortare avanti la lettura del testo carattere per carattere Il processo di lettura del testo continua fino alla fine del testoIl processo di lettura del testo continua fino alla fine del testo Contemporaneamente avviene il confronto con la parola ricercataContemporaneamente avviene il confronto con la parola ricercata

Incremento dell’indice sulla parolaIncremento dell’indice sulla parola Occorre:Occorre:

Leggere un carattere del testoLeggere un carattere del testo Confrontarlo con la prima lettera della parola cercataConfrontarlo con la prima lettera della parola cercata Se vi è accordo si legge il prossimo carattere e si confronta con la Se vi è accordo si legge il prossimo carattere e si confronta con la

prossima lettera della parola per verificare se l’accordo continuaprossima lettera della parola per verificare se l’accordo continua Ogni volta che si stabilisce che la parola è completamente eguale Ogni volta che si stabilisce che la parola è completamente eguale

allo spezzone di testo, va controllato se questo è una parola o una allo spezzone di testo, va controllato se questo è una parola o una substringasubstringa di una parola nel testo di una parola nel testo Si assume che una parola sia preceduta e seguita da un carattere Si assume che una parola sia preceduta e seguita da un carattere

non alfabeticonon alfabetico1.1. Occorre ricordare il carattere che precede una parola nel testoOccorre ricordare il carattere che precede una parola nel testo2.2. Necessità di tener conto dei Necessità di tener conto dei fine-lineafine-linea nel testo nel testo

Page 34: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4Nucleo della strategiaNucleo della strategia

Metti a 1 l’indice Metti a 1 l’indice ii dell’array di parola dell’array di parolaMentreMentre non è vera la condizione che segnala la fine del non è vera la condizione che segnala la fine del

testo testo eseguieseguiLeggi il prossimo carattereLeggi il prossimo carattereSeSe il carattere è identico all’ il carattere è identico all’ii-esimo carattere -esimo carattere

dell’array contenente la parola dell’array contenente la parola alloraalloraEstendi il confronto di 1Estendi il confronto di 1SeSe vi è concordanza vi è concordanza alloraallora

Verifica che l’intera parola concordi e Verifica che l’intera parola concordi e prendi azioni opportuneprendi azioni opportune

AltrimentiAltrimentiPrendi le azioni conseguenti un caso di Prendi le azioni conseguenti un caso di

discordanzadiscordanza

Page 35: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4ConsiderazioniConsiderazioni

Necessità di ricordare il carattere che precede uno Necessità di ricordare il carattere che precede uno spezzone di testospezzone di testo N.B.: Un carattere su cui si è verificata una N.B.: Un carattere su cui si è verificata una

condizione di disaccordo condizione di disaccordo puòpuò essere un carattere che essere un carattere che precede una parolaprecede una parola Bisogna salvarlo Bisogna salvarlo Sarà cambiato solo quando vi è una condizione di Sarà cambiato solo quando vi è una condizione di

disaccordo (Non varierà durante il confronto)disaccordo (Non varierà durante il confronto) Quando si rileva un disaccordoQuando si rileva un disaccordo

Salvare il carattere corrente nel testo come Salvare il carattere corrente nel testo come prepre Reimpostare l’indice di parola a 1Reimpostare l’indice di parola a 1

Se vi è accordo completoSe vi è accordo completo Incrementare il contatore di confronto di 1Incrementare il contatore di confronto di 1 Lasciare in Lasciare in prepre il più recente il più recente Reimpostare l’indice di parola a 1Reimpostare l’indice di parola a 1

Page 36: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4AlgoritmoAlgoritmo

Input: parola, testoInput: parola, testoOutput: trovato/non trovatoOutput: trovato/non trovatoStabilire la parola e la sua lunghezzaStabilire la parola e la sua lunghezzaInizializzare il contatore di concordanze Inizializzare il contatore di concordanze nmatchesnmatches, ,

definire il carattere precedente e mettere a 1 definire il carattere precedente e mettere a 1 l’indice di array della parola da cercarel’indice di array della parola da cercare

FintantochéFintantoché ci sono caratteri nel file ci sono caratteri nel file eseguieseguiFintantochéFintantoché la linea non è terminata la linea non è terminata eseguiesegui

Leggi il prossimo carattere Leggi il prossimo carattere chrchr(vd. lucido successivo)(vd. lucido successivo)

Passa all’altra linea di testoPassa all’altra linea di testonmatchesnmatches contiene il numero di concordanze contiene il numero di concordanze

Page 37: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4AlgoritmoAlgoritmo

SeSe chrchr coincide con l’ coincide con l’ii-esimo carattere nella -esimo carattere nella parola parola alloraalloraSeSe l’intera parola concorda l’intera parola concorda alloraallora

Leggi il prossimo Leggi il prossimo chrchr nel testo nel testo postpostSeSe il carattere precedente ed il seguente il carattere precedente ed il seguente

non sono alfabetici non sono alfabetici alloraalloraAggiorna Aggiorna nmatchesnmatches

Reimposta l’indice di parola Reimposta l’indice di parola iiSalva il carattere Salva il carattere postpost come prossimo come prossimo

precedenteprecedenteAltrimentiAltrimenti

Salva il prossimo carattere precedenteSalva il prossimo carattere precedenteReimposta Reimposta ii a 1 a 1

Page 38: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4ConsiderazioniConsiderazioni

L’azione fondamentale è il paragone tra il carattere L’azione fondamentale è il paragone tra il carattere corrente del testo ed il carattere corrente di parolacorrente del testo ed il carattere corrente di parola Viene effettuata un numero di volte uguale al numero di Viene effettuata un numero di volte uguale al numero di

caratteri nel testocaratteri nel testo Con ogni iterazione è letto un altro carattereCon ogni iterazione è letto un altro carattere

Si raggiunge sicuramente la fine del file:Si raggiunge sicuramente la fine del file:L’algoritmo L’algoritmo terminatermina

Allo stadio di ricerca in cui sono stati letti i primi Allo stadio di ricerca in cui sono stati letti i primi jj caratteri sono state contate tutte le parole nel testo che caratteri sono state contate tutte le parole nel testo che corrispondono alla parola ricercatacorrispondono alla parola ricercata

È possibile realizzare algoritmi che ottimizzino la ricerca È possibile realizzare algoritmi che ottimizzino la ricerca In funzione della lunghezza della stringa da ricercareIn funzione della lunghezza della stringa da ricercare

oppureoppure In funzione della particolare parolaIn funzione della particolare parola

Saltando alla parola successiva già al primo disaccordoSaltando alla parola successiva già al primo disaccordo

Page 39: Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.

Problema 4Problema 4CodificaCodifica

Vedi testo consigliato DromeyVedi testo consigliato Dromey