#include #include #include // Questo programma esegue la sommatoria e la produttoria dei primi N numeri interi, // tramite l'utilizzo del ciclo for in varie declinazioni. // N in questo caso e definito tramite direttiva di precompilatore, ma potrebbe // essere letto tramite input. Cercate di fare questa piccola modifica (con tutto cio che // comporta) #define N 10 main(){ int i,sum,prod; double x; printf("UN PROBLEMA GAUSSIANO:LA SOMMA DEI PRIMI N NUMERI INTERI \n"); /*Forma canonica del ciclo for for( espressione iniziale ; espressione di controllo; espressione di iterazione) */ sum=0; for (i=1;i<=N ;i++){ sum+=i; } /*Stampo il risultato*/ printf("Forma canonica %i \n",sum); /*Qui mostro l'equivalenza sostanziale del for col ciclo while cosi costruito */ sum=0; i=1; //equivale all'espressione iniziale while(i<=N) { //equivale all'espressione di controllo sum+=i; //statement, ovvero tutto cio' che va calcolato all'interno del ciclo i++; //espressione di iterazione } printf("While loop %i \n",sum); /*Prima variazione sul tema del ciclo for includiamo nell'espressione iniziale l'azzeramento della variabile somma. Multiple espressioni sono ammesse separate da virgole */ for (sum=0,i=1 ;i<=N ;i++){ sum+=i; } printf("Prima variazione sul tema %i \n",sum); /*Seconda variazione sul tema del ciclo for (ASSOLUTAMENTE DEPRECATA) Possiamo includere l'operazione interna nell'espressione di iterazione, ricordarsi pero' del punto e virgola finale in quanto in qusto caso dobbiamo comunicare che l'operazione si esaurisce*/ for (sum=0,i=1 ;i<=N ; sum+=i,i++); printf("Seconda variazione sul tema %i \n",sum); /*Sperimentiamo l'effetto nefasto di un cambio di ordine all'interno dell'espressione di iterazione*/ for (sum=0,i=1 ;i<=N ; i++,sum+=i); printf("Seconda variazione sul tema con ordine diverso %i \n",sum); /*Terza variazione sul tema del ciclo for (DEPRECATA) possiamo omettere l'espressione iniziale, i punti e virgola tuttavia sono sempre obbligatori poiche' solo cosi il compilatore capisce quali sono le espressioni di controllo e iterazione*/ sum=0; i=1; for (;i<=N;i++){ sum+=i; } printf("Terza variazione sul tema %i \n",sum); /*Sapreste stimare con un semplice argomento geometrico la somma dei primi N numeri? /*COMPITO PER CASA: scrivete un codice con la vostra declinazione preferita del ciclo for che calcoli le seguenti somme: a)SERIE ARMONICA: Somma per i=1,N di 1/i ; questa serie per N grande rimane finita o esplode (permettetemi l'espressione)?? b) Somma per i=1,N di 1/i^2; in questo caso alla fine della sommatoria predentene il valore moltiplicatelo per 6 e dunque fatene la radice quadrata, a cosa sembra convergere questa serie? c)SERIE DI MENGOLI: Somma per i=1,N di 1/(i*(i+1)) a cosa sembra convergere questa serie? Sperimentate il tutto per valori di N progressivamente grandi */ /*ED ORA LA PRODUTTORIA*/ printf("SECONDO PROBLEMA: PRODUTTORIA DEI PRIMI N INTERI \n"); /*Ricordarsi che una produttoria va inizializzata all elemento neutro del prodotto cioe'...*/ prod=1; for(i=1;i<=N;i++){ prod=prod*i; } /*A cosa corrisponde il prodotto dei primi N interi?...al fattoriale di N*/ printf("Prodotto dei primi n interi %i \n",prod); /*Curiosita' matematica: esiste una funzione speciale chiamata gamma (contenuta nella libreria math.h) che ha la seguente proprieta' notevole : gamma(N+1)=N!, possiamo quindi testare il nostro programma stampando gamma(N+1).*/ printf("Risultato funzione gamma(N+1) %lf \n",gamma(N+1)); /*Secondo Compito per casa: sperimentare come il nostro codice di calcolo del fattoriale sebbene formalmente corretto possa restituire risultati errati se N e sufficientemente grande...Stimare cosa vuol dire N sufficientemente grande cambiando il valore di N, ricordarsi quanto accenato a lezione sul problema dell'overflow. Vi ricordo alcuni valori, di N! 10! 3628800 11! 39916800 12! 479001600 13! 6227020800 14! 87178291200 15! 1307674368000 16! 20922789888000 17! 355687428096000 18! 6402373705728000 il nostro semplice fattoriale ad un certo punto fallira', mentre la funzione gamma (che e' una funzione reale) funzionera' anche per valori relativamente grandi...perche'? */ }