1.74k likes | 2.11k Views
C/C++. Claudio Rocchini IGM. -1 Pre Introduzione. Il C/C++. Il C++ e’ un linguaggio di programmazione.
E N D
C/C++ Claudio Rocchini IGM C. Rocchini - C++
-1 Pre Introduzione C. Rocchini - C++
Il C/C++ • Il C++ e’ un linguaggio di programmazione. • E’ il lunguaggio utilizzato per creare i programmi (insieme all’Assembler), (es. Windows, Linux, Office, OpenOffice, Apache, Perl, PHP, Oracle, PostgreSql, AdobePhotoshop, etc. sono scritti un C/C++) • L’efficienza e’ uno degli obiettivi principali (supporto run-time minimo, contrapposto a Java, Basic, PHP, Perl : support RE massimo + garbage-collector). • Ma e’ anche un linguaggio molto espressivo. • Nasce in ambiente industriale (non accademico o umanistico). C. Rocchini - C++
0 - Introduzione C. Rocchini - C++
Il Mio primo programma #include <stdio.h> //libreria stdio int main() //funzione principale { //Inizio blocco printf(“Buongiorno”); //Stampa buongiorno return 0; //Riturna il valore 0 } //Fine blocco // La spaziatura non conta // Tutto i comandi finiscono con ; // I bocchi sono delimitati da {} C. Rocchini - C++
Struttura TipoRisultato NomeFunzione( Parametri) { istruzione; istruzione; … return valore_ritorno; } Altra_Funzione … // Commento di una linea /* Commento di piu’ linee */ C. Rocchini - C++
Nota sullo stile • La spaziatura, la tabulazione e i ritorni a capo non hanno alcun significato (al contrario del Basic o del Fortran). • Questo non vuol dire che bisogna scrivere disordinatamente. • Di solito si indenta (tabularizza) i blocchi fra parentesi per facilitare la lettura. • I nomi devono essere significativi. C. Rocchini - C++
Nota sullo stile 2 • Esiste un campionato mondiale di C scritto disordinato: “The International Obfuscated C Code Contest”, http://www.ioccc.org/ • Uno dei vincitori: main() { printf(&WIN32["\021%six\012\0"],(WIN32)["have"]+"fun"-0x60);} C. Rocchini - C++
Nota sullo stile 3 #define _ F-->00||F-OO--; int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ } C. Rocchini - C++
Esercitazione • Es0: applicazione console • Consultate i lucidi relativi alla esercitazione 0: applicazione console C. Rocchini - C++
4 – Tipi Fondamentali C. Rocchini - C++
Tipi fondamentali float x; // x e’ una variabile in virgola mobile // in Basic: dim x as single int y = 7; // y e’ una var. intera con valore iniz. 7 float fun(int x); // fun e’ una funzione da float a int // in Basic: function fun( x as integer ) as single char c; // c e’ un carattere double z; // z e’ una variabile in doppia precisione // void = tipo “nullo” esempio: void sub(); // sub e’ una procedura (subroutine) C. Rocchini - C++
Costruire Altri Tipi int * punt; // Puntatore ad intero char vet[7]; // Vettore di caratteri double & d; // “Riferimento” ad un double // Enumerazioni enum giorni { lunedi, martedi, mercoledi, … }; // Strutture: struct Coordinata { double latitudine; double longitudine; }; // In basic: structure // Classi… (come vedremo piu’ avanti) C. Rocchini - C++
Bool (Valore di verità) bool x = true; // Variabile inizializzata bool y = false; int a = 1; int b = 1; bool k = a==b; // a e’ uguale a b? bool q = (a!=0) && (b>7); // Diverso, maggiore C. Rocchini - C++
Char (carattere) char c = ‘a’; // Carattere letterale char k = 32; // Conversione da codice ascii int c = int(‘$’); // Conversione in codice ascii if( isupper(c) ) .. // Esempio di funzioni bool k = isdigit(k); // k e’ una cifra (0-9) // Nota: da non confondersi con string! C. Rocchini - C++
Tipi interi int a = 3; // Intero standard(4-8 byte) shortint s; // Intero a 2-4 byte short s; // Scrittura abbreviata long int l; // Intero 4-8 byte long l; // Scrittura abbreviata unsignedint u; // Intero senza segno unsigned u; // Scrittura abbreviata unsignedlong lu; // Intero lungo positivo intx = 3*5+7-4/2; // Espressioni intk = 15%7; // =1, operatore modulo = resto divisione int k = 0xFE; // Costanti esadecimali C. Rocchini - C++
Virgola mobile float x = 1; // Singola precisione double y = 3.14; // Doppia precisione double z = 1.2e10; // Notazione esponensiale // Espressioni e funzioni double t = 3*7-sqrt(k)+sin(9); double z = 3^y; // Esponenziale int round = int(z+0.5); // Arrotondamento ad intero int trunc = int(z); // Troncamento ad intero C. Rocchini - C++
void void x; // Variabile nulla: VIETATO void sub(); // Procedura (non ritorna niente) void * p; // Puntatore a qualcosa: utile per // dichierare puntatori generici di // tipo sconosciuto. C. Rocchini - C++
Tipi Enumerati enum e1 { LUN, MAR, MER, GI }; // Non specificata enum e2 { A=2, B, C, D }; // Inizio specificato enum e3 { K=1, H=99 }; // Tutti specificati enum e1 pippo; // Variabile di tipo enum int x = MAR; // Utilizzo del valore cost. switch(pippo) // Utilizzo tipico: case { case LUN: … LUN = 99; // Errore! C. Rocchini - C++
int a = 5; // Una variabile intera int *p = &a; // p è un puntatore a intero, // viene assegnato all’indirizzo // di a. a = 6; *p = 7; // a ora vale 7 int * q = 0; // 0, valore speciale // Puntatore nullo Introduzione ai puntatori Cella di Memoria di a Valore = 5 Valore = 5 … … “Indirizzo” in memoria della cella: Il puntatore alla cella. C. Rocchini - C++
Costanti constdouble PI = 3.141596; // Valore costante PI = 4; // Errore! constchar * p; // Il contenuto e’ costante *p = ‘w’; // Errore p = 0; // OK char * const p; // Il puntatore e’ costante *p = ‘w’; // OK p = 0; // Errore C. Rocchini - C++
Vettori Statici char v[10]; // Vettore di 10 elemeni (da 0 a 9) intx; v[7] = 11; // Accesso ad un elemento v[999] = 1; // Errore catastrofico! // Forse distruggi x double mat[3][3]; // Vettore bidimensionale mat[0][2] = 9; // Accesso ad un elemento char *p = &(v[0]); // Indirizzo del primo elem. char *p = v; // Scrittura abbreviata int a = fun(); char w[a]; // Errore, dinamico constint b = 10; char x[b]; // Ok, statico C. Rocchini - C++
Dichiarazioni Multiple int a,b,c; // Tre interi char k, *p; // Un carattere ed un puntatore bool y,v[11]; // Un booleano ed un vettore C. Rocchini - C++
Regole di Visibilità int x = 1; // Globale al modulo void sub() { x = 7; // Modifico la globale int x = 2; // Locale alla procedura … { int x = 3; // Locale al sottoblocco // Qui x vale 3 int y = 99; } // Qui y non e’ dichiarata! } C. Rocchini - C++
typedef unsignedlong * p; // Puntatore ad intero lungo s.s. typedefunsignedlong * Pointer; // Definizione di tipo Pointer p; // Stesso tipo di p typedef double Matrix[9][9]; // Tipo matrice 9x9 Matrix m; // Dichiarazione m[2][1] = 3; C. Rocchini - C++
Strutture struct Registrazione // Dichierazione di tipo { bool ok; int valore; double x; }; // Notare il punto e virgola Registrazione r; // Dichiarazione variabile r.valore = 3; // Utilizzo r.x = 4.5; C. Rocchini - C++
Strutture 2 struct Dipendente { string nome; string cognome; int eta; }; … Dipendete d1,d2; d1.nome = “claudio”; d1.eta = 37; d2.nome = “claudia”; C. Rocchini - C++
Puntatore a Strutture struct Registrazione // Dichierazione di tipo { bool ok; int valore; double x; }; // Notare il punto e virgola Registrazione a; // Una struttura Registrazione * p = &a; // Puntatore a struttura a.valore = 5; (*p).valore = 3; // Accesso ai campi p->valore = 7; // Altra scrittura Registrazione k = {false,3,0.9}; // Inizializzazione C. Rocchini - C++
Operatore “sizeof” // restituisce la dimensione in byte di una variabile sizeof(char) // = 1 sizeof(short) // = 2 sizeof(int) // = 2 o 4 sizeof(long) // = 4 o 8 sizeof(double) // = 8 sizeof(char *) // = 4 (ma 8 proc. 64 bit) sizeof(double *) // = sempre 4! sizeof(void *) // = sempre 4! sizeof(short[32]) // = 64 C. Rocchini - C++
Sizeof(2) struct registrazione { short x; bool b; double y; }; sizeof(registrazione) // >= sizeof(short)+sizeof(bool)+sizeof(double) // Attenzione! Puo’ essere anche maggiore per // motivi di allineamento del processore C. Rocchini - C++
La notte del C: le stringhe C // Prima nota: ogni volta che e’ possibile si usi il // tipo C++ std::string (e’ un oggetto) // Stringhe letterali: incluse in virgolette “questa e’ una stringa” // I caratteri invece sono inclusi in apici ‘a’ // I vettori di caratteri possono essere interpretati // come stringhe, le stringhe sono terminate dal // carattere 0 char nome[100]; C. Rocchini - C++
Stringhe C (2) char s[16] = “casa”; // Inizializzazione s[0]==‘c’ s[3]==‘a’ s[4]== 0 // Terminazione della stringa s[5]== ??? Valore non Definito ??? char n1[4] = “casa”; // Errore: manca spazio char n2[5] = “casa”; // OK: corretto sizeof(“casa”)==5 // 4 lettere + terminatore // Stringha nulla: “” char nulla[1000] = “”; nulla[0] == 0 // Subito il terminatore C. Rocchini - C++
String C (3) // I puntatori a carattere possono essere associati // a stringhe (puntatori al primo carattere). char * p = “cavallo”; // Stringa costante ! charx = p[2]; // OK: lettura di ‘v’ p[3] = ‘i’; // Errore: stringa costante char str[32] = “cavallo”; // Stringa variabile p = str; // p punta all’inizio di str p[3] = ‘i’; // OK: str = “cavillo” C. Rocchini - C++
Stringhe C: funzioni // Funzioni della libreria string.h int strlen( char * str); // Lunghezza di una stringa str1 = str2; // Errore! strcpy( str1, str2 ) // Copia di stringhe strcat( str1, str2 ) // Concatenzazione str1 == str2 // Errore! Conf. Puntatori! strcmp( str1, str2 ) // Confronto fra stringhe strchr( str1, char ) // Cerca un carattere strstr( str1, str2 ) // Cerca una sottostringa // Altre funzioni: tokenizzatore (parser) strtok( str1, “separatori”) C. Rocchini - C++
Stringhe, per finire: escape seq. “\”” // Virgolette nelle stringhe ‘\’’ // Il carattere apicetto “\n” // Ritorno a capo “\r” // Ritorno carrello “\t” // Carattere di tabulazione “\\” // Caratte barra rovesciata C. Rocchini - C++
6 – Espressioni ed Istruzioni C. Rocchini - C++
Riepilogo operatori A = 3; // Assegnamento a variabile // Aritmetica di base A = b+c; // Somma A = b-c; // Sottrazione A = b*c; // Prodotto A = b/c; // Divisione A = b%c; // Resto della divisione intera A = -b; // Cambio di segno A = ((b+c)*d)-h; // Parentesi (solo tonde!) C. Rocchini - C++
Riepilogo operatori // Confronti e operatori logici if( A==B ).. // Uguale A != B // Diverso A < B // Minore A > B // Maggiore A <= B // Minore o uguale A >= B // Maggiore o uguale && // And (e) logico || // Or (o) logico ! // Not (non) logico // es. if( a<min || a>max) … C. Rocchini - C++
Riepilogo operatori // Incrementi e decrementi int a = 2, b=7; ++a; // Incremento: a vale 3 --b; // Decremento: b vale 6 int x = 10; int y = x++; // Postincremento, x=11 ma y=10 intz = ++x; // Preincremento, z=12 e x = 12 int h = 42; int k = h--; // Postdecremento, h=41 ma k=42 // Utilizzabile sugli interi, non su virgola mobile C. Rocchini - C++
Operatori sui bit A = b & c; // And bit a bit A = b | c; // Or bit a bit A = b ^ c; // Xor = or esclusivo, 1 se b!=c A = ~b; // Not logico A = b<<3; // Shift a sinistra (di 3) A = b>>4; // Shift a destra // Esempi (b>>2)&1 // Estrazione del terzo bit b|(1<<4) // Forza a uno il quarto bit b&~(1<<4) // Forza a zero il quarto bit (b>>8)&0xFF // Parte alta di una word <<2 C. Rocchini - C++
Modificatori e Exp Condizionale // Modificatori A += b; // Scrittura riassuntiva di A = A + b; A -= b; A *= b; … A <<= 3; // Equivale a A = A << 3; // Espressione condizionale // condizione ? valore_se_vero : valore_se_falso A = b==0 ? 1 : 100/b; // se b vale 0 a prende 1 altrimenti prende 100/b // Corrisponde al se(;;) di Excel C. Rocchini - C++
Ordine di valutazione A = 3+2*3; // 9, non 15! (Anche in Basic) Record * p; *p.valore // Contenuto di valore (*p).valore // Contenuto di p if( a&b==0 ) // == associa prima di &: errato! if( (a&b)==0 ) // Corretto // Nel dubbio usare le parentesi! // Controllare la precedenza sul manuale C. Rocchini - C++
Memoria dinamica: new, delete int *p = 0; // Puntatore nullo *p = 7; // Errato: non esiste la locazione p = newint; // Allocazione di un intero *p = 7; // Corretto delete p; // Obbligatorio dopo l’utilizzo! *p = 7; // Di nuovo errato double * v = 0; v = newdouble[1024]; // Allocazione di un vettore v[907] = 3.14; // OK: memoria allocata … delete[] v; // Disallocazione: notare le [] C. Rocchini - C++
Cast: Conversioni di tipo int a = 3; double x = a; // Automatica a = int(x); // Cast (troncamento) int * q; char * p = (char *)q; // Conversione di puntatore void * k; // Puntatore “generico” bool * b = (bool *)k; char c = char(3.14); // Da double a char C. Rocchini - C++
Istruzione condizionale if (a>b) // Parentesi () obbligatorie!! c = a; // Spaziatura non significativa! if (a!=b) // Blocco di istruzioni { c = a; b = a; } if (a>b) c = a; // Utilizzo di else else c = b; C. Rocchini - C++
Case switch(a) // A seconda del valore di a { case 1: // case + valore // se a=1 break; // Fine case case 2: // Doppio valore case 3: // se a=2 oppure 3 break; default: // Caso di default(case else) // Altrimenti… } C. Rocchini - C++
Cicli while while( a>b ) // Ciclo while { // Controllo all’inizio --a; } do// Ciclo do-while { // Controllo alla fine --a; } while( a>b ); C. Rocchini - C++
Ciclo For // for(inizializzazione;condizione;iterazione) {} for(a=1;a<=10;++a) // Ciclo classico { // … } for(a=1; a<=100 ;a+=10) // step di 10 for(a=1024; a>1; a/=2) // Ciclo logaritmico //Struttura scansione di un file: //for(apri_file;not eof;leggi_carattere) // TODO FARE ESEMPIO C. Rocchini - C++
Esempio for su file FILE * fp; char c; for(fp=fopen(file);!EOF(fp);c=fgetc(fp)) { usa il carattare c } C. Rocchini - C++
goto //Il comando goto si articola in due parti: //Dichiarazione di una etichetta // Comando goto per saltarci. //Si usa raramente: in caso di errore per saltare //Fuori da una procedure (bisognerebbe usare le // Eccezioni //… goto etichetta; //.. etichetta: //… C. Rocchini - C++