Introduzione al linguaggio C++ Prof. Giuseppe Di Capua Il linguaggio C ++: STRUTTURA DI UN PROGRAMMA Un programma in C++ è formato da una sezione di librerie, da una parte di Dichiarazioni Globali, da una parte denominata main ( programma principale) e da una seria di funzioni. Si può così schematizzare: 1. ogni funzione è un insieme di dichiarazioni e di istruzioni racchiuse tra due parentesi graffe; 2. la funzione main è sempre presente in un programma e gestisce le chiamate alle altre funzioni; 3. ogni variabile deve essere dichiarata prima dell'utilizzo. Il linguaggio C ++: STRUTTURA DI UN PROGRAMMA La struttura generale di un programma C++ è: Librerie Dichiarazioni Globali main(argomenti) { dichiarazioni locali Funzione1() } Funzione1 (argomenti) { dichiarazioni locali istruzioni } 2. SINTASSI 2.1 Alcune regole 1. Tutte le istruzioni, fatte alcune eccezioni che si vedranno in seguito, terminano con il ; (punto e virgola) 2. Le variabili hanno nomi con caratteri maiuscoli o minuscoli (N.B.: Il C++ è CASE SENSITIVE ovvero c’è differenza tra carattere maiuscolo e minuscolo nei nomi delle variabili. La variabile Alfa è differente da alfa); 3. Il nome di una variabile non può essere composto da più parole (in tal caso si utilizza il carattere speciale “_” chiamato underscore, per unire le parole); 4. Il primo carattere può essere o una lettera o “_”. Esempio di nomi di variabili corretti: Esempio di nomi di variabili NON corretti: Numero_giorni Datanascita 3Numero Data di nascita 2. SINTASSI 2.2 Identificatori Gli identificatori particolari sono caratteri o parole particolari usate nel linguaggio. Esse sono: 1. Le variabili 2. Parole del vocabario del linguaggio (main, if, else, while, for, …) 3. I commenti (sequenze di caratteri racchiuse tra i simboli /* e */ se su più righe o dopo // se su singola riga). Ad esempio /* Questo è un commento di più righe */ //questo è un commento singola riga 2. SINTASSI 2.2 Variabili Tutti gli identificatori variabili devono essere dichiarati prima di essere invocati. La dichiarazione avviene indicando: • il tipo di dato (cioè la quantità di memoria necessaria per la memorizzazione e le operazioni consentite); • il nome attraverso cui utilizzarlo; • l’inizializzazione (optionale). Esempio: dichiarazioni semplici: int i, j ; char c; float pigraco ; double x; dichiarazioni con inizializzazione int i = 0; char c = ‘b’ ; double x = 5.789; 2. SINTASSI Le variabili Le variabili rappresentano un’area di memoria. Ogni variabile viene identificata da un nome Si possono distinguere vari tipi di variabili in base alla posizione che occupano nel corpo del programma, ai valori che possono assumere e alle operazioni che supportano: 1. variabili locali o automatiche (dichiarate all’interno di un blocco o funzione, sono creata al momento della chiamata e distrutte al termine dell’esecuzione); 2. variabili globali (dichiarate all’esterno di tutte le funzioni, sono visibili su tutto il codice); 2. SINTASSI I tipi di dato I tipi di dato presenti in C sono di due specie: 1. tipi semplici (char, int, float, double, void); 2. tipi strutturati (strutture, vettori,union). int: si indica il tipo intero in complemento a due che, a seconda della versione C++ utilizzata, può essere a 16 o a 32 bit; char : è il carattere, rappresentato in genere in ascii. le costamti di tipo char possono essere dichiarate anche in base alla rappresentazione ottale premettendo al valore il carattere "backslash". Ad esempio '\7' rappresenta il bell mentre '\0' il null; double : è un numero rappresentato in virgola mobile; una costante di tipo double è un numero dove compare il carattere <punto> , come ad esempio 12.3; tutte le costanti dove compare il punto, o scritte in notazione scientifica ( 1e3 ) sono di tipo double; in genere il compilatore utilizza più spazio per le variabili di tipo double rispetto alle variabili di tipo float , per cui la precisione di calcolo risulta superiore. 3. OPERAZIONI Il C++ ha molti operatori e poche parole chiavi. Oltre alle parentesi tonde, che il C++ considera come operatoti, i restanti operatori possono essere divisi nelle categorie principali che sono: 1. 2. 3. 4. operatori operatori operatori operatori aritmetici; relazionali e logici; di assegnamento; di incremento e decremento; 3. OPERAZIONI 3.1 Operazioni aritmetiche binarie Gli operatori aritmetici binari sono: + addizione - sottrazione * moltiplicazione / divisione % resto della divisione tra interi Una espressione è una sequenza di costanti,variabili, operatori e chiamate di funzioni che in genere determina un risultato. Esempio: 3; a + b; 3 * x; 2 * (a+b); 3. OPERAZIONI 3.2 Operatori relazionali e logici Gli operatori relazionali sono utilizzati nelle espressioni e forniscono come risultato un int di valore 0 per falso e 1 per vero. Essi sono: operatori relazionali < minore > maggiore <= minore uguale >= maggiore uguale = = uguale != diverso operatori logici ! negazione && and || or L'unico operatore unario è la negazione (!); tutti gli altri sono binari. Esempi. 9>7 ha valore VERO o 1 4+3 < 1+3 ha valore FALSO o 0 3*2 == 5+1 ha valore VERO o 1 3. OPERAZIONI 3.3 Assegnazione Con l'assegnazione si assegna ad una variabile un valore (costante, contenuto di variabile o il risultato di un'espressione). L’assegnazione richiede il punto e virgola i = 0; alfa = alfa + 1; vuole dire porre 0 in i significa incrementare di 1 il valore contenuto in alfa Sono possibili assegnazioni multiple come la seguente : a=b=c=d=3; In questo caso le variabili ‘a’, ‘b’, ‘c’ e ‘d’ sono inizializzate tutte con 3. La valutazione delle operazioni da svolgere avviene da destra a sinistra. La prima operazione è l'assegnazione d=3 che produce come risultato 3; tale risultato viene assegnato alla variabile c, producendo nuovamente come risultato 3, che viene assegnato alla variabile b, e così via. 3. OPERAZIONI 3.3 Assegnazione Sono, inoltre, possibili notazioni abbreviate: alfa += 1; var *= i ; equivale a equivale a alfa = alfa + 1; var = var * i ; N.B.: Il C effettua una conversione implicita sul tipo degli operandi :se una variabile è di tipo intero e l’espressione produce come risultato un valore reale, viene troncata e portata al reale. Esempio: int num, oper2=10; float oper1; oper1= 3/2; num = oper1* oper2; Num=+=1; 3. OPERAZIONI 3.4 Operazioni di incremento e di decremento Gli operatori di incremento e decremento “++” e “ --" sono operatori unari che vengono utilizzati per incrementare o decrementare di 1 un’espressione. Essi possono essere applicati sia prima che dopo la variabile da modificare, con effetto diverso. Esempio: ++a; equivale a a = a + 1; --a; equivale a a = a - 1; a++; equivale a x= a++; x = a; a = a + 1; a--; equivale a x= a--; x = a; a = a - 1; In situazioni semplici scrivere “a++” o “++a” è indifferente. Le cose cambiano quando il risultato di tale operazione è utilizzato all'interno di un'altra espressione. Esempio: int a, b=0, c=0; a = b++ + c++; a = ++b + ++c; /* avremo a = 0 /* avremo a = 2 b = 1 b = 1 c = 1 c = 1 */ */ 5. OPERAZIONI DI INGRESSO/USCITA Il C++ prevede numerose funzioni per gestire l’input/output da tastiera, su video, su file, etc. Le funzioni più comunemente usate, per l’input/output, sono “cin” e “cout” appartenenti alla libreria standard di I\O e richiamata attraverso la direttiva #include <iostream.h> . 5. OPERAZIONI DI INGRESSO/USCITA 5.2 L’Input La funzione per l’input è “cin”, essa legge i dati digitati da tastiera e li memorizza nella variabile indicata La sintassi di cin è la seguente: cin<<nomevariabile; Esempio: int a, b, c; double x; char val; cin<< a; /*viene letto cin<< b<<c; /*vengono un numero e memorizzato nella variabile a*/ letti due numeri e memorizzati nelle variabili b e c*/ cin<< val; val*/ /*viene letto un carattere e memorizzato nella variabile 5. OPERAZIONI DI INGRESSO/USCITA 5.1 L’Output La sintassi della funzione usata per l’output, “cout”, è: cout<< variabile o stringa; Esempio: cout<<“Salve”; cout<<a; //stampa //stampa a video la parola Salve a video il contenuto della variabile a cout<<“il valore di b = “<<b; /*stampa a video la frase il valore di b = e a seguire il contenuto della variabile b*/ cout<<c<<endl; // stampa il contenuto della variabile c e poi va a capo 4. ISTRUZIONI Si è già introdotta l’operazione di assegnazione, di seguito vengono elencate e poi spiegate atre istruzioni possibili in C++: 1. 2. 3. 4. istruzione composta; istruzione vuota; istruzione condizionale; i cicli; 4. ISTRUZIONI 4.1 Istruzione composta 4.2 Istruzione vuota Tutte le istruzioni terminano con il carattere punto e virgola “ ;” . L'istruzione vuota è rappresentata da un singolo “;”. L'istruzione composta è una sequenza di istruzioni racchiusa tra due parentesi graffe. La si utilizza quando la sintassi richiede un'istruzione ma non è richiesta alcuna azione (specie nel ciclo for). Esempio: { a = 1; b = 2; { c = 3; d = 4; } } 4. ISTRUZIONI 4.3 Istruzione condizionale SELEZIONE a una via 1. L’istruzione condizionale “if “ ha la forma : if ( espressione ) { istruzione1; istruzione2; } istruzione3; dove l’espressione di condizione tra parentesi permette, se è vera (ovvero contiene un valore diverso da 0), di eseguire le istruzioni tra parentesi graffe, altrimenti si eseguono le istruzioni subito dopo l’if (istruzione3). Se le istruzioni da eseguire nel caso di condizione VERA fosse stata solo una non erano necessarie le parentesi graffe. 4. ISTRUZIONI 4.3 Istruzione condizionale SELEZIONE BINARIA 2. L’istruzione condizionale “if – else” ha la forma: if { ( espressione ) istruzione1; istruzione2; } else { istruzione3; } dove l’espressione di condizione tra parentesi permette, se è vera (ovvero contiene un valore diverso da 0), di eseguire le istruzioni 1 e 2, altrimenti si esegue l’istruzione3. Se le istruzioni da eseguire nel caso di condizione VERA o FALSA sono solo una non sono necessarie le parentesi graffe. 4. ISTRUZIONI 4.3 Istruzione condizionale NIDIFICATA Le istruzioni condizionali possono essere annidate una nell’altra, o possono essere scritte una dietro l’altra. ma questo potrebbe potere a situazioni di ambiguità. L’istruzione condizionale “if – else” NIDIFICATA ha la forma: 2. if { ( condizione1) if (condizione2) istruzione1; else istruzione2; } else { if (condizione3) istruzione3; else istruzione4; } 4. ISTRUZIONI 4.3 Istruzione condizionale a CASCATA Le istruzioni condizionali possono essere annidate una nell’altra, o possono essere scritte una dietro l’altra. ma questo potrebbe potere a situazioni di ambiguità. L’istruzione condizionale “if ” A CASCATA ha la forma: 2. if { ( condizione1) istruzione1; } if { ( condizione2) istruzione2; } if { ( condizione3) istruzione3; } 4. ISTRUZIONI 4.3 Istruzione condizionale SELEZIONE MULTIPLA Un’altra istruzione utilizzata per rendere più eleganti e strutturati i programmi, è quella introdotta dalla parola chiave switch , per la selezione multipla. Con tale istruzione è possibile testare un’espressione, che può avere diversi valori di tipo intero o carattere, e per ogni caso individuare una serie di azioni da effettuare. 3. l’istruzione condizionale “switch” ha la forma: switch ( espressione ) { case costante_1 : istruzione_1; break; case costante_2 : istruzione_2 ; break; case ... : ...... break; case costante_n : istruzione_n; break; default : istruzioni ; break; } 4. ISTRUZIONI 4.3 Istruzione condizionale Esempi: 1. Assegnare a min il valore minore tra a e b. if ( a< = b ) \*min = a < b ? a : b ; *\ min = a; else min = b; 2. Determinare il maggiore tra tre numeri. if (a > b ) max = a; else max = b; if( max < c ) max=c; 4. ISTRUZIONI 4.3 Istruzione condizionale Esempi: 3. Dati due numeri max e min ordinarli. if( max < min ) { tmp = max; max = min; min = tmp ; } 4. ISTRUZIONI 4.4 Istruzioni di ciclo Ci sono tre istruzioni di ciclo: 1. istruzione while (controllo in testa); 2. istruzione do- while (controllo in coda); 3. istruzione for (ciclo enumerativo). 1. L’istruzione while permette di ripetere un blocco per tutto il tempo che la condizione, posta tra parentesi, risulta vera. Esempio: int i = 0; while ( i < 20) { cout<<“Il valore di i è :”<<i<<endl; i= i+1; } \*stampa i numeri da 0…19*\ 4. ISTRUZIONI 4.4 Istruzioni di ciclo 2. L’istruzione do-while valuta l’espressione di condizione solo dopo avere eseguito il corpo del ciclo. Esempio: int i = 0; do { cout<< “Il valore di i è “<<i<<endl; i= i+1; } while( i < 20 ); \*stampa i numeri da 0…19*\ N.B.: CONTRARIAMENTE ALLA TEORIA SI CICLA PER VERO E SI ESCE DAL CICLO PER FALSO! 4. ISTRUZIONI 4.4 Istruzioni di ciclo do-while Esempio: int b,h,a; char risp; do { cout<< “Inserisci base e altezza rettangolo”; cin>>b; cin>>h; a=b*h; cout<<“il valore dell’area è “<< a<<endl; cout<<“altro calcolo? (S o N) “; cin>>risp; } while( risp ==‘s’); \*Riesegue il programma finchè l’utente non risponde N alla domanda*\ N.B.: CONTRARIAMENTE ALLA TEORIA SI CICLA PER VERO E SI ESCE DAL CICLO PER FALSO! 4. ISTRUZIONI 4.4 Istruzioni di ciclo 1. L’istruzione for permette di ripeter un blocco per un numero di volte specificato. Essa ha la forma : for (valore di inizializzazione;condizione;valore di incremento ) { istruzione; } Questo ciclo è equivalente al seguente: valore di inizializzazione; while (condizione ) { istruzioni; valore di incremento; } 4. ISTRUZIONI 4.4 Istruzioni di ciclo Esempi: for (i=0; i<20; i++) cout<<“Il valore di i è “<<i; Se il corpo del FOR ha più di una istruzione allora richiede le parentesi graffe In un ciclo for tutte e tre le espressioni possono anche essere l'istruzione vuota: for( ; ; ) cout<<“questa riga viene ripetuta indefinitamente”; 6. ESEMPI DI SEMPLICI PROGRAMMI Problema 1: Calcolare l'area di un rettangolo. output: area. Input: base,altezza. limiti: (base>0) && (altezza>0) pseudo codice: Inizio leggi (base, altezza) se ( (base > 0) && (altezza > 0) allora area = base*altezza scrivi (area) altrimenti scrivi (“Errore nei dati”) fine La codifica in C++ dell’algoritmo : #include <iostream.h> main() { int base, altezza, area; cout<<“Inserisci base e altezza”; cin>>b>>h; if (base > 0) && (altezza > 0) { area = base * altezza; cout<<“Area = “<<area<<endl; } else cout<<“ERRORE nei dati”; system(“pause”); } Problema 2: Calcolare l'area del quadrato inscritto e circoscritto in una circonferenza. obiettivo: output: Input: limiti: calcolare l'area dei due quadrati. area_inscritta, area_circoscritta. raggio. (raggio>0). Pseudo codice Inizio leggi (raggio) se(raggio>0) area_circoscritta = 4 * raggio * raggio area_inscritta = 2 * raggio * raggio scrivi (area_circoscritta) scrivi (area_inscritta) altrimenti scrivi ("errore“) fine La codifica in C++ dell’algoritmo : #include <iostream.h> main() { int raggio, area_inscritta, area circoscritta; cout<<“inserisci raggio “; cin>>raggio; if (raggio>0) { area_circoscritta = 4*raggio*raggio; area_inscritta = 2*raggio*raggio; cout<<area_circoscritta<<“ “<<area_inscritta<<endl; } else cout<<“ERRORE"; system(“pause”); } Problema 3: Stampare i numeri pari da 0 a 100. output: numero di pari, numero di dispari; input: nessuno ; algoritmo: Inizio c=0 mentre c<=100 esegui scrivi (c) c=c+2 finemetre Fine La codifica in C++ dell’algoritmo : #include <iostream.h> main() { int c; while(c<=100) { cout<< c<<endl; c+=2; } system(“pause”); } Problema 3: Contare tra N numeri quanti sono i numeri pari e quanti sono I dispari output: numero di pari, numero di dispari; input: Il numero N e gli N numeri algoritmo: leggi il numero n dei numeri; ripeti n vote leggi il prossimo numero; se è pari, aggiorna il numero dei pari; altrimenti aggiorna il numero dei dispari; stampa il risultato. Problema 3: Contare tra N numeri quanti sono i numeri pari e quanti sono I dispari Pseudocodifica Inizio leggi(N) c=1; mentre c<=N esegui leggi (numero) se(numero MODULO 2==0) allora pari = pari+1 altrimenti dispari = dispari +1 finese c=c+1 Finementre Scrivi(pari) Scrivi(dispari) Fine La codifica in C ++dell’algoritmo : #include <iostream.h> main() { int n,i, numero, pari=0, dispari=0; cout<<"Inserisci numero dei valori da esaminare: "; cin>>n; for (i=1; i<=n; i++) { cout<<"Inserisci un valore “; cin>>numero; if ( numero % 2 == 0) pari++; else dispari++; } cout<<"Pari = “<< pari<<endl; cout<<“Dispari = “<< dispari<<endl; system(“pause”); }