Grazie grazie!! Anche perchè ho provato a controllarlo facendolo simile in java (di cui sono più pratico) e andava benissimo...
Ciao.![]()
Grazie grazie!! Anche perchè ho provato a controllarlo facendolo simile in java (di cui sono più pratico) e andava benissimo...
Ciao.![]()
Il fatto che a te esce 0 non implica che anche a me o a ant esca così. Il codice di Matteo non è del tutto corretto, la variabile va sempre inizializzata, se non lo è prende un valore random. Nella maggior parte dei casi questo valore è zero, ma c'è un motivo ben preciso: quando dichiari una variabile il C punta ad uno spazio della memoria sul disco. Se la variabile è di tipo numerico il C, partendo da tale indirizzo, prende N byte a seconda del tipo numerico. Se questo spazio era stato utilizzato in precedenza da un altro programma (qualsiasi programma), il valore della variabile è la conversione esadecimale/decimale dei bytes che occupa. Se lo spazio non è mai stato utilizzato o se è stato "pulito" allora imposta la variabile a zero. Non tutti i programmi puliscono la memoria che utilizzano, molti cancellano solo i puntatori a tali spazi.Originariamente inviato da maiosyet_2
Si però non è vero![]()
Il codice postato da metto982 funziona perfettamente, anche senza dichiarare il valore di tot; tant'è che se fai
Ottieni come output:codice:int main () { int num; int tot; printf("per la cronaca, tot non inizializzato vale %d\n", tot); for (num=2;num<=30;num++){ if (num % 2 == 0) { tot = tot + num; } } printf("La somma è %d\n", tot); return 0; } }
./a.out
per la cronaca, tot vale 0
La somma è 240
Se prendi qualche manuale noterai che, oltre a descrivere + accuratamente quello che ho appena detto, le variabili di tipo Int da inizializzare a zero sono sempre dichiarate nel seguente modo:
Int Var=0;
PS: Copiando/incollando il codice postato da Matteo mi da 277, a Ant_alt 1642. Questa è fortuna, perchè abbiamo il modo di accorgerci. Capita a tutti di dimenticarsi di inizializzare una variabile e se per puro caso (come è successo a te) il programma sembra andare, rischi di dare in giro un programma mal funzionante
![]()
codice:#include <stdio.h> int main () { int num,tot; for (num=2;num<=30;num+=2) tot+=num; printf("La somma è %d\n", tot); return 0; }
ps: nel frattempo ho trovato questa piccola guida su internet:
http://www.math.unipd.it/~sperduti/CORSO-C++/Variabili_%20Tipi%20di%20dato_%20Costanti.htm
tratta proprio di questo argomento, ti posto il pezzo interessante:
Inizializzazione delle variabili
Quando dichiariamo una variabile il suo valore è indeterminato (i bit della zona di memoria riservata alla variabile hanno il valore che era stato loro assegnato da qualche precedente programma). Potremmo volere che una variabile abbia un valore particolare fin dal momento in cui viene dichiarata. Per fare questo basta aggiungere alla dichiarazione un simbolo di uguale seguito dal valore desiderato:
tipo identificatore = valore_iniziale ;
Ad esempio se vogliamo dichiarare una variabile a di tipo int con valore iniziale 0 possiamo scrivere:
int a = 0;
comunque ai miei primi tempi di programmazione ci sono caduto anch'io mille volte
![]()
Tutta sta discussione solo per mettere un "= 0" mi sembra un po' eccessiva, se ci va (cosa su cui concordo visto che quando scrivo un programma lo metto) è inutile farsi troppi problemi!![]()
Ciao.![]()
Non è una discussione(se lo sembra non era di mia intenzione). Sono solo le risposte che si aspettava Ant, è il motivo per cui va aggiunta quell'istruzione, è sempre utile sepere il perchè di ogni cosa che si scrive, altrimenti si dimentica nel tempo.
Sai quante volte agli inizi ho chiesto aiuto e mi hanno risposto con del codice (funzionante) senza che però io capissi il funzionamento![]()
Si su quello sono completamente d'accordo!![]()
Ciao.![]()
Vi fa tanto schifo usare la ricorsione in questo forum!
codice:int main() { printf("%d",Sum(30)); } int Sum(int n) { if(n<2) return 0; return n+Sum(n-2); }![]()
![]()
Usare la ricorsione per calcolare una somma, che e' un compito prettamente iterativo, mi sembra uno spreco di risorse immotivato.
L'esempio era per il valore 30 ... ma se dovessimo sommare i valori fino a 1 miliardo, avremmo avuto lo stack impegnato 1 miliardo di volte ... con problemi di crash per mancanza di memoria quando un algoritmo iterativo avrebbe lavorato normalmente ...
Una tecnica piuttosto che un'altra va scelta non perche' faccia "schifo" o meno usarla, ma quando ha senso usarla.
Sono d'accordo con oregon è inutile usare la ricorsione qui, ci sono problemi per qui è molto più utile dell'iterazione ma in questo caso è solo uno spreco di risorse.Originariamente inviato da oregon
Usare la ricorsione per calcolare una somma, che e' un compito prettamente iterativo, mi sembra uno spreco di risorse immotivato.
L'esempio era per il valore 30 ... ma se dovessimo sommare i valori fino a 1 miliardo, avremmo avuto lo stack impegnato 1 miliardo di volte ... con problemi di crash per mancanza di memoria quando un algoritmo iterativo avrebbe lavorato normalmente ...
Una tecnica piuttosto che un'altra va scelta non perche' faccia "schifo" o meno usarla, ma quando ha senso usarla.
Di solito si cerca di usare meno risorse possibili non il contrario!
Ciao.![]()