Programmazione Procedurale in Linguaggio C Le Stringhe versione

  • Slides: 40
Download presentation
Programmazione Procedurale in Linguaggio C++ Le Stringhe versione 2. 1 Questo lavoro è concesso

Programmazione Procedurale in Linguaggio C++ Le Stringhe versione 2. 1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – mecca@unibas. it – Università della Basilicata

Tipo Stringa >> Sommario m Generalità del Tipo Stringa in C++ m Operazioni sulle

Tipo Stringa >> Sommario m Generalità del Tipo Stringa in C++ m Operazioni sulle Stringhe m Funzioni Predefinite m Lettura e Stampa delle Stringhe m Un Altro Esempio: il FORTRAN 77 m Appendice ðDettagli sulle Funzioni Predefinite G. Mecca - Programmazione Procedurale in Linguaggio C++ 2

Tipo Stringa >> Generalità del Tipo Stringa in C++ m Stringa ðsequenza di caratteri

Tipo Stringa >> Generalità del Tipo Stringa in C++ m Stringa ðsequenza di caratteri racchiusa tra “ “ m Esempi: ð“Mario ð“- - ð“a”, “ ð“” m Differenza Rossi”, “ 123” - - - >”, “risultato = “ ”, “*” con il tipo char ðun singolo carattere (tra apici singoli) G. Mecca - Programmazione Procedurale in Linguaggio C++ 3

Tipo Stringa >> Generalità m Attenzione ðil tipo string è stato introdotto esplicitamente in

Tipo Stringa >> Generalità m Attenzione ðil tipo string è stato introdotto esplicitamente in C++ ðin C non esiste il tipo string e la gestione delle stringhe è decisamente più complessa ðper compatibilità, in C++ esistono sia le stringhe “in stile C” (o “stringhe c”), che le stringhe di tipo string ðdiverse rappresentazioni in memoria ðè possibile trasformare la rappresentazione di una stringa nell’altra G. Mecca - Programmazione Procedurale in Linguaggio C++ 4

Tipo Stringa >> Generalità m Peculiarità del tipo string ðil tipo stringa non è

Tipo Stringa >> Generalità m Peculiarità del tipo string ðil tipo stringa non è un tipo predefinito del C++ (come int o char) ðsi tratta in realtà di una classe di oggetti (nel senso della prog. orientata agli oggetti) ðdi conseguenza le stringhe vengono manipolate in modo leggermente diverso ðoperazioni basate sull’uso del punto (. ), diverse da quelle sui tipi di base G. Mecca - Programmazione Procedurale in Linguaggio C++ 5

