INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan venus.unive.it/borg borg@unive.it Ricevimento lunedì, prima o dopo lezione 1
Le funzioni in C Le funzioni vengono utilizzate per 3 motivi: Riusabilità del software Per evitare la ripetizione di codice Per rendere più agevole la scrittura/lettura del codice /* prima funzione # include <stdio.h> Int quadrato (int y); main () { int x; for (x=1; x<=10; x++) printf ( %d, quadrato(x)); return 0 } // prototipo funzione //contatore // chiamata funzione //fine funzione main 2 int quadrato (int y) // definizione funzione { return y * y } // fine funzione quadrato
Funzioni: chiamata per valore o per riferimento Per valore, gli argomenti saranno passati preparando una copia del loro valore. Nessuna modifica al valore originario Per riferimento, gli argomenti saranno passati prendendo il riferimento al vaore originario. Vengono modificati i valori originari In C tutte le chiamate sono per VALORE, per riferimento invece bisogna utilizzare il concetto di puntatore. Esempio int quadrato (int *yptr) { return *yptr * *yptr; } // definizione funzione, chiamata per riferimento 3
Funzioni Se una funzione non accetta parametri in ingresso si dichiara come int quadrato (void) Se una funzione non restituisce nessun valore di ritorno allora si dichiara come Void quadrato (int x) In una funzione vanno esplicitamente dichiarate tutte le variabili int quadrato (double x, double y) int quadrato (double x, y) significa allocare x come double e y come un integer 4
Generare numeri casuali La funzione rand() genera numeri pseudocasuali INTERI compresi tra 0 e RAND_MAX (32767 secondo lo standard ANSI). L istruzione i = rand() assegna un numero casuale alla variabile intera i. Esercizio. Generare numeri casuali compresi tra 1 e 6 Esercizio. Simulare 6000 lanci di un dado, conti quante volte la facciata si è presentata e ne calcoli la probabilità. SENZA utilizzare i vettori Esercizio. Rifare esercizio punto precedente utilizzando i vettori 5
Esercizi Scrivere una funzione tipo: Potenza(base,esponente). Esponente deve essere un numero diverso da zero. Utilizzate il ciclo for per il calcolo. Scrivere una funzione Multiplo che per una coppia di numeri determini se il secondo sia multiplo del primo. La funzione deve restituire vero (1) o falso (0). La funzione main stampare a video vero o falso. Scrivere una funzione che determini se un numero è primo. (Numero è primo se divisibile per 1 o per se stesso). Fino a che limite superiore (di divisori) bisogna arrivare? 6
Il gioco dei dadi: implementiamolo 7 Un giocatore lancia 2 dadi. Vince se al primo tiro la somma è 7 o 11. Perde se al primo tiro la somma è 2, 3 o 12 (Craps). Se la somma è 4, 5, 6, 8, 9 o 10 al primo tiro, allora la somma diventa il punteggio del giocatore. Per vincere si deve continuare a lanciare i dadi fino a ottenere il punteggio giocatore del primo lancio. Se però durante i lanci esce 7 allora il giocatore ha perso. Es. 4 + 1 = 5 Punteggio = 5, ritiro i dadi 6 + 2 = 8 2 + 1 = 3 3 + 2 = 5 Hai vinto
La ricorsione 1/2 Per determinati tipi di problemi può essere utile che una funzione richiami se stessa, in questi casi si parla di ricorsione. Unesempio per chiarire il problema: calcolare il fattoriale diun numero. n! = n * (n-1) * (n-2) * 1 In modo non ricorsivo: fattoriale = 1; For (x = n; x>=1;x--) fattoriale = fattoriale * x; Scomponendo il problema, n! = n * (n-1)! 4! = 4 * 3! = 4 * 3 * 2! = 4 * 3 * 2 * 1! 8
9 La ricorsione 2/2 La sequenza di chiamate nello stack della procedura ricorsiva e i relativi valori di ritorno saranno dunque: 5! 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 long fattoriale ( long n) { If (n<=1) else } return 1 120 24 6 2 return (n * fattoriale(n-1)); 1
La ricorsione. Fibonacci In modo ricorsivo la serie di fibonacci può essere definita come: Fibonacci(0) =1 Fibonacci(1) =1 Fibonacci(n) = fibonacci(n-1) * fibonacci(n-2) Long fibonacci ( long n) { if (n==0 n==1) return n; else return (fibonacci(n-1) + fibonacci(n-2)); } 10
Esercizio sulla ricorsione Scrivete una funzione ricorsiva Potenza(base, esponente) Scrivete una funzione Palindromo () che restituisca vero o falso a seconda che la stringa si legga allo stesso modo da sinistra a destra e da destra a sinistra. 11