PDA

Visualizza la versione completa : Riordinare i nomi di una classifica


cikc9807
21-10-2017, 14:50
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]);
}
}

Scara95
21-10-2017, 15:05
PA[i][b]=NOME[i+1][b];
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.

Scara95
21-10-2017, 15:06
In ogni caso stai "mischiando C e C++"

cikc9807
21-10-2017, 15:28
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.

Scara95
21-10-2017, 16:35
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.

#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

#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


#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);
}

cikc9807
21-10-2017, 17:19
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

cikc9807
21-10-2017, 17:21
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?

Scara95
21-10-2017, 18:03
Per stampare la stringa ti basta il fare:
cout << stringa;
Per la formattazione dei numeri float puoi utilizzare iomanip


#include <iomanip>
//...
cout << fixed << setprecision(2);
//...
cout << numero_float;

Loading