C++ For Dummies
C++ For Dummies
La sua dichiarazione avviene tramite la dicitura int main() , seguita da delle parentesi graffe:
Queste contengono il corpo del nostro programma (quindi “contengono il nostro blocco
d'istruzioni”).
Sopra il nostro int main(), avremo degli header contenenti le varie librerie (#include <libreria>)
utilizzate da programma ed il namespace. Le librerie sono una raccolta di funzioni e programmi
“già scritti” richiamati per permetterci di svolgere operazioni semplici. Il namespace std (dove
“STD” significa “STANDARD”) contiene invece le funzioni e le variabili standard del C ++ (è quindi
utile quando si usano spesso le funzioni standard del C ++).
Sia Variabili che Costanti sono caratterizzate in primo luogo da un TIPO di valore che ne definirà il
contenuto; questi potranno essere dunque di:
int anni;
Una costante invece ha un valore fisso: se ad esempio si volesse fare un controllo per verificare
che la mia età rientri nella cerchia dei “maggiorenni”, basterà verificare se il numero
precedentemente contenuto nella variabile anni sia maggiore o uguale di 18, dove 18 è un valore
costante.
( anni > 18 )
RICORDIAMO che il nome di una variabile NON può iniziare con un numero o contenere spazi o
caratteri speciali (comprese le lettere accentate), se volessimo avvalorarci di una parola
composta, come ad esempio “valore medio”, potremo al più usare una underscore
(valore_medio), sintetizzarlo utilizzando le sue iniziali (VM) oppure scriverlo banalmente senza
spazio (ValoreMedio).
_______________________________________________________________________________
NOTA BENE: Quando si dichiara una o più variabili dello stesso tipo (int, float, char, bool), è
possibile farlo separatamente tramite dichiarazioni uniche oppure in successione nella stessa riga
della prima dichiarazione utilizzando una virgola per distinguere una variabile dall'altra.
È inoltre possibile dare fin dall'inizio un valore ad una variabile nel momento stesso in cui questa
viene dichiarata.
Dove:
• int indica il TIPO delle nostre variabili;
• gg, mm, aaaa rappresentano il NOME delle nostre variabili;
• la virgola ha il compito di dividere una variabile dall'altra;
• il punto e virgola conclude l'istruzione di dichiarazione.
Possiamo inoltre dichiarare fin da subito il valore iniziale di una variabile, ovvero:
Con il termine “Ricevere in Output” invece si intende la visualizzazione dei dati in uscita offerti dal
programma all'utente: non sono necessariamente i risultati dei calcoli, ma possono essere anche
variabili stesse o “stringhe” contenenti parole e frasi.
L'input è quindi ciò che noi diamo alla nostra macchina, mentre output è ciò che la nostra
macchina ci “restituisce e comunica”.
Dove in entrambi, gli operatori “<<” e “>>” indicano il “flusso dei dati”, che saranno in ingresso o
in uscita, ovviamente. ENDL invece è una costante che sostituisce i caratteri di fine riga.
• Con la prima istruzione (INPUT) avremo un inserimento da tastiera, dove prenderemo la variabile
intera nome_variabile e la valorizzeremo con dei valori appropriati. Nel momento in cui inseriremo
un valore che non è consono alla nostra variabile, il nostro programma interromperà la
compilazione (Come se il nostro programma si aspettasse un valore numerico intero, ma noi invece
digitiamo un valore alfanumerico) .
• Con la seconda istruzione (OUTPUT) invece avremo una visualizzazione su schermo del
contenuto della nostra variabile e quindi, se ad esempio in fase di inserimento (input / cin)
avessimo valorizzato la nostra nome_variabile (ipoteticamente presa come intero) con il valore
“2022”, avremmo avuto in visualizzazione (o “lettura”) tale valore.
INOLTRE:
Il cout può contenere anche solamente del testo, oppure, del testo + la nostra variabile.
Infatti, in un ipotetico inserimento da tastiera del valore anno, sarebbe consono ed opportuno
procedere seguendo la seguente sintassi:
Se notiamo i due cout della riga 18 e 19 però, la presenza della variabile “anno” in output non è
l'unica differenza. Aggiungere un “<<endl” dopo il testo del nostro cout prima del punto e virgola è
solo una implicazione che sta a significare “End Line”: Quello che succede se si aggiunge “<<endl”
al termine della nostra visualizzazione cout è l'implicazione che la nostra prossima linea di codice
verrà svolta nella riga sotto (cout o cin che sia).
Se infatti il primo cout fosse stato scritto come cout<<''Inserisci anno corrente: ''<<endl; dove
endl non era presente nel nostro caso preso in esempio in precedenza, avremmo avuto in output:
L'inserimento del numero 2022 è avvenuto L'inserimento del numero 2022 è avvenuto
nella riga successiva. nella stessa riga.
Endl però non è l'unico modo per “andare a capo alla riga dopo”. Nei “testi” all'interno dei cout
infatti sarà possibile utilizzare dei caratteri speciali che svolgeranno particolari compiti all'interno
del nostro codice in visualizzazione, nel dettaglio, con:
I commenti in C rappresentano note, appunti, pensieri o spiegazioni che sintetizzano nella riga di
codice corrente quello che sta succedendo.
Prendendo come esempio l'esercizio svolto nella pagina precedente, potremmo ipoteticamente
aggiungere dei commenti che spieghino il significato del nostro codice:
Ci basterà guardare le righe di codice: 7-8, 11, 17 e 20 per capire di cosa stiamo parlando.
Possiamo notare fin da subito che esistono sostanzialmente DUE tipi di forme di “commento”
possibile col quale possiamo “commentare” il programma:
Mediante gli Operatori Relazionali è possibile effettuare un confronto tra due variabili ed ottenere
di conseguenza un risultato TRUE oppure un risultato FALSE.
Una volta assegnati a Num1 e Num2 due valori, non sarà difficile capire quindi in che situazione si
ottenga in output il risultato VERO ed il risultato FALSO.
Supponiamo di avere:
int Num1 = 3;
int Num2 = 8;
Ipoteticamente, quello che otterremo da questi vari confronti sarà:
(Num1 > Num2) // FALSE, Num1 non è maggiore di Num2!
(Num1 < Num2) // TRUE, Num1 è minore di Num2!
(Num1 >= Num2) // FALSE, Num1 non è maggiore\uguale di Num2!
(Num1 <= Num2) // TRUE, Num1 è minore\uguale di Num2!
(Num1 = = Num2) // FALSE, Num1 non è UGUALE a Num2!
(Num1 ! = Num2) // TRUE, Num1 è DIVERSO da Num2!
Un'applicazione consona di questi test potrebbe essere quindi utilizzata negli argomenti dei
Selettori (if, switch) o nei Cicli di Iterazione (while, do-while e for).
Attenzione: è un errore molto frequente agli inizi della programmazione quello di utilizzare
l'operatore di “uguaglianza” con un singolo “=” anziché utilizzare il doppio uguale ( = = ).
”IF”, dall'inglese letteralmente “SE”: Il suo utilizzo è letteralmente lo stesso di quello che
potremmo avere nel parlato: tant'è che quando scriveremo del codice ci ritroveremo davanti ad un
La sua implementazione del codice è strettamente collegata con la pagina precedente di questo
documento e viene riportata in C/C++ tramite la seguente scrittura:
if (condizione) // Dove Condizione è una condizone Logica TRUE o FALSE;
{
<blocco di istruzioni> // Contiene il nostro codice in C/C++;
}
Il blocco di selezione IF può inoltre avvalersi di una seconda funzione, denominata “ELSE”,
dall'inglese “ALTRIMENTI”: La sua implementazione non è obbligatoria ma ci consente di scegliere
tra due differenti blocchi da eseguire in base all'esito della nostra condizione.
Si vuole ricevere in ingresso (input) gli anni di uno studente e verificare se questo ha raggiunto la
maggiore età. In uscita output avremo dunque che:
Con “IF ANNIDATO” si intende un << un if dentro ad un altro if >>, questa pratica è comunemente
utilizzata quando dobbiamo svolgere più controlli all'interno del nostro programma.
Esempio IF nidificato:
“Si vuole ricevere in ingresso la base e l'altezza di due rettangoli, calcolarne la rispettiva area per
poi mandare in output l'informazione di quale dei due rettangoli abbia l'area maggiore”
ATTENZIONE: Gli output finali non saranno banalmente due, ma ben sì tre, perché non
possiamo escludere che il primo ed il secondo rettangolo abbiano la stessa area.
Un PESSIMO UTILIZZO dei nostri strumenti ci potrebbe spingere ad utilizzare TRE VOLTE if, facendo
quindi TRE CONFRONTI dove verifichiamo che SE (A1 > A2) allora avrò un output, SE (A1 < A2)
allora avrò un altro output e SE ( A1 = = A2 ) avrò un altro output differente ancora.
Un OTTIMO UTILIZZO dei nostri strumenti invece ci porterà ad avere solamente DUE CONFRONTI
if, poiché ci basterà verificare che: SE (A1 > A2) allora avrò un output, ALTRIMENTI, SE (A1 < A2)
allora avrò un altro output ALTRIMENTI avrò un altro output differente ancora.
int main() {
int b1, h1, b2, h2;
// Inserimento Rettangolo 1;
cout<<''Inserisci la base del primo Rettangolo: '';
cin>>b1;
cout<<''Inserisci l'altezza del primo Rettangolo: '';
cin>>h1;
// Inserimento Rettangolo 2;
cout<<''Inserisci la base del secondo Rettangolo: '';
cin>>b2;
cout<<''Inserisci l'altezza del secondo Rettangolo: '';
cin>>h2;
//Calcolo delle varie Aree;
int A1 = b1*h1;
int A2 = b2*h2;
//Inizio dei controlli IF:
if (A1>A2) // “SE (A1 E' MAGGIORE) ALLORA...”
{cout<<''Il primo Rettangolo ha l'area maggiore'';}
else if (A2>A1) // (← if nidificato) “...ALTRIMENTI, SE (A2 E' MAGGIORE), ALLORA...”
{cout<<''Il secono Rettangolo ha l'area maggiore'';}
else //”...ALTRIMENTI...”
{cout<<''I due rettangoli hanno la stessa Area.'';}
return 0;
}
L'if che segue l'else è un “if nidificato”: In questo caso è un “if nidificato di secondo grado.”
Il grado sta ad indicare quanto “nidificato” è il nostro if: più è nidificato, più alto sarà il suo grado.
Connettivi Logici
La Condizione Logica è un'istruzione che come risultato ha due possibili output: VERO o FALSO.
I Connettivi Logici hanno il compito di lavorare i risultati della “Condizione Logica”, mettendoli a
confronto diretto: negandoli (!), congiungendoli (&&) o eventualmente disgiungendoli (OR).
<< Questi Connettivi Logici sono NOT (!), AND (&&), OR (||) >>
• NOT: Come nella lingua parlata, anteporre il connettivo “NON” ribalta il senso della frase.
Supponiamo di avere una variabile booleana “A”, visualizziamo la ipotetica “Tabella della Verità”.
A !A
TRUE FALSE
FALSE TRUE
• AND: La “Congiunzione” tra DUE variabili booleane “A” e “B” ha come risultato il valore VERO
solo se ENTRAMBE le variabili hanno valore VERO. Visualizziamo la “Tabella della Verità”.
A B A && B
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE
• OR: La “Disgiunzione” tra DUE variabili booleane “A” e “B” ha come risltato il valore VERO solo
se ALMENO UNA delle DUE variabili ha VERO come valore. Visualizziamo la “Tabella della Verità”.
A B A || B
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
if (cond1 && cond2) → AND vuole che sia cond1 che cond2 siano VERE, quindi l'if non
viene eseguito. “Se cond1 e cond2 sono entrambe vere, allora...”
if (cond1 && !cond2) → AND vuole che sia cond1 che cond2 siano VERE, NOT ribalta il
valore di cond2, quindi l'if viene eseguito! “Se cond1 è vera
e cond2 è falsa, allora...”
if (cond1 || cond2) → OR vuole che ALMENO UNA tra le due condizioni sia VERA, quindi
“se cond1 è vera oppure cond2 è vera, allora...”
Selettori Multipli (Switch)
Alcune situazioni però prevedono più di due alternative: In questi casi è necessario utilizzare una
variante della selezione che prevede di intraprendere un percorso alternativo NON in base al
VERO o FALSO, ma in base al valore di una variabile.
Dopo aver dichiarato una variabile ed averle assegnato un valore ci basterà mettere dentro una
funzione di selezione switch la stessa variabile: Sarà adesso compito dello switch, in base al valore
sulla nostra variabile, indirizzare il nostro programma verso un determinato <blocco di istruzioni>
Dove i case sono un numero indefinito di blocco di istruzioni che eseguono differenti operazioni.
Come già si può intuire visivamente, siamo davanti ad un “Menù di Selezione”; in base al valore
che noi daremo alla nostra variabile entreremo dentro dei differenti ”case” che ci faranno svolgere
differenti <blocchi di istruzioni>.
L'utilizzo del break indica la fine del <blocco di istruzioni>, senza di esso, una volta completata
l'esecuzione di case valoreN verrà eseguito automaticamente anche il case di valoreN+1.
Infine default sarà il <blocco di istruzioni> eseguito automaticamente nel caso in cui la nostra
variabile venga avvalorata di un valore non presente all'interno del nostro switch in nessun case.
Con le Iterazioni (o cicli, che vedremo nella prossima pagina) sarà possibile fare interessanti
utilizzi del selettore Switch: una volta eseguito un <blocco di istruzioni> dentro un determinato
case sarà possibile effettuare un'altra iterazione (“un altro giro”) selezionando un case differente.
Cicli a condizione Iniziale: While
Ci sono delle operazioni, anche nella quotidianità, che vanno ripetute più volte, fino al
soddisfacimento di un determinato obbiettivo, per esempio:
In programmazione questa funzione viene chiamata While e seppur la sua presentazione sia molti
simile a quella di un if semplice, la differenza è sostanziale. Nella sua forma più generica scritta:
while (condizione)
{
<blocco istruzioni>
}
Avremo un <blocco istruzioni> che continuerà ad essere ripetuto SE e FINTANTO CHE la nostra
condizione affiancata al while risulta essere TRUE.
“Inizializziamo una variabile intera n a 0, man mano la incrementeremo di 1 fino ad arrivare a 10.
Quando arriviamo a 10, interrompiamo il nostro programma.”
int n = 0;
while verifica che la Condizione (n<=10) sia verificata, entra nel <blocco istruzioni>, dove n viene
incrementata di 1 e poi torna nuovamente a verificare se la Condizione è ancora vera.
ATTENZIONE PERÒ:
La condizione del ciclo deve essere ben definita, altrimenti:
• Il ciclo potrebbe non essere mai eseguito se la condizione non si verificasse mai;
• Il ciclo potrebbe essere infinito (quindi un loop) se la condizione risultasse sempre vera.
Ci sono anche delle volte però in cui le operazioni dovranno essere eseguite almeno una volta
prima di poter controllare la condizione di iterazione. Questi casi (noti come “Do-While”) sono
chiamati anche iterazioni ”Post-Condizionate” in quanto: PRIMA effettueremo il nostro <blocco
istruzioni> e solo DOPO verificheremo se ripetere l'iterazione in base alla nostra condizione.
do
{
<blocco istruzioni>
} while (condizione)
Questa volta avremo un <blocco istruzioni> che sarà eseguito ALMENO una volta a prescindere da
tutto e che continuerà ad essere ripetuto SE e FINTANTO CHE la nostra condizione affiancata al
while risulterà essere TRUE.
do {
precedente = nuovo; //Il valore inserito all'inizio diventerà quello precedente;
cout << ''Inserisci nuovo valore: '';
cin >> nuovo; //Il nuovo valore viene salvato
}while (nuovo >= precedente) //Controllo che ''nuovo'' sia maggiore di ''precedente'';
All'inizio della nostra iterazione non ci sarebbe stato possibile fare il controllo della condizione
posta come: nuovo >= precedente; perché dopo aver inserito il primo valore prima dello while
bisognerà, a prescindere di tutto, effettuare almeno un inserimento per verificare che la
condizione sia VERA oppure FALSA.
IMPORTANTE: In generale, nei cicli WHILE e DO-WHILE ci si può avvalere di variabili intere
denominate come “VARIABILI CONTATORE”. Queste variabili hanno il ruolo di “Contare” il
numero di ripetizioni, incrementando di “+1” ogni volta che viene iterato il <blocco istruzioni>.
Per fare ciò basterà dichiarare una generica variabile INT “N” e mettere al termine del while un
“N++” (oppure “N = N + 1”) incrementando così il nostro conteggio ad ogni giro.
Il prossimo metodo di iterazione, nonché l'ultimo, utilizzerà proprio i contatori come meccanica
principale di iterazione: il suo nome sarà “CICLO FOR” oppure “CICLO A CONTEGGIO”.
Cicli a Conteggio (For)
Fin'ora abbiamo visto casi di while dove la durata dei nostri cicli non era nota a priori; infatti anche
nei casi che abbiamo affrontato negli esempi ci siamo ritrovati in casistiche dove bisognava
“eseguire una determinata azione fino a quando la condizione non è più verificata come vera”.
Esiste tuttavia un insieme di problemi caratterizzati dal fatto di avere come dato iniziale proprio il
numero di volte che un compito deve essere eseguito (esempio: Per 10 volte scrivi “Ciao”).
→ Queste iterazioni sono note come Cicli a Conteggio (oppure Cicli For).
Questi si presentano in modo differente dai due cicli che avevamo visto in precedenza, infatti:
For ( < Inizializzazione > ; < Condizione > ; < Aggiornamento > )
{
< Blocco Istruzioni >
}
Possiamo notare fin da subito una struttura di iterazione molto più elaborata che non
necessariamente implichi che sia dunque più complessa. Il suo funzionamento infatti è semplice:
• Blocco Istruzioni : Al suo interno avremo le regolari operazioni, come in ogni ciclo;
• Condizione : Non è diversa da quella che abbiamo visto anche negli altri cicli;
RICORDIAMO che per calcolare la media di “N” numeri è sufficiente sommare tutti i numeri in
unica variabile per poi dividerla per N: Il risultato di tale operazione sarà la media dei valori.
int numero;
int somma=0;
for (int cont=0; cont < 10; cont++) //creo contatore, creo la condizione, creo l'aggiornamento
{
cout << ''Inserisci numero: '';
cin >> numero;
somma = somma + numero;
}
cout << ''La media dei 10 numeri inseriti è: ''<< somma/10;
EXTRA:
Cicli a Conteggio DINAMICO
In tutti gli esempi visti fin'ora, abbiamo avuto dichiarazioni di while statiche, dove siamo stati noi
da tastiera ad inserire quanto lunga sarebbe stata arbitrariamente la nostra iterazione. Ma se, per
esempio, riprendessimo l'esercizio di pagina precedente e lo ricompilassimo in maniera tale che
invece di dover effettuare 10 INSERIMENTI ne dovessimo effettuare N, dove N è un numero
dinamico (e quindi scelto dopo il lancio del programma)? L'esecuzione in realtà è molto semplice!
Per questioni di completezza e di spazi quello che scriverò questa volta non sarà soltanto una
“frazione di codice”, ma l'intero main: Quindi un vero e proprio programma eseguibile!
#include <iostream>
using namespace std;
int main()
{
int numero, iterazioni;
int somma=0;
cout << ''Quanti numeri vogliamo inserire, capo? '';
cin >> iterazioni;
Utilizzate gli spazi prima e dopo le variabili durante i cout, per una visualizzazione più “carina”.
Esempio Impaginazione di un Programma in C
/* I commenti sono, in quanto tali, ovviamente superflui *
/***********************************************
***********************************************/
#include <iostream> //Header di Librerie e NameSpace
using namespace std;
//Dichiarazione del main, contenente il nostro {codice}
int main()
{
//Dichiarazione delle variabili
int nVecchio;
int nNuovo;
//Valorizzazione dei primi valori
cout << "Inserisci un numero: ";
cin >> nNuovo;
//Nell'esempio useremo l'iterazione Do-While
do{
nVecchio = nNuovo;
cout << "Inserisci un nuovo numero: ";
cin >> nNuovo;
}while(nVecchio != nNuovo);
//Output per avvertire la chiusura del software
cout << "hai inserito due volte " << nVecchio;
return 0; //Chiusura del Programma
}