Problema

di il
6 risposte

Problema

Salve a tutti,
questo è il mio primo post in questo forum e sono anche alle prime armi con la programmazione quindi spero di non chiedere un' ovvietà
È da poco che ho cominciato a "studiare" il manuale "C. Corso completo di programmazione" di HM e PJ Dietel e ho incontrato la prima difficoltà nel scrivere un programma che legga in input un numero e restituisca la costante di Euler (2.7182...) elevata a quel numero utilizando la formula

e^x = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ...

Ho scritto il seguente codice (che non funziona...) ma non riesco a trovare dove sbaglio:
/*visualizza e^x*/

#include <stdio.h>
#include <math.h>

int main ()
{
    int cont = 5, cont_num = 5, cont_den = 5; 
    int p, d, m, x;
    float e = 1;
    
    printf("Inserisci un numero: ");
    scanf("%d", &x);
    
    while (cont > 0) {
          
          /*numeratore*/
          p = pow(x, cont_num);
          cont_num--;
    
          /*denominatore*/
          d = cont_den;
          m = cont_den;
          while (cont_den >= 1) {
                d = d * --m;
          }
          cont_den--;
          
          /*e^x*/
          
          e = e + ((float) p / (float) d);
          
          printf("e^%d = %f", x, e);
    cont--;
    }
    
    system("PAUSE");
    return 0;
}
Mi scuso se il codice dovesse essere incasinato o completamente sbagliato.

Come compilatore utilizzo DevC++.
Spero che qualcuno riesca ad aiutarmi a trovare dove sbaglio, in tal caso ringrazio anticipatamente

saluti
revolver

6 Risposte

  • Re: Problema

    Uhm.... sinceramente non riesco a capire la formula.
    Premetto che non ho idea di cosa sia la costante di Euler pero' la formula che hai postato mi sembra un po' strana, cioe' se io inserisco il numero 2 da tastiera la formula sarebbe:

    x = 2 (input da tastiera)
    e^2 = 1 + (2/1!) + (2^2/2!) + (2^3/3!) + ... e poi cosa??

    Cioe' non capisco questi ...

    Comunque, nel tuo codice mi e' balzato all'occhio un errore in queste righe:
    
    while (cont_den >= 1) {
        d = d * --m;
     }
    cont_den--;
    
    Questo e' un loop infinito perche' "cont_den" non viene mai decrementata dentro al ciclo e quindi varra' sempre 5 (la inizializzi tu con questo valore).
    Saluti, netburst.
  • Re: Problema

    Ciao,
    ti ringrazio della risposta: effettivamente era quello il passaggio che non funzionava, ora l'ho corretto e ho limitato il tutto a 10 iterazioni, invece delle infinite di prima (che genererebbero l'intero numero "e", infinito appunto). Il risultato è piuttosto approssimato ma comunque si può vedere che il codice funziona.

    Il codice corretto è questo:
    /*calcola e^x*/
    #include <stdio.h>
    #include <math.h>
    
    int main ()
    {
        int x, num, num2, pot, exp = 1, num3, fat = 0; 
        double e = 1;
        
        printf("Inserisci x: ");
        scanf("%d", &x);
        
        for(num = 1; num <= 10; num++) {
             
             /*numeratore*/ 
             pot =  pow(x , exp++);
                
             /*denominatore*/
             num3 = num;
             if (num3 > 1) {
                fat = num3;
                while (num3 > 1) {
                      fat *= --num3 ;
                }
             }
             else {
                  fat = 1;
             }        
             
          e += ((double) pot / (double) fat);
          }
          printf("\ne^%d = %f\n\n", x, e);
          
        
        system("PAUSE");
        return 0;
    }
    
    Saluti
    revolver

    P.S.: Scusa per la risposta poco tempestiva.
  • Re: Problema

    Perfetto, mi fa piacere che tu abbia risolto e mi fa altrettanto piacere che tu abbia postato la soluzione del problema non lasciando il topic abbandonato.
    Un consiglio, non utilizzare l'istruzione
    
    system("PAUSE");
    
    al suo posto utilizzza l'istruzione
    
    getchar();
    
    Questo perche' l'utilizzo della system() richiede l'inclusione dell'header stdlib.h quindi appesantisci codice ed eseguibile per niente.
    Un'altra cosa: fai attenzione quando leggi un numero e/o un carattere con la scanf(). Nel modo che fai tu lasci un '\n' nel buffer stdin (buffer di input) e future letture con la scanf() verranno fatte in modo errato.
    Un modo sicuramente corretto per leggere un carattere o un numero con la scanf e':
    
    int n;
    
    scanf("%d%*c",&n);
    
    // Ora 'n' contiene l'integer inserito da tastiera.
    // Il '%*c' legge il \n e lo scarta semplicemente. In questo modo nel buffer stdin non c'è nulla
    //+ e future letture con scanf() verranno fatte correttamente.
    
    Probabilmente nel libro che stati seguendo (sicuramente un buon libro) non sei arrivato ancora a questo punto, oppure non viene nemmeno presentato questo esempio ma tienilo sempre a mente perche' ti servira'
    Saluti, netburst.
  • Re: Problema

    Grazie mille!
    Effettivamente per ora nel manuale che uso non ho ancora incontrato questo sistema che mi hai consigliato (e non so se lo troverò, ... speriamo).

    Per il
    System("PAUSE")
    il problema è che se non lo metto (e negli esempi forniti dal libro non c'è) una volta eseguito il codice la finestra si chiude da sola appena aperta. Cercando su internet ho notato che in certi codici postati alla fine veniva messo questo comando (che in realtà non so nemmeno cosa sia...) e ho provato a inserirlo, effettivamente con questo comando la finestra del "programma" rimane aperta e una volta terminata l'esecuzione compare la scritta "Premere un tasto per continuare ...".
    A questo punto mi chiedo come mai il codice non funzioni senza questo comando, ...

    Saluti
    revolver
  • Re: Problema

    Ciao

    Il programma funziona benissimo senza!
    Il tuo problema è che DevC++ una volta che il programma è terminato chiude la finestra in cui era eseguito, quindi tu non puoi vedere un eventuale output a video!
    Con
    getchar();
    forzi il programma ad attendere un input da tastiera, quindi vedi l'output!

    Prova a fare una prova compila il tuo programma senza ne
    system("PAUSE");
    ne
    getchar();
    dopo di che avvia cmd (se sei sotto windows) o il terminale (se sei sotto linux) avvia il tuo programma e vedrai che funziona benissimo!!!
  • Re: Problema

    Ho provato e funziona!
    È molto interessante il fato di mettere il comando
    getchar();
    "inutile" alla fine del programma in modo da lasciarlo in attesa, lo terrò a mente. Dubito che ci sarei arrivato da solo...

    Utilizzando direttamente il prompt dei comandi per aprire il "programma" effettivamente poi rimane l'output visibile, ma trovo che la soluzione migliore sia quella del "getchar()", che ha il vantaggio di già funzionare in DevC++.

    Grazie a tutti
    saluti
    revolver
Devi accedere o registrarti per scrivere nel forum
6 risposte