View Full Version : [C] Somma di n numeri...??
fabri_napoli
08-12-2008, 15:19
Ciao ragazzi, mi chiamo fabrizio ho 19 anni e sono uno studente di informatica all'università di Napoli Federico II.. e sono disperatoo! :D
Lunedì prossimo ho una prova di intercorso e non so.. niente -.-
Stavo svolgendo qualche esercizio a casa quando mi imbatto in questo:
Scrivere un programma in C che sommi n numeri... ovvero se do' di input 5 la macchina mi fa 1+2+3+4+5... e ok qua ci siamo :D
io ho scritto così:
#include <stdio.h>
#include <stdlib.h>
/*dichiarazione della funzione sumnum*/
int sumnum (int somma, int n);
main ()
{
int n, i, risult, somma;
printf ("Quanti numeri vuoi sommare tra loro?\n");
scanf ("%d", &n);
risult= sumnum (n, somma);
printf ("Il risultato e' pari a %d\n", risult);
system ("pause");
}
int sumnum (int somma, int n) {
int i;
somma=0;
for (i=0; i<=n; i++) {
somma = i+ somma;
}
return somma;
}
Il problema è che nella funzione, esterna al main, non c'è un valore definito di n e quindi il ciclo for è inutile!! come posso fare per comunicare alla funzione il valore inserito con lo scanf nel main? sono alle prime armi heeeelp!
vi ringrazio molto :-)
yggdrasil
08-12-2008, 15:25
tanto per iniziare il fatto che chiami i parametri nello stesso modo delle variabili locali del main ma al contrario ti fa un casotto in testa che basta e avanza
poi non c'è motivo per cui passare come parametro somma visto che tanto poi verrà ritornato. come non c'è motivo e necessità di dichiarare una i dentro il main visto che il main non la usa mai
così magari è più leggibile per te
#include <stdio.h>
#include <stdlib.h>
/*dichiarazione della funzione sumnum*/
int sumnum (int n);
int main ()
{
int n, risult;
printf ("Quanti numeri vuoi sommare tra loro?\n");
scanf ("%d", &n);
risult= sumnum (n);
printf ("Il risultato e' pari a %d\n", risult);
system ("pause");
}
int sumnum (int n)
{
int i;
int valoredaritornare=0;
for (i=0; i<=n; i++) {
valoredaritornare = i+ valoredaritornare;
}
return valoredaritornare;
}
inoltre la funzione main è meglio dichiararla SEMPRE int
se hai dubbi chiedi pure
ramarromarrone
08-12-2008, 15:30
ci sono molte imprecisioni nel tuo codice
1) non devi passare somma come parametro
int sum(int n) {
int i, somma = 0;
for(i = 1; i <= n; i++)
somma = somma + i;
return somma;
}
2)
non fare confusione tra i tipi:
se n lo dichiari intero allora la scanf prenderà un intero(%i) non un double(%d)
scanf("%i", &n)
stesso discorso per la printf, se stampa un intero il parametro è %i non %d
fabri_napoli
08-12-2008, 15:39
siete dei geniiiiiiiiiiiiiii :eek:
quindi tralasciando la mia sintassi che è ancora pessima l'errore dell'algoritmo stava nell'aver dichiarato più parametri di quanti ne avessi bisogno...??
yggdrasil
08-12-2008, 15:54
2)
non fare confusione tra i tipi:
se n lo dichiari intero allora la scanf prenderà un intero(%i) non un double(%d)
scanf("%i", &n)
stesso discorso per la printf, se stampa un intero il parametro è %i non %d
avrà pur fatto casotto con altro ma il tipo era giusto
forse anche tu dovresti dare una occhiata al manuale... :read:
http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html
DanieleC88
09-12-2008, 11:34
Se devi sommare i primi n numeri interi tra di loro, puoi usare anche la formula di Gauss:
somma = (n * (n + 1)) / 2;
Ad esempio, se hai n = 100 (vuoi sommare tutti i numeri interi da 1 a 100):
somma = (100 * 101) / 2 = 10100 / 2 = 5050
E puoi evitarti anche i cicli, è un metodo immediato. Se poi l'esercizio ve l'avevano dato proprio per farvi usare dei cicli, be'... usa quelli ed evita i rischi. :D
Se devi sommare i primi n numeri interi tra di loro, puoi usare anche la formula di Gauss:
somma = (n * (n + 1)) / 2;
Ad esempio, se hai n = 100 (vuoi sommare tutti i numeri interi da 1 a 100):
somma = (100 * 101) / 2 = 10100 / 2 = 5050
E puoi evitarti anche i cicli, è un metodo immediato. Se poi l'esercizio ve l'avevano dato proprio per farvi usare dei cicli, be'... usa quelli ed evita i rischi. :D
Nota di colore.
Gauss aveva dimostrato ed usato questo suo primo teorema alle elementari, come risultato di una punizione (sommare i numeri da 1 a 100) che l'avrebbe tenuto impegnato per un'oretta.
E che ha invece risolto in un paio di minuti e godendosi il resto del tempo.
DanieleC88
09-12-2008, 12:39
Sì, lo sapevo quest'aneddoto. Infatti mi sono sempre immaginato la faccia del prof che soddisfatto pensò "oooh, così me lo tolgo dalle scatole per un bel po'" e dopo pochi minuti lo vede già rispondere (e per di più correttamente)... :asd:
Certo che Gauss aveva una mente fuori dal comune. :eek:
yggdrasil
09-12-2008, 15:54
si era immaginato che fosse un esercizio improntato sull'imparare a codificare e non su quello che si implementava realmente. naturale che poi nella realtà la formula di gauss è molto meglio :D
tanto per aggiungere alla nota una precisazione: i numeri da sommare erano fino a 1000, senza la formula farlo a mano era abbastanza complicato...ma quel bambino di dieci anni in quattro e quattr'otto capì come aggirare il problema. tar l'altro non è nemmeno difficile capire come abbia fatto ad arrivare alla soluzione. è l'area di un triangolo che ha come base il numero massimo che si deve sommare e come altezza il numero più uno. :O
si era immaginato che fosse un esercizio improntato sull'imparare a codificare e non su quello che si implementava realmente. naturale che poi nella realtà la formula di gauss è molto meglio :D
tanto per aggiungere alla nota una precisazione: i numeri da sommare erano fino a 1000, senza la formula farlo a mano era abbastanza complicato...ma quel bambino di dieci anni in quattro e quattr'otto capì come aggirare il problema. tar l'altro non è nemmeno difficile capire come abbia fatto ad arrivare alla soluzione. è l'area di un triangolo che ha come base il numero massimo che si deve sommare e come altezza il numero più uno. :O
In realta' avevo letto da qualche parte, mi sembra un appendice del libro della V superiore al liceo, che aveva capito come fare non appena aveva provato a sommare il numero piu' alto con quello piu' basso ovvero 100+1 = 101.
Poi aveva provato a sommare 99 con 2 e otteneva sempre 101, ma anche 98 e 3... etc.
A quel punto si era chiesto quante volte dovesse ripetere queste operazioni, ed ha trovato il risultato.
yggdrasil
09-12-2008, 16:47
sì, beh sono due diverse dimostrazioni della medesima cosa, una con un metodo grafico e una con un metodo aritmetico :D
DanieleC88
09-12-2008, 18:32
In realta' avevo letto da qualche parte, mi sembra un appendice del libro della V superiore al liceo, che aveva capito come fare non appena aveva provato a sommare il numero piu' alto con quello piu' basso ovvero 100+1 = 101.
Poi aveva provato a sommare 99 con 2 e otteneva sempre 101, ma anche 98 e 3... etc.
A quel punto si era chiesto quante volte dovesse ripetere queste operazioni, ed ha trovato il risultato.
Esattamente, da lì ha capito che bisognava sommare n/2 volte n+1. :)
dreadknight
10-12-2008, 01:53
non fare confusione tra i tipi:
se n lo dichiari intero allora la scanf prenderà un intero(%i) non un double(%d)
scanf("%i", &n)
stesso discorso per la printf, se stampa un intero il parametro è %i non %d
:eek: :eek:
malocchio
10-12-2008, 22:33
Non esiste concorso a stampo logico/matematico senza almeno un esercizio che richieda la formula di Gauss!
||ElChE||88
10-12-2008, 22:46
2)
non fare confusione tra i tipi:
se n lo dichiari intero allora la scanf prenderà un intero(%i) non un double(%d)
scanf("%i", &n)
stesso discorso per la printf, se stampa un intero il parametro è %i non %d
http://www.cplusplus.com/reference/clibrary/cstdio/printf.html
d or i Signed decimal integer
http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html
d Decimal integer: Number optionally preceded with a + or - sign.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.