[C] Gauss: numeri triangolari

Shebang
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
apatriarca
C'è una ragione per cui stai postando questi codici?

Shebang
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.

vict85
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).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.