Introduzione alle stringhe e algoritmi collegati

Documenti analoghi
Caratteri e stringhe

L AMBIENTE CODE BLOCKS E L IO

Lezione 8: Stringhe ed array multidimensionali

C: panoramica. Violetta Lonati

Puntatori e array. Violetta Lonati

Lezione 6 Introduzione al C++ Mauro Piccolo

I CARATTERI E LE STRINGHE

Esercitazione di Reti degli elaboratori

La codifica digitale

Il linguaggio C. Puntatori e dintorni

Introduzione al linguaggio C Primi programmi

Implementazione di DFA in C

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

(Def. funzioni con parametri di tipo matrice)

Introduzione al linguaggio C Puntatori

Sommario. Tipo stringa: string. Tipo stringa: stile C. Tipo stringa Tipo booleano

Dati due punti sul piano calcolare la loro distanza

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

A. Veneziani - Le variabili puntatore

I tipi strutturati e i record in C++

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 02/04/2014/ Appello straordinario/ Foglio delle domande / VERSIONE 1

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 05/02/2014/ Foglio delle domande / VERSIONE 1

Strutture Dati. Nicu Sebe. Informatica Nicu Sebe 1 / 27

ALGORITMI E STRUTTURE DATI

Tipi strutturati in C. Stringhe

Array k-dimensionali

L AMBIENTE CODE BLOCKS E L IO

Strutture dati e loro organizzazione. Gabriella Trucco

Corso di Fondamenti di Informatica

Strutture Dati. Luca Abeni

Corso di Fondamenti di Informatica Tipi strutturati: Stringhe

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Fondamenti di Informatica Ing. Biomedica

Allocazione Dinamica della Memoria

Primi programmi in C

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Variabili e Costanti

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

La Programmazione. Cos è la programmazione? Concetti preliminari

Caratteri e stringhe

Introduzione ai puntatori in C Definizione

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

Laboratorio di programmazione

Corso di Informatica

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Linguaggio C - Stringhe

Dati aggregati. Violetta Lonati

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Costanti e Variabili

Introduzione alla programmazione. Alice Pavarani

Titolo presentazione

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

La Codifica e la Rappresentazione dei dati

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Struttura di un linguaggio

4 GLI ARRAY E LE STRINGHE

Variabili e Funzioni. Informatica 1 / 19

viene chiamato base del sistema di numerazione ed è costituito da r simboli ordinati tra i quali compaiono lo zero è l unità.

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Linguaggio C: Stringhe Valeria Cardellini

a.a Codice corso: 21012, 22010

Linguaggio C - sezione dichiarativa: costanti e variabili

Stringhe e allocazione dinamica della memoria

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

5.4 Istruzione di input L istruzione di input ha la forma:

La codifica. dell informazione. Codifica dei numeri. (continua) Codifica dei numeri. Codifica dei numeri: il sistema decimale

File binari e file di testo

Liste concatenate e allocazione dinamica

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Lezione 5: Introduzione alla programmazione in C

LEZIONE 1 LE BASI DEL LINGUAGGIO C

Codifica binaria dell informazione

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Introduzione al linguaggio C Dati aggregati

Introduzione alla STL

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Tipi strutturati - struct

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

1

Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Tipi di dato primitivi

Transcript:

Introduzione alle stringhe e algoritmi collegati Algoritmicamente August 15, 2009 1 Introduzione 1.1 Introduzione ai caratteri In informatica o più generalmente in una terminologia scientifica, il carattere è l unità di informazione minima (un simbolo) di un linguaggio naturale. Definizione 1 Un linguaggio è un sistema di comunicazione tra individui. Definizione 1.1 L unità minima di un linguaggio è un simbolo, chiamato carattere. Il carattere ci permette di esprimere un linguaggio. Un esempio di carattere può essere dato da un numero (0, 1, 2,..., 9), una lettera o un segno di interpunzione. Anche uno spazio è un carattere. In informatica un carattere non è solo un segno di un linguaggio naturale ma può anche essere un elemento di controllo per alcune determinate azioni. Un esempio di elemento di controllo o carattere di controllo è un Carriage return (return) o un EOF (End of File). Definizione 1.1.1 Un carattere di controllo è un sottogruppo di caratteri che viene usato per determinate operazioni di preprocessing e gestione. In informatica, i caratteri vengono rappresentati secondo una codifica che, generalmente, assegna ad ogni carattere un numero, rappresentato come serie di bit. Definizione 2 Un sistema di codifica di caratteri è formato da un codice che opera su due insiemi, un insieme di caratteri e un insieme di oggetti. Il codice associa ogni elemento dell insieme di caratteri ad uno e un solo elemento del secondo insieme. Lo scopo di un sistema di codifica è quello di facilitare la rappresentazione dei caratteri usati in un linguaggio naturale. 1

