PDA

View Full Version : [C] Somma di n numeri...??


fabri_napoli
08-12-2008, 16: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, 16: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, 16: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, 16: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, 16: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, 12: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

gugoXX
09-12-2008, 12:44
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, 13: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, 16: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

gugoXX
09-12-2008, 17:34
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, 17: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, 19: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, 02: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, 23:33
Non esiste concorso a stampo logico/matematico senza almeno un esercizio che richieda la formula di Gauss!

||ElChE||88
10-12-2008, 23: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.

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.