[C] Gauss: numeri triangolari
Simpatico programmino esemplificativo:
#include <stdio.h> int main(){ long long int i, n, s; long long int x; printf("\nQuesto programma tratta il famoso problema risolto da Gauss all'età di 9 anni, trovare la somma dei primi n numeri naturali.\nSi usa la sua formula [n*(n+1)]/2 per poi usare la sommatoria 1+2+3+...+n-1 e visualizzare tutti i numeri sommati con un ciclo for.\n"); printf("\nInserisci il numero n per sapere l'ultimo termine della successione triangolare di n elementi: "); scanf("%lld", &x); if(x<=0){ printf("\nn deve essere maggiore di 0"); } else{ printf("Il risultato della formula è: %lld", ((x*(x+1))/2)); } printf("\nAdesso visualizza la successione triangolare all'i-esima (-1) iterazione;\nInserisci un valore i >= 1: "); scanf("%lld", &n); if(n > 0){ for(i=1; i<n; i++){ s += i; printf("La somma al passo i(%lld) della successione triangolare è: %lld\n", i, s); } } else { printf("Il numero di iterazioni deve essere maggiore di 0. \n"); } return 0; }
Risposte
C'è una ragione per cui stai postando questi codici?
Bè penso che se qualcuno trova un modo per migliorare quello che scrivo o semplicemente scrivere qualcosa in più a riguardo credo si possa venir a creare un buono spunto per condivisione idee.
Non è che ci sia molto da dire: è un programma elementare.
Due suggerimenti però:
[list=1][*:1sz9hnex] Indenta il codice.[/*:m:1sz9hnex]
[*:1sz9hnex] tieni conto di eventuali overflow e underflow.[/*:m:1sz9hnex][/list:o:1sz9hnex]
Per esempio supponi di avere numeri molto grandi e fare (x*(x+1))/2. Quello che stai facendo è di calcolare il doppio del risultato finale e poi dividerlo a metà. Se il risultato finale è vicino a LLONG_MAX allora x*(x+1) va in overflow e poi viene diviso per 2 risultato in un numero completamente sbagliato anche se il tuo risultato può essere rappresentato. Idee su come risolvere il problema[nota]La vera programmazione è riconoscere e risolvere questo tipo di problematiche. Oltre che ovviamente trovare modi migliori per implementare qualcosa.[/nota]? Magari senza aggiungere un if.
È comunque mia opinione che non valga la pena usare ancora il C89. Esistono due standard successivi che implementano alcune caratteristiche comode e che sono presenti anche in C++ (oltre che varie altre che non lo sono). In particolare c'è la libreria stdint.h, i commenti in stile C++ e la possibilità di definire le variabili quando servono e non necessariamente all'inizio del blocco[nota]Un blocco è qualsiasi cosa che è delimitata da parentesi graffe.[/nota] (seppur molti principianti li mettano all'inizio della funzione, possono essere messi all'inizio di ogni blocco anche nel C89).
Due suggerimenti però:
[list=1][*:1sz9hnex] Indenta il codice.[/*:m:1sz9hnex]
[*:1sz9hnex] tieni conto di eventuali overflow e underflow.[/*:m:1sz9hnex][/list:o:1sz9hnex]
Per esempio supponi di avere numeri molto grandi e fare (x*(x+1))/2. Quello che stai facendo è di calcolare il doppio del risultato finale e poi dividerlo a metà. Se il risultato finale è vicino a LLONG_MAX allora x*(x+1) va in overflow e poi viene diviso per 2 risultato in un numero completamente sbagliato anche se il tuo risultato può essere rappresentato. Idee su come risolvere il problema[nota]La vera programmazione è riconoscere e risolvere questo tipo di problematiche. Oltre che ovviamente trovare modi migliori per implementare qualcosa.[/nota]? Magari senza aggiungere un if.
È comunque mia opinione che non valga la pena usare ancora il C89. Esistono due standard successivi che implementano alcune caratteristiche comode e che sono presenti anche in C++ (oltre che varie altre che non lo sono). In particolare c'è la libreria stdint.h, i commenti in stile C++ e la possibilità di definire le variabili quando servono e non necessariamente all'inizio del blocco[nota]Un blocco è qualsiasi cosa che è delimitata da parentesi graffe.[/nota] (seppur molti principianti li mettano all'inizio della funzione, possono essere messi all'inizio di ogni blocco anche nel C89).