Visualizzazione risultati 1 fino 4 di 4

Discussione: [C++]ma xkè cout di un float mi mostra un intero?

  1. #1
    Guest

    Predefinito [C++]ma xkè cout di un float mi mostra un intero?

    Scusate...stavo facendo un programma in C++, molto simply, come compilatore uso DEV-C++....
    Faccio fare la media tra diversi valori inseriti dall'utente, la media è float, ma poi quando la metto a schermo(cout), mi mostra un valore intero, presumibilmente arrotondato....
    Mi sapreste dire perchè?in teoria il mostrando un valore float non avrei dovuto vedere qualche cifra dopo la virgola?
    per la cronaca il programma è qsto....
    Codice:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    int n, m; //dichiarare le lunghezze
    int i, sommaA=0, sommaB=0; //altre varibili intere
    float mediaA, mediaB; //altre variabili float(virgola)
    int main()
    {   //testo esercizio
        cout<<"Scrivere un programma che memorizzi dei valori in due vettori A e B,"<<endl;
        cout<<"ripettivamente di lunghezza n e m, a scelta dell'utente;"<<endl;
        cout<<"Trovare il valore maggiore presente nel vetttore A e calcolare la"<<endl;
        cout<<"media dei valori di A;"<<endl;
        cout<<"Trovare il valore minimo presente nel vettore B e calcolare la"<<endl;
        cout<<"media dei valori di B;"<<endl;
        cout<<endl;
        //inserire la lunghezza dei vettori A e B
        cout<<"Inserire la lunghezza del vettore A"<<endl;
        cin>>n;
        cout<<"Inserire la lunghezza del vettore B"<<endl;
        cin>>m;
        //dichiarare i vettori
        //vengono dichiarati dopo aver dato un valore alle varibili della loro lunghezza prima non è possibile!
        int A[n], B[m]; 
        //inserire dei valori nei vettori
        for(i=0;i<n;i++){ //valori per il vettore A
                         cout<<"Inserisci il valore da inserire nel vettore A"<<endl;
                         cin>>A[i];
        }
        for(i=0;i<m;i++){ //valori per il vettore B
                          cout<<"Inserisci il valore da inserire nel vettore B"<<endl;
                          cin>>B[i];
        }
        int maxA=A[0], minB=B[0];
        //INIZIO LAVORO SUL VETTORE A:
        //calcolare il maggiore e la media dei valori di A
        for(i=0;i<n;i++){
                         if(A[i]>maxA){
                                       maxA=A[i];
                         }
        }
        //calcolare la media di A
        //fase 1: calcolare la somma dei valori del vettore A
        for(i=0;i<n;i++){
                         sommaA=sommaA+A[i];
                         }
        //fase 2: calcolare la media del vettore A
        mediaA=sommaA/n;
        //FINE LAVORO SUL VETTORE A!
        //INIZIO LAVORO SUL VETTORE B:
        //calcolare il maggiore e la media dei valori di B
        for(i=1;i<m;i++){
                         if(B[i]<minB){
                                       minB=B[i];
                         }
        }
        //calcolare la media di B
        //fase 1: calcolare la somma dei valori del vettore A
        for(i=1;i<m;i++){
                         sommaB=sommaB+B[i];
                         }
        //fase 2: calcolare la media del vettore A
        mediaB=sommaB/m;
        //FINE LAVORO SUL VETTORE B!
        //PRESENTAZIONE DEI RISULTATI
        cout<<"Risultati del vettore A:"<<endl;
        cout<<"Valore maggiore di A "<<maxA<<endl;
        cout<<"Valore medio di A "<<mediaA<<endl;
        cout<<endl;
        cout<<"Risultati del vettore B:"<<endl;
        cout<<"Valore minimo di B "<<minB<<endl;
        cout<<"Valore medio di B "<<mediaB<<endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Grazie mille già da ora a chi mi aiuterà....

  2. #2
    Guest

    Predefinito

    l'errore è dovuto al fatto che le variabili che usi per fare i calcoli sono int e e un'operazione tra int da come risultato un intero (anche se tu lo metti in una variabile float) dovresti usare un operatore di cast es:
    mediaB=sommaB/m;
    diventerà:
    mediaB= static_cast<float> (sommaB) /m;

    cosa succede:
    per la durata dell'operzione sommaB diventa float e quindi anche m viene promosso a float (perchè non si può effettuare un operazione tra tipi diversi)

    edit:
    tanto per essere precisi il valore non viene arrotondato, viene troncato...

    edit 2:
    alcune divisioni possono dare numeri periodici o comuqnue con un numero improponilibe di decimali.. per limitarli ti consiglio di dare un'occhiata ai manipolatori di stream setprecision() e fixed (qusto serve ad evitare la notazione scientifica)
    Ultima modifica di SoulHome : 02-10-2006 alle ore 20.17.12

  3. #3
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,261

    Predefinito

    concordo con quanto sopra. Soluzione alternativa: dichiari anche somma come float in partenza.

    ricorda che il risultato di un'operazione ha il tipo degli operandi che ne fanno parte. Quindi intero/intero darà risultato intero (eventualmente troncato). Se poi lo metti in una variabile float non importa, perché ci metti cmq un numero intero.

  4. #4
    Guest

    Predefinito

    Thanks davvero!...Grazie ancora!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •