Appunti di programmazione

Appunti per il corso universitario di programmazione, riferito al linguaggio ANSI C
Redatti all'università di Venezia

ARGOMENTI

STRUTTURA COMPUTER

DEFINIZIONI

TASTIERA E TIPI

AMBIENTE E MEMORIA

COMANDI

FUNZIONI E PROCEDURE

TIPI DERIVATI

PUNTATORI

STRINGHE

ARRAY DI PUNTATORI

STRUTTURE

TYPEDEF E ENUM

PUNTATORI A PROCEDURE

ALLOCAZIONE DINAMICA

LISTE

ALGORITMI

ERRORI

COMANDI CONDIZIONALI

COMANDO CONDIZIONALE SEMPLICE

if (<espressione>) <comando>

diagramma di flusso a pag. 54 del libro di testo

semantica (operazionale):

  1. valuto l'espressione

  2. se il valore è diverso da zero (TRUE) eseguo il comando

  3. passo all'istruzione successiva

COMANDO CONDIZIONALE A DUE RAMI

if (<espressione>) <comando1>

else <comando2>

diagramma di flusso a pag. 56 del libro di testo

gli else si legano sempre all'if precedente


es.

int y=0;

int x=1;

if (y!=0)

if (x==1)

....

else (questo non si riferisce al primo if ma al secondo: l'indentazione può ingannare)

....

printf....


utile in casi che richiedono scelte multiple: es. programma che deve scrivere il giorno successivo rispetto a quello inserito dall’utente (numero da 1 a 7 -> 7 possibilitàSWITCH


switch (<espressione>)

{

Listacasi1 ListaComandi1

Listacasi2 ListaComandi2

....

default: ListaComandi

}


  1. espressione deve essere di tipo int o compatibile con int

  2. un “ListaCasi” consiste in una sequenza di: case ValoreCostante :

  3. ogni “ListaComandi” può terminare con break o return


es.

int mese;

int giorni;

switch(mese){

case 2: giorni = 28; break;

case 4:case 6:case 9:case 11: giorni = 30; break;

default: giorni = 31; break;

}


se non scrivo il break esegue anche i comandi degli altri casi (se avessi scritto return sarei uscito dal programma)


es.

int giorno;

scanf (“%d”, &giorno);

switch (giorno){

case 1: printf (“martedì”); break;

...

}


es.

switch (giorno){

case 1: case 2: case 3:

printf (“diesel”); break;

...

}

BREAK

mi permette di uscire da un comando strutturato

RETURN

restituisce il ritorno al chiamante = mi permette di uscire dalla funzione nella quale sto lavorando, ritornando eventualmente un valore

COMANDI DI INCREMENTO E DECREMENTO

y = x + 1;

x = x + 1;

corrisponde a:

y = ++x;

x prima è incrementata, poi utilizzata


y = x;

x = x + 1;

corrisponde a:

y = x++;

a prima è utilizzata, poi incrementata


y = x - 1;

x = x - 1;

corrisponde a:

y = --x;

x prima è decrementata, poi utilizzata



y = x;

x = x - 1;

corrisponde a:

y = x--;

x prima è utilizzata, poi decrementata


es.

int z = 7;

int w;

w = (z++) * 2;


al termine:

w vale 14

z vale 8


non devo fare ad esempio “w = ((--z)*2)+((++z)-3)” perché l'ANSI non è rigorosa in questo (non so come reagiscano i vari compilatori)

COMANDI DI ITERAZIONE

for (<espressione inizializzazione>; <condizione>; <espressione di incremento>)

corpo del for

importante: non più di tre espressioni all’interno della parentesi del for separate da “;”, per aggiungerne altre devo utilizzare la “,”

diagramma di flusso a pag. 97 del libro di testo


while (<condizione>)

corpo del while

diagramma di flusso a pag. 60 del libro di testo


do{

corpo del do-while

} while(<condizione>)

diagramma di flusso a pag. 110 del libro di testo

COMANDI DI RIPETIZIONE INDEFINITA

es.

for (i = 0; i < z; i++; x *=2)

printf (“ %d %d”, i, x);


posso inserire più espressioni di incremento


for (;;)

<comando>

è legittimo (un espressione vuota ha valore logico = TRUE)


es.

int main(){

for(;;);

return 1;

}

non fa niente indefinitamente

ITERAZIONE (O RIPETIZIONE) INDEFINITA

quando non sappiamo in anticipo il numero di volte per cui l'azione va ripetuta

meglio utilizzare il while (while indefinito = abbreviazione del for indefinito)


for(;;){

...

if (B) break;

}

corrisponde al do...while


programma che vuole input tra 3 e 7 fallo con i vari cicli


vedi nozione di “invariante del ciclo” e rappresentazione algoritmi ({S} stato iniziale ecc.)


il for accetta come variabile contatore anche double ma è un rischio

for (j = 0.0; j; j += 1){...} non entra nel ciclo

la variabile utilizzata come contatore può essere modificata anche nel corpo del for

l’indice deve essere un int o compatibile, poichè se ad esempio dichiariamo l’indice come double, l’indice può variare per infinitesimi, quindi rischiamo di cadere in un numero imprevisto di iterazioni, se non poniamo attenzione nel valore del limite

CONTINUE

salta alla prossima valutazione della condizione del ciclo


es.

int a = 15;

while (a > 5) {

if (a % 2 != 0)

continue;

a--;

printf (“%d”,a);

} /* va in loop */




int a = 16;

while (a > 5) {

if (a % 2 != 0)

continue;

a--; a--;

printf (“%d”,a);

} /* stampa i pari */


int a = 16;

while (a > 5) {

if (a % 2 != 0){

a--; continue;}

a--;

printf (“%d”,a);

}

stampa i dispari

Ritorna sopra | Home page