In Pascal è possibile avere oltre ai file testo, cioè file di char, anche file di interi, stringhe, records. Unica condizione è quella che se un file.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

Shell: variabili di sistema PATH HOME USER PWD SHELL HOSTNAME HOSTTYPE Per visualizzare il valore di tutte le variabili dambiente si usa il comando set.
Esercizio Usate il ciclo repeat until (controllo post condizionale) per simulare il prodotto N x M con M somme di N. Esempio: 5 x 3 equivale a fare 5 +5.
Informatica 22/03/2012.
CAPITOLO 2.
LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
PROGRAMMARE IN PASCAL (le basi)
I File di testo in Pascal
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
Programmazione Concorrente
Programmazione Procedurale in Linguaggio C++
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
File.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Indipendenza lineare,
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Ricorsione e Debug.
1. 2 ALCUNE INFORMAZIONI PRELIMINARI Docente: E. Burattini Libri di testo: Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione,
Programmazione Mod. B - prof. Burattini - Cap 17 1.
Introduzione agli stream e alle classi
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Introduzione alla programmazione lll
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.
Organizzazione del corso
Algoritmi su Tipi Semplici
Istruzioni Decisionali
Problema Ci sono 5 signore nel parco. Ognuna di loro ha 1 figlio. Ogni bambino ha 10 figurine di calciatori, per un totale quindi di 50 figurine. Questi.
OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri.
CAPITOLO 7.
FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI.
Primo progetto intercorso Simulare lattività di un distributore automatico di generi alimentari in cui sono in vendita prodotti con data di scadenza.
CAPITOLO 10.
RICORDARSI DI PRENOTARE GLI SCRITTI NOTE SUL PROGETTO LA FRASE CHIAVE DEVE POTER CONTENERE SIA SPAZI CHE LETTERE MAIUSCOLE. QUANDO SI MOSTRA IL CONTENUTO.
In Pascal è possibile avere oltre ai file testo, cioè file di char, anche file di interi, stringhe, records. Unica condizione è quella che se un file.
CAPITOLO 6.
I File.
Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX AWK Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Lezione 2 Programmare in ASP
Corso di PHP.
File I record.
File ad accesso casuale o random
Programmazione Mod. B - prof. Burattini - Cap 17 1.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
PROBLEMA ALGORITMO PROGRAMMA LINGUAGGI di PROGRAMMAZIONE
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Programmazione Strutturata
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
CORSO DI PROGRAMMAZIONE II Lezione 22
Il linguaggio Fortran 90: 3. Procedure e Funzioni
JavaScript Generalità Cos'è JavaScript?
Lezione 3 Struttura lessicale del linguaggio
ESERCIZIO Assegnata una lista L di caratteri ed un carattere k, scrivere una procedura che cancelli tutte le occorrenze di k in L. PROGRAM Liste(output,input);
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
RossiUgo /8796 BianchiCarlo /8746 II I Sia dato un file di testo riguardante un insieme di studenti di cui è.
Lez. 11 (13/14)Elementi di Programmazione1 Lezione 11 Esercizi.
Ancora sulla shell. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Stringhe In linguaggio C. Stringhe  Un insieme di caratteri in sequenza forma una stringa.  Alcuni linguaggi definiscono per le stringhe uno specifico.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Transcript della presentazione:

In Pascal è possibile avere oltre ai file testo, cioè file di char, anche file di interi, stringhe, records. Unica condizione è quella che se un file è ad esempio dichiarato di interi esso non può contenere che interi. Tutti i file di tipo non-testo sono detti file binari.

La estensione di un file testo è NomeFile.txt La estensione di un file binario è NomeFile.dat La sintassi di un file binario è diversa da quella di un file testo. identificatore = FILEOF type

PROGRAM FileTesto(output, Teresa); VAR Teresa:text; Ch:char; BEGIN END. PROGRAM FileBinari(output, Ints,Reals,Records); TYPE String30=STRING[30]; NameType=RECORD First, Middle, Last:String30; END; IntsFile=FILE OF integer; RealsFile=FILE OF real; RecFile=FILE OF NameType; VAR Ints:IntsFile; Reals:RealsFile; Names:RecFile; BEGIN END. Preparazione alla lettura del file reset(NomeFile) es. reset(Reals) Preparazione alla scrittura del file rewrite(NomeFile) es. rewrite(Reals)

Il controllo di fine file viene eseguito come per i text file con la funzione eof(NomeFile) Essendo i dati scritti uno di seguito all’altro non esiste più l’. Nel caso del RecFile i record NameType=RECORD descritti da First, Middle, Last:String30; avremo La lettura avviene record per record, non stringa per stringa Giulio Luca RossiCarlo Maria BianchiGian Giacomo Verdi…………….. Carlo Maria Bianchi Area Dati AName.First  Carlo AName.Middle  Maria AName.Last  Bianchi

