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';
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′.
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.
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.
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:
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.
Esempio: scrivere un programma che, dato un nome in input, costruisca e stampi una stringa con il testo "ciao, nome"
Esercizi:
s="ciao mamma"
ed m=3, n=4
il programma deve stampare la stringa "ao ma"
.nome: aaa
indirizzo: bbb
Esercizi:
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.
Nel ciclo while
dobbiamo specificare:
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.
Esempio: assegnata una stringa s contenente anche delle cifre, sommare tutte le cifre e fornire il valore totale di tale somma.
Esercizio8.5.cpp
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:
enum.
typedef.
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:
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)!
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.
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.
Esempio: esercizio8.6.cpp
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.
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.
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string