1.2 Le stringhe Oggetto principale di questo articolo sono le stringhe. Una stringa in informatica è una sequenza di caratteri. Un esempio di stringa può essere la frase Ciao Federica!. Una stringa, in un linguaggio di programmazione, può essere un tipo di dato primitivo (il linguaggio di programmazione offre la possibilità di usare direttamente una stringa, già esistente come tipo di dato) o composito (il linguaggio di programmazione offre la possibilità di creare, attraverso una modellazione di entità quali oggetti o strutture, un tipo di dato stringa). Definizione 1 Una stringa in informatica è una sequenza di caratteri. Diamo adesso una definizione formale di stringa che useremo per definire alcune operazioni. Definizione 1.1 Una stringa è una sequenza composta da un certo numero di oggetti appartenenti ad un alfabeto. Definizione 1.2 Un alfabeto è un insieme finito non vuoto C di elementi chiamati caratteri. Definizione 2 Una stringa in C è una qualsiasi disposizione finita di caratteri di C. Diamo, per semplicità, la definizione di disposizione. Definizione 2 Dati due interi positivi n e k, si definisce disposizione di n elementi di classe k ogni sottoinsieme ordinato di k oggetti estratti da un insieme di n oggetti, dove i sottinsiemi differiscono per qualche elemento diverso o per gli stessi elementi ma in ordine inverso ( ciao! = cioa ). Una stringa quindi una sequenza di caratteri presi da un alfabeto. Presentiamo di seguito un esempio: se C = {a, b, c}, le stringhe in C sono nella forma: Notiamo:, a, b, c, ab, ac, abc, abca,... - Una stringa in C può esser formata da nessun carattere. Questa stringa viene chiamata stringa vuota. - Seguendo l esempio superiore, formalmente possiamo definire una sequenza infinita (stringa infinita) quando la lunghezza della stringa n non è fissata (possiamo creare delle disposizioni al variare di n). Le sequenze infinite non vengono prese in considerazione in ambito 2

informatico, quindi possiamo affermare che ogni stringa abbia una propria lunghezza. Definizione 2.1 Una stringa vuota è una stringa composta da nessun carattere. Definizione 2.2 Ogni stringa ha una lunghezza n, dove n indica la lunghezza della sequenza di caratteri (la stringa ciao ha lunghezza n = 4; la stringa vuota ha lunghezza n = 0). 1.3 Rappresentazione delle stringhe La rappresentazione di una stringa in un sistema informatico avviene tramite il character encoding, ovvero un sistema il cui compito è quello di formare una coppia (corrispondenza biunivoca) tra una sequenza di caratteri e un set di caratteri. Un set di caratteri (o character set) è un gruppo di caratteri (inclusi caratteri di controllo). Compito principale del character encoding è quello di codificare una data sequenza di caratteri nelle rispettive componenti del character set usato. Un esempio di character encoding è il codice Morse, il quale codifica ogni lettera e numero in una serie di segnali ad intermittenza. Attualmente, in ambito informatico si usano sistemi come ASCII e Unicode e codifiche quali UTF-8 e UTF-16 (i quali non saranno argomento di questo articolo). Le implementazioni usate nella maggior parte dei linguaggi di programmazione identificano la stringa simile ad un array, i cui elementi contengono i codici corrispondenti ai rispettivi caratteri definiti nel set di caratteri che si sta utilizzando. La lunghezza di una stringa può essere ricavata implicitamente da uno speciale carattere di terminazione. Questo carattere, generalmente, è il carattere nullo (NULL) avente codice zero. Qui sopra osserviamo l esempio di una stringa null-terminated: la lunghezza è di 8 caratteri e la fine è indicata dal carattere NULL; la stringa è rappresentata in codifica ASCII (valori esadecimali) e occupa 9 byte (il carattere NULL occupa comunque 1 byte). La rappresentazione usata sopra è la più comune ma altre rappresentazioni sono possibili. 3

1.4 Uso delle stringhe in C++ Analizzeremo ora l uso delle stringhe nel linguaggio di programmazione C++. Abbiamo scelto questo linguaggio poiché gli algoritmi che studieremo saranno presentati, scritti e studiati in codice C++. Naturalmente il tutto può essere adattato a qualunque linguaggio ma per comodità abbiamo scelto di usare il C++ per andar fino in fondo al discorso. La rappresentazione di una stringa in C++ è di due tipi: stringa in stile C e classe standard stringa. Nei nostri esempi useremo, a seconda del problema, l una o l altra rappresentazione. Le stringhe in stile C sono necessarie al principio per capire il funzionamento di una stringa e le operazioni che possiamo effettuare su di essa; la classe standard stringa invece semplifica la vita dell utilizzatore con metodi già pronti e un controllo più accurato e meno soggetto ad errori. Iniziamo con il dare una definizione per le stringhe in stile C. Definizione 1 Una stringa in stile C è rappresentata da un array di caratteri, manipolabile attraverso un puntatore a carattere (char ) Una stringa in stile C viene inizializzata dichiarando un array i cui elementi saranno caratteri (non è compito di qusto testo dare nozioni di base sugli array o sui puntatori, gli esempi principali verranno mostrati senza spiegazioni non inerenti al discorso). Una possibile rappresentazione può esser data dalla seguente: // dichiariamo un array d i 20 e l e m e n t i d i t i p o char char mystring [ 2 0 ] ; // come sopra ma con a l l o c a z i o n e dinamica char mystring = new char [ 2 0 ] ; Dall esempio riportiamo che l unica operazione effettuata è stata l allocazione di memoria. Possiamo operare sulle stringhe in stile C in molti modi. Diamo un occhiata ad alcuni esempi per poi darne una spiegazione generale: 4