E’ possibile leggere anche più di un valore alla volta da un file. Esempio read(Reals, R1, R2, R3,….) Per leggere un intero file si può far uso dell’ Esempio reset(Ints); WHILE NOT eof(Ints) DO BEGIN read(Ints, Intero); elabora(Intero) END; L’uso dell’ produce un errore di sintassi.

E’ possibile scrivere in un file binario se ovviamente è stato preparato per la scrittura. Esempio write(Ints, AnInt, 3*AnInt); write(Reals, Re1, ); write(Names, AName); write(Names, Name1, Name2); Come si vede anche più di un dato può contemporaneamente essere scritto in un file binario. Attenzione !!! Ogni elemento che si scrive deve essere dello stesso Type del file. Quindi sono sbagliate le scritture del tipo write(Ints, Re1, 3.2*Re1); write(Reals, AnInt, AnInt DIV 2); write(Names, Aname.First, Aname.Middle, Aname.Last); Errore !!!!!! Non essendoci non è permesso il writeln. TYPE String30=STRING[30]; NameType=RECORD First, Middle, Last:String30; END; IntsFile=FILE OF integer; RealsFile=FILE OF real; RecFile=FILE OF NameType; VAR Ints:IntsFile; Reals:RealsFile; Names:RecFile;

COPIA DI FILE BINARI Supponiamo di avere due file binary AFile e Bfile aventi lo stesso Type le cui componenti sono del tipo ComponentType. WHILE NOT eof(Afile) DO read(Afile, Acomponent) write(Bfile, Acomponent) PROCEDURE CopyFile(VAR InNames, OutNames:RecFile); VAR AName:NameType; BEGIN WHILE NOT eof(InNames) DO read(InNames, AName); write(OutNames, AName) END END;

Si noti che con una sola operazione di read o write si possono leggere molti valori contemporaneamente se questo è previsto dalla struttura dei file in gioco. Ad esempio un record con 20 campi può essere scritto con una sola operazione e non campo per campo. Nel caso in cui si vogliono dare i valori di un record campo per campo, ad esempio da tastiera, allora si può adoperare la seguente procedura: WITH RecordVar DO introduci il valore del campo write(OutFile, RecordVar)

PROCEDURE WriteAName(VAR OutFile:NameFile); VAR Aname: NameType; BEGIN WITH Aname DO BEGIN write(‘ First Name: ‘); readln(First); write(‘ Middle Name: ‘); readln(Middle ); write(‘ Last Name: ‘); readln(Last ); END; write(OutFile, AName) END; TYPE String30=STRING[30]; NameType=RECORD First, Middle, Last:String30; END; IntsFile=FILE OF integer; RealsFile=FILE OF real; RecFile=FILE OF NameType; VAR Ints:IntsFile; Reals:RealsFile; Names:RecFile;

TYPE Stringa20 = STRING[20] RisultatiArray=ARRAY[1..TotaleProve] OF integer; AnagraficaRecord = RECORD Cognome, Nome : Stringa20 END; DataRecord = RECORD Giorno, Mese, Anno :integer END; StuRecord = RECORD Anagrafe:AnagraficaRecord; Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real; END; Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia CONST MaxStud=150; TYPE StuRecord = RECORD ………………. END; ClassArray=ARRAY[1..Maxstud] OF StuRecord; StuRecFile=FILE OF StuRecord; VAR InFile:StuRecFile; AClass: ClassArray; TotalStudents:integer;

Procedura per la costruzione di un Array di record a partire da un file binario. PROCEDURE FillClass(VAR AClass: ClassArray; VAR TotalStudents: integer; VAR InFile: StuRecFile); VAR AStudent: StuRecord; BEGIN TotalStudents:=0; reset(InFile); WHILE NOT eof(InFile) DO BEGIN TotalStudents:= TotalStudents+1; read(InFile, AStudent); Aclass[TotalStudents]:=AStudent END END; Supponiamo di introdurre meno di MaxStud record StuRecord = RECORD Anagrafe:AnagraficaRecord; Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real; END;

AGGIORNAMENTO DI FILE DI RECORD BINARI Dati due File di record binari ordinati, fare il merge del primo nel secondo producendo un terzo file ordinato. Corso Programmazione Sessione Estiva CSPE99 Corso Programmazione Sessione Invernale CSPI99 Corso Programmazione CSP99 Semester OldMaster NewMaster merge SessioneStuRecord SessioneStuRecord MStuRec

