Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 8.Array di caratteri e tipi astratti


C++ array di caratteri

Il tipo char ha dimensione di un byte e contiene il numero di codice ASCII che gli corrisponde.

Un letterale di tipo carattere deve essere sempre racchiuso tra virgolette semplici, ad esempio: ‘a’.

Oltre agli array di numeri interi o reali, possiamo definire anche gli array di caratteri; per esempio:

char s[]={'c', 'i', 'a','o'}

dove s è un array di caratteri formato da 4 elementi:

s[0]='c'; s[1]='i'; s[2]='a'; s[3]='o';

C++ array di caratteri (segue)

Una stringa è un insieme di caratteri (e/o sequenze di escape) rappresentate tra virgolette:

"Hell:o World\n"

Le stringhe in C++ non costituiscono un tipo standard: non sono ammesse come operandi dalla maggior parte degli operatori (compreso l’operatore di assegnazione).

Sono tuttavia riconosciute da alcuni operatori (di flusso di I/O) e da numerose funzioni di libreria del C (di manipolazione stringhe, come printf).

Per gestire un array di caratteri come stringa non è necessario conoscere a priori la sua lunghezza in quanto è sufficiente scandire la stringa fino al simbolo ‘\0′.

C++ array di caratteri (segue)

In memoria le stringhe sono degli array di tipo char null terminated
… array di caratteri con la particolarità che l’elemento che segue l’ultimo carattere deve contenere il carattere NULL ( ‘\0′ terminatore).

Consente a operatori e funzioni di distinguere stringhe da normali array.


C++ array di caratteri (segue)

Esempio: Leggere una stringa:

Esercizio8.1.cpp
Esercizio8.2.cpp


C++ array di caratteri (segue)

Se a CIN e >> non viene fornito un array di caratteri abbastanza grande per memorizzare le stringhe in input potreste perdere dei dati o incorrere in errori gravi durante l’esecuzione del programma.

C++ array di caratteri (segue)

Usando cin per la gestione dell’input, la lettura di ciascuna variabile termina quando incontra o il carattere spazio (la barra spaziatrice) o la tabulazione (tasto Tab) o il fine linea (tasto Invio).
Per poter leggere stringhe contenenti spazi (e tabulatori) si usa:

cin.getline(s, n, c)

Dove:

  • s è una variabile stringa;
  • n è un numero intero che indica il numero massimo di caratteri da leggere;
  • c (può essere omesso) è un carattere alternativo di terminazione dell’input (in sua mancanza l’input termina con il tasto Invio).

Come risultato dell’input s può contenere anche spazi in quanto l’input termina solo digitando il tasto Invio (o incontrano il carattere c).

cin.get(s,n,c) è simile a cin.getline con la differenza che get lascia il carattere di terminazione (\n) nel buffer di input, mentre getline lo rimuove.

Esercizio8.3.cpp

C++ array di caratteri (segue)


C++ array di caratteri (segue)

Esempio: scrivere un programma che, dato un nome in input, costruisca e stampi una stringa con il testo "ciao, nome"

Esercizio8.4.cpp


C++ array di caratteri (segue)

Esercizi:

  1. Assegnata una stringa s, scrivere un programma che conteggi i caratteri ‘a’ in essa contenuti.
  2. Assegnata una stringa s, ed un intero n minore della lunghezza della stringa, scrivere un programma che stampi tutti i caratteri compresi tra n e la lunghezza della stringa.
  3. Assegnata una stringa s, e due interi m<n minori della lunghezza della stringa, scrivere un programma che stampi la sottostringa che va da m ad n
    • Esempio: s="ciao mamma" ed m=3, n=4 il programma deve stampare la stringa "ao ma".
  4. Scrivere un programma che, assegnata in input una stringa s del tipo aaa@bbb stampi su video

nome: aaa
indirizzo: bbb

C++ array di caratteri (segue)

Esercizi:

  1. Scrivere un programma che data in input una stringa la compatti in una nuova stringa eliminando tutti gli spazi in essa presenti.
  2. Scrivere un programma che data in input una stringa (testo) stampi i caratteri distinti (inclusi caratteri di punteggiatura e spazi) in essa presenti e quante occorrenze di ciascuno di essi si trovano nella stringa.
  3. Scrivere un programma che date in input due stringhe A e B fornisca la posizione in A (indice) di tutte le occorrenza di B. Consultare l’esempio a lato.

C++ array di caratteri (segue)

Esercizio. Assegnata una stringa s contenente anche delle cifre, sommare tutte le cifre e fornire il valore totale di tale somma.
Esempio, : s="abc3x casa2 y34zq" il programma deve restituire 3+2+3+4=12.


C++ array di caratteri (segue)

Nel ciclo while dobbiamo specificare:

  • inizializzazione: contatore di ciclo inizializzato a zero, i = 0, e somma = 0;
  • condizione di uscita: l’ultimo carattere letto è la sequenza di escape \0 c == ‘\0′; la condizione di esecuzione del ciclo è la sua negazione, c != ‘\0′;
  • corpo del ciclo: se il carattere è una cifra aggiungerla a somma; incrementare in ogni caso il contatore i;

