La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI.

Presentazioni simili


Presentazione sul tema: "FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI."— Transcript della presentazione:

1

2 FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI

3 FILE TESTO - Contiene caratteri leggibili - E etichettato con un nome - Ha un indirizzo sullunità di memoria di massa I File testo si possono caricare e modificare con un Editor ad Es. quello del Turbo Pascal, il Word, Note Pad purchè vengano salvati come file testo (suffisso.txt), o con un appropriato programma Pascal. Esempio La vispa Teresa avea tra lerbetta a volo sorpresa gentil farfalletta

4 FILE TESTO In ogni programma Pascal ogni file è identificato attraverso una variabile. PROGRAM EcoFile(output, InFile); VAR Infile : text; Carattere: char; {usato per estrarre i caratteri dal testo} BEGIN ………….. END. UN FILE TESTO NON SI COMPILA PERCHE NON E UN PROGRAMMA !!!!

5 APERTURA DI UN FILE assign( ProvaF, C:\TP\ESEMPI\TESTO.TXT'); assign (IdentificatoreFile,NomeFile) PROGRAM EcoFile(output, ProvaF); VAR ProvaF : text; } BEGIN assign( ProvaF, C:\TP\ESEMPI\TESTO.TXT'); ………….. END. assign ( ) Nome file Identificatore file procedure,

6 Un file non può essere letto e scritto contemporaneamente. La chiamata alla procedura reset può variare da dialetto a dialetto. LETTURA DI UN FILE La procedura reset prepara il file alla lettura.

7 LETTURA DI UN FILE reset (IdentificatoreFile) reset () Identificatore file procedure reset( ProvaF); prepara file per la lettura LavispaT

8 LETTURA DI UN FILE reset nei vari dialetti Supponiamo che il file dati si chiami TESTO.txt VAX e standard Pascal reset(Testo) TURBO PASCAL assign(Infile,TESTO.txt) reset(Infile,TESTO.txt) APPLE PASCAL reset(Infile,TESTO.txt)

9 FILE TESTO Il file testo (.txt) è caratterizzato dallavere un carattere speciale quando termina un rigo, detto eoln (end-of-line) e da un carattere speciale che indica la fine del file detto eof (end-of-file)

10 FILE TESTO Struttura del file testo LavispaT aeolnasere Esempio La vispa Teresa avea tra lerbetta a volo sorpresa gentil farfalletta a v tr.. eof eoln ea

11 Lavispa v Finestra di lettura FILE TESTO i

12 Per sapere quando siamo arrivati a fine rigo o a fine file nella lettura di un file esistono due funzioni eoln(InFile)TRUE se il carattere letto è eoln (fine rigo) eof(InFile)TRUE se il carattere letto è eof (fine file) Solo per i file.txt

13 Lavispa L Posizione e contenuto della finestra di lettura dopo il reset(ProvaF). a Posizione e contenuto della finestra di lettura dopo read(ProLett,Carattere); write(Carattere); L

14 a eof eoln a read(Prolett,Carattere)a eoln(Prolett)FALSE eof eoln(Prolett)TRUE

15 PROGRAM ProvaFiles(input,output,ProLett); {legge dal file TESTO i caratteri uno alla volta e li mostra a video} VAR ProLett: text; Carattere: char; BEGIN assign(ProLett,'C:\TP\ESEMPI\TESTO.TXT'); reset(ProLett); WHILE NOT eof(ProLett) DO BEGIN WHILE NOT eoln(ProLett) DO BEGIN read(ProLett,Carattere); write(Carattere) END; readln(ProLett); writeln; END; readln END. Terminata la lettura di una riga bisogna andare a capo

16 T eoln asere Valori Finestrainput eoln Ch letto Ch mostrato input False T ? 6° True eoln a a 5° False a s s 4° False s e e 3° False e r r 2° False r e e 1° False e T T

17 La chiamata alla procedura rewrite può variare da dialetto a dialetto e risulta operativa solo se il file aperto cui essa fa riferimento non contiene alcun carattere. SCRITTURA DI UN FILE La procedura rewrite prepara il file alla lettura. Quando si scrive un file si presuppone sempre di comnciare dallinizio del file. Se questo avesse già un contenuto questo verrebbe sovrascritto.

18 SCRITTURA DI UN FILE rewrite (IdentificatoreFile) Identificatore file rewrite () rewrite( ProvaF); prepara file per la scrittura

19 SCRITTURA DI UN FILE Si può copiare un file in un altro anche leggendo un rigo alla volta close (IdentificatoreFile) close () Identificatore file procedure close( Prodat);

20 Dopo avere scritto un file è necessario chiuderlo. La procedura close(InFile) chiude il file identificato dalla variabile InFile CHIUSURA DI UN FILE

21 PROGRAM ProvaFiles(input,output,ProInput,ProOut); {esempio di lettura e scrittura di files} {legge dal file TESTO una stringa Stringa e la scrive su COPIA} CONST LungMax=80; {massima lunghezza permessa alle stringhe } TYPE Stringa=STRING[LungMax]; {dipende dal dialetto} VAR ProInput,ProOut: text; {identificatori dei file di lettura e scrittura} Rigo: Stringa; {linea del testo letta e riscritta} BEGIN assign(ProInput,'C:\TP\ESEMPI\TESTO.TXT'); assign(ProOut,'C:\TP\ESEMPI\COPIA.TXT'); reset(ProInput); {prepara file per la lettura} rewrite(ProOut); {prepara file per la scrittura} WHILE NOT eof(ProInput) DO {verifica che non sia finito il file} BEGIN readln(ProInput,Rigo); {leggi il rigo} writeln(ProOut,Rigo){scrivi il rigo} END; close(ProInput);{chiudi il file di input} close(ProOut);{chiudi il file di output} writeln('File Duplicato '); readln END.

22 In lettura i caratteri vengono letti uno alla volta (read) o a gruppi (readln) e la finestra di lettura si comporta come prima descritto. In scrittura i caratteri letti vengono messi in un buffer del file rappresentato dal nome della variabile del file. Il buffer contiene una riga del testo, cioè dallinizio fino a. Con write leggiamo carattere per carattere e lo aggiungiamo nel buffer. Con writeln prima carichiamo il buffer con una riga di testo e poi scarichiamo il suo contenuto sul file di uscita aggiungendo automaticamente alla fine un. A questo punto il buffer si riempie di spazi vuoti ed è pronto a continuare la lettura. Con un read o readln la finestra di lettura fa sempre un passo avanti. Con un write o writeln si aggiunge sempre un carattere al buffer.

23 ESERCIZIO pag. 405 n. 20 per il Laboratorio Generare 100 numeri interi in maniera casuale compresi fra 0 e 50. Scrivere questi numeri su un file 10 per rigo. Leggere i numeri contenuti nel file precedente e per ogni rigo trovare il più piccolo, il più grande e fare la somma dei 10 numeri presenti. Mostrare il numero più piccolo e quello più grande tra tutti quelli presenti nel file e fare la somma di tutti i 100 numeri.

24 ALGORITMI PER IL TRATTAMENTO DI FILE TESTO read mode Lavispa i Finestra di lettura Variabile NomeFile InFile v alla elaborazione

25 ALGORITMI PER IL TRATTAMENTO DI FILE TESTO write mode vispa buffer invio Variabile NomeFile OutFile eoln Lavispa

26 PROGRAM MostraFile(VispaTeresa, output); {mostra il contenuto di un file su monitor} VAR VispaTeresa: text; BEGIN assign(VispaTeresa,C:\TP\ESEMPI\TESTO.txt) reset(VispaTeresa); CopiaFile(VispaTeresa,output); close(VispaTeresa); END. PROCEDURE CopiaFile(VAR InFile,OutFile:text); {i file InFile e OutFile sono già stati preparati per essere letti e scritti} VAR Carattere: char; {carattere da leggere da InFile} BEGIN WHILE NOT eof(InFile) DO {verifica che non sia finito il file} BEGIN WHILE NOT eoln(InFile) DO BEGIN read(InFile,Carattere); {leggi il carattere} write(OutFile,Carattere){scrivi il carattere} END; readln(InFile); writeln(OutFile) END END;

27 CREAZIONE DI UN FILE TESTO DA TASTIERA PROGRAM Digitato(input, output, FileDigitato); {crea un file da tastiera e poi lo mostra } VAR FileDigitato: text; Risposta : char; {per rispondere al quesito} PROCEDURE Istruzioni; BEGIN writeln(Alla fine della digitazione premere CONTROL Z per chiudere il file) END; PROCEDURE CopiaFile(VAR InFile,OutFile: text); BEGIN ********************* END;

28 {************* MAIN ********************} BEGIN assign(FileDigitato,C:/TP/ESEMPI/TESDIG.TXT); rewrite(FileDigitato); CopiaFile(input, FileDigitato); close(FileDigitato); reset(input); {necessario per alcuni dialetti} write(Copia eseguita. Vuoi rivedere il testo ? S/N); readln(Risposta); IF Risposta IN[S,s] THEN BEGIN writeln; reset(FileDigitato); CopiaFile(FileDigitato,output) END; END. CREAZIONE DI UN FILE TESTO DA TASTIERA

29 COPIA DI DUE FILE IN UNO PROGRAM CopiaDueFile(output;Teresa, Giacomo, TerGiac); VAR Teresa, Giacomo, TerGiac: text; PROCEDURE CopiaFile(VAR InFile, OutFile: text); BEGIN ******************* END; BEGIN assign(Teresa,C/TP/ESEMPI/TESTO1.txt); assign(Giacomo,C/TP/ESEMPI/TESTO2.txt); assign(TerGiac,C/TP/ESEMPI/TESTO3.txt); rewrite(TerGiac); reset(Teresa); CopiaFile(Teresa,TerGiac); writeln(TerGiac); reset(Giacomo); CopiaFile(Giacomo,TerGiac); writeln( FINE); close(TerGiac) END.

30 LETTURA DEL NOME DEL FILE DURANTE LELABORAZIONE PROCEDURE ChiamaFile(VAR NomeFile: StringType; VAR UnFile: text); BEGIN write( Dammi il nome del file da elaborare: ); readln(NomeFile); assign(UnFile, NomeFile) END;

31 USO DELLA FUNZIONE eoln Il valore di default della funzione eoln è il file input, cioè se non è dichiarato il nome del file, allora la funzione eoln sarà vera quando battiamo il tasto invio. In questo caso sia per eoln che per read o readln non è necessario mettere il parametro relativo al file. Lettura di un rigo di un file carattere per carattere WHILE NOT eoln(UnFile) DO read(UnFile, Carattere) elabora carattere Alla fine del loop tutti i caratteri del rigo sono stati letti e il carattere eoln è il nuovo candidato ad essere letto. Questo provoca la lettura di uno spazio che in realtà non esiste. Per evitare questo si pone readln(UnFile) readln(UnFile){azzera la finestra di lettura} Senza questa istruzione se cè un altro read verrà letto un blank.

32 ESEMPIO Contare il numero di caratteri digitati e il numero degli spazi. ContaSpazi:=0; ContaCaratteri:=0; WHILE NOT eoln DO BEGIN read(Carattere); ContaCaratteri:=ContaCaratteri+1; IF Carattere = THEN ContaSpazi:=ContaSpazi+1; END; readln; write(Il numero di caratteri totali digitati e,ContaCaratteri, di cui,ContaSpazi, spazi.); Notare che abbiamo usato il file di default input.

33 ESEMPIO Trovare il primo carattere diverso da blank Carattere ; WHILE (Carattere = ) AND NOT eoln(UnFile) DO read(UnFile, Carattere); readln; Leggere caratteri fin quando non si incontra eoln Carattere ; IF NOT eoln(UnFile) THEN read(UnFile, Carattere); ELSE Carattere

34 OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri contiene, concatenare insieme più stringhe. La funzione length(Stringa) restituisce la lunghezza della stringa. Esempio Supponiamo di avere uno spazio di 80 caratteri e vogliamo centrare in questo spazio la scritta SONO AL CENTRO StringaDaMostrare:= SONO AL CENTRO; Spazi:=(80-length(StringaDaMostrare)) DIV 2; writeln( :Spazi, StringaDaMostrare); |………………………SONO AL CENTRO………………………| length

35 CONCATENAZIONE + concat Esempio Teresa e Giacomo Teresa + e + Giacomo Teresa e Giacomo

36 La stringa può essere vista come un ARRAY. TYPE Stringa=STRING[Lunghezza] UnaStringa:Stringa Allora SONO QUI si presenta così UnaStringa[3] = N UnaStringa[7] = U SONOQUI12345678SONOQUI12345678

37 ESEMPIO Trasformare una stringa qualunque in una stringa tutta maiuscolo. PROCEDURE MinMaius(VAR UnaStringa: Stringa); {trasforma una stringa tutta in maiuscolo } VAR Posizione: integer; {posizione del carattere nella stringa} BEGIN FOR Posizione:=1 TO length(UnaStringa) DO UnaStringa[Posizione]:=Maiuscolo(UnaStringa[Posizione]) END; FUNCTION Maiuscolo(Carattere:char):char; BEGIN IF Carattere IN [a..z] THEN Maiuscolo:=chr(ord(Carattere) + ord(A) - ord(a)) ELSE Maiuscolo:=Carattere END;

38 Algoritmo per leggere stringhe e numeri da un file testo Problema: Dato un file testo in cui ci sono una stringa di caratteri e numeri si vuole separare la stringa dai numeri e fare delle operazioni su questi ultimi. In fase di scrittura del file non imponiamo una lunghezza fissa alle stringhe in lettura ma conveniamo di indicare la fine della stringa con un carattere sentinella ad esempio ^. Imponiamo invece la lunghezza massima del rigo. Esempio Verdi Carlo^ 30 29 28 30 Esposito Franco^ 25 27 29 30 Verdi Carlo^ 30 29 28 30 Esposito Franco^ 25 27 29 30 140

39 Pseudocodice {leggi i caratteri finchè non incontri la sentinella e concatenali in una stringa} Sentinella ^ {Inizializza il carattere sentinella} UnaStringa {Inizializza la stringa con la stringa nulla } read(InFile,Carattere) WHILE Carattere <> Sentinella DO UnaStringa UnaStringa + Carattere read(InFile,Carattere)

40 In generale bisogna controllare: se il carattere è la sentinella se il numero di caratteri letti e accumulati nella stringa sono <= della lunghezza massima permessa alla stringa se siamo a fine rigo, cioè se il prossimo carattere è eoln Pseudocodice IF NOT eoln(UnFile) AND NOT (lenght(Stringa)=MaxLung) THEN ELSE Carattere Sentinella WHILE Carattere <> Sentinella DO BEGIN read(UnFile,Carattere) UnaStringa UnaStringa + Carattere END;

41 PROCEDURE LeggiUnRigo(Sentinella: char; VAR UnaStringa: StringaNome; VAR InFile:text); VAR Carattere: char; BEGIN UnaStringa:=''; {inizializza con stringa nulla} IF NOT eoln(InFile) THEN BEGIN read(InFile,Carattere) END ELSE Carattere:=Sentinella; WHILE (Carattere<>Sentinella) DO BEGIN UnaStringa:=UnaStringa+Carattere; IF NOT eoln(InFile) AND (length(UnaStringa)<> LunMassima) THEN BEGIN read(InFile,Carattere) END ELSE Carattere:=Sentinella END END;

42 ESEMPIO 9.2 Problema: Si hanno i dati relativi a M esami fatti da N studenti. Vogliamo leggere questi dati e per ogni studente fare la media. Il file di dati si presente così: 5 4 Rossi Carlo^ 30 28 18 25 Rossi Lucio^ 18 25 22 21 Bianchi Ugo^ 18 18 18 18 Verdi Carlo^ 30 29 28 30 Esposito Franco^ 25 27 29 30 Al primo rigo sono segnati il numero N degli studenti e il numero M di esami. Nei righi successivi ci sono i dati. Ogni stringa che identifica lo studente è terminata con il carattere ^.

43 Output atteso Rossi Carlo ha una media di 24.5 su 4 test. Rossi Lucio ha una media di 28.25 su 4 test. Bianchi Ugo ha una media di 22.3 su 4 test. Verdi Carlo ha una media di 21.5 su 4 test. Esposito Franco ha una media di 26.2 su 4 test. Pseudo Codice Inizializza FOR NumeroStudenti:=1 TO TotaleStudenti MostraStudente(TotaleTest,Risultati)

44 PROGRAM EsamiTest(output,Risultati); CONST Sentinella='^'; LunMassima=40; TYPE StringaNome=STRING[LunMassima]; VAR Risultati: text; NumeroStudenti,TotaleStudenti,TotaleTest: integer; PROCEDURE Inizializza(VAR Risultati: text; VAR TotaleStudenti,TotaleTest: integer); BEGIN ………….. END; PROCEDURE LeggiRigo(Sentinella: char; VAR Nome:StringaNome; VAR Risultati:text); BEGIN ……………………….END; PROCEDURE MostraStudente(TotaleTest:integer;VAR Risultati:text); BEGIN ……………………………… END; {************************** } BEGIN Inizializza(Risultati,TotaleStudenti,TotaleTest); FOR NumeroStudenti:=1 TO TotaleStudenti DO BEGIN MostraStudente(TotaleTest,Risultati) END; readln END.

45 PROCEDURE Inizializza(VAR Risultati: text; VAR TotaleStudenti,TotaleTest: integer); BEGIN assign(Risultati,'C:\TP\ESEMPI\STUDENT1.TXT'); reset(Risultati); readln(Risultati,TotaleStudenti,TotaleTest) END;

46 PROCEDURE MostraStudente(TotaleTest:integer;VAR Risultati:text); VAR Somma,ContoTest,Punteggio: integer; Nome: StringaNome; BEGIN LeggiRigo(Sentinella,Nome,Risultati); Somma:=0; FOR ContoTest:=1 TO TotaleTest DO BEGIN read(Risultati,Punteggio); Somma:=Somma+Punteggio END; readln(Risultati); {non ci sono altri risultati sul rigo} write(Nome, ' ha una media di '); writeln(Somma/TotaleTest:4:2, ' su ',TotaleTest:1,' test') END;

47 PROCEDURE LeggiRigo(Sentinella: char; VAR Nome:StringaNome; VAR Risultati:text); VAR Carattere: char; BEGIN Nome:=''; {inizializza con stringa nulla} read(Risultati,Carattere); WHILE (Carattere<>Sentinella) DO BEGIN Nome:=Nome+Carattere; read(Risultati,Carattere); END END;

48 ESEMPIO 9.3 Supponiamo di dover introdurre delle scritte di controllo in un programma che non funziona. Dopo aver trovato lerrore vogliamo eliminare le scritte di controllo rapidamente. Mettiamo davanti ad ogni scritta di controllo una sentinella uguale per tutte le scritte. Es.{D}writeln(Variabile1,Testo,…); WHILE ….. DO …………………. {D}writeln(Variabile1,Testo,…); FOR ….. TO …………………. {D}writeln(Variabile1,Testo,…);

49 Problema: Scrivere un programma tale che permette di eliminare da un file indicato dallutente tutti i righi preceduti dalla stringa {D} riscrivendo su un nuovo file solo i righi non preceduti da {D}. Pseudo-codice ApriFile(InFile,OutFile), WHILE NOT eof(InFile) DO CreaRigo(InFile,OutFile) close(InFile) close(OutFile) ApriFile: apre i file CreaRigo :decide se copiare o meno il rigo letto a seconda che sia o meno preceduto da {D}

