+ Rispondi
Pagina 1 di 6 1 2 3 ... UltimaUltima
Risultati da 1 a 10 su 54

Discussione: Aiuto per C++

  1. #1

    Iscritto dal
    14/10/2011
    Messaggi
    229

    Aiuto per C++

    Ciao a tutti
    Ecco l'esercizio:




    Ricordando che la funzione esponenziale si può scrivere in serie di Maclaurin come:

    e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

    si scriva un programma in linguaggio C++ che:
    • legga dalla tastiera un valore per x ;
    • legga da tastiera l’errore con cui si vuole calcolare il valore di e^x
    • calcoli il valore approssimato;
    • stampi il valore calcolato sullo schermo.

    (Sugg. Il generico termine della serie si ottiene dal precedente come segue (x^n/n!) = (x^(n-1)/(n-1)!) (x/n)


    Per valutare l’errore ad ogni passo utilizzare la funzione predefinita “exp(x)” )

    Io ho fatto così, ma il computer si blocca

    codice:
    // calcolo di e^x
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    
    // Lettura esponente
    void leggiX (float &x) {
        cout << "Immetti x" << endl;
        cin >> x;
        return;
    }
    
    
    // Lettura errore
    void leggiErrore (float &e) {
        cout << "Immetti l'errore con cui calcolare l'esponenziale" << endl;
        cin >> e;
        return;
    }
    
    
    // Calcolo valore approssimato
    void valore (float x, float e, float &v) { 
        int i=1;
        int fattoriale = 1;
        while (fabs(v - exp(x)) >= e && v <= exp(x)) {
        v += 1 + (pow(x, i))/(fattoriale * i);
         i++;
        }
        return;
    }
    
    
    // Stampa valore
    void risultati (float v) {
        cout << "L'esponenziale vale: " << v << endl;
        return;
    }
    
    
    int main () {
        float x, e, v;
        leggiX (x);
        leggiErrore (e);
        valore (x, e, v);
        risultati (v);
        return 0;
    }
    Visto che stasera sono un po' cotto, mi potete dire dove ho sbagliato?

    La discussione, assieme a quella sul matlab, prenderà vita tra un po', visto che ora ho altri esami in ballo .

    Buona serata
    Ultima modifica: 19-06-2013 alle 20:29, di xam8re

  2. #2
    nic
    nic non è in linea
    Still Alive
    Iscritto dal
    22/09/2011
    Località
    Napoli
    Messaggi
    2,632
    leggendo molto velocemente, direi v += 1 + (pow(x, i))/(fattoriale * i); anche se non ho effettivamente capito come funzionerebbe exp(x)
    My name is Legion, for we are many.

  3. #3
    Driving out Terrorists...
    Iscritto dal
    10/09/2012
    Località
    Alcamo (TP)
    Messaggi
    161
    Sono a lavoro e non posso risponderti in maniera esaustiva. Ma, dando un'occhiata veloce non ho potuto fare a meno di notare un errore concettuale ed almeno un errore di sintassi. Domani verso ora di pranzo, se non hai risolto, ti scrivero' la soluzione con annesse spiegazioni. Scusa se in questo momento non ti scrivo di piu' ma sono a rischio "cazziata"
    CPU: Intel Core i7 2700K; GPU: MSI N670GTX Power Edition; MoBo: Gigabyte G1.Sniper 2; RAM: 8Gb Patriot Viper 3 Series @2133 MHz; HDD: Western Digital Caviar Black 2Tb; PSU: Antec HCP-850W; CPU-Cooler: Corsair H60; Case: Antec Lanboy Air Yellow; Blu-Ray: Plextor PX-LB950SA; Monitor: Philips 273E3LSB; Mouse: SteelSeries Sensei; Mousepad: Steelseries QCK Demon Hunter Edition; Tastiera: Steelseries 7G; Cuffie: Steelseries 7H USB; Controller: Xbox 360 Controller.

  4. #4

    Iscritto dal
    14/10/2011
    Messaggi
    229
    Grazie per le risposte. Col += almeno si avvia
    Avevo saltato anche un i++.
    Ultima modifica: 19-06-2013 alle 19:31, di _ROBERTO_

  5. #5
    nic
    nic non è in linea
    Still Alive
    Iscritto dal
    22/09/2011
    Località
    Napoli
    Messaggi
    2,632
    e poi il fattoriale come lo stai calcolando?
    My name is Legion, for we are many.

  6. #6

    Iscritto dal
    14/10/2011
    Messaggi
    229
    Dai abbozzami qualcosa, stasera sono un po' stanco

  7. #7
    {abstract}
    Iscritto dal
    05/09/2011
    Località
    altrove.
    Messaggi
    4,080
    molto probabile si tratti di un problema di overflow ...

    ...

  8. #8

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,834
    ti ho corretto post iniziale, il codice mettilo sotto code (nel frattempo stiamo lavorando per voi avremo prima o poi il code syntax).

    intanto una prima bozza :


    // calcolo di e^x
    #include <iostream>
    #include <math.h>
    using namespace std;


    // Lettura esponente
    void leggiX (float &x)
    {
    cout << "Immetti x" << endl;
    cin >> x;
    return;
    }


    // Lettura errore
    void leggiErrore (float &e)
    {
    cout << "Immetti l'errore con cui calcolare l'esponenziale" << endl;
    cin >> e;
    return;
    }

    unsigned int factorial(unsigned int n)
    {
    unsigned int ret = 1;
    for(unsigned int i = 1; i <= n; ++i)
    ret *= i;
    return ret;
    }

    // Calcolo valore approssimato
    void valore (float x, float e, float &v)
    {
    int i=1;
    int fattoriale = 1;
    while (fabs(v - exp(x)) >= e && v <= exp(x))
    {
    v += 1 + (pow(x, i))/(factorial(i) * i);
    i++;
    }
    return;
    }


    // Stampa valore
    void risultati (float v)
    {
    cout << "L'esponenziale vale: " << v << endl;
    return;
    }


    int main ()
    {
    float x = 0, e = 0, v = 0;
    leggiX (x);
    leggiErrore (e);
    valore (x, e, v);
    risultati (v);
    return 0;
    }
    non calcoli il fattoriale. Bloccare non si blocca a me (al massimo restituisce NaN. (però io uso un sistema operativo che non si arrabbia troppo )

  9. #9

    Iscritto dal
    26/05/2011
    Località
    Lugano, Svizzera
    Messaggi
    21,469
    Spezzerei un po' di più la funzione per chiarezza, tanto le prestazioni non penso siano la preoccupazione principale


    intanto in qualche modo il fattoriale devi calcolarlo.
    Fattoriale vuole dire che 5! è 5*4*3*2*1

    quindi viene qualcosa su questa linea:

    codice:
    int fattoriale (int param) {
        
        int ret = param;
    
    
        while (param > 0){
        ret = ret * (param -1);
        param = param -1;
        }
    
    
        return ret;
    }

    Poi per la sommatoria farei qualcosa così (messo come l'ho messo per chiarezza )

    codice:
    int esponenziale = 1;
    int i = 1;
    
    
    while ( // controllo errore //){
        
        double numeratore = pow(x,i);
        int denominatore = fattoriale(i);
    
    
        esponenziale = esponenziale + numeratore/denominatore;
        
        i++;
    
    
    }




    Aggiungendo però come dice Uri anche delle condizioni d'uscita per non andare chissà dove col contenuto delle variabili




    edit: scritto insieme
    Max fai il fattoriale andando avanti? Io lo faccio andando indietro, non so perché
    Verità #10 | Viva l'unto, reale o presunto

  10. #10

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,834
    oltre al fatto che:

    1- non controlli gli input a noi davano due solo per quello.
    2- usi il c++ solo per cin e cout. Usa il C a questo punto
    3- la condizione di uscita dal while fatta così è troppo pericolosa. Io personalmente metterei una condizione di uscita gestita da me.


 
+ Rispondi
Pagina 1 di 6 1 2 3 ... UltimaUltima

Autorizzazioni

  • Non puoi iniziare nuove discussioni
  • Non puoi rispondere alle discussioni
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
Powered by vBulletin™ Version 4.1.5
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved
SEO by vBSEO ©2011, Crawlability, Inc.
Fuso orario: UTC +1, sono le 09:31.