Osserviamo che l’istruzione (int) c effettua un casting esplicito da carattere a numero: ciò che si ottiene è il codice ASCII di c; se sottraiamo tale valore al codice ASCII del carattere che rappresenta lo zero, otteniamo proprio il valore numerico della cifra. In altre parole,

(int) ‘3′ – (int) ‘0′ restituisce l’intero 3, mentre (int) c – (int) ‘0′ restituisce l’intero rappresentato dal carattere c, se c è compreso tra 0 e 9.

C++ array di caratteri (segue)

Esempio: assegnata una stringa s contenente anche delle cifre, sommare tutte le cifre e fornire il valore totale di tale somma.
Esercizio8.5.cpp


C++ tipi astratti

il C++ consente al programmatore di definire nuovi tipi, estendendo così le capacità effettive del linguaggio
… una volta definiti, questi tipi sono molto “concreti” e sono trattati esattamente come i tipi standard.

I tipi non standard sono detti tipi astratti:

  • Tipi enumerativi on enum.
  • Nuovi tipi con typedef.
  • Strutture (e puntatori a strutture) (modulo B).
  • Oggetti e classi (modulo B).

C++ tipi astratti -> enumerativo

Con la parola-chiave enum si definiscono i tipi enumerati.
Variabili di tipi enumerati possono assumere solo i valori specificati in un elenco

enum Nome-Tipo { lista dei valori accettabili }

Il tipo enumerativo ha le seguenti caratteristiche:

  1. è un tipo definito dal programmatore che può essere utilizzato nella dichiarazione di una variabile;
  2. la lista dei valori accettabili è un insieme di identificatori;
    • rappresentano i soli valori che le variabili di quel tipo possono assumere;
    • non si può assegnare a variabili di quel tipo valori diversi da quelli prescritti;
  3. è un tipo ordinale nel senso che si può parlare di un precedente (tranne il primo) e di un successivo (tranne l’ultimo);
  4. all’interno della macchina il dato viene trattato come un intero.

C++ tipi astratti -> enumerativo (segue)

Il C++ associa ad ogni identificatore definito nella lista un numero intero che parte da zero; perciò, lunedì corrisponde a 0, martedì ad 1, e così via (non sono accettate le vocali accentate).
Ha sicuramente senso scrivere:

oggi <= domani

il compilatore interpreterà il risultato sostituendo i rispettivi valori alle variabili e restituirà un valore vero o falso.
Supponiamo invece di scrivere:

domani < = ris

In fase di compilazione il compilatore dovrebbe dare un errore.
Invece, il migliore dei compilatori fornisce un errore di avvertimento (warning)!

C++ tipi astratti -> enumerativo (segue)

Agli enumeratori sono assegnati numeri interi, a partire da 0 e con incrementi di 1.

Volendo assegnare numeri diversi (comunque sempre interi), bisogna specificarlo.

Esempio:

enum feriale { Lun, Mar, Mer=4, Gio, Ven };

l’uso degli enumeratori, anziché quello diretto delle costanti numeriche corrispondenti, è utile in quanto permette di scrivere codice più chiaro ed esplicativo di ciò che si vuole fare.

C++ tipi astratti -> enumerativo (segue)


C++ tipi astratti -> enumerativo (segue)

Consideriamo ancora la possibilità di utilizzare un costrutto iterativo per evidenziare tutti i giorni della settimana:

for (oggi=lunedì; oggi <= domenica; oggi++)
{ .......istruzioni..... }

il compilatore evidenzia un errore!

Infatti, poiché oggi ++ è equivalente a oggi = oggi+1

il compilatore forza il valore oggi a destra dell’uguaglianza a diventare un intero, per poi assegnare alla variabile oggi (che appare alla sinistra) ancora un intero;
in questo modo la variabile oggi perde il suo significato iniziale per diventare un intero.

Si può ovviare a questo inconveniente forzando con un casting al tipo giorno il risultato.

for (oggi=lunedì; oggi <= domenica; oggi=(giorno)(oggi+1))

il valore di oggi+1 è forzato ad assumere un valore di tipo giorno.

C++ tipi astratti -> enumerativo (segue)

Esempio: esercizio8.6.cpp


C++ tipi astratti -> typedef

L’istruzione typedef serve a dare un nuovo nome (identificatore) ad un tipo (standard o astratto) già esistente.

typedef non crea un nuovo tipo.

Consulta gli esempi a lato.


C++ tipi astratti -> typedef (segue)

Un motivo per cui si utilizza typedef è la portabilità del software.
Confinando in unico luogo i riferimenti diretti a un tipo è più semplice scrivere programmi portabili su macchine diverse.
Consulta l’esempio a lato.


C++ tipi astratti -> typedef (segue)

Un altro motivo per cui si utilizza typedef è per evitare ripetizioni di definizioni lunghe di tipi.


  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion