Restituire un array da una funzione in C++

di il
17 risposte

Restituire un array da una funzione in C++

Salve, sono alle prese con un esercizio da libro che descrivo in seguito.

/*Scrivere un programma che consenta all'utente di fornire i cognomi di cinque candidati ad un'elezione, ciascuno seguito dal numero di voti ricevuti. Il programma deve visualizzare i cognomi dei candidati, ciascuno seguito dal numero di voti ricevuti e dalla percentuale che tali voti rappresentano rispetto al totale dei voti espressi. Il programma deve anche decretare un vincitore dell'elezione.*/

Premetto che non ho ancora studiato i puntatori.(saranno argomento del prossimo capitolo)

Ringrazio anticipatamente chiunque mi offra delle delucidazioni.

il risultato che ottengo è il seguente: dove 9.32 è il valore riferito ai voti di "ashtony".

NOMI      N°VOTI    % VOTI   
Johnson   5000      9.32642   
Miller    4000      9.32642
Duffy     6000      9.32642
Robinson  2500      9.32642
Ashtony   1800      9.32642
Totale    19300
Il vincitore delle elezioni è : Duffy
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;

double vincitore(double voti []);	// funzione che stabilisce il vincitore delle elezioni 
double percentuale(double x[], int y);	/* funzione che calcola la percentuale dei voti ricevuta da ogni singolo
													candidato in base al totale.*/

int main (){

ifstream inFile;
inFile.open("DaLeggere2.txt");

string nomi [5];
double voti [5];
double percentual[5];
int totale;
int largest;


cout<<setw(10)<<left<<"NOMI"<<setw(5)<<setw(10)<<left<<"N°VOTI"<<setw(5)<<setw(10)<<left<<" % VOTI"<<endl;

for(int i=0; i<5; i++){
inFile>>nomi[i]>>voti[i];		//ciclo for che calcola il totale dei voti leggendo i dati da File
totale+=voti[i];
}

inFile.close();
inFile.open("DaLeggere2.txt");

    for (int i = 0; i<5; i++)
    { inFile>>nomi[i]>>voti[i];					
    percentual[i]=percentuale(voti, totale);
    cout<<setw(1)<<setw(10)<<left<<nomi[i]<<setw(1)<<setw(10)<<left<<voti[i]<<setw(1)<<setw(10)<<left<<percentual[i]<<endl;
    

    }

cout<<setw(1)<<setw(10)<<left<<"Totale"<<setw(1)<<setw(10)<<left<<totale<<endl;
largest=vincitore(voti);

cout<<"Il vincitore delle elezioni è : "<<nomi[largest];


    return 0;
}

    double vincitore (double voti [])
    {
    int maxIndex;
    maxIndex=0;


    for (int index=1; index<5; index++)
    if (voti[maxIndex]<voti[index])
        maxIndex=index;
        
        return maxIndex;

    }

        double percentuale( double x[] , int y)
        {

        double z[5];
        double s;
        

        
            for(int i=0; i<5; i++){
            z[i]=((x[i]/y)*100);
        
            }

            for(int i=0; i<5; i++){
               s=z[i];
              
            }
            
            return s;
            
        }

