Coding ++
Coding ++
Inizio scrittura:
26 gennaio 2015
0. Introduzione
C++ è un linguaggio di programmazione compilato adatto per la
programmazione sia procedurale che ad oggetti.
Nato come evoluzione del C, infatti il suo primo nome è stato “C with classes”
ovvero “C con classi”.
Il C++ è in grado di lavorare sia ad alto che a basso livello.
La seguente guida ha lo scopo di essere scorrevole e comprensibile,
non mi dilungherò su nessun argomento o riempirò il documento di futilità.
1. Strumenti
Tutto ciò di cui necessiterete è un computer con un sistema operativo in grado
di fare “girare il nostro compilatore” GCC.
Raccomando tuttavia l'utilizzo di un ambiente di sviluppo,
personalmente la mia scelta ricade su Code::Blocks.
http://www.codeblocks.org/downloads
#include <iostream>
int main()
{
return 0;
}
Funzione main le quali parentesi graffe racchiudono ciò che gli appartiene.
cout non sarà riconosciuta come istruzione, ciò potrebbe accadere per diversi
motivi:
#include<iostream>
Non basta.. l'istruzione cout come anche la cin deve essere preceduta dal
namespace ovvero della collezione di nomi a cui appartiene.
In questo caso il namespace è std ovvero standard:
#include <iostream>
int main()
{
std::cout << “To C or not to C that's the question!”;
std::cin.ignore();
std::cin.get();
return 0;
}
cout << “Riga 0” << endl << “riga 1” << endl << “riga 3”;
#include <iostream>
#include <iostream>
int main()
{
using namespace std; // Namespace locale alla funzione main
cout << “Qui invece ne faccio a meno SOLO nel main :)”;
return 0;
}
Poi visto che noi a queste scatole teniamo particolarmente gli diamo anche un
nome. Il nome di una variabile si chiama identificatore.
Potete dare qualunque nome alle vostre variabili a patto che non contengano
caratteri speciali, solo l'underscore _ è ammesso.
Inoltre per il problema che ho descritto prima dello spazio di nomi non potete
dargli il nome di parole chiave che il linguaggio utilizza.
Non potete nemmeno farle iniziare con un numero o contenere spazi.
Per rendere tutto più chiaro, facciamo come al solito esempi:
Nomi ammessi:
_var
_var1
Var
Var_
Var_1
tipo nome;
char
Contiene caratteri, uno alla volta: 'a', 'z', '$'
il nome deriva da character ovvero carattere.
string
Contiene una sequenza di caratteri: “ciao mondo”, “sono batman”.
String significa appunto stringa.
int
Contiene numeri interi: 3, 1990, -13
Il nome deriva da integer ovvero intero
float
Contiene numeri reali: 3.14159, 1.618, 1, 41421 , -43.0
I decimali si separano con il punto . e NON con la virgola!
Il nome deriva da floating point ovvero virgola mobile.
double
Contiene numeri reali proprio come float però è più grande, viene definito a
precisione doppia.
Il nome deriva da double ovvero doppio.
Non si tratta di una stringa, age non va quindi tra virgolette “”!
Ricordate che endl serve per andare a capo.
Per dichiarare più variabili dello stesso tipo sulla stessa riga:
Possiamo ora immaginare la variabile come una casa, con un indirizzo specifico
e con una dimensione.
La dimensione è designata dall'architettura e dal tipo della variabile mentre
l'indirizzo di memoria, dal sistema operativo.
Non fidatevi di me! Provate tutto il codice che scrivo e non fate copia e incolla.
Errori di compilazione
Il codice deve stare nel blocco del main, che è tra le 2 parentesi graffe:
int main()
{
Qui va il codice
}
ATTENZIONE:
Il linguaggio C++ è case-sensitive, ovvero differenzia maiuscole e minuscole,
scrivere int var, int Var, INT var fa una notevole differenza, quindi controllate
sempre le maiuscole occhio a non divertirvi troppo con lo shift.
8. Leggere l'input
Adesso che sappiamo come funzionano le variabili facciamo scegliere all'utente
il loro contenuto.
Per farlo dobbiamo richiedere un input ovvero un dato acquisito dal nostro
programma, in questo caso da parte dell'utente.
Se cout sta per console output e serve per scrivere potete immaginare che per
leggere basta usare cin ovvero console input.
I dati letti vanno memorizzati nelle variabili la cin ha quindi bisogno di una
variabile per svolgere il proprio compito.
float var;
cin >> var;
cout << “hai inserito “ << var << endl;
Notare che indirizzamento è opposto, non sarà più << come cout, ma sarà >>
cin vi permette di leggere più dati nella stessa chiamata*, basta fare così:
Constatata l'esistenza delle variabili per operare con esse necessitiamo degli
operatori, troverete gli operatori sotto forma di parole chiave (sizeof) oppure di
simboli (%,/,+,-,::).
le prime 3 sono intuitive, attenzione invece alla divisione che se tra numeri
interi taglia la parte decimale:
3/2 = 1 e non 1.5
Dovrete quindi fare delle conversioni (le vedremo in seguito) per avere il
risultato sperato.
int a,b;
a = 12;
b = 22;
cout << “La somma è ” << a + b << endl;
int c = a - b;
c = -c;
cout << “La differenza è” << c << endl;
oppure
Quindi:
Noterete che l'output è in virgola mobile anche se la variabile raggio era intera
e la parte decimale non è stata tagliata!
Se chiedi ad computer se oggi piove ti dirà true o false, non ti dirà “qualche
goccia”, “il cielo è scuro”.
Se il cielo è nero e non cadono gocce false.
Se cade anche una sola goccia true.
se se se.
In italiano introduce un periodo ipotetico, in informatica controlla se un
espressione è vera o falsa.
leggi età
se (età ≥ 18)
scrivi “Sei maggiorenne”
if (false)
cout << “Io non verro eseguita :(”;
Così come:
L'if avrà il controllo solo sulla prima istruzione, trova un punto e virgola e
termina il suo lavoro, quindi anche se scriverete così:
{
istruzione1;
istruzione2;
istruzione3;
…
}
Adesso abbiamo un programma che ci chiede l'età e ci informa del fatto che
siamo maggiorenni se il numero inserito è maggiore o uguale a 18, altrimenti
non fa assolutamente nulla.
E se noi volessimo per esempio informare l'utente di quanti anni di attesa
necessita per arrivare alla maggiore età?
Qui ci viene in soccorso la clausola else (altrimenti) che racchiude le istruzioni
da eseguire in caso l'istruzione if dovesse essere risultata falsa.
Voi direte, beh se il cane non proviene da Černobyl' basta solo controllare il
pelo oppure il numero di zampe in questo modo anche se il cane è stato
mutilato in un incidente perdendo delle zampe il programma funziona.
Benissimo:
AND OR e NOT sono operatori logici e possono anche essere usati assieme:
vero AND NOT falso → vero
vero AND vero OR NOT falso → vero
Come al solito facciamoci aiutare da un esercizio esempio.
Dobbiamo scrivere un programma che controlla l'idoneità di un individuo per
salire su una giostra.
Trattandosi di una montagna russa dobbiamo essere alti almeno 1,60 metri, in
alternativa dobbiamo avere 18 anni.
Ecco l'output:
Se avete fatto attenzione alla parola chiave “in alternativa” che ho usato nel
testo del problema capirete il perché dell' OR.
Ricordate:
and → &&
or → ||
not → !
11. Commenti
Ora che conosciamo tutte queste cose i nostri programmi iniziano a diventare
complessi.
Per capire se avete avuto successo nell'imparare C++ a fine libro tornate su
questa frase… Se vi viene da ridere allora tutto ok.
/*
Il seguente codice ordina un vettore di N elementi.
Si scorre N volte per N elementi.
Si tratta di un algorimo di bubble sorting
*/
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(vet[j] < vet [i])
{
swap = vet[i];
vet[i] = vet[j];
vet[j] = swap;
}
}
}
Potete anche usare i commenti in alto per specificare nome, data e autore di
un codice sorgente che verrà distrubuito:
/*
Software: Calcolatrice.cpp
Autore: InformaticageNJP
Data: 01/09/2015
*/
12. Switch
lavoriamo con x
caso 0: cout << “zero”;
switch(var)
switch (var)
{
switch(var)
{
case 1:
cout << “ uno “ << endl;
// tutto il codice fino alla fine dello switch verrà eseguito quanto case 1
sarà vero.
cout << “ verrò eseguito anche io! “;
}
nel caso in cui nessun caso (case) restituisce true, c'è l'istruzione di default
(predefinita):
switch(var)
{
case 1:
cout << “ uno “ << endl;
// tutto il codice fino alla fine dello switch verrà eseguito quanto case 1
sarà vero.
cout << “ verrò eseguito anche io! “;
case 56:
cout << “cinquantasei” << endl;
default:
cout << “nessun caso si è rivelato vero!”;
}
switch(x)
{
case 0: cout << “zero”;
case 1: cout << “uno”;
case 2: cout << “due”;
default: cout << “altro”;
}
Inizio
Partiamo con una bottiglia vuota.
Mentre la bottiglia non è piena
Aggiungi acqua
Fine.
In C++ il mentre viene rappresentato dal ciclo while che in inglese significa
appunto ciclo mentre.
Il ciclo while esegue un blocco di istruzioni fino a che una determinata
condizione non diventa falsa, qundi esegue il blocco solo se la condizione è
vera.
while (true)
{
// Ciclo infinito
}
while(false)
{
// Questo blocco di codice non verrà mai eseguito
}
Dopo 100 esecuzioni del ciclo while la bottiglia sarà piena (1000 ml) e si
passerà al resto del codice scrivendo in output “la bottiglia è piena”.
Se l'utente sceglie 3:
3*0=0
3*1=3
3*2=6
e così via, dove 3 rappresenta la variabile numero e 0,1,2 rappresentano la
variabile contatore che con l'istruzione contatore = contatore + 1 incrementa.
soluzione 1:
int num = 10;
num += 1;
cout << num;
soluzione 2:
int num = 10;
num++;
cout << num;
Possiamo fare la stessa cosa con la sottrazione:
int num = 10;
num--;
cout << num; // 9
int num = 2;
num++; // num vale ancora 2!
cout << num; // qui vale 3
num--; // num vale 3
cout << num; // qui vale 2
int num = 2;
++num; // num vale già 3!
cout << num; // qui vale 3
--num // num vale 2
cout << num; // qui vale 2
Nel C++ gli operatori hanno un effetto collaterale che prende il nome di
side-effect ovvero un valore restituito al termine dell'utilizzo di un operatore.
Ad esempio:
num = 1;
ha un side effect di 1.
quindi possiamo utilizzarlo per assegnare valori ad altre variabili:
int a = num = 1;
dove a acquisisce il side effect di num = 1 contendo così anch'essa il valore 1:
int num = 5;
cout << num++;
cout << num--;
No, non ho ripetuto due volte lo stesso capitolo, il ciclo while ed il ciclo
do-while il controllo in posizione diversa… vediamo di che si tratta.
while (condizione)
// Se condizione == true io vengo eseguito!
do
{
// Vengo eseguito almeno una volta
// Se condizione == true io vengo Rieseguito!
}while(condizione); // non dimenticare il ;
Ovvero:
Scrivere
do {
Codice;
} while (condizione);
oppure
codice;
while (condizione) {
codice;
}
Produce lo stesso risultato.
17. Ciclo for
Eccone la struttura:
for(inizializzazione; controllo; incremento/decremento)
Istruzioni;
I parte da 1
J parte da 1
I non incrementa fino alla fine del ciclo for interno quindi fino a che J non
arriva a 10.
Iniziamo a moltiplicare i * j.
1 * 1; 1 * 2; 1 * 3 ecc.. ovvero:
1 2 3…
Incrementa I
Iniziamo a moltiplicare i * j.
2 * 1; 2 * 2; 2 * 3; 2 * 4 ecc… ovvero:
2 4 6 8…
Per accedere agli elementi della matrice bisogna specificare riga e colonna:
Esercizio:
Creiamo sfruttando le matrici un gioco del tris a 2 giocatori.
Per farlo sarà necessario immaginare una matrice 3x3 come il terreno di gioco.
X O O
X X
X O
Ogni turno per far rendere conto al giocatore della situazione sarà necessario
stampare la matrice con i relativi turni.
Dovete inoltre controllare se uno dei 2 ha fatto filetto, ovvero se sono stati
messi in riga 3 simboli uguali.
Prima di aprire code::blocks prendete carta e penna, l'esercizio è piuttosto
complesso e necessita di progettazione.
Non andate avanti nel libro senza essere riusciti DA SOLI a scrivere questo
applicativo.
Come ogni software che scriverete anche questo ha diverse possibili soluzioni.
Nella pagina successiva troverete la mia soluzione, tuttavia ho voluto simulare
un sorgente trovato su internet, per questo troverete delle istruzioni che non
avete ancora imparato ma che non sono chiave alla risoluzione del problema.
Il sorgente è ampiamente commentato per permetterne una facile
comprensione.
Non fatevi ingannare dalla lunghezza, non c'è nulla di complesso.
Come al solito lo troverete nella pagina successiva, ma non sbirciate e non
azzardatevi a copiare e incollare!! ;)
// Se compiliamo su Linux
#ifdef __linux__
#define CLRSRC system("clear") // Pulisce la console su Linux: Bash
// Se compiliamo su windows
#elif _WIN32
#define CLRSRC system("cls") // Pulisce la console su windows: CMD
#endif
int main()
// A -> X
// B -> O
{
bool filetto = false;
char table[3][3];
char giocatore = 'A';
if(!(riga > 0 && riga <= 3 && colonna > 0 && colonna <= 3))
// Se riga e colonna non sono compresi tra 0 e 3
{
CLRSRC;
continue; // Torna a inizio ciclo while ricominciando da capo
}
// Fine dell'esecuzione
return 0;
}