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