Alcuni suggerimenti sui file Evitare di usare il REPEAT … UNTIL quando si leggono file binari o testo. reset(SomeFile) REPEAT read(SomeFile,SomeComponent) elabora(SomeComponent) UNTIL eof(SomeFile) reset(SomeFile) IF NOT eof(SomeFile) THEN REPEAT read(SomeFile,SomeComponent) elabora(SomeComponent) UNTIL eof(SomeFile) SBAGLIATO !!!!!!!!!! CORRETTO !!!!!!!!!! Non mettere mai un reset o un rewrite all’interno di un loop. WHILE NOT eof(SomeFile) DO BEGIN reset(SomeFile); read(SomeFile,SomeComponent) elabora(SomeComponent) END; SBAGLIATO !!!!!!!!!!

Ricordare che il valore di una variabile file cambia sempre quando si usano il read o il write, quindi le chiamate alle variabili file vanno sempre fatte per VAR e mai per valore. Ricordare che readln e writeln si possono usare solo con i file testo e non con i file binari. Quando si implementano procedure per la gestione di file realizzare sempre procedure per provare se i record o comunque i dati sono correttamente inseriti facendo le prove con pochi esempi.

UNIT STRINGHE Si vuole creare una UNIT che operi sulle stringhe e che sia il più possibile indipendente dal dialetto PASCAL adoperato. StringADT Len Chars Adoperiamo una struttura a RECORD per il data Type Array

UNIT Stringa; INTERFACE CONST MaxLength=80; TYPE SysString=STRING[MaxLength]; StringADT=RECORD Chars:ARRAY[1.. MaxLength] OF char; Len:0.. MaxLength END;

Constructor - cambia o inizializza i valori di una variabile astratta Primitive constructor - assegna un valore ad una variabile astratta senza fare uso di altre variabili astratte dello stesso tipo. Ha una sola variabile di output e quelle di input servono per costruire l’output.

IMPLEMENTATION PROCEDURE NullString(VAR OutStr:StringADT); BEGIN END; ritorna una la stringa nulla ‘’. Primitive constructor PROCEDURE ConvertSysString(StrValue:SysString; VAR OutStr:StringADT); VAR Position:1..MaxLength; BEGIN WITH OutStr DO BEGIN Len:=length(StrValue); FOR Position:=1 TO Len DO Chars[Position]:=StrValue[Position] END END; converte una stringa rappresentata in un qualche sistema nella stringa equivalente di type StringADT

Primitive constructor PROCEDURE ReadString(Sentinel:char;VAR OutStr:StringADT; VAR InFile:text); VAR Ch:char; BEGIN WITH OutStr DO BEGIN Len:=0; ReadCh(Sentinel,Ch,Len,InFille) WHILE Ch<>Sentinel DO BEGIN Len:=Len+1; Chars[Len]:=Ch; ReadCh(SentinelCh,Len,InFile) END END; legge la stringa da un file escludendo eventuali caratteri sentinella

PROCEDURE ReadlnString (Sentinel:char; VAR OutStr:StringADT;VAR InFile:text); VAR Ch:char; BEGIN WITH InString DO BEGIN Len:=0; WHILE NOT eoln(InFile) AND NOT (Len=MaxLength) DO BEGIN Read(Infile,Ch); Len:=Len+1; Chars[Len]:=Ch; END END; legge una stringa da una linea di un file predeterminato Primitive constructor

SELECTOR - fornisce informazioni su una variabile di input ADT ad un parametro di uscita. Spesso è una funzione (il parametro di uscita in tal caso è la funzione stessa). Primitive selector - ritorna il valore di uno dei componenti della variabile astratta.

FUNCTION ACh(Instr:StringADT;Position:integer):char; BEGIN IF Position>InStr.Len THEN Ach:=chr(0) ELSE Ach:=InStr.Chars[Position] END; ritorna il carattere N-esimo di una stringa Primitive selector FUNCTION StrLength(Instr:StringADT):integer; BEGIN StrLength:=Instr.Len END; ritorna la lunghezza della stringa Primitive selector

Non-primitive selector - ritorna il valore che non è relativo ad uno dei componenti della variabile astratta ma ciò nonostante è utile al client.

PROCEDURE WritelnString(InStr:StringADT; VAR OutFile:text); BEGIN WriteString(Instr,OutFile); writeln(OutFile) END; scrive una stringa in un file seguita da un Non-primitive selector PROCEDURE WriteString (InStr:StringADT; VAR OutFile:text); VAR Position:integer; BEGIN WITH InStr DO FOR Position:=1 TO Len DO write(OutFile,Chars[Position]) END; scrive una stringa in un file Non-primitive selector

Selector operations FUNCTION StartPos((Substr, SearchStr:StringADT):integer; VAR SLen,Pos: integer; Found: Boolean; CandStr: StringADT; BEGIN SLen:=SubStr.Len; Found:=FALSE; Pos:=1; WHILE NOT (SearchStr.Len+1-Pos>SLen) AND NOT Found DO BEGIN StrExtract(SearcStr,Pos,SLen,CandStr); IF StrEqual(CandStr,SearchStr) THEN Found:=TRUE ELSE Pos:=Pos+1 END; IF Found THEN StratPos:=Pos ELSE StratPos:=0 END; Ritorna la posizione di partenza di una data sub- stringa nell’ambito di una preassegnata stringa

PREDICATE - è una funzione booleana che ritorna informazioni sul valore o lo stato di una variabile astratta.

FUNCTION StrEqual(Instr1, Instr2:StringADT):boolean; VAR Pos, TotalChars:integer; StillEqual:boolean; BEGIN IF Instr1.Len<>Instr2.Len THEN StillEqual:= FALSE ELSE StillEqual:= TRUE; TotalChars:= Instr1.Len; Pos:=1; WHILE NOT(Pos>TotalChars) AND StillEqual DO IF Minuscole(InStr1.Chars[Pos])<> Minuscole(InStr2.Chars[Pos]) THEN StillEqual:= FALSE ELSE Pos:=Pos+1; StrEqual:=StillEqual END; ritorna TRUE se due stringhe hanno gli stessi caratteri e la stessa lunghezza Predicate operations

FUNCTION StrLessThan(InStr1, InStr2:StringADT):boolean BEGIN ………………. END; ritorna TRUE se la prima stringa precede alfabeticamente la seconda

Non-primitive constructor -. Ha almeno una variabile di input il cui tipo è uguale a quello dell’output.

PROCEDURE ChConcat (Ch; VAR InOutStr:StringADT); BEGIN WITH InOutStr DO IF Len<MaxLength THEN BEGIN Len:=Len+1; Chars[Len]:=Ch END END; concatena un singolo carattere ad una stringa Non-primitive constructor

PROCEDURE StrExtract(InStr:StringADT; Start, TotalChs:integer; VAR OutStr: StringADT); VAR InStrPos, OutStrPos :integer; BEGIN WITH OutStr DO BEGIN IF Start > Instr.Len THEN Len:=0 ELSE IF TotalChs > InStr.Len+1-Start THEN Len:=InStr.Len+1-Start ELSE Len:=TotalChs; InStrPos:=Start; FOR OutStrPos:=1 TO Len DO BEGIN Chars[OutStrPos]:=InStr.Chars[InStrPos]; InStrPos:=InStrPos+1 END END; copia una stringa di una predeterminata lunghezza a partire da una determinata posizione in una stringa di output

Non-primitive constructor PROCEDURE StrRemove(Start, TotalChs:integer; VAR InOutStr: StringADT); PredString, SuccString: StringADT; BEGIN IF NOT (Start>InOutStr.Len) THEN BEGIN StrExtract(InOutStr,1,Start-1,PredString); StrExtract(InOutStr,1,Start+TotalChs,InOutStr.Len,SuccString); StrConcat(PredString, SuccString,InOutStr) END END; rimuove un predeterminato numero di caratteri a partire da una certa posizione di una stringa di input/output PROCEDURE StrInsert(InStr:StringADT; Start:integer; VAR InOutStr: StringADT); BEGIN END; inserisce un predeterminata stringa di caratteri a partire da una certa posizione in una variabile stringa.

PROCEDURE ReadCh(Sentinel:char;PresentLength:integer; VAR Ch:char;VAR InFile:text); BEGIN IF NOT(eoln(InFile) OR (PredsentLength= MaxLength)) THEN Read(InFile,Ch); ELSE Ch:=Sentinel END; legge i caratteri di una stringa da un file e se supera la lunghezza prefissata o trova eoln restituisce un carattere sentinella Non-primitive constructor

FUNCTION Minuscole(Ch:char):char; BEGIN IF Ch IN ['A'..'Z'] THEN Minuscole:=chr(ordCh)+ord('a')-ord('A')) ELSE Minuscole:=Ch END; trasforma le maiuscole in minuscole

PROCEDURE ChConcat (Ch; VAR InOutStr:StringADT); BEGIN WITH InOutStr DO IF Len<MaxLength THEN BEGIN Len:=Len+1; Chars[Len]:=Ch END END; concatena i caratteri in una stringa controllando che la lunghezza massima non venga superata

ESERCIZIO Sia assegnato un file così caratterizzato Informazioni Varie Testo Messaggio …………………. Informazioni Varie Testo Messaggio …………………. Informazioni Varie Testo Messaggio …………………. Scrivere una procedura per estrarre per ogni mittente solo il testo del messaggio. Costruire un array con gli indirizzi dei mittenti. Mostrare per ogni mittente il messaggio