Cosa sbaglio in questo esercizio c++?
/* esercizio pdf 4.21: la ridotta n-esima della serie armonica è così definita:
Hn = 1+1/2+1/3+...+1/n
SI scriva un programma c che esegua i seguenti passi:
a) legga da tastiera un numero intero n;
b) se è minore o uguale a 0 termini l'esecuzione in caso contrario determini e stampi
la somma Hn dei primi n termini della seria . */
/* questa la mia soluzione...ma il risultato mi viene sempre 1 */
#include
#include
main ()
{
int i;
int n;
float somma;
printf("inserisci un numero intero:\n");
scanf("%d", &n);
if (n<=0) printf("impossibile determinare la serie armonica.\n");
if (n>0) for (i=1;i<=n;i++) {
somma = somma+ 1/i;
}
printf("La somma dei primi %d termini della serie e':%f\n", n,somma);
system("PAUSE");
return 0;
}
Hn = 1+1/2+1/3+...+1/n
SI scriva un programma c che esegua i seguenti passi:
a) legga da tastiera un numero intero n;
b) se è minore o uguale a 0 termini l'esecuzione in caso contrario determini e stampi
la somma Hn dei primi n termini della seria . */
/* questa la mia soluzione...ma il risultato mi viene sempre 1 */
#include
#include
main ()
{
int i;
int n;
float somma;
printf("inserisci un numero intero:\n");
scanf("%d", &n);
if (n<=0) printf("impossibile determinare la serie armonica.\n");
if (n>0) for (i=1;i<=n;i++) {
somma = somma+ 1/i;
}
printf("La somma dei primi %d termini della serie e':%f\n", n,somma);
system("PAUSE");
return 0;
}
Risposte
Non hai inizializzato la variabile somma. Inoltre hai dichiarato la variabile i come intero, quindi 1/i è una divisione intera, e da come risultato un intero, eventualmente troncato a zero. Puoi cambiare il corpo del ciclo con: somma = somma + 1.0f /i. In questo modo i viene promossa a float, e il risultato non viene troncato.
Al di là di questo, ci sono un sacco di altre imprecisioni e scorrettezze:
- #include: gli header C++ non hanno estensione .h dal 1998 (cioè da quando il C++ è stato standardizzato). A occhio stai studiando su un testo preistorico. Qui qualcosa di più moderno.
- #include: in C++ gli header C non hanno estensione .h ma hanno prefisso c: #include .
- printf/scanf: sono disponibili in C++ per retrocompatibilità con il C, ma si dovrebbe usare l'interfaccia offerta dal C++, std::cout e std::cin.
- main(): deve restituire un int, e deve essere indicato esplicitamente: int main(){...}.
- Dichiarare tutte le variabili all'inizio della funzione è una pratica del C, in C++ si usa il principio del minimo privilegio e si dichiarano il più tardi possibile. Soprattutto la variabile i dovrebbe essere dichiarata nell'intestazione del ciclo: for (int i = 1; i <= n; i++) {...}
- system("PAUSE"): non si dovrebbe usare. I programmi console vanno eseguiti da console. Se stai usando DevC++, cambia.
Al di là di questo, ci sono un sacco di altre imprecisioni e scorrettezze:
- #include
- #include
- printf/scanf: sono disponibili in C++ per retrocompatibilità con il C, ma si dovrebbe usare l'interfaccia offerta dal C++, std::cout e std::cin.
- main(): deve restituire un int, e deve essere indicato esplicitamente: int main(){...}.
- Dichiarare tutte le variabili all'inizio della funzione è una pratica del C, in C++ si usa il principio del minimo privilegio e si dichiarano il più tardi possibile. Soprattutto la variabile i dovrebbe essere dichiarata nell'intestazione del ciclo: for (int i = 1; i <= n; i++) {...}
- system("PAUSE"): non si dovrebbe usare. I programmi console vanno eseguiti da console. Se stai usando DevC++, cambia.
Aggiungo solamente che nel C non è più indispensabile inizializzare le variabili all'inizio della funzione da più di 10 anni. Farlo è anche nel C segno che studi da libri preistorici (anche se non ci sono molti libri sul C che trattano di C99 e C11).
Inoltre, anche nel C99 e C11, è indispensabile mettere int prima del main, anche se non è indispensabile scrivere il return 0.
Detto questo non ha senso usare, nello stesso codice, iostream e stdio.
Inoltre, anche nel C99 e C11, è indispensabile mettere int prima del main, anche se non è indispensabile scrivere il return 0.
Detto questo non ha senso usare, nello stesso codice, iostream e stdio.