Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Stefano Melacci
Selezioni
Cicli
switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }
FondamentidiInformatica(20112012)
Selezioni
Cicli
switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }
FondamentidiInformatica(20112012)
if else
include<stdio.h> int main() { int a; printf(Introdurreunnumerointero:\n); scanf(%d,&a); if (a0) { printf(Ilnumeroenegativo.\n); a=a*2; printf(Ildoppiovale%d.\n,a); } else { printf(Ilnumeroepositivo.\n); } printf(Fineprogramma.\n); return 0; }
FondamentidiInformatica(20112012) 4
Se lespressione tra parentesi vera, si esegue il blocco dopo if, altrimenti quello dopo else Le espressioni si scrivono sempre tra parentesi tonde! E ormai chiaro che le parentesi graffe in C servono a racchiudere un blocco di istruzioni (esattamente come nelle funzioni!) Le parentesi graffe non sono necessarie se listruzione da eseguire dopo if o else solo una (blocco con una sola istruzione)! Listruzione printf(Fine programma.\n); viene eseguita sempre, indipendentemente da if, else, e dalla condizione usata Notare lindentazione!
Espressioni condizionali
Espressioni condizionali in C
! minore maggiore minore o uguale maggiore o uguale uguale diverso
Espressioni condizionali
Una espressione condizionale di base nasce dal confronto tra una coppia di valori
Oppure dal confronto tra pi espressioni!
OR logico: ||
Vera solo se vera anche solo una delle espressioni confrontate
if (a>5) if (a>=4) if (a==b) if (a>b &&a<5) if (a>b &&a<5 &&a!=3) if (a>c ||a>8) if ((a>b&&a<5&&a!=3)||(a>c||a>8)) if (!(a>c))
6
FondamentidiInformatica(20112012)
Esercizi
E possibile innestare (o annidare) una selezione (if else) allinterno di unaltra (if else) e cos via
Attenzione alle parentesi! Nel dubbio, una soluzione perfetta consiste nellusare sempre le parentesi per ogni blocco dopo if ed else
Scrivere il programma che legge due numeri reali da tastiera e stampa il maggiore dei due Scrivere il programma che legge un numero intero da tastiera e stampa se si tratta di un numero pari o dispari Scrivere il programma che legge tre numeri reali da tastiera e stampa il maggiore dei tre Scrivere il programma che legge un carattere da tastiera e riconosce se vengono inseriti a, o b, o c Scrivere il programma che legge i lati di un triangolo e stampa il tipo corrispondente (equilatero, isoscele, scaleno) [vari modi!!!]
FondamentidiInformatica(20112012) 7
switch
#include <stdio.h> int main(){ int a; switch (a) { case1: n=n*2; printf("Ildoppiodelnumeroe'%d\n",n); break; case2: n=n; printf("Ilnumerocambiatodisegnoe'%d\n",n); break; default: printf("Haiinseritounasceltanonvalida!\n"); } printf("Fineprogramma.\n"); return 0; }
Lespressione tra parentesi deve essere di tipo intero (es: variabile intera o carattere) La scrittura case 1: equivale a se la variabile tra parentesi vale 1 esegui le seguenti istruzioni break termina il blocco di istruzioni dentro al case (stavolta non ci sono le parentesi graffe!) default il caso generale. Se la variabile tra parentesi non ha nessuno dei valori dei precedenti case, viene eseguito il blocco dopo default. Notare ancora lindentazione!
8
FondamentidiInformatica(20112012)
switch
#include <stdio.h> int main(){ char c; switch (c) { case%: break; casev: caseu: break; default: } printf("Fineprogramma.\n"); return 0; }
Se voglio eseguire la medesima operazione quando la mia variabile assume pi valori, devo ripetere i blocchi di istruzioni? (Es: se la variabile controllata dallo switch vale 1 o 2 esegui la stessa operazione) Risposta: No, posso costruire dei case in cascata Nellesempio a destra, se c=v o c=u si esegue il medesimo blocco di istruzioni In questo esempio la variabile gestita dallo switch un carattere (char) Notare gli apici nei singoli case!
FondamentidiInformatica(20112012)
Esercizio
Scrivere un programma che legge due numeri reali ed un carattere da tastiera. Il carattere pu essere uno tra +,-,*,/. In base al carattere inserito, il programma deve stampare rispettivamente la somma, la differenza, il prodotto o la divisione tra i due numeri reali. Se viene inserito un carattere non ammesso, deve stampare un messaggio di avvertimento. Utilizzare listruzione switch
FondamentidiInformatica(20112012)
10
Selezioni
Cicli
switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }
Prima di iniziare: Ogni esecuzione delle istruzioni allinterno di un ciclo detta ITERAZIONE
FondamentidiInformatica(20112012) 11
while
#include <stdio.h> int main(){ int i; i=0; while (i<10) { printf(Scriverquestomessaggio10volte!\n); i=i+1; } printf("Fineprogramma.\n"); return 0; }
while (traduzione: mentre o finch) seguito da una espressione (tra parentesi) Finch lespressione vera, il blocco di istruzioni che lo segue viene eseguito in modo ripetuto Quando lespressione diventa falsa, si prosegue con le istruzioni che seguono la } Se lespressione vera e non cambia mai, il ciclo infinito (ossia il mio programma NON termina!) Se lespressione contiene una variabile non inizializzata, il comportamento imprevedibile!
FondamentidiInformatica(20112012)
12
while
#include <stdio.h> int main(){ int i; i=0; while (i<10) { printf(Scriverquestomessaggio10volte!\n); i=i+1; } printf("Fineprogramma.\n"); return 0; }
Spesso si conosce il numero di volte in cui il ciclo verr eseguito Serve una variabile contatore per tenere traccia di quante volte stato eseguito il ciclo La variabile contatore deve essere: Inizializzata FUORI dal ciclo Incrementata (o decrementata) ad ogni iterazione, ossia DENTRO al ciclo Attenzione a dove si incrementa (o decrementa), ossia se inizio o fine ciclo!
13
FondamentidiInformatica(20112012)
Nota
i +1:
i=i+1; i++; // postincremento ++i; // preincremento
i -1:
i=i-1; i--; // postdecremento --i; // predecremento
Per somma, differenza, prodotto, divisione, modulo, le seguenti espressioni sono equivalenti (esempio con il prodotto)
i=i*5; i*=5;
FondamentidiInformatica(20112012) 14
do while
#include <stdio.h> int main(){ int i; i=0; do { printf(Scriverquestomessaggio10volte!\n); i=i+1; } while (i<10); printf("Fineprogramma.\n"); return 0; }
Identico al while, ma la prima iterazione viene eseguita SEMPRE, indipendentemente dalla condizione verificata la condizione controllata a FINE ciclo, e non pi ad INIZIO ciclo Questo significa che per convertire un ciclo while in un do while non sempre basta spostare while alla fine ed aggiungere do: Cosa sarebbe successo se la condizione dellesempio a sinistra fosse stata while(i!=0) ? E necessario cambiare la condizione del ciclo o linizializzazione del contatore!
FondamentidiInformatica(20112012)
15
Esercizio
Scrivere il programma che legge un intero da tastiera, ed effettua la somma di 5 numeri uguali a quello, restituendo il risultato
Modificare il programma precedente, in modo che venga richiesto allutente di specificare quante volte effettuare la somma Modificare il programma precedente, in modo che non venga accettata la richiesta di un numero di somme negativo Modificare il programma precedente passando da while a do while o viceversa
FondamentidiInformatica(20112012)
16
for
#include <stdio.h> int main(){ int i; for (i=0;i<10;i++) { printf(Scriverquestomessaggio10volte!\n); } printf("Fineprogramma.\n"); return 0; }
for il modo pi sintetico per scrivere un ciclo Inizializzazione, condizione e incremento sono tutte contenute in ununica istruzione! (separate da punto e virgola)
Esercizio
E possibile innestare (o annidare) un ciclo dentro un altro. Per ogni iterazione del ciclo padre si eseguono tutte le iterazioni del ciclo figlio, e cos via
Attenzione alle parentesi!
Scrivere il programma che calcola il fattoriale di un numero, usando un ciclo for Modificare il precedente programma in modo che non produca risultati maggiori di 150, usando listruzione breake senza usarla!
FondamentidiInformatica(20112012) 18
FondamentidiInformatica(20112012)
19
break, continue
break; continue; sono due parole chiave che servono per alterare il naturale svolgimento di un ciclo
Avevamo gi usato break per il costrutto switch!
break; termina lesecuzione del ciclo, indipendentemente dallo stato della condizione del ciclo continue; provoca linterruzione delliterazione corrente e si prosegue con la successiva
Utile se non si vuol eseguire una porzione del blocco di codice del ciclo Attenzione ai contatori!
FondamentidiInformatica(20112012)
21
Esempio
#include <stdio.h> int main(){ int n,i; printf("Stampadi10000000asterischi...\n\n"); for (i=0;i<10000000;i++){ if (i==3) continue; printf("*"); if (i==5) break; } printf("\n\nIlcontatoredovevaarrivarea10000000masie'fermatoalvalore%d",i); return 0; }
Ouput: ***** 5
FondamentidiInformatica(20112012)
22
Altri Operatori
Stefano Melacci
Operatore sizeof()
Restituisce la dimensione in byte di un tipo di dato o di unespressione Il valore restituito di tipo: unsigned int Quali sono i valori che vengono stampati? Perch?
#include <stdio.h> int main() { unsigned int s;
Variabile che user per memorizzare il valore restituito da sizeof()
printf("Dim di un float: %d byte\n",sizeof(float)); printf("Dim di un double: %d byte\n",sizeof(double)); printf("Dim di 3+5: %d byte\n",sizeof(3+5)); printf("Dim di 3.0+5: %d byte\n", sizeof(3.0+5)); return 0; }
FondamentidiInformatica(20112012)
sizeof(espressione)
24
Operatore ?
Operatore condizionale
E lunico operatore ternario del linguaggio C E solo un modo abbreviato per scrivere if else
if (x<y) z x; else z y; if (j<0) printf(Ecco %d, j); else printf(Ecco %d, k);
FondamentidiInformatica(20112012) 25
z = ((x<y) ? x : y)
Funzioni
Stefano Melacci
Chiamate a Funzioni
FondamentidiInformatica(20112012)
27
Funzioni 1) Definizione
Definizione della funzione:
Gi introdotta precedentemente Dichiarazione, che definisce il nome, il numero ed il tipo degli argomenti ed il comportamento della funzione (istruzioni del corpo della funzione) Definisce anche il tipo di dato restituito (se non serve restituire valori si usa il tipo void)
float area_triangolo(int base, int altezza) { float area; area = (base*altezza)/2; return area; }
FondamentidiInformatica(20112012) 28
Funzioni 2) Chiamata
Chiamata di funzione:
Invocazione di una funzione, che ha come effetto il trasferimento del controllo del programma alla funzione chiamata Al termine della funzione chiamata, lesecuzione riprende dallistruzione immediatamente successiva alla chiamata I tipi dei parametri passati devono corrispondere ai tipi richiesti dalla funzione in questione (ed anche il numero di parametri!)
int main() { int bas,alt; float area; area = area_triangolo(bas,alt); return 0; } float area_triangolo(int base, int altezza) { float ar; ar = (base*altezza)/2; return ar; }
FondamentidiInformatica(20112012)
29
Da ctype.h b=isalpha(c); /* se il carattere c una lettera restituisce un intero >0 (true), altrimenti restituisce 0 (false) */
FondamentidiInformatica(20112012) 30
Parametro FORMALE
float area_triangolo(int base, int altezza) { float ar; ar = (base*altezza)/2; return ar; }
FondamentidiInformatica(20112012)
31
return pu essere collocato in qualsiasi punto delle funzione (non necessariamente alla fine) In una funzione pu essere specificato pi di un return Quando viene incontrato return, la funzione termina IN QUEL PUNTO
FondamentidiInformatica(20112012) 33
FondamentidiInformatica(20112012)
34