Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Riordinare i nomi di una classifica

    Salve a tutti sono nuovo nel forum, sono un elettrotecnico ma per curiositità ho voluto cimentarmi nel c++.
    Ho iniziato un semplice programma che mi permetta dopo aver inserito i nomi e i punteggi, di sviluppare una classifica dei partecipanti. I punteggi riesco a riordinarli ,ma non riesco a trovare una soluzione perchè i nomi restino accoppiati ai punteggi.
    Penso che il problema sia il fatto che per organizzare i nomi li ho dichiarati così:
    char PA[21][30];
    Prevedo massimo 21 partecipanti e massimo 30 caratteri per ogni nome
    Questo è il codice spero che mi possiate aiutare:

    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <float.h>
    #include <cmath>
    using namespace std;

    int numero_partecipanti,terminare;
    //DICHIARAZIONE DECIMALI
    float Pfinale[21];

    char PA[21][30];
    char NOME[21][30];

    void Stampa_classifica();
    int main ()
    {

    cout <<"Scrivere il numero di partecipanti:\n";
    cin >> numero_partecipanti ;

    int i;
    for (i=0; i<numero_partecipanti; i++)
    {
    cout <<"\nInserisci il nome del partecipante:\n";
    cin >> PA[i];
    cout <<"Inserisci il punteggio finale:\n";
    cin>> Pfinale[i];
    Stampa_classifica();
    }

    void Stampa_classifica()
    {
    unsigned int i, scambio;
    float X=0 ;
    do
    {
    scambio = 0;
    //CICLO CHE SCAMBIA PER IL NUMERO DI PARTECIPANTI
    for(i = 0; i < numero_partecipanti -1; i++)
    {
    if(Pfinale[i] < Pfinale[i + 1])
    {
    //SCAMBIO NOME
    int a,b,c;
    for(a=0 ; a!=30 ; a++)
    {
    NOME[i][a]=PA[i][a];
    }
    for(b=0 ; b!=30 ; b++)
    {
    PA[i][b]=NOME[i+1][b];
    }
    for(c=0 ; c!=30 ; c++)
    {
    PA[i+1][c]=NOME[i][c];
    }


    X = Pfinale[i];
    Pfinale[i] = Pfinale[i + 1];
    Pfinale[i + 1] = X;

    scambio = 1;
    }
    }
    } while(scambio == 1);

    for(i = 0; i < numero_partecipanti; i++)
    {
    cout << i+1 << " "<<"CLASSIFICATO";
    printf("\nNome: %s",PA[i]);
    printf ("\nFinale: %.2f\n", Pfinale[i]);
    }
    }
    Ultima modifica di cikc9807; 21-10-2017 a 15:21

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    [CODE]PA[i][b]=NOME[i+1][b];[/CODE]
    NOME[i+1][*] non è stato inizializzato da nessuna parte. I dati che vuoi copiare stanno in PA[i][*]

    Inoltre non è necessario utilizzare un array per copiare i dati, ti basta una singola variabile temporanea: ci assegni il valore in i, assegni a i il valore di i+1, assegni a i+1 il valore della variabile temporanea. A questo punto non ti interessa più nulla del valore della variabile temporanea.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    In ogni caso stai "mischiando C e C++"
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Ciao grazie mille per la veloce risposta,però sfortunatamente non sono sicuro di aver capito, cioè mi stai suggerendo di non creare un altro array per fare lo scambio e questo ok, ma non ho capito cosa uso al suo posto.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Modificando il tuo codice facendo un po' di pulizia e correggendo il bug puoi scrivere qualcosa del genere, ci sono modi molto migliori per fare la stessa cosa tuttavia.
    codice:
    #include <iostream>
    #include <stdio.h>
    
    
    using namespace std;
    
    
    int numero_partecipanti, terminare;
    //DICHIARAZIONE DECIMALI
    float Pfinale[21];
    
    
    char PA[21][30];
    
    
    void Stampa_classifica();
    
    
    int main()
    {
    
    
        cout << "Scrivere il numero di partecipanti:\n";
        cin >> numero_partecipanti;
    
    
        for (int i = 0; i < numero_partecipanti; i++) {
            cout << "\nInserisci il nome del partecipante:\n";
            cin >> PA[i];
            cout << "Inserisci il punteggio finale:\n";
            cin >> Pfinale[i];
        }
        Stampa_classifica();
        return 0;
    }
    
    
    void Stampa_classifica()
    {
        bool scambio;
        do {
            scambio = false;
            //CICLO CHE SCAMBIA PER IL NUMERO DI PARTECIPANTI
            for (int i = 0; i < numero_partecipanti - 1; i++) {
                if (Pfinale[i] < Pfinale[i + 1]) {
                    //SCAMBIO NOME
                    for (int j = 0; j < 30; ++j) {
                        char tmp = PA[i][j];
                        PA[i][j] = PA[i + 1][j];
                        PA[i + 1][j] = tmp;
                    }
    
    
                    float tmp = Pfinale[i];
                    Pfinale[i] = Pfinale[i + 1];
                    Pfinale[i + 1] = tmp;
    
    
                    scambio = true;
                }
            }
        } while (scambio);
    
    
        for (int i = 0; i < numero_partecipanti; i++) {
            cout << i + 1 << " "
                 << "CLASSIFICATO";
            printf("\nNome: %s", PA[i]);
            printf("\nFinale: %.2f\n", Pfinale[i]);
        }
    }
    Le modifiche minime per far funzionare il codice danno come risultato
    codice:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <float.h>
    #include <cmath>
    using namespace std;
    
    
    int numero_partecipanti, terminare;
    //DICHIARAZIONE DECIMALI
    float Pfinale[21];
    
    
    char PA[21][30];
    char NOME[21][30];
    
    
    void Stampa_classifica();
    int main()
    {
    
    
        cout << "Scrivere il numero di partecipanti:\n";
        cin >> numero_partecipanti;
    
    
        int i;
        for (i = 0; i < numero_partecipanti; i++) {
            cout << "\nInserisci il nome del partecipante:\n";
            cin >> PA[i];
            cout << "Inserisci il punteggio finale:\n";
            cin >> Pfinale[i];
        }
        Stampa_classifica();
        return 0;
    }
    
    
    void Stampa_classifica()
    {
        unsigned int i, scambio;
        float X = 0;
        do {
            scambio = 0;
            //CICLO CHE SCAMBIA PER IL NUMERO DI PARTECIPANTI
            for (i = 0; i < numero_partecipanti - 1; i++) {
                if (Pfinale[i] < Pfinale[i + 1]) {
                    //SCAMBIO NOME
                    int a, b, c;
                    for (a = 0; a != 30; a++) {
                        NOME[i][a] = PA[i][a];
                    }
                    for (b = 0; b != 30; b++) {
                        PA[i][b] = PA[i + 1][b];
                    }
                    for (c = 0; c != 30; c++) {
                        PA[i + 1][c] = NOME[i][c];
                    }
    
    
                    X = Pfinale[i];
                    Pfinale[i] = Pfinale[i + 1];
                    Pfinale[i + 1] = X;
    
    
                    scambio = 1;
                }
            }
        } while (scambio == 1);
    
    
        for (i = 0; i < numero_partecipanti; i++) {
            cout << i + 1 << " "
                 << "CLASSIFICATO";
            printf("\nNome: %s", PA[i]);
            printf("\nFinale: %.2f\n", Pfinale[i]);
        }
    }
    Una versione invece riscritta, anche se ancora largamente migliorabile, può essere
    codice:
    #include <iostream>
    #include <vector>
    
    
    using namespace std;
    
    
    struct partecipante {
        string nome;
        float punteggio;
    };
    
    
    vector<partecipante> leggi_partecipanti();
    void ordina_partecipanti(vector<partecipante>& partecipanti);
    void stampa_partecipanti(const vector<partecipante>& partecipanti);
    void stampa_classifica_partecipanti(vector<partecipante> partecipanti);
    
    
    int main()
    {
        vector<partecipante> partecipanti = leggi_partecipanti();
        stampa_classifica_partecipanti(partecipanti);
        return 0;
    }
    
    
    vector<partecipante> leggi_partecipanti() {
        int n;
        cout << "Numero partecipanti: ";
        cin >> n;
        vector<partecipante> partecipanti(n);
        for(int i = 0; i < n; ++i) {
            cout << "Inserisci il nome del partecipante: ";
            cin >> partecipanti[i].nome;
            cout << "Inserisci il punteggio finale: ";
            cin >> partecipanti[i].punteggio;
            cout << endl;
        }
        return partecipanti;
    }
    
    
    void ordina_partecipanti(vector<partecipante>& partecipanti) {
        bool scambio = true;
        for(int j = partecipanti.size()-1; scambio && j > 0; --j) {
            scambio = false;
            for(int i = 0; i < j; ++i) {
                if(partecipanti[i].punteggio < partecipanti[i+1].punteggio) {
                    swap(partecipanti[i], partecipanti[i+1]);
                    scambio = true;
                }
            }
        }
    }
    
    
    void stampa_partecipanti(const vector<partecipante>& partecipanti) {
       for(int i = 0; i < partecipanti.size(); ++i) {
           cout << i+1 << " " << partecipanti[i].nome
                << " con un punteggio di " << partecipanti[i].punteggio << endl;
       }
    }
    
    
    void stampa_classifica_partecipanti(vector<partecipante> partecipanti) {
        ordina_partecipanti(partecipanti);
        cout << "CLASSIFICA" << endl;
        stampa_partecipanti(partecipanti);
    }
    Ultima modifica di Scara95; 21-10-2017 a 16:42
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    wow grazie millle la prima "versione" che mi hai mandato è perfetta, ora mi ci metto e cerco di capire bene il funzionamento dell' ultima! Davvero grazie mille
    Ultima modifica di cikc9807; 21-10-2017 a 17:32

  7. #7
    Hai ragione solo che non riesco a scrivere questa parte bene usando il cout
    printf("\nNome: %s",PA[i]);
    printf ("\nFinale: %.2f\n", Pfinale[i]);
    Come si dovrebbe scrivere?

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Per stampare la stringa ti basta il fare:
    codice:
    cout << stringa;
    Per la formattazione dei numeri float puoi utilizzare iomanip
    codice:
    #include <iomanip>
    //...
    cout << fixed << setprecision(2);
    //...
    cout << numero_float
    ;
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.