laboratorio di linguaggi lezione di ripasso costrutti marco tarini università dellinsubria facoltà...
TRANSCRIPT
Laboratorio di Linguaggi
lezione di ripasso costrutti
Marco Tarini
Università dell’Insubria
Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese
Corso di Laurea in Informatica
Anno Accademico 2007/08
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Ripasso costrutti base:
Istruzioni di Controllo del Flusso
nozioni di sintassi e semantica(intuitivamente, non formalmente)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
if then else
• costrutto condizionale
if (<expression>) <statement1>else <statement2>
Come gia’ detto, esegue statement1 (il ramo then) sse l’espressione risulta diversa da zero
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
<statement>
• Esempi di <statement>s:
y = x + 10;
{ y = x + 10; z = 4;};niente punto-e-virgola!
nota: punto e virgola...
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
if then else
• costrutto condizionale
if (<expression>) <statement1>else <statement2>
if (x) y = x + 10; else y = 20;
if (x==2) {y = x + 10; ... } else y = 20;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Lo sapevate che...
• In C, quasi tutti gli statement sono anche espressioni?
• Ad esempio, l’assegnamento
e’ anche un’espressione, che vale il valore assegnato (e ha anche il suo tipo)
• Cio’ consente di scrivere, per esempio:
(non solo e’ coinciso, ma e’ anche efficiente,come da filosofia C)
x = y
int x,y,z;x = y = z = 10 ;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
if then else: trappole
• errore di sintassi (non compila, innocuo)
• errore nella guardia (compila: errore “cattivo”. Cosa fa?)
• punto-e-virgola di troppo (compila: errore “cattivo”. Cosa fa?)
if (x=2) { y = x + 10; ... }
if (x==2) {y = x + 10; ... } else y = 20;
if (x==2); { y = x + 10; ... }
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
for
• costrutto iterativo
for (<expr0>;<expr1>;<expr2>) <stat>
for (i=0,j=10;(j>20) &&(i<5); i++, j--){ vect[i]+=10; printf(“%d”, vect[i]);}
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
while
• ciclo while
while (<expr0>) <stat>
while (i<N && a[i]< 1000) i = i + 1;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
do while
• ciclo do-while
do <stat> while (<expr0>)
do{ printf("Immettere un valore intero pari\n"); scanf("%d",&a); /* leggi il numero a da tastiera */}while(a%2);
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
switch
• costrutto condizionale a più vie
switch (<expr0>) { case <const1>: <stat1> break; ... case <const2>: <stat2> break;}
switch (ch){ case 'a': cont_a++; break; case 'e': cont_e++; break; case 'i': cont_i++; break; case 'o': cont_o++; break; case 'u': cont_u++; break; default : cont_car++; }
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
switch
• senza break: fall trought
switch (oggi){ case LUN: ... /* gestisci il caso LUN */ break; case MAR: ... /* gestisci il caso MAR */ break; case SAB: ... /* operazioni solo per il SAB */ /* FALL TROUGHT */ case DOM: ... /* gestisci per il SAB e la DOM */ break; default : ... /* gestisci gli altri casi */}
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
labels e goto
• salti non strutturati– cattiva pratica di programmazione
• (porta a programmi spaghetti)
– perlomeno, non eleganti
<label>:
goto <label>;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
labels e goto
• ad esempio:
• equivalente a:
i=0; while (i <= NUM) printf("%d \n",++i); ...
i=0; INIZIO : if (i>NUM) goto FINE; printf("%d \n",++i); goto INIZIO; FINE : ...
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
break e continue
• utilizzabili in tutti i cicli– for, while, do-while
• break = esci dal ciclo– (vai alla prima iterazione dopo il ciclo)
• continue = interrompi l’iterazone corrente
– vai all’inizio della prossima iterazione– (dove, per prima cosa, la guardia di uscita dal ciclo viene
testata)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Fine ripassino
• Fine ripassino
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
:)
da http://xkcd.com