50 PROGRAM Diagnostico(input, output, InFile, OutFile); {elimina dal file InFile tutti i righi preceduti da {D} e lo riscrive cosi corretto in OutFile } CONST Sentinella='{D}'; LunMass=80; TYPE TipoStringa=STRING[LunMass]; VAR InFile, OutFile: text; { --------------------------- } PROCEDURE LeggiNomeFile(VAR NomeFile:TipoStringa;VAR UnFile:text); BEGIN …………………….. END; PROCEDURE ApriFile(VAR InFile,OutFile:text); BEGIN …………………. END; PROCEDURE PrendiRigo(Spazio: char; VAR StringaRisultante: TipoStringa; VAR Infile:text); BEGIN …………………………. END; PROCEDURE CreaRigo(VAR InFile,OutFile: text); BEGIN ………………………………………………. END; { ********* BODY ********* } BEGIN ApriFile(InFile,OutFile); writeln(' Sto copiando il file.........'); WHILE NOT eof(InFile) DO CreaRigo(InFile,OutFile); close(InFile); close(OutFile); writeln(' FINE LAVORO'); readln END.

51 PROCEDURE LeggiNomeFile(VAR NomeFile:TipoStringa;VAR UnFile:text); { legge i nomi dei file } BEGIN writeln; readln(NomeFile); assign(UnFile,NomeFile) END; PROCEDURE ApriFile(VAR InFile,OutFile:text); { apre i file } VAR NomeFile: TipoStringa; BEGIN write('Elimina i righi preceduti da {D}, dal file: '); LeggiNomeFile(NomeFile,InFile); write('Dammi il nome che vuoi attribuire al file corretto: '); LeggiNomeFile(NomeFile,OutFile); reset(InFile); rewrite(OutFile) END;

52 PROCEDURE PrendiRigo(Spazio: char; VAR StringaRisultante: TipoStringa; VAR Infile:text); { prende la prima stringa presente sul rigo - si suppone che la sentinella {D} si trovi a inizio rigo} VAR Carattere:char; BEGIN StringaRisultante:=''; IF NOT eoln(InFile) THEN Read(InFile,Carattere) ELSE Carattere:=Spazio; WHILE Carattere<>Spazio DO BEGIN StringaRisultante:= StringaRisultante+Carattere; IF NOT eoln(InFile) THEN Read(InFile,Carattere) ELSE Carattere:=Spazio END END;

53 PROCEDURE CreaRigo(VAR InFile,OutFile: text); {copia tutti i righi da InFile a OutFile purchè senza sentinrlla} VAR Primo, Resto: TipoStringa; BEGIN PrendiRigo(' ',Primo,InFile); readln(InFile,Resto); IF Primo<>Sentinella THEN writeln(OutFile,Primo+' '+Resto); END; { ******** BODY ******** } BEGIN ApriFile(InFile,OutFile); writeln(' Sto copiando il file.........'); WHILE NOT eof(InFile) DO CreaRigo(InFile,OutFile); close(InFile); close(OutFile); writeln(' FINE LAVORO'); readln END.

54 AVVERTENZE E SUGGERIMENTI usare sempre dei Nomi di Variabile per accedere al contenuto dei file, mai direttamente il nome reale usare sempre close dopo avere utilizzato dei file in letture o scrittura. In scrittura è obbligatorio pena la perdita di dati o danni maggiori. nei vari dialetti lapertura e la chiusura può essere diversa quando si legge un file assicurarsi sempre di controllare leof altrimenti il programma va in errore

55 non usare mai REPEAT ………… UNTIL per controllare eof o eoln. eof ? elabora SI NO REPEAT UNTIL eof ? elabora NO SI WHILE NOT eoln DO REPEAT read(UnFile, Qualcosa) elabora(Qualcosa) UNTIL eoln(UnFile) readln(UnFile) UNTIL eof(UnFIle) VA IN CRASH SE IL FILE E VUOTO

56 eoln spa a spa a p spa p s read WHILE NOT eoln DO elabora read(Carattere) END readln: Lultimo carattere non viene elaborato perché si esce prima dal loop.

57 WHILE NOT eoln DO read elabora eoln spa spa p s spa a

58 Supponiamo di avere un ciclo per elaborare o una linea di dati oppure che esca sulla base di un carattere sentinella. read(unFile, UnValore) WHILE NOT eoln(UnFile) AND NOT (UnValore è una sentinella) DO elabora read(unFile, UnValore) Funziona bene se esce per la presenza della sentinella Funziona male se esce per la presenza del eoln

59 Supponiamo di avere sempre un ciclo per elaborare o una linea di dati oppure che esca sulla base di un carattere sentinella. WHILE NOT eoln(UnFile) AND NOT (UnValore è una sentinella) DO read(unFile, UnValore) elabora Funziona male se esce per la presenza della sentinella Funziona bene se esce per la presenza del eoln

60 IF NOT eoln(UnFile) THEN read(unFile, UnValore) ELSE UnValore sentinella WHILE NOT (UnValore è una sentinella) DO elabora IF NOT eoln(UnFile) THEN read(unFile, UnValore) ELSE UnValore sentinella CODICE CORRETTO

61 Quando in un file ci sono numeri che devono essere letti, fare attenzione che gli eoln siano messi accanto alla fine del numero e non preceduti da uno spazio. Esempio: 44 55 69 33 68 98 45 87<eoln) In questo caso non vengono letti due righi di 3 e 5 numeri ma un solo rigo di 8 numeri, perché dopo avere letto 69 poiché cè uno spazio non legge ma va a leggere direttamente il numero successivo WHILE NOT eoln(InFile) DO BEGIN read(InFile, Numero); elabora(Numero) END; readln(InFile) SBAGLIATO!!!

62 ATTENZIONE SE I FILE DI DATI NON SONO SICURI METTERE QUANTI PIU CONTROLLI E POSSIBILE !!!!!!!!!!! FARE DEI TEST CON FILE NOTORIAMENTE ERRATI VEDERE COSA SUCCEDE E METTERE I CONTROLLI OPPORTUNI !!!!!!!!!!!! ESEMPIO DARE VALORI CHE PORTANO I CONTATORI FUORI RANGE DARE VALORI NEGATIVI SE SONO PREVISTI SOLO POSITIVI DARE VALORI CHE SI SA NON DOVREBBERO POTER ESSERE ELABORATI …………………….

63

64 IL PROBLEMA DELLA CIFRATURA A CHIAVE Dato lalfabeto di 26 lettere si fanno corrispondere alle singole lettere dellalfabeto in chiaro le stesse lettere in un ordine diverso. Con il metodo della sostituzione per chiave si scelgono una o due parole, si eliminano gli spazi e le lettere ripetute e si usa la sequenza di caratteri così ottenuta come sequenza iniziale dellalfabeto cifrante. Le successive lettere si ottengono facendo seguire allultima lettera quelle che nellalfabeto in chiaro la seguono ordinatamente escludendo ovviamente quelle già usate nella prima parte. Es. Parole chiave = Giulio Cesare = GIULOCESAR A B C D E F G H I J K L M N O P Q R S T U V W X Y Z G I U L O C E S A R T V W X Y Z B D F H J K M N P Q Esempio Crittografare diverte Udahhyegdcgdo lakodo

65 Realizzare un sistema di crittografia e decifrazione a chiave. Si assegni una Frase chiave a piacere. Si costruisce lalfabeto cifrante secondo lo schema precedente. Si legga un testo da un file.txt e si codifichi secondo la chiave prevista. Si mostri il testo cifrato. Assegnato un testo cifrato e la chiave di cifra decodificare il testo e mostrarlo in chiaro. Dopo aver cifrato e decifrato un testo confrontare carattere per carattere il testo decifrato con il testo di partenza.


Scaricare ppt "FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI."

Presentazioni simili


Annunci Google