La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Funzioni Moreno Marzolla

Presentazioni simili


Presentazione sul tema: "Funzioni Moreno Marzolla"— Transcript della presentazione:

1 Funzioni Moreno Marzolla
Dipartimento di Informatica—Scienza e Ingegneria (DISI) Università di Bologna

2 Copyright © 2008, Stefano Mizzaro
Copyright © 2017, Moreno Marzolla This work is licensed under the Creative Commons Attribution-Non Commercial 2.0 International (CC BY-NC 2.0) License. To view a copy of this license, visit or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. Funzioni

3 Ringraziamenti prof. Stefano Mizzaro, Università di Udine
Funzioni

4 Funzioni /* demo-funzioni.c */ #include <stdio.h> double somma(double a, double b) { return (a + b); } void stampa(double v) printf("v=%f\n", v); return; /* opzionale */ void saluta( void ) printf("Ciao\n"); int main( void ) saluta(); stampa(somma(3.0, 4.0/2.0)); return 0; Una funzione in C può essere intuitivamente definita come “un blocco di istruzioni con un nome” Una funzione può accettare un certo numero di parametri (anche nessuno), ciascuno con un tipo Una funzione può restituire un risultato di un certo tipo, oppure nessun risultato Funzioni

5 Perché le funzioni sono utili
Sintesi Stesse operazioni da ripetere in più punti del programma Evito ripetizione codice → evito errori Modularità Scompongo problema (programma) in sottoproblemi (sottoprogrammi) Funzioni

6 Dichiarazione vs Definizione
La dichiarazione di una funzione indica la sua segnatura Nome della funzione; tipo del risultato; tipo dei parametri Il corpo della funzione può venire omesso Una funzione può essere usata dopo che è stata dichiarata La definizione di una funzione indica cosa fa Il corpo della funzione deve essere specificato La definizione funge anche da dichiarazione Funzioni

7 Dichiarazione vs Definizione
/* dich.c */ #include <stdio.h> int fattoriale(int); int fat5( void ) { return fattoriale(5); } int fattoriale(int n) { int f = 1; while (n > 1) { f = f*n; n--; } return f; int main( void ) printf("%d\n", fat5() ); return 0; Dichiarazione di una funzione “fattoriale” che accetta un parametro intero e restituisce un intero. La funzione fattoriale() può essere usata dopo che è stata dichiarata Definizione della funzione fattoriale Funzioni

8 Definizione delle funzioni
Al di fuori del main e di altre funzioni Intestazione (prima riga) Tipo del risultato restituito (void se non restituisce un risultato) Nome della funzione Parametri formali e loro tipi (separati da “,”) Corpo (fra graffe { } obbligatorie) Istruzioni return termina esecuzione della funzione Il “return” è obbligatorio solo per funzioni che restituiscono un valore Per quelle che non restituiscono un valore si può usare “return” senza argomento, oppure ometterlo per terminare la funzione alla fine del blocco Funzioni

9 Esecuzione di programma con funzioni
L’esecuzione comincia da main Anche il main è una funzione Invocazione → l’esecuzione passa alla funzione Associazione parametri Esecuzione istruzioni della funzione … fino al return o alla fine della funzione Poi l’esecuzione ritorna al chiamante, all’istruzione successiva Funzioni

10 Flusso di esecuzione main() fat5() fattoriale() /* dich.c */
#include <stdio.h> int fattoriale(int); int fat5( void ) { return fattoriale(5); } int fattoriale(int n) { int f = 1; while (n > 1) { f = f*n; n--; } return f; int main( void ) printf("%d\n", fat5() ); return 0; main() fat5() fattoriale() Funzioni

11 Parametri formali/attuali
/* cotangente.c: Calcolo cotangente. Compilare con: gcc cotangente.c -o cotangente -lm */ #include <stdio.h> #include <math.h> double tangente(double x) { return (sin(x) / cos(x)); } double cotangente (double x) { return (1.0 / tangente(x)); int main( void ) { double angolo; printf("Inserisci angolo "); scanf("%lf", &angolo); printf("La cotangente di %f e' %f\n", angolo, cotangente(angolo)); return 0; Parametro formale: usato nella definizione della funzione cotangente usa (chiama, invoca) tangente Parametro attuale: specifica su quali parametri la funzione deve operare Funzioni

12 Associazione fra parametri attuali e parametri formali
All’invocazione il valore del parametro attuale viene assegnato al parametro formale Come con un assegnamento I tipi devono essere compatibili, come per un assegnamento Se ci sono più parametri, associazione posizionale (basata sulla posizione) f(x,y) = 2x2 + 4y + 9xy f(4,7) Funzioni