17 Risposte

  • Re: Restituire un array da una funzione in C++

    Ho risolto cosi

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <iomanip>
    using namespace std;
    
    double vincitore(double voti []);
    
    
    int main (){
    
    ifstream inFile;
    inFile.open("DaLeggere2.txt");
    
    string nomi [5];
    double voti  [5];
    double perc [5] ;
    int totale;
    int largest;
    
    cout<<setw(10)<<left<<"NOMI"<<setw(5)<<setw(10)<<left<<"N°VOTI"<<setw(5)<<setw(10)<<left<<" % VOTI"<<endl;
    
    for(int i=0; i<5; i++){
    inFile>>nomi[i]>>voti[i];
    totale+=voti[i];
    }
    
    
    
        for(int i=0; i<5; i++){
        inFile>>nomi[i]>>voti[i];
        perc[i]=(voti[i]/totale)*100;
        cout<<setw(1)<<setw(10)<<left<<nomi[i]<<setw(1)<<setw(10)<<left<<voti[i]<<setw(1)<<setw(10)<<left<<perc[i]<<endl;
        
         }
    
    cout<<setw(1)<<setw(10)<<left<<"Totale"<<setw(1)<<setw(10)<<left<<totale<<endl;
    largest=vincitore(voti);
    
    cout<<"Il vincitore delle elezioni è : "<<nomi[largest];
    
    
        return 0;
    }
    
        double vincitore (double voti [])
        {
        int maxIndex;
        maxIndex=0;
    
    
        for (int index=1; index<5; index++)
        if (voti[maxIndex]<voti[index])
            maxIndex=index;
            
            return maxIndex;
    
        }
    
    
  • Re: Restituire un array da una funzione in C++

    Perchè hai letto nuovamente il file nel secondo for?

    Perchè per i voti usi un vettore di double?

  • Re: Restituire un array da una funzione in C++

    Ho letto nuovamente i file nel secondo for perche la % dei voti va calcolata sul totale dei voti, di conseguenza se avessi calcolato il totale nello stesso ciclo del calcolo percentuale non avrei ottenuto un valore corretto.

    per quel che riguarda il vettore double per i voti è puramente casuale.

  • Re: Restituire un array da una funzione in C++

    X1=totvoti/100*voti[1]

    X2=totvoti/100*voti[2]

    X3=totvoti/100*voti[3]

    X4=totvoti/100*voti[4]

    X5=totvoti/100*voti[5]

    Come mai hai sempre la stessa percentuale per tutti?

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - sihsandrea ha scritto:


    X1=totvoti/100*voti[1]

    X2=totvoti/100*voti[2]

    X3=totvoti/100*voti[3]

    X4=totvoti/100*voti[4]

    X5=totvoti/100*voti[5]

    Come mai hai sempre la stessa percentuale per tutti?

     avevo la stessa percentuale per tutti i candidati perche non riuscivo a far uscire dalla funzione “percentuale” attraverso l'enunciato return tutti i valori dell'array “Z”. a seconda di dove veniva posizionato return (all'interno del ciclo o fuori da quest'ultimo ottenevo o il primo dato relativo al primo candidato o l'ultimo…da qui anche il titolo della discussione). 

    l'esercizio andava svolto utilizzando il piu possibile gli array. quindi al posto di 5 variabili X come descritto da te sopra, volevo usare un array.

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - Vlad ha scritto:


    Ho letto nuovamente i file nel secondo for perche la % dei voti va calcolata sul totale dei voti, di conseguenza se avessi calcolato il totale nello stesso ciclo del calcolo percentuale non avrei ottenuto un valore corretto.

    A parte che il fatto che non puoi leggere due volte di seguito il file in questo modo, è un errore leggerlo due volte.

    Il totale l'hai calcolato durante la prima for, non ha senso quello che dici.

    per quel che riguarda il vettore double per i voti è puramente casuale.

    “Casuale”? Non si programma a caso.

    Anche la variabile totale deve essere double.  Inoltre, la variabile totale è una variabile locale e deve essere inizializzata a 0

    Quindi devi scrivere

    double totale = 0;

    ed eliminare la riga della lettura del file dal secondo for.

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - Vlad ha scritto:


    l'esercizio andava svolto utilizzando il piu possibile gli array. quindi al posto di 5 variabili X come descritto da te sopra, volevo usare un array.

    C'è il suo perché nell'uso di x1, x2,…,xN

    Suvvia! Sforzati un po'.

    Mettilo in un ciclo.

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - oregon ha scritto:


    06/05/2024 - Vlad ha scritto:


    Ho letto nuovamente i file nel secondo for perche la % dei voti va calcolata sul totale dei voti, di conseguenza se avessi calcolato il totale nello stesso ciclo del calcolo percentuale non avrei ottenuto un valore corretto.

    A parte che il fatto che non puoi leggere due volte di seguito il file in questo modo, è un errore leggerlo due volte.

    Il totale l'hai calcolato durante la prima for, non ha senso quello che dici.

    per quel che riguarda il vettore double per i voti è puramente casuale.

    “Casuale”? Non si programma a caso.

    Se intendi che ci possa essere un voto come 6.5 (sei e mezzo) allora anche la variabile totale deve essere double.  Inoltre, la variabile totvoti è una variabile locale e deve essere inizializzata a 0

    ho calcolato il totale complessivo dei voti durante il primo ciclo for e me ne sono servito nel secondo per calcolare la percentuale dei voti appunto sul totale complessivo che è gia stato calcolato dal primo ciclo.

    non ho trovato altro modo di farlo.

    se avessi inserito il calcolo del totale complessivo all'interno dello stesso ciclo che calcolava la percentuale non avrei ottenuto il risultato desiderato in quanto

    ogni percentuale ottenuta non sarebbe stata calcolata attraverso un totale complessivo, ma parziale.

    correggo le variabili.

    grazie per le delucidazioni.

  • Re: Restituire un array da una funzione in C++

    @Andrea mi sfugge quello che stai dicendo o suggerendo

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - sihsandrea ha scritto:


    06/05/2024 - Vlad ha scritto:


    l'esercizio andava svolto utilizzando il piu possibile gli array. quindi al posto di 5 variabili X come descritto da te sopra, volevo usare un array.

    C'è il suo perché nell'uso di x1, x2,…,xN

    Suvvia! Sforzati un po'.

    Mettilo in un ciclo.

    è appunto quello che ho fatto inizialmente ma non riuscivo a tirar fuori tutti i valori di “x” in questo caso. 

    ho risolto cosi

      for(int i=0; i<5; i++){
        inFile>>nomi[i]>>voti[i];
        perc[i]=(voti[i]/totale)*100;

    nel primo commento della discussione ho elencato con piu precisione.

    grazie.

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - Vlad ha scritto:


    ho calcolato il totale complessivo dei voti durante il primo ciclo for e me ne sono servito nel secondo per calcolare la percentuale dei voti appunto sul totale complessivo che è gia stato calcolato dal primo ciclo.

    non ho trovato altro modo di farlo.

    Giusto ma nel secondo ciclo for NON serve leggere ancora il file. Elimina la linea che legge dal file dal secondo for.

    se avessi inserito il calcolo del totale complessivo all'interno dello stesso ciclo che calcolava la percentuale non avrei ottenuto il risultato desiderato in quanto

    E questo va bene, io dico solo che nel secondo for NON devi leggere ancora

    Elimina dunque la lettura dal secondo for e riprova con la variabile totale double azzerata.

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - Vlad ha scritto:

      for(int i=0; i<5; i++){
        inFile>>nomi[i]>>voti[i];
        perc[i]=(voti[i]/totale)*100;

    Perchè continui ad inserire la linea

    inFile>>nomi[i]>>voti[i];

    in questo ciclo quando ti ho detto che è un ERRORE?

  • Re: Restituire un array da una funzione in C++

    06/05/2024 - oregon ha scritto:


    06/05/2024 - Vlad ha scritto:

      for(int i=0; i<5; i++){
        inFile>>nomi[i]>>voti[i];
        perc[i]=(voti[i]/totale)*100;

    Perchè continui ad inserire la linea

    inFile>>nomi[i]>>voti[i];

    in questo ciclo quando ti ho detto che è un ERRORE?

    adesso ho capito ciò che intendevi… hai pienamente ragione.

    mi sono perso il penultimo messaggio che avevi postato

  • Re: Restituire un array da una funzione in C++

    Con queste modifiche il risultato del programma è

    NOMI      N¦VOTI     % VOTI
    Johnson   5000      25.9067
    Miller    4000      20.7254
    Duffy     6000      31.0881
    Robinson  2500      12.9534
    Ashtony   1800      9.32642
    Totale    19300
    Il vincitore delle elezioni Þ : Duffy

Devi accedere o registrarti per scrivere nel forum
17 risposte