// Esempio 1 char mystring [ 2 0 ] ; // riempiamo l array con i numeri da 0 a 19 for ( unsigned i = 0 ; i < 2 0 ; i++ ) mystring [ i ] = i ; // Esempio 2 #include <iostream >... char nome = Federica ; std : : cout << nome ; // Esempio 3 char s t r = Federica ; do std : : cout << s t r ; while ( s t r ++); Esempio 1 La riga 1 dichiara un array di tipo stringa chiamato mystring di capacità 20 (cioè il numero massimo di elementi che può contenere). La riga 3 definisce un for per scandire l array elemento per elemento (mystring[0], mystring[1],..., mystring[19]) e ad ogni elemento assegnerà il valore corrente della variabile iteratore i. Esempio 2 Dichiariamo e inizializziamo un array di caratteri esplicito chiamato nome. L identificatore di un array (il nome) viene tradotto nell indirizzo del primo elemento contenuto in esso. Sfruttando la libreria iostream usiamo la funzione cout per stampare su standard output la nostra stringa. Esempio 3 Dichiarazione e inizializzazione come nell esempio 2. Usiamo un costrutto do...while per stampare le singole lettere in colonna. L operatore (star) ci permette di dereferenziare il puntatore e ottenere così il valore da stampare. L operatore ++ sul puntatore dereferenziato ci permette di scandire la stringa utilizzando l aritmetica dei puntatori. La libreria C standard (presente nel C++ standard) offre molte funzioni utili per manipolare le stringhe in stile C; presentiamo di seguito alcune funzioni molto usate (bisogna includere l header cstring): // r e s t i t u i s c e l a l u n g h e z z a d i una s t r i n g a int s t r l e n ( const char ) ; // confronta due s t r i n g h e per l u g u a g l i a n z a int strcmp ( const char, const char ) ; // copia l a seconda s t r i n g a n e l l a prima char s t r c p y ( char, const char ) ; 5

Definizione 2 La classe standard stringa è un implementazione del tipo di dato astratto stringa ; è fornita nella libreria standard C++ string. Offre numerosi vantaggi quali una gestione e usabilità maggiore e più semplice rispetto alle stringhe in stile C. Usando la classe string possiamo istanziare degli oggetti di tipo stringa. Punto di forza dell intera libreria è quello di poter godere di una estrema facilità d uso e allo stesso tempo di una potenza notevole. Cerchiamo ora di presentare un paio di esempi illustrando le caratteristiche peculiari della classe. Un oggetto di tipo stringa può essere inizializzato con una sequenza di caratteri oppure con un altro oggetto stringa (a differenza delle stringhe in stile C): ricordiamo che per istanziare e manipolare oggetti di tipo string bisogna includere la libreria string; nel primo esempio presentiamo l inclusione della libreria #include <s t r i n g >... // s t r i n g a vuota s t r i n g s1 ; // s t r i n g a i n i z i a l i z z a t a con una sequenza d i c a r a t t e r i s t r i n g s2 ( Federica ) ; // s t r i n g a i n i z i a l i z z a t a con un a l t r a s t r i n g a s t r i n g s3 ( s2 ) ; // i n i z i a l i z z a z i o n e vuota e // assegnamento t r a m i t e o p e r a t o r e = s t r i n g s4 = s3 ; Facilmente, possiamo accedere ai singoli elementi di una stringa, possiamo confrontare due stringhe, controllarne la dimensione, controllarne il contenuto e effettuare manipolazioni come il concatenamento: s t r i n g s ( Federica ) ; s t r i n g s2 ( Giappone ) ; // s i puo accedere a i s i n g o l i e l e m e n t i d i una s t r i n g a // t r a m i t e l o p e r a t o r e d i s u b s c r i p t o l a f u n z i o n e at ( ) std : : cout << s [ 2 ] ; // stampa d std : : cout << s. at ( 2 ) ; // stampa d // confronto t r a due s t r i n g h e i f ( s == s2 ) // l e due s t r i n g h e sono u g u a l i // ( in l u n g h e z z a e in contenuto ) // l a l u n g h e z z a d i una s t r i n g a // e data d a l l a f u n z i o n e s i z e ( ) std : : count << s. s i z e ( ) ; // stampa 8 6

// per v e r i f i c a r e se una s t r i n g a e vuota // s i usa l a f u n z i o n e empty ( ) i f (! s. empty ( ) ) // non e vuota, s i f a q u a l c o s a // concatenazione d i due s t r i n g h e s t r i n g s3 = s + s2 ; // s3 sara FedericaGiappone Esistono molte altre funzioni nella libreria standard e la documentazione di ognuna di esser può essere reperita facilmente in rete. 7