La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Il main program Ogni programma in C++, per essere eseguibile, deve contenere una funzione main() da cui lesecuzione comincerà main() deve avere un tipo.

Presentazioni simili


Presentazione sul tema: "1 Il main program Ogni programma in C++, per essere eseguibile, deve contenere una funzione main() da cui lesecuzione comincerà main() deve avere un tipo."— Transcript della presentazione:

1 1 Il main program Ogni programma in C++, per essere eseguibile, deve contenere una funzione main() da cui lesecuzione comincerà main() deve avere un tipo (decidere quale è compito del programmatore). Regola generale è che main() ritorni un intero, a significare il return code dellapplicazione int main() { // il piu` semplice programma in C++ return 0; } int main() { // il piu` semplice programma in C++ return 0; }

2 2 I/O: lettura e scrittura Non esiste nel C++ nativo. Si usa: iostream –Gli operatori > sono usati per definire la direzione del flusso – cin, cout e cerr rappresentano lo standard input, output e error del programma #include using namespace std; int main() { return 0; } direttiva al preprocessore end of line #include cout << Hello, world ! << endl;

3 3 Commenti Esistono due tipi di commento in C++ –inline: –multiline (come in C ): –I due tipi possono essere usati indifferentemente, ma si raccomanda di usare linline (più semplice e meno ambiguo) const int Ntries; // questo e` un commento inline // il resto della linea e trattato come un commento const int Ntries; /* questo e` un commento multiline: tutto viene trattato come un commento fino a quando il commento stesso non viene chiuso con uno */

4 4 Tipi predefiniti in C++ Sono definiti una serie di tipi numerici che permettono di rappresentare numeri interi, reali e caratteri – char (un solo byte) viene normalmente usato per rappresentare interi inferiori a 256 –stringhe e numeri complessi sono implementati come tipi derivati intintero in singola precisione longintero in doppia precisione floatreale in singola precisione doublereale in doppia precisione long double reale in precisione estesa unsigned intintero senza segno unsigned doublereale senza segno in doppia precisione charcarattere singolo boolvariabili logiche

5 5 Tipi predefiniti in C++ (2) 123 123 0x123 interi costanti, decimale, ottale, esadecimale 123l 123uinteri, long, unsigned A 1 \t caratteri, tab 3.14f 3.14153.1415Lfloat, double, long double 300e-2.03e230e-1double, notazione esponenziale Nomestringa costante truefalseboolean Esempi di costanti \aalert \\backslash \bbackspace \rcarriage return \double quote \fform feed \ttab \nnewline \0carattere nullo \single quote \vvertical tab \101101 ottale, A \x041esadecimale, A Costanti carattere stringa nulla (\0) nomen o m e \0 una \stringa\stampa: una stringa una stringa \un \ alla fine della linea su piu` lineeper continuare la stringa Stringhe costanti

6 6 Tipi predefiniti in C++ (3) char [1] int [1] bool short [1] long [1] float double long double 8 16 32 64 8 32 16 32 64 128 8 32 16 64 32 64 128 OS 16 bit OS 32 bit OS 64 bit [1] Può essere unsigned

7 7 Identificatori Un identificatore è composto da uno o più caratteri Il primo carattere deve essere una lettera o un underscore. Caratteri successivi possono essere lettere, numeri o underscore Non c è un limite in lunghezza, anche se alcuni sistemi si limitano a considerare i primi 31 caratteri Gli identificatori che iniziano con un doppio underscore o con un underscore e una lettera maiuscola sono riservati ad usi di sistema C++ e` case sensitive! const int Ntries; double _attempts; double 2A; // errore!

8 8 Keywords Alcuni identificatori sono esplicitamente riservati al sistema (hanno un preciso significato in C++ ) e non possono essere usati asmelseoperatorthrow autoenumprivatetrue boolexplicitprotectedtry breakexternpublictypedef casefalseregistertypeid catchfloatreinterpret_casttypename charforreturnunion classfriendshortunsigned constgotosignedusing const_castifsizeofvirtual continueinlinestaticvoid defaultintstatic_castvolatile deletelongstructwchar_t do mutableswitchwhile doublenamespacetemplate dynamic_castnewthis keyword

9 9 const La keyword const viene utilizzata per dichiarare un oggetto costante In C le costanti vengono normalmente dichiarate usando il preprocessore –in questo caso N e` una costante senza tipo ed il preprocessore sostituisce N ovunque lo trovi nel programma, senza rispettare le regole di scope (da evitare) const int N=100;N non puo` essere cambiato double w[N];N usato come per dimensionare un vettore const int vect[5]=le componenti di vect non {10,20,30,40,50};possono essere cambiate Esempi di const #define N 100

10 10 Dichiarazione Le dichiarazioni associano un significato ad un identificatore in C++ ogni cosa deve essere dichiarata per poter essere usata Una dichiarazione è spesso anche una definizione. Per variabili semplici questo consiste nellassociare un valore alla variabile al momento della dichiarazione const int i;// la variabile i double max(double r1,double r2);// la funzione max const double pi=3.1415926;// definizione double max(double r1, double r2) {// dichiarazione return (r1>r2) ? r1: r2; // definizione di max }

11 11 typedef Listruzione typedef viene utilizzata per creare un alias per tipi esistenti typedef NON può essere usato per implementare nuovi tipi, ma solo per definire un alias typedef int INTEGER;// per i nostalgici del fortran typedef int BOOLEAN;// usato prima che bool venisse // implementato typedef void (*ptr_f)(); // ptr_f e` un puntatore ad una // procedura (subroutine) typedef mela frutto;// compila soltanto se mela // e` gia` stata definita

12 12 Enumeratori In C++ sono supportati tipi definiti dallutente enum Color { red, green, blue }; Color screenColor = blue; Color windorColor = red; int n = blue; // valido Color c = 1; // errore enum Seme { cuori, picche, quadri, fiori };

13 13 Scope Le variabili possono essere dichiarate e definite quasi ovunque in un programma in C++ la visibilità (scope) di una variabile dipende da dove la variabile è stata dichiarata int func() { … const int n=50;// function scope for (int i=0;i<100;i++)// i e` locale { double r;// r e` locale... } cout< { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_12.jpg", "name": "13 Scope Le variabili possono essere dichiarate e definite quasi ovunque in un programma in C++ la visibilità (scope) di una variabile dipende da dove la variabile è stata dichiarata int func() { … const int n=50;// function scope for (int i=0;i<100;i++)// i e` locale { double r;// r e` locale...", "description": "} cout<

14 14 Scope (2) Attenzione! La stessa variabile può essere ri- dichiarata (con visibilità diversa). Questo è da evitare (se possibile) per non rendere il programma oscuro e a rischio di errore! int i;// file (global) scope int func() { int i=50;// function scope, nasconde // la i a file scope for (int i=0;i<100;i++)// block scope. Nasconde // la i a function scope { int i;// questo e` un errore...... } cout< { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_13.jpg", "name": "14 Scope (2) Attenzione.La stessa variabile può essere ri- dichiarata (con visibilità diversa).", "description": "Questo è da evitare (se possibile) per non rendere il programma oscuro e a rischio di errore. int i;// file (global) scope int func() { int i=50;// function scope, nasconde // la i a file scope for (int i=0;i<100;i++)// block scope. Nasconde // la i a function scope { int i;// questo e` un errore...... } cout<

15 15 -i+wpiu` e meno unari a*ba/bi%2moltiplicazione, divisione, modulo a+ba-baddizione e sottrazione binarie a=3;assegnazione Espressioni AritmeticheCommento Operatori k = ++j; j=j+1; k=j; k = j++; k=j; j=j+1; k = --j; j=j-1; k=j; k = j--; k=j; j=j-1; Auto-incremento Espressione e decremento ~i; Complemento bit a bit i&j; AND bit a bit i|j OR bit a bit i^j XOR bit a bit i<>n shift a destra di n pos. bit-wise significato maggiore di.GT. <=minore o uguale.LE. >=maggiore o uguale.GE. ==uguale.EQ. !=diverso.NE. !Negazione unaria.NOT. &&and logico.AND. ||or logico.OR. Operatori relazionaliFortran

16 16 Espressioni di assegnazione Le espressioni di assegnazione sono valutate da destra a sinistra Le assegnazioni multiple sono permesse alcuni operatori di assegnazione combinano assegnazione ed altri operatori Assegnazioni possono essere fatte allinterno di espressioni aritmetiche a = j++; j viene incrementato ed il risultato assegnato ad a a = b = c = d = 100; a *= b;// equivale ad a = a*b; a -= b;// equivale ad a = a-b; a = b + ( c = 3 );// equivale a c=3; a=b+c;

17 17 Statements vuoto; espressionej=j+k; composto{.... }usato in funzioni, if.. Costituisce un blocco goto goto label;da non usarsi ifif (p==0) cerr<0); breakbreak;esce dal blocco continuecontinue;prossima iterazione StatementC++commenti

18 18 Statements (2) switchswitch (s) { case 1:si deve usare break per ++i;evitare di cadere nei case 2:casi successivi e --i;aggiungere un caso di default:default alla fine della ++j;lista }; dichiarazioneint i=7;in un blocco, file o namespace trytry {....}usato per trattare le eccezioni labelerror: cerr< { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_17.jpg", "name": "18 Statements (2) switchswitch (s) { case 1:si deve usare break per ++i;evitare di cadere nei case 2:casi successivi e --i;aggiungere un caso di default:default alla fine della ++j;lista }; dichiarazioneint i=7;in un blocco, file o namespace trytry {....}usato per trattare le eccezioni labelerror: cerr<

19 19 Statement composti Uno statement composto in è costituito da una serie di statement contenuti fra parentesi graffe Usato normalmente per raggruppare istruzioni in un blocco ( if, for, while, do-while, etc.) Il corpo di una funzione è sempre uno statement composto La dichiarazione di una variabile può avvenire ovunque allinterno di un blocco, in questo caso lo scope della variabile sarà il blocco stesso Ovunque si possa usare uno statement singolo si può definire un blocco

20 20 if Attenzione alluso di = e == Nel dubbio, usare sempre un blocco… Attenzione agli else! if (i=1)// questo e` sempre vero!!! {....} if (i != 0)// possibile divisione per 0 a++;// mancano delle {}? a/=i; if (i == 0)// possibile divisione per 0 if (a<0) { cerr< { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_19.jpg", "name": "20 if Attenzione alluso di = e == Nel dubbio, usare sempre un blocco… Attenzione agli else.", "description": "if (i=1)// questo e` sempre vero!!. {....} if (i != 0)// possibile divisione per 0 a++;// mancano delle {}. a/=i; if (i == 0)// possibile divisione per 0 if (a<0) { cerr<

21 21 while e do-while La forma generale di un while è : Lo statement verrà eseguito fino a quando la condizione verrà verificata ( true ). A seconda del volore della condizione, lo statement verrà eseguito zero o più volte la sintassi di un do-while è invece: Lo statement verrà quindi eseguito almeno una volta while (condizione) statement; do statement; while (condizione);

22 22 break e continue break e continue sono utilizzati nei loop per saltare alla fine del loop o fuori dal loop stesso break e continue possono solamente essere utilizzati nel corpo di un for, while o do- while. break e` anche usato negli switch int i,n=0; int a[100]; cin>>i;// leggo il valore di i while (1)// loop infinito { if (i<0) break; if (n>=100) continue; a[n]=i; n++; // continue salta qui } // break salta qui

23 23 switch Lo switch è uno statement condizionale che generalizza lo if-else lo statement è generalmente composito e consiste di diversi case e, opzionalmente, di un default switch (condizione) (statement); switch (n) { case 0: cout<< n e` nullo< { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_22.jpg", "name": "23 switch Lo switch è uno statement condizionale che generalizza lo if-else lo statement è generalmente composito e consiste di diversi case e, opzionalmente, di un default switch (condizione) (statement); switch (n) { case 0: cout<< n e` nullo<

24 24 switch (2) Non si puo` dichiarare una variabile in uno dei case … ma si puo` creare una variabile locale definendo uno statement composto... switch (k) { case 0: int j=0;// Illegale! Errore!... case 1:... } switch (k) { case 0: { int j=0;// OK, questo compila... } case 1:... }

25 25 Loperatore ? Loperatore ? e` lunico esempio di operatore ternario in C++ –Equivale a: –Esempio: expr1 ? expr2 : expr3; double max(double a, double b) { double max = (a>b) ? a : b; return max; } if(expr1) expr2; else expr3;

26 26 int main() { return 0; } int main() { return 0; } Funzioni matematiche In C++ non esistono funzioni predefinite cmath.h definisce sin, cos,... { double r, theta, phi; #include cin >> r >> theta >> phi ; #include using namespace std; double x = r * sin( theta ) * sin( phi ); double y = r * sin( theta ) * cos( phi ); double z = r * cos( theta ); cout << x <<, << y <<, << z << endl; Potenze: pow(b,exp) (non si può usare ** )

27 27 Array Sono supportati gli array di dimensione fissa int main() { int x[10]; for ( int i = 0; i < 10, i++ ) x[i] = 0; double m[5][5]; for ( int i = 0; i < 5; i++ ) for ( int j = 0; j < 5; j++ ) m[i][j] = i * j; return 0; } int main() { int x[10]; for ( int i = 0; i < 10, i++ ) x[i] = 0; double m[5][5]; for ( int i = 0; i < 5; i++ ) for ( int j = 0; j < 5; j++ ) m[i][j] = i * j; return 0; } Lindice va da 0 a n-1. Usare un indice maggiore di n-1 può causare un crash. int x[] = { 1, 2, 3, 4 }; char[] t = { C, i, a, o, \0 }; char[] s = Ciao; int m[2][3] = { {11, 12, 13}, {21, 22, 23} }; Inizializzazione:

28 28 Esempio con gli arrays Moltiplicazione fra matrici: int main() { const int DIM=3; float m[DIM][DIM], m1[DIM][DIM], m2[DIM][DIM]; // Assumiamo che m1 ed m2 vengano riempiti qui... // Moltiplicazione: for (int i=0; i { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/599803/2/slides/slide_27.jpg", "name": "28 Esempio con gli arrays Moltiplicazione fra matrici: int main() { const int DIM=3; float m[DIM][DIM], m1[DIM][DIM], m2[DIM][DIM]; // Assumiamo che m1 ed m2 vengano riempiti qui...", "description": "// Moltiplicazione: for (int i=0; i

29 29 12 24 0x7b03a928 Puntatori Riferimento ad una locazione di memoria j 12 ptr using namespace std; int main() { int j = 12; return 0; } using namespace std; int main() { int j = 12; return 0; } int *ptr = &j; #include cout << *ptr << endl; j = 24; cout << *ptr << endl; cout << ptr << endl; indirizzo di memoria 24

30 30 Puntatori Puntatore nullo #include using namespace std; int main() { int j = 12; int *ptr = 0; cout << *ptr << endl; // crash ! return 0; } #include using namespace std; int main() { int j = 12; int *ptr = 0; cout << *ptr << endl; // crash ! return 0; } Segmentation violation (core dumped) j 12 ptr

31 31 Puntatori e array In C gli array sono trattati come puntatori int main() { float x[5]; int j; for (j = 0; j < 5; j++) x[j] = 0; float *ptr = x; *ptr = 1.5; // x[0] = 1.5 *(ptr+1) = 2.5; // x[1] = 2.5 *(ptr+3) = 3.5; // x[3] = 3.5 } x X[0] 1.5 X[1]X[2]X[3]X[4] 2.50.03.50.0 X+1X+3

32 32 Puntatori: allocazione dinamica Riferimento ad una locazione di memoria #include using namespace std; int main() { int *ptr = new int; *ptr = 12; cout << *ptr << endl; delete ptr; return 0; } #include using namespace std; int main() { int *ptr = new int; *ptr = 12; cout << *ptr << endl; delete ptr; return 0; } 12 ptr Attenzione: –Non usare delete fa accumulare locazioni di memoria inutilizzate (memory leak) –Utilizzare puntatori prima del new o dopo il delete causa il crash del programma

33 33 Puntatori: allocazione dinamica Riferimento a più locazioni di memoria #include using namespace std; int main() { int *ptr = new int[3]; ptr[0] = 10; ptr[1] = 11; ptr[2] = 12 delete [] ptr; return 0; } #include using namespace std; int main() { int *ptr = new int[3]; ptr[0] = 10; ptr[1] = 11; ptr[2] = 12 delete [] ptr; return 0; } 10 ptr 1112

34 34 new e delete Gli operatori new and delete vengono utilizzati per allocazione/deallocazione di memoria dinamica – la memoria dinamica (heap), è unarea di memoria libera provvista dal sistema per quegli oggetti la cui durata di vita è sotto il controllo del programmatore new riserva la quantità necessaria di memoria richiesta e ritorna lindirizzo di questarea int *i=new int;alloca un intero, returna il puntatore char *c=new char[100];alloca un array (stringa) di 100 caratteri int *i=new int(99);alloca un intero e lo inizializza a 99 char *c=new char(c);alloca un carattere inizializzato a c int *j=new int[n][4];alloca un array di puntatori ad intero operatore newcommenti

35 35 new e delete (2) Loperatore delete è usato per restituire una certa area di memoria (allocata con new ) allo heap Ogni oggetto allocato con new deve essere distrutto con delete se non viene piu` utilizzato, altrimenti larea di memoria che esso occupata non potra` piu` essere ri-allocata (memory leak) Largomento di delete è tipicamente un puntatore inizializzato preventivamente con new delete ptr;distrugge un puntatore ad un oggetto delete p[i];distrugge loggetto p[i] delete [] p; distrugge ogni oggetto di tipo p operatore deletecommenti

36 36 new e delete (3) Attenzione –la dimensione dello heap non e` infinita –lallocazione con new può fallire, nel qual caso new restituisce un puntatore nullo o suscita uneccezione. Nel caso di allocazione di memoria importante bisogna verificare che loperazione abbia avuto successo prima di usare il puntatore –ogni oggetto creato con new deve essere distrutto con delete, ogni oggetto creato con new [] deve essere distrutto con delete [], queste forme NON sono intercambiabili


Scaricare ppt "1 Il main program Ogni programma in C++, per essere eseguibile, deve contenere una funzione main() da cui lesecuzione comincerà main() deve avere un tipo."

Presentazioni simili


Annunci Google