OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

Stringhe Operare con le stringhe con laiuto degli array.
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Informatica 22/03/2012.
String c++.
Stringhe di caratteri In linguaggio C.
PROGRAMMARE IN PASCAL (le basi)
I File di testo in Pascal
Lez. 11 (11/12) - PBElementi di Programmazione1 Lezione 11 Esercizi.
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
Laboratorio Matematica e Informatica
numero rette n numero parti piano f(n) f(n -1)n -1 f(n -1) + nn numero parti piano f(n) numero rette n.
Programmazione Concorrente
INFORMATICA Strutture iterative
Cammini minimi con sorgente singola
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Informatica di base A.A. 2003/2004 Algoritmi e programmi
File.
Università degli Studi di Bergamo Facoltà di Lingue e Letterature Straniere Facoltà di Lettere e Filosofia A.A Informatica generale 1 Appunti.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Corso di Informatica (Programmazione)
Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION:
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Ricorsione e Debug.
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati (Mod. B)
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
APPUNTI SUL LINGUAGGIO C
Funzioni di Libreria per le stringhe DICHIARAZIONI CONTENUTE NEL FILE: char *strcpy( char *dest, const char *sorg ); Copia sorg in dest, incluso il carattere.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.
Algoritmi su Tipi Semplici
Strutture di controllo nel C
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.
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.
Programmazione in Java Claudia Raibulet
File ad accesso casuale o random
I numeri di Fibonacci.
Introduzione agli algoritmi e strutture dati 3/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2010 – The McGraw-Hill Companies srl.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
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);
Javascript Istruzioni di ciclo: for(inizio; condizione; incremento ) {blocco istruzioni} istruzione seguente; – inizio e incremento possono contenere più.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
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.
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.
RossiUgo /8796 BianchiCarlo /8746 II I Sia dato un file di testo riguardante un insieme di studenti di cui è.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
Operatori di incremento e decremento
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.
Interpreti e compilatori
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Transcript della presentazione:

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

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

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 SONOQUI SONOQUI

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;

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^ Esposito Franco^ Verdi Carlo^ Esposito Franco^

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) 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;

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;

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^ Rossi Lucio^ Bianchi Ugo^ Verdi Carlo^ Esposito Franco^ 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 ^. Output atteso Rossi Carlo ha una media di 24.5 su 4 test. Rossi Lucio ha una media di 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.

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.

PROCEDURE Inizializza(VAR Risultati: text; VAR TotaleStudenti,TotaleTest: integer); BEGIN assign(Risultati,'C:\TP\ESEMPI\STUDENT1.TXT'); reset(Risultati); readln(Risultati,TotaleStudenti,TotaleTest) END; 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;

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;

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. {D}writeln(Variabile1,Testo,…); WHILE ….. DO …………………. {D}writeln(Variabile1,Testo,…); FOR ….. TO …………………. {D}writeln(Variabile1,Testo,…); 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}

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.

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;

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;

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.

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

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

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.

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

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 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

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

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: <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!!!