C: costanti introdotte con #define Laboratorio di informatica Ingegneria meccanica Lezione 4 22 ottobre 2007 Forma: #define nome valore Effetto: ogni occorrenza successiva di nome sarà rimpiazzata con valore (qualunque esso sia!) nome: stesse regole date per il nome di variabili Esempio: #define KAPPA =-p32pk ; produce la sostituzione di "KAPPA" con =-p32pk ;" Inserimento nel programma: dove necessario #define è una direttiva per il compilatore (elaborata dal preprocessore a tempo di compilazione) Uso tipico: per modificare valori di costanti senza interventi pesanti sul testo del programma (si ricompila il programma dopo aver aggiornato solo il valore che compare nella #define) 1 2 C: Valutazione delle espressioni (1) REGOLE DI PRECEDENZA TRA OPERATORI Stabiliscono l'ordine logico di applicazione degli operatori che compaiono in un'espressione Esempio: In a * b + c, * èapplicato prima di + Si può forzare l'ordine logico desiderato usando parentesi tonde: l'ordine è dalle parentesi più interne verso quelle più esterne Esempio: In (a * (b + c)), + è applicato prima di * (la seconda coppia di parentesi può essere omessa) C: Valutazione delle espressioni (2) PRECEDENZA PER ALCUNI OPERATORI (quelli su una stessa riga hanno identica precedenza) unari binari! + - * / % + - < <= > >= ==!= && = max precedenza min precedenza 3 4
C: Valutazione delle espressioni (3) REGOLE DI ASSOCIATIVITA' PER OPERATORI Stabiliscono l'ordine logico di applicazione degli operatori nel caso in cui questi abbiano la stessa precedenza! + - * / % + - < <= > >= ==!= && = da destra a sinistra da destra a sinistra 5 C: Valutazione delle espressioni (4) ESEMPI d = a + b - c: d = ((a+b) - c) a + b - c/d: ((a+b) - (c/d)) a = b = c: a = (b=c) a = a + b: a = (a+b) a = a + b < c: a = ((a+b)<c) a = a + b!= c: a = ((a+b)!=c) a = a <= b!= c: a = ((a<=b)!=c) 6 C: Valutazione delle espressioni (5) ORDINE DI ESECUZIONE Esistono regole solo per alcuni operatori Esempio: per && e è stabilito un ordine temporale di esecuzione (si valuta prima l'operando sinistro e e solo se necessario si si valuta l'operando destro) Precedenza ed associatività stabiliscono come una espressione verrà interpretata, non la sequenza di azioni eseguite per la sua valutazione Il compilatore è libero di produrre il risultato atteso nel modo che ritiene più conveniente ESEMPIO: d = (3 + a) * (b + c) potrebbe essere eseguita come d = b + c ; d' = 3 + a ; d = d * d'; o come d' = 3 + a ; d" = b + c ; d = d' * d"; ; etc Strutture di controllo Modifiche condizionate del flusso di esecuzione delle istruzioni Strutture di selezione: ramificazione condizionata del flusso (istruzioni if selezione singola, if else selezione doppia, switch selezione multipla) Strutture di iterazione: ripetizione condizionata di un blocco di istruzioni (istruzioni while e for) 7 8
Strutture di iterazione Le strutture di iterazione permettono di specificare un azione che dovrà essere ripetuta sotto il controllo di una condizione C: Istruzione while while ( espressione ) { ; ; ; Iterazione definita: controllata da un contatore (il numero di iterazioni è noto in anticipo) Iterazione indefinita: controllata da un valore sentinella (il numero di iterazioni non è noto in anticipo) espressione 9 10 C: istruzione for for ( espressione1; espressione2; espressione3 ) { ; ; ; C: Confronto for-while espressione1 espressione1 viene preliminarmente valutata se espressione2 ha valore diverso da 0, si esegue il corpo del ciclo ; ; ; espressione3 è valutata ogni volta che viene eseguito il corpo del ciclo, dopo di questo e prima di rivalutare espressione2 Il ciclo termina quando espressione2 ha valore 0 espressione3 espressione2 11 12
Esempio uso ciclo for Esempio: iterazione definita espressione1 inizializza una variabile contatore espressione3 aggiorna il valore della variabile contatore espressione2 verifica se la variabile contatore ha raggiunto il valore finale Il corpo del ciclo viene così eseguito un numero di volte che è determinabile da espressione1, espressione2 ed espressione3 13 Stampa numeri da 1 a 100 int i ; for ( i = 1 ; i <= 100 ; i = i + 1 ) printf( %d, i ) ; equivale a int i ; i = 1; while ( i <= 100 ) { printf( %d, i ) ; i = i + 1; 14 Esempio: iterazione indefinita C: Ciclo do while Conta numeri interi positivi letti da input, la lettura termina quando viene letto il valore -1 int main( ) { int num, cont = 0 ; printf ("Inserire sequenza di interi positivi terminata con -1\n"); scanf ("%d", &num); while ( num!= -1 ) /* controllo valore sentinella */ { cont= cont + 1; scanf( "%d", &num ); /* modifica valore sentinella */ printf ("Numero di interi letti = %d\n", cont); return 0; do { ; ; ; while ( espressione ) Il corpo del ciclo ; ; ; èeseguitounaprima volta Se espressione ha valore diverso da 0, il corpo viene eseguito di nuovo, altrimenti si esce dal ciclo 15 16
C: Ciclo do while Esempio: calcolo del fattoriale espressione #include <stdioh> int main () { int n, i ; int p = 1; printf("inserire numero intero maggiore di zero: "); scanf("%d", &n); for ( i = 1 ; i <= n ; i = i+1) p =p* i; printf("\n%d! = %d\n", n, p); return 0; 17 18