Tipo Stringa >> Generalità m Altri esempi di oggetti visti finora ði flussi (gli

Tipo Stringa >> Generalità m Altri esempi di oggetti visti finora ði flussi (gli “stream”) m cout ðoggetto della classe ostream m cin ðoggetto della classe istream mi flussi diretti ai file ðoggetti delle classi ifstream, ofstream G. Mecca - Programmazione Procedurale in Linguaggio C++ 6

Tipo Stringa >> Generalità Dichiarazione delle Variabili m Sintassi ordinaria ðstring <nome. Var>; ðstring

Tipo Stringa >> Generalità Dichiarazione delle Variabili m Sintassi ordinaria ðstring <nome. Var>; ðstring <nome. Var 1>, <nome. Var 2>; ðstring <nome. Var> = <valore. Iniziale>; m Esempi: ðstring nome; ðstring nome, cognome; ðstring matricola = “S 1234”; ðconst string cognome = “Rossi”; G. Mecca - Programmazione Procedurale in Linguaggio C++ 7

Tipo Stringa >> Generalità Dichiarazione delle Variabili m Semantica ðalla variabile viene assegnato uno

Tipo Stringa >> Generalità Dichiarazione delle Variabili m Semantica ðalla variabile viene assegnato uno spazio nella memoria ðlo spazio dipende dalla lunghezza della stringa m Lunghezza della stringa ðnumero di caratteri contenuti m Spazio di memoria iniziale ðinizialmente la stringa viene considerata di lunghezza 0 ðsuccessivamente viene occupato lo spazio di memoria necessario per rappresentare il valore G. Mecca - Programmazione Procedurale in Linguaggio C++ 8

Tipo Stringa >> Operazioni sulle Stringhe m Espressioni sulle stringhe ðcome per gli altri

Tipo Stringa >> Operazioni sulle Stringhe m Espressioni sulle stringhe ðcome per gli altri tipi di dato possono essere operandi nelle espressioni m Esistono ðoperatori predefiniti sulle stringhe ðfunzioni predefinite sulle stringhe G. Mecca - Programmazione Procedurale in Linguaggio C++ 9

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Accesso ai caratteri: s[i]

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Accesso ai caratteri: s[i] ðestrae il carattere in posizione i dalla stringa ðil primo carattere è in posizione 0 m Esempi string s = “Prova “; char c 0 = s[0]; char c 3 = s[3]; cout << c 0 << “ “ << c 3; m 0 1 2 3 4 5 P r o v a Schermo Pv Attenzione: è possibile anche eseguire: char c = s[100]; cout << c << endl; // SCORRETTO G. Mecca - Programmazione Procedurale in Linguaggio C++ 10

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Concatenazione: + ðconcatena il

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Concatenazione: + ðconcatena il valore di due stringhe m Esempi string p 1 = “Questa è “; string p 2 = “una stringa”; string p 3; p 3 = p 1 + p 2; cout << p 3; Questa è una stringa G. Mecca - Programmazione Procedurale in Linguaggio C++ 11

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Confronti ðconfrontano i valori

Tipo Stringa >> Operazioni sulle Stringhe Operatori sulle Stringhe m Confronti ðconfrontano i valori di due stringhe ðordinamento “lessicografico” m Esempi string p 1 = “questa è “; string p 2 = “una stringa”; p 1 == p 2; // falso p 1 != p 2; // vero p 1 >= p 2; // falso p 1 <= p 2; // vero G. Mecca - Programmazione Procedurale in Linguaggio C++ 12

Tipo Stringa >> Funzioni Predefinite m Sintassi particolare: <stringa>. <funzione> ðes: string s; s.

Tipo Stringa >> Funzioni Predefinite m Sintassi particolare: <stringa>. <funzione> ðes: string s; s. size(); m Nel seguito ðuna funzione viene presentata in dettaglio ðsize: calcola la lunghezza della stringa ðtutte le altre sono solo elencate (vedi Appendice) G. Mecca - Programmazione Procedurale in Linguaggio C++ 13

Tipo Stringa >> Funzioni Predefinite m Lunghezza: s. size() ðcalcola la lunghezza della stringa

Tipo Stringa >> Funzioni Predefinite m Lunghezza: s. size() ðcalcola la lunghezza della stringa s m Esempi: string s = “******”; cout << s. size(); 12 string cognome; cout << cognome. size(); G. Mecca - Programmazione Procedurale in Linguaggio C++ 0 14

Tipo Stringa >> Funzioni Predefinite m Altre funzioni ðs. insert(x, s 1): inserimento di

Tipo Stringa >> Funzioni Predefinite m Altre funzioni ðs. insert(x, s 1): inserimento di una stringa in un’altra ðs. erase(x, y): cancellazione di una sottostringa ðs. substr(x, y): estrazione di una sottostringa ðs. find(s 1): ricerca della posizione di una sottostringa ðs. replace(x, y, s 1): sostituzione di una sottostringa con un’altra ðs. c_str(): cambia la rappresentazione di un valore da string ad una stringa del C G. Mecca - Programmazione Procedurale in Linguaggio C++ 15

Tipo Stringa >> Lettura e Stampa delle Stringhe m Stampa ðsi effettua in modo

Tipo Stringa >> Lettura e Stampa delle Stringhe m Stampa ðsi effettua in modo ordinario (<<) m Lettura ðnon è opportuno utilizzare l’operatore di lettura (>>) ðl’input formattato elimina gli spazi che nelle stringhe sono rilevanti (es: “Paolo Rossi”) ðviene utilizzata una modalità diversa, in cui l’input non viene formattato G. Mecca - Programmazione Procedurale in Linguaggio C++ 16

Tipo Stringa >> Lettura e Stampa delle Stringhe m Input non formattato ðistruzione getline

Tipo Stringa >> Lettura e Stampa delle Stringhe m Input non formattato ðistruzione getline m Sintassi getline(<flusso>, <stringa>) <stringa> è una variabile di tipo string <flusso> è il flusso da cui leggere; es: cin m Esempio string s; getline(cin, s); G. Mecca - Programmazione Procedurale in Linguaggio C++ 17

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Semantica ðpreleva

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Semantica ðpreleva una riga di caratteri (spazi inclusi) dal flusso di input e la assegna alla stringa m Riga di caratteri ðtutti i caratteri presenti nel flusso fino al primo carattere di fine riga (n) incluso m Attenzione ðse nel flusso ci sono caratteri di fine riga possono esserci situazioni inaspettate G. Mecca - Programmazione Procedurale in Linguaggio C++ 18

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato string s; getline(cin,

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato string s; getline(cin, s); RAM s: Processore Paolo Rossi n RAM s: Paolo Rossi Processore Dispositivo di ingresso (es: tastiera) ATTENZIONE: il carattere di fine riga viene eliminato (ma solo in alcune versioni del compilatore; es: BCC 5. 5. 1) G. Mecca - Programmazione Procedurale in Linguaggio C++ 19

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato RAM int i;

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato RAM int i; string s; cin >> i; getline(cin, s); i: 2134567 s: Processore 23 n abc n Dispositivo di ingresso (es: tastiera) RAM i: 23 s: Processore G. Mecca - Programmazione Procedurale in Linguaggio C++ 20

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Problema ðnel

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Problema ðnel caso in cui si mischiano input diversi ðogni operazione di lettura formattata lascia un carattere di fine riga nel flusso m Soluzione ðtutte le volte che un input non formattato è stato preceduto da uno formattato è necessario eliminare il carattere di fine riga G. Mecca - Programmazione Procedurale in Linguaggio C++ 21

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Operazione ignore

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato m Operazione ignore ðserve ad eliminare il primo carattere di un flusso m Sintassi <flusso>. ignore() dove <flusso> è il flusso in questione; es: cin m Semantica ðscarta il primo carattere contenuto nel flusso G. Mecca - Programmazione Procedurale in Linguaggio C++ 22

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato RAM int i;

Tipo Stringa >> Lettura e Stampa delle Stringhe Input Non Formattato RAM int i; string s; cin >> i; cin. ignore(); getline(cin, s); i: 2134567 s: Processore 23 n abc n Dispositivo di ingresso (es: tastiera) RAM i: 23 s: abc Processore G. Mecca - Programmazione Procedurale in Linguaggio C++ Dispositivo di ingresso (es: tastiera) 23

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m In FORTRAN ðil

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m In FORTRAN ðil tipo utilizzato per le stringhe è una variante del tipo CHARACTER utilizzato per i caratt. m Sintassi ðcharacter*<lung> <variabile> ðdove <lung> è la lunghezza massima per le stringhe m Esempio ðcharacter*10 nome G. Mecca - Programmazione Procedurale in Linguaggio C++ 24

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Principali operazioni sulle

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Principali operazioni sulle stringhe in FORTRAN ðassegnazione ðconcatenazione ðestrazione di carattere ðestrazione di sottostringa ðcalcolo della lunghezza G. Mecca - Programmazione Procedurale in Linguaggio C++ 25

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Assegnazione ðcharacter*10 nome

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Assegnazione ðcharacter*10 nome ðnome = ‘Franco’ m Concatenazione: // ðcharacter*10 nome, cognome, s ðnome = ‘Franco’ ðcognome = ‘Rossi’ ðs = nome // ‘ ‘ // cognome ðil valore di s è ‘Franco Rossi’ G. Mecca - Programmazione Procedurale in Linguaggio C++ 26

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Estrazione di carattere

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Estrazione di carattere ða differenza del C++ in FORTRAN i caratteri delle stringhe sono numerati a partire da 1 ðcharacter*10 nome ðcharacter c, d ðnome = ‘Franco’ ðc = nome(1: 1) ðd = nome(5: 5) ðin questo caso c vale ‘F’ e d vale ‘o’ G. Mecca - Programmazione Procedurale in Linguaggio C++ 27

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Estrazione di sottostringa

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Estrazione di sottostringa ðstessa sintassi che per i caratteri, ma con indici diversi ðcharacter*10 nome ðcharacter*2 c ðnome = ‘Franco’ ðc = nome(1: 2) ðin questo caso c vale ‘Fr’ G. Mecca - Programmazione Procedurale in Linguaggio C++ 28

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Calcolo della lunghezza:

Tipo Stringa >> FORTRAN Un Altro Esempio: il FORTRAN 77 m Calcolo della lunghezza: LEN ðesiste una funzione predefinita per il calcolo della lunghezza di una stringa ðma il risultato è banale: NON restituisce la lunghezza effettiva, ma la lungh. massima dichiarata ðcharacter*10 nome ðnome = ‘Franco’ ðwrite(*, *) len(nome) ðin questo caso viene stampato il valore 10 G. Mecca - Programmazione Procedurale in Linguaggio C++ 29

Tipo Stringa >> Sommario Riassumendo m Generalità del Tipo Stringa m Operazioni sulle Stringhe

Tipo Stringa >> Sommario Riassumendo m Generalità del Tipo Stringa m Operazioni sulle Stringhe m Funzioni Predefinite m Lettura e Stampa delle Stringhe m Un Altro Esempio: il FORTRAN 77 G. Mecca - Programmazione Procedurale in Linguaggio C++ 30

Tipo Stringa >> Appendice m Funzioni Predefinite sulle Stringhe ðs. size(): calcola la lunghezza

Tipo Stringa >> Appendice m Funzioni Predefinite sulle Stringhe ðs. size(): calcola la lunghezza della stringa ðs. insert(x, s 1): inserimento di una stringa in un’altra ðs. erase(x, y): cancellazione di una sottostringa ðs. substr(x, y): estrazione di una sottostringa ðs. find(s 1): ricerca della posizione di una sottostringa ðs. replace(x, y, s 1): sostituzione di una sottostringa con un’altra ðs. c_str(): cambia la rappresentazione di un valore da string ad una stringa del C G. Mecca - Programmazione Procedurale in Linguaggio C++ 31

Tipo Stringa >> Funzioni Predefinite m Lunghezza: s. size() ðcalcola la lunghezza della stringa

Tipo Stringa >> Funzioni Predefinite m Lunghezza: s. size() ðcalcola la lunghezza della stringa s m Esempi: string s = “******”; cout << s. size(); 12 string cognome; cout << cognome. size(); G. Mecca - Programmazione Procedurale in Linguaggio C++ 0 32

Tipo Stringa >> Funzioni Predefinite m Inserimento: s. insert(x, s 1) ðinserisce la stringa

Tipo Stringa >> Funzioni Predefinite m Inserimento: s. insert(x, s 1) ðinserisce la stringa s 1 nella stringa s prima della posizione x m Esempi string s = “Mario Rossi”; cout << s. insert(10, ”in”); Mario Rossini G. Mecca - Programmazione Procedurale in Linguaggio C++ 33

Tipo Stringa >> Funzioni Predefinite m Cancellazione: s. erase(x, y) ðcancella x caratteri dalla

Tipo Stringa >> Funzioni Predefinite m Cancellazione: s. erase(x, y) ðcancella x caratteri dalla stringa s a partire dalla posizione y m Esempio string s 0 = “Mario Rossi”; cout << s 0. erase(3, 3); Mar. Rossi G. Mecca - Programmazione Procedurale in Linguaggio C++ 34

Tipo Stringa >> Funzioni Predefinite m Estrazione di sottostringa: s. substr(x, y) ðrestituisce la

Tipo Stringa >> Funzioni Predefinite m Estrazione di sottostringa: s. substr(x, y) ðrestituisce la sottostringa della stringa s fatta di y caratteri a partire dalla posizione x m Esempi: string s = “Mario Rossi”; string p 1 = s. substr(6, 4); cout << p 1; Rossi G. Mecca - Programmazione Procedurale in Linguaggio C++ 35

Tipo Stringa >> Funzioni Predefinite m Ricerca di sottostringa: s. find(s 1) ðrestituisce la

Tipo Stringa >> Funzioni Predefinite m Ricerca di sottostringa: s. find(s 1) ðrestituisce la posizione della sottostringa s 1 m Esempio string s 0 = “Alex Del Piero”; cout << s 0. find(“el”); 6 G. Mecca - Programmazione Procedurale in Linguaggio C++ 36

Tipo Stringa >> Funzioni Predefinite m Sostituzione: s. replace(x, y, s 1) ðsostituisce nella

Tipo Stringa >> Funzioni Predefinite m Sostituzione: s. replace(x, y, s 1) ðsostituisce nella stringa s y caratteri a partire dalla posizione x con la stringa s 1 m Esempi: string s = “Mario Rossi”; cout << s. replace(3, 3, ”ta e Tina”); Marta e Tina Rossi G. Mecca - Programmazione Procedurale in Linguaggio C++ 37

Tipo Stringa >> Funzioni Predefinite m Trasformazione in stringa C: c_str() ðtrasforma un valore

Tipo Stringa >> Funzioni Predefinite m Trasformazione in stringa C: c_str() ðtrasforma un valore di tipo string nel corrispondente valore di tipo “stringa C” ðindispensabile per usare funzioni e procedure che prevedono argomenti che sono stringhe C m Esempio: creazione di un flusso su file string nome. File; cin >> nome. File; ifstream flusso. Da. File(nome. File. c_str()); G. Mecca - Programmazione Procedurale in Linguaggio C++ 38

Ringraziamenti m Parte del materiale di questa lezione è stato sviluppato con la collaborazione

Ringraziamenti m Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott. ssa Maria Samela (mariasamela@tiscali. it), a cui va il mio ringraziamento. G. Mecca - Programmazione Procedurale in Linguaggio C++ 39

Termini della Licenza m This work is licensed under the Creative Commons Attribution. Share.

Termini della Licenza m This work is licensed under the Creative Commons Attribution. Share. Alike License. To view a copy of this license, visit http: //creativecommons. org/licenses/by-sa/1. 0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-Share. Alike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http: //creativecommons. org/licenses/by-sa/1. 0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Procedurale in Linguaggio C++ 40