13 Cosa succede? /* parametri.c */ #include <stdio.h>
void inc(int x) { x = x + 1; } int main( void ) int y = 0; inc(y); printf("%d\n", y); return 0; > gcc parametri.c -o parametri > ./parametri Funzioni

14 Perché Il passaggio di parametri avviene per valore
Il valore del parametro attuale viene copiato nel parametro formale Ma sono 2 variabili diverse Quindi ogni modifica al parametro formale non si riflette sul parametro attuale Vedremo più avanti il meccanismo da usare perché una funzione possa “modificare” i parametri attuali Funzioni

15 Esempio Scrivere una funzione che determina se un numero n positivo è un numero primo oppure no La funzione riceve come parametro un intero n e restituisce 1 se n è primo, 0 altrimenti 1 non è un numero primo 2 è un numero primo Scrivere anche un main() che invoca la funzione in modo appropriato Funzioni

16 Idea Guardo tutti i numeri i minori di n Escluso 1 Basta arrivare a √n
Controllo per ogni i se è un divisore di n Se trovo un divisore di n, allora n non è primo Ne basta uno; mi fermo subito Se non ne trovo, n è primo Devo guardarli tutti; esco solo alla fine Perché mi posso fermare a sqrt(n) ? Supponiamo che n sia un valore composto, quindi n = s * t. Supponiamo che uno dei due fattori, s, sia maggiore di sqrt(n). Quindi n = s * t => n/t = s > sqrt(n) Ma quindi sqrt(n) * sqrt(n) / t > sqrt(n) semplificando sqrt(n) / t > 1 quindi t < sqrt(n) Ergo, in un numero composto, almeno uno dei fattori è sempre minore di sqrt(n) Funzioni

17 SBAGLIATO Questo programma non funziona per n = 1
#include <stdio.h> /* Dato un intero n maggiore di zero, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) { int i; for (i = 2; i*i <= n; i++) { if (n % i == 0) { return 0; } else { return 1; } int main( void ) int v; printf("Inserisci un intero "); scanf("%d", &v); if ( primo(v) ) { printf(“%d e' un numero primo\n”, v); printf(“%d NON e' un numero primo\n”, v); SBAGLIATO Questo programma non funziona per n = 1 Funzioni

18 SBAGLIATO Questo programma non funziona per n = 1
#include <stdio.h> /* Dato un intero n maggiore di zero, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) { int i; for (i = 2; i*i <= n; i++) { if (n % i == 0) { return 0; } else { return 1; } int main( void ) int v; printf("Inserisci un intero "); scanf("%d", &v); if ( primo(v) ) { printf(“%d e' un numero primo\n”, v); printf(“%d NON e' un numero primo\n”, v); SBAGLIATO Questo programma non funziona per n = 1 Funzioni

19 Compilazione con -Wall
> gcc -Wall primo.c -o primo primo.c: In function ‘primo’: primo.c:14:1: warning: control reaches end of non-void function [- Wreturn-type] } ^ Disegnando il flowchart della funzione primo() si vede che c'è un cammino che porta al termine della funzione senza alcun return; peraltro, questo cammino viene seguito dando in input n=3 Funzioni

20 Meglio, ma sempre sbagliato
#include <stdio.h> /* Dato un intero n maggiore di zero, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) { int i; for (i = 2; i*i <= n; i++) { if (n % i == 0) { return 0; /* trovato un divisore; n non primo */ } return 1; /* nessun divisore; n e' primo */ int main( void ) int v; printf("Inserisci un intero "); scanf("%d", &v); if ( primo(v) ) { printf("%d e' un numero primo\n", v); } else { printf("%d NON e' un numero primo\n", v); return 0; Meglio, ma sempre sbagliato Questo programma non funziona per n = 1 Funzioni

21 Attenzione... Verifichiamo empiricamente la correttezza della funzione primo(n), testando i “casi limite” n = 1, n = 2 int primo(int n) { int i; for (i = 2; i*i <= n; i++) { if (n % i == 0) { return 0; /* n non e' primo */ } return 1; /* n e' primo */ SBAGLIATO Quando n = 1 il ciclo “for” non viene eseguito; quindi la funzione ritorna “true”, il che significherebbe che 1 viene considerato un numero primo, il che non è corretto Funzioni

22 Versione corretta Mettiamoci “una pezza” OK
/* primo.c */ int primo(int n) { int i; if ( n == 1 ) { return 0; } else { for (i = 2; i*i <= n; i++) { if (n % i == 0) { } return 1; OK Quando n = 1 il ciclo “for” non viene eseguito; quindi la funzione ritorna “true”, il che significherebbe che 1 viene considerato un numero primo, il che non è corretto Funzioni

23 Il meccanismo di invocazione delle funzioni

24 Esempio Stack #include <stdio.h> int sq(int x) { return x * x; }
int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; Funzioni

25 Esempio Stack main() a = 3 b = 2 #include <stdio.h>
int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 Funzioni

26 Esempio Stack main() a = 3 b = 2 #include <stdio.h>
int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 Funzioni

27 Esempio Stack main() a = 3 b = 2 ret #include <stdio.h>
int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret Funzioni

28 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ??
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ?? sqy = ?? Funzioni

29 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ??
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ?? sqy = ?? Funzioni

30 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ??
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ?? sqy = ?? ret Funzioni

31 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ??
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ?? sqy = ?? ret sq() x = 3 Funzioni

32 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ??
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = ?? sqy = ?? 9 Funzioni

33 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = ?? Funzioni

34 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = ?? Funzioni

35 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = ?? ret Funzioni

36 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = ?? ret sq() x = 2 Funzioni

37 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = ?? 4 Funzioni

38 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = 4 Funzioni

39 Esempio Stack main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9
#include <stdio.h> int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 ret sumsq() x = 3 y = 2 sqx = 9 sqy = 4 Funzioni

40 Esempio Stack main() a = 3 b = 2 13 #include <stdio.h>
int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 13 Funzioni

41 Esempio Stack main() a = 3 b = 2 #include <stdio.h>
int sq(int x) { return x * x; } int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; main() a = 3 b = 2 Funzioni

42 Esempio Stack #include <stdio.h> int sq(int x) { return x * x; }
int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int main( void ) int a = 3, b = 2; printf("%d\n", sumsq(a, b)); return 0; Funzioni

43 Domanda Chi "consuma" il valore di ritorno della funzione main()?
Risposta: il Sistema Operativo Vedremo... Funzioni

44 Visibilità delle variabili
Funzioni

45 Regola di visibilità delle variabili
Una variabile è visibile unicamente all’interno del blocco in cui è dichiarata I parametri formali funzionano come le variabili (sono visibili solo nel corpo della funzione cui si riferiscono) void f(int i) { /* Qui i e' visibile, j no */ } void g(int j) { /* Qui j e' visibile, i no */ int main( void ) { /* Qui non sono visibili ne' i ne' j */ return 0; Funzioni

46 Blocco Da “{” a “}” #include <stdio.h> int main( void ) {
int a = 3; if ( a > 0 ) { int b = a+1; } else { int b = a-1; } printf("%d\n", a); printf("%d\n", b); /* errore: b non e' visibile qui */ return 0; Funzioni

47 Variabili all’esterno delle funzioni
Variabili globali x e y sono variabili globali, quindi visibili ovunque, anche all'interno di f(), g() e main() #include <stdio.h> int x, y; void f(int i) { x = i; /* ok */ } int g(int j) { y = j; /* ok */ return y + 1; int main( void ) { f(4); g(5); return 0; Funzioni

48 Modello a contorni Utile per capire dove una variabile è visibile
Un “contorno” (rettangolo) intorno a ogni blocco All'interno di un blocco sono visibili Tutte le variabili definite all'inizio di quel blocco Tutte le variabili definite nei blocchi che contengono quel blocco Funzioni

49 Modello a contorni: esempio
int va; void f(int vb) { ... for (...) { int vc; if (...) { int vd; } int main( void ) { int ve; va vb vc vd Un contorno intorno a ogni blocco ve Funzioni

50 Blocchi annidati E' possibile (ma fortemente sconsigliato) definire variabili che hanno lo stesso nome di variabili già definite in un blocco più esterno Le variabili definite nel blocco interno “nascondono” quelle con lo stesso nome definite esternamente Vedi esempio che segue Funzioni

51 Esempio /* nascoste.c */ #include <stdio.h>
int x, y; /* variabili globali */ void f( ) { int x; x = 1; /* locale */ y = 1; /* globale */ printf(“f(): x=%d\n”, x); printf(“f(): y=%d\n”, y); } int main( void ) x = 0; /* globale */ y = 0; /* globale */ f(); printf(“main(): x=%d\n”, x); printf(“main(): y=%d\n”, y); return 0; x, y x In f() la x locale nasconde la x globale > gcc nascoste.c -o nascoste > nascoste f(): x=1 f(): y=1 main(): x=0 main(): y=1 Funzioni

52 Variabili “globali” vs. passaggio parametri
Quando possibile, usare parametri e non variabili globali È più semplice capire cosa fa una funzione Basta leggere la definizione della funzione; non serve far riferimento a tutto il resto del programma Funzioni

53 Alcune funzioni matematiche dichiarate in <math.h>
double sqrt(double) Radice quadrata double exp(double x), double exp2(double x), double exp10(double x) e (base dei logaritmi naturali) elevato alla x, 2 elevato alla x, 10 elevato alla x double log(double x), double log2(double x), double log10(double x) logaritmo in base e, in base 2, in base 10 di x double sin(double x), double cos(double x), double tan(double x) seno, coseno, tangente di x double pow(double x, double y) x elevato alla y double fabs(double x) valore assoluto di x double floor(double x), double ceil(double x) arrotonda x all'intero inferiore o superiore Funzioni

54 Uso di <math.h> Le funzioni di cui al lucido precedente (e molte altre) sono solo dichiarate in math.h La definizione risiede di una libreria che va inclusa nel programma con l'opzione -lm /* esempio-math.c : compilare con gcc esempio-math.c -o esempio-math -lm */ #include <stdio.h> #include <math.h> int main( void ) { double v; for (v=0.0; v < 1.0; v += 0.1) { printf("%f %f %f %f\n", v, sin(v), cos(v), tan(v)); } return 0; Provare a compilare il programma d'esempio senza l'opzione -lm per vedere l'errore che da Funzioni

55 Uso di <math.h> Cosa succede se dimentico di includere math.h ?
> gcc esempio-math.c -o esempio.math -lm esempio-math.c: In function ‘main’: esempio-math.c:9:30: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default] printf("%f %f %f %f\n", v, sin(v), cos(v), tan(v)); ^ esempio-math.c:9:38: warning: incompatible implicit declaration of built-in function ‘cos’ [enabled by default] esempio-math.c:9:46: warning: incompatible implicit declaration of built-in function ‘tan’ [enabled by default] Funzioni

56 Uso di <math.h> Cosa succede se dimentico di compilare con -lm ?
> gcc esempio-math.c -o esempio.math /tmp/ccEOzRqN.o: In function `main': esempio-math.c:(.text+0x27): undefined reference to `tan' esempio-math.c:(.text+0x42): undefined reference to `cos' esempio-math.c:(.text+0x5d): undefined reference to `sin' collect2: error: ld returned 1 exit status Funzioni

57 Esercizio Scrivere un programma che stampa i numeri primi compresi fra 2 e n, con n letto in input durante l’esecuzione Suggerimento: se lo si ritiene utile, si può usare la funzione primo() definita in questi lucidi. Funzioni

58 Esercizio Scrivere una funzione int sqrtint(int n) che accetta come parametro un intero n ≥ 0, e restituisce la radice quadrata (approssimata per difetto) di n In altre parole, la funzione restituisce il massimo intero q per cui si abbia q*q ≤ n Es. sqrtint(0) ritorna 0; sqrtint(1) ritorna 1; sqrtint(2) ritorna 1; sqrtint(13) ritorna 3 Predisporre una funzione main() che invoca la funzione precedente Funzioni

59 Esercizio Scrivere una funzione int primofattore(int n) che, dato in input un intero n > 0, restituisce il più piccolo fattore primo di i; se n è un numero primo, la funzione restituisce n Es.: primofattore(1) restituisce 1; primofattore(2) restituisce 2; primofattore(4) restituisce 2; primofattore(9) restituisce 3; primofattore(21) restituisce 3 Suggerimento bastano alcune semplici modifiche alla funzione primo() vista a lezione Scrivere una nuova funzione void fattorizzazione(int n) che dato in input un intero n > 0 stampa la fattorizzazione di n Es.: fattorizzazione(3) stampa 3; fattorizzazione(21) stampa 3 7; fattorizzazione(16) stampa ; fattorizzazione(27) stampa 2 3 3 Suggerimento: sfruttare la funzione primofattore() definita sopra. Funzioni

60 Esercizio Scrivere una funzione void lanci(int n) che accetta in input un intero n ≥ 1, e simula n lanci di una moneta; la funzione deve stampare il numero di teste e croci uttenute Per simulare il lancio di una moneta è possibile usare la funzione int rand(void) definita nel file stdlib.h che va incluso all'inizio del programma (rand() % 2) è una espressione che vale 0 oppure 1 con uguale probabilità ogni volta che l'espressione viene valutata si potrebbe ottenere un valore diverso #include <stdio.h> #include <stdlib.h> void lanci(int n) { int m; m = (rand() % 2); /* m vale 0 oppure 1 */ } Funzioni


Scaricare ppt "Funzioni Moreno Marzolla"

Presentazioni simili


Annunci Google