Linguaggio C++ A. Lorenzi – V. Moriggia C++. TEORIA E AMBIENTE DI PROGRAMMAZIONE Atlas Copyright © Istituto Italiano Edizioni Atlas Il programma C++ Un programma in C++ per la somma di due numeri // Somma.cpp: somma di due numeri #include <iostream> using namespace std; int main() { int a, b, s; cin >> a; cin >> b; s = a + b; cout << s; return 0; } Input e output standard cin >> a; cin >> b; s = a + b; cout << s ; • cin>> indica la lettura dei dati (input) • s = a + b specifica che il risultato deve essere assegnato alla variabile s • cout<< ordina la visualizzazione del risultato (output) Tipi di dati numerici • I principali tipi standard delle variabili sono: Costanti e variabili • Le variabili devono essere dichiarate indicando il tipo e il nome: tipo nome; int anni; float statura; • Le costanti vengono dichiarate attraverso la parola chiave const: const tipo nome = valore; const double PIGRECO = 3.14; const int SCONTO = 20; Le frasi di commento • Le frasi di commento iniziano con i delimitatori // • I commenti possono essere posti all’inizio di una nuova riga oppure accanto ad un’istruzione: int eta; // età di una persona Istruzione di assegnazione • L’istruzione di assegnazione ha una sintassi del tipo: variabile = valore; • Il valore viene assegnato alla variabile scritta a sinistra del simbolo = area = raggio * raggio * 3.14; nome = "Rossi"; Operatori di assegnamento Il casting Il casting è l’azione che consente di trasformare la rappresentazione di un dato dal suo tipo originale a un altro. • L’operatore cast è rappresentato da una coppia di parentesi tonde che racchiudono il tipo di dato: (tipo) espressione; b = (int) a; Gli operatori di relazione e logici Simboli per indicare gli operatori di confronto : I connettivi logici che possono essere utilizzati: • && indica l’operazione di congiunzione (And) • || indica l’operazione di disgiunzione (Or) • ! indica la negazione (Not). Istruzioni di input e output • cin >> indica un’operazione sullo standard input cin >> raggio; • cout << indica un’operazione sullo standard output cout << area; Fasi del lavoro di programmazione codifica compilazione linking exe • Il risultato della fase di codifica si chiama programma sorgente; i file hanno l’estensione .cpp. • consiste nel tradurre il programma sorgente in un programma oggetto, attraverso il compilatore. • il programma, linker, effettua il collegamento tra il programma oggetto e le librerie del linguaggio necessarie per l’esecuzione del programma. • viene creato il file eseguibile con l’estensione .exe. Errori di programmazione errore sintattico errore lessicale errore di run-time errore logico • non sono state rispettate le regole per la costruzione corretta delle frasi del linguaggio. • è stata utilizzata una parola che non esiste nel dizionario del linguaggio C++. • blocca l’avanzamento del processo di elaborazione. • riguarda la correttezza dell’algoritmo. Per individuarlo si utilizza il debugger. Importanza della documentazione Alcuni accorgimenti per una buona documentazione: • usare per le variabili nomi significativi; • esplicitare quali sono i tipi previsti per i dati; • utilizzare le strutture di controllo; • organizzare i programmi in modo strutturato; • inserire frequenti frasi di commento; • effettuare prove di esecuzione; • fornire un manuale per l’utente. La sequenza La sequenza si rappresenta costruendo un blocco di istruzioni delimitato da una coppia di parentesi graffe { … }. #include <iostream> using namespace std; int main() { int num1, num2, differenza; cout << "Due numeri: "; cin >> num1 >> num2; differenza = num1 - num2; cout << "Risultato = " << differenza << endl; return 0; }; La struttura di alternativa Per la selezione si usa l’istruzione if che ha la seguente sintassi: if (condizione) { istruzioni-a; } else { istruzioni-b; } Strutture annidate di alternativa • Dopo la condizione o dopo else, può essere presente un gruppo di istruzioni, contenente a sua volta altre strutture if interne alla struttura più esterna. if (condizione1) istruzioni-a; else if (condizione2) istruzioni-b; else istruzioni-c; La struttura di ripetizione La struttura di ripetizione si rappresenta con l’istruzione do … while do { istruzioni; } while (condizione); Ripetizione precondizionale La ripetizione precondizionale si rappresenta con l’istruzione while. while (condizione) { istruzioni; } Ripetizione con contatore La struttura di ripetizione con contatore viene rappresentata con la struttura for. for (int i=min; i<=max; i++) { istruzioni; } Struttura di scelta multipla La struttura di scelta multipla è realizzata dall’istruzione switch. switch(variabile) { case valore1: istruzioni1; break; case valore2: istruzioni2; break; . . . . . . case valoren: Istruzionin; break; default: istruzioni; break; } Funzioni Una funzione è un procedimento che riceve valori come argomenti in ingresso e restituisce un valore come risultato. La sintassi generale di una funzione è: tipo di dato restituito nome funzione (elenco parametri) { } istruzioni; return valore restituito; Funzioni • Se il tipo restituito dalla funzione non è specificato si assume per default il tipo int. • Se si vuole invece che la funzione non restituisca alcun valore, specificare il tipo void. Funzioni con parametri L’operazione, con la quale il main (o un’altra funzione chiamante) invia i valori alla funzione, assegnandoli ai parametri, si chiama passaggio di parametri. • le variabili indicate nell’intestazione della funzione si chiamano parametri formali; • le variabili che forniscono i valori ai parametri si chiamano parametri attuali. Passaggio di parametri • il passaggio di parametri per valore avviene indicando nell’intestazione della funzione il tipo e il nome di ciascun parametro formale. • per indicare il passaggio di un parametro per referenza, si deve aggiungere il carattere & subito dopo la dichiarazione del tipo del parametro. Dichiarazione dei prototipi di funzione Per una migliore organizzazione dei programmi: • dichiarazione delle funzioni per mezzo dei loro prototipi; va posta in testa al programma stesso. Questa dichiarazione si chiama prototipo della funzione. • definizione (o implementazione) delle funzioni; viene posta dopo la funzione main. Risorse globali e locali In un programma si possono distinguere: • variabili globali, che vengono dichiarate all’inizio del programma e che possono essere usate dal programma principale e da tutte le funzioni; • variabili locali, che vengono dichiarate all’interno della funzione che le utilizza e che non sono visibili alle altre funzioni (main compreso). Regole di visibilità Ogni ambiente vede • le proprie risorse locali • quelle definite all’esterno e che precedono l’ambiente stesso. Funzioni predefinite Funzioni predefinite (built-in): sono funzioni che possono essere usate dal programmatore senza dichiarazione. Tali funzioni sono richiamabili inserendo all’inizio del programma la direttiva #include. #include <cmath> Esempi di funzioni built-in della libreria cmath: • pow, exp, sqrt, log, log10 • sin, cos, tan Namespace e librerie di inclusione namespace (spazio dei nomi) è un raggruppamento di dati e di funzioni che hanno tra loro un nesso logico namespace spazioglobale1 { // esempi di variabili e funzioni globali int totale; int Calcolo(int a, int b); } Namespace e librerie di inclusione • Per un impiego permanente di tutte le componenti di un namespace si deve utilizzare il comando using namespace. using namespace spazioglobale1; ..... cout << totale << endl; Function overloading Function overloading consente di definire due funzioni con lo stesso nome che differiscono tra loro solamente per l’elenco dei parametri. float pow (float, float); long double pow (long double, long double); Funzioni ricorsive Con il termine ricorsione (o ricorsività) si indica la possibilità che una funzione ha di chiamare se stessa, cioè la chiamata della funzione è contenuta all’interno della funzione stessa. Enumerazioni Le enumerazioni sono una serie di valori interi che vengono associati a nomi di costanti, dichiarate attraverso la parola chiave enum. La sintassi è la seguente: enum identificatore {lista delle costanti}; enum Lista {C1, C2, C3, C4}; enum SecondoTrimestre {APR=4, MAG=5, GIU=6}; Array L’array è un insieme di elementi omogenei tra loro. Con una variabile possiamo indicare solo un dato, con l’array possiamo indicare tanti dati dello stesso tipo con un solo nome collettivo di variabile: l’identificatore dell’array. Gli elementi si distinguono uno dall’altro attraverso l’indice che viene assegnato nell’array, e che viene posto accanto all’identificatore dell’array. In matematica con il termine vettore si fa riferimento agli array a una dimensione. Array Un array si definisce con la seguente dichiarazione: tipo NomeArray[dimensione]; double coeff[10]; Quando un array viene passato come parametro ad una funzione, in realtà viene passata la locazione (cioè l’indirizzo) della prima componente dell’array. Array a due dimensioni La matrice (o array a due dimensioni) è un insieme di elementi dello stesso tipo che sono in corrispondenza biunivoca con un insieme di coppie ordinate di numeri interi, che rappresentano rispettivamente il numero della riga e il numero della colonna della matrice. Viene così definita: tipo NomeMatrice[N][M]; const int MAX = 20; int matrice1[MAX][MAX]; Strutture La struttura serve a contenere dati di tipo diverso. Viene dichiarata con la parola chiave struct. struct NomeStruttura { tipo1 campo1; tipo2 campo2; tipo3 campo3; }; Puntatori Una variabile di tipo puntatore contiene l’indirizzo di memoria di un’altra variabile. è possibile creare un puntatore scrivendo il carattere * (asterisco o star) accanto al tipo. int* puntatore; char* s; struct data* ricorrenza; Puntatori • Per conoscere l’indirizzo di memoria di una variabile si usa l’operatore &. int num; int* pInteri; pInteri = # • Per accedere alla memoria puntata da un puntatore si usa l’operatore *. int a, b; int* pInteri; a = 5; pInteri = &a; b = *pInteri; cout << b;