Cuando se tienen vectores paralelos y se ordena uno de ellos hay que tener la precaución de intercambiar los elementos de los vectores paralelos.
Confeccionar un programa que permita cargar los nombres de 5 alumnos y sus notas respectivas. Luego ordenar las notas de mayor a menor. Imprimir las notas y los nombres de los alumnos.
#include<iostream>
using namespace std;
class NotaAlumnos {
private:
char nombres[5][40];
int notas[5];
public:
void cargar();
void ordenar();
void imprimir();
};
void NotaAlumnos::cargar()
{
cout <<"Carga de nombres y notas"<<"\n";
for(int f=0;f < 5;f++)
{
cout <<"Ingese el nombre del alumno:";
cin.getline(nombres[f],40);
cout <<"Ingrese la nota del alumno:";
cin >>notas[f];
cin.get();
}
}
void NotaAlumnos::ordenar()
{
for (int k = 0; k < 5; k++)
{
for (int f = 0; f < 4 - k; f++)
{
if (notas[f] < notas[f + 1])
{
int auxnota;
auxnota = notas[f];
notas[f] = notas[f + 1];
notas[f + 1] = auxnota;
char auxnombre[40];
strcpy_s(auxnombre,40, nombres[f]);
strcpy_s(nombres[f],40, nombres[f + 1]);
strcpy_s(nombres[f + 1],40, auxnombre);
}
}
}
}
void NotaAlumnos::imprimir()
{
cout <<"Nombres de alumnos y notas de mayor a menor"<<"\n";
for(int f=0;f < 5;f++)
{
cout <<nombres[f] <<" - " <<notas[f] <<"\n";
}
cin.get();
}
int main()
{
NotaAlumnos na;
na.cargar();
na.ordenar();
na.imprimir();
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace : OrdenamientoVectoresParalelos
Definimos en la clase NotaAlumnos los dos vectores:
class NotaAlumnos {
private:
char nombres[5][40];
int notas[5];
Procedemos a cargar los dos vectores:
void NotaAlumnos::cargar()
{
cout <<"Carga de nombres y notas"<<"\n";
for(int f=0;f < 5;f++)
{
cout <<"Ingese el nombre del alumno:";
cin.getline(nombres[f],40);
cout <<"Ingrese la nota del alumno:";
cin >>notas[f];
cin.get();
}
}
Como podemos ver hemos introducido una nueva característica del cout que es la impresión de múltiples valores con un solo cout (nos ahorramos líneas de codificación):
cout <<"Carga de nombres y notas"<<"\n";
En lugar de:
cout <<"Carga de nombres y notas";
cout <<"\n";
En el proceso de ordenamiento dentro de los dos for verificamos si debemos intercambiar los elementos del vector notas:
for (int k = 0; k < 5; k++)
{
for (int f = 0; f < 4 - k; f++)
{
if (notas[f] < notas[f + 1])
{
En el caso que la nota de la posición 'f' sea menor a de la posición siguiente 'f+1' procedemos a intercambiar las notas:
int auxnota;
auxnota = notas[f];
notas[f] = notas[f + 1];
notas[f + 1] = auxnota;
y simultánemamente procedemos a intercambiar los elementos del vector paralelo (con esto logramos que los dos vectores continúen siendo vectores paralelos):
char auxnombre[40];
strcpy_s(auxnombre,40, nombres[f]);
strcpy_s(nombres[f],40, nombres[f + 1]);
strcpy_s(nombres[f + 1],40, auxnombre);
Como vemos utilizamos dos auxiliares distintos porque los elementos de los dos vectores son de distinto tipo (int y cadena de caracteres)
Si deseamos ordenar alfabéticamente la condición dependerá del vector nombres.
Nuevamente en la impresión hemos utilizado el objeto cout con salidas múltiples:
void NotaAlumnos::imprimir()
{
cout <<"Nombres de alumnos y notas de mayor a menor"<<"\n";
for(int f=0;f < 5;f++)
{
cout <<nombres[f] <<" - " <<notas[f] <<"\n";
}
cin.get();
}
#include <iostream>
using namespace std;
class PaisesHabitantes {
private:
char paises[5][40];
int habitantes[5];
public:
void cargar();
void ordenarPorNombres();
void ordenarPorHabitantes();
void imprimir();
};
void PaisesHabitantes::cargar()
{
cout << "Carga de paises y habitantes" << "\n";
for (int f = 0; f < 5; f++)
{
cout << "Ingese el nombre del pais:";
cin.getline(paises[f], 40);
cout << "Ingrese la cantidad de habitantes:";
cin >> habitantes[f];
cin.get();
}
}
void PaisesHabitantes::ordenarPorNombres()
{
for (int k = 0; k < 5; k++)
{
for (int f = 0; f < 4 - k; f++)
{
if (strcmp(paises[f], paises[f + 1]) > 0)
{
char auxpais[40];
strcpy_s(auxpais, 40,paises[f]);
strcpy_s(paises[f], 40,paises[f + 1]);
strcpy_s(paises[f + 1], 40, auxpais);
int auxhabitante;
auxhabitante = habitantes[f];
habitantes[f] = habitantes[f + 1];
habitantes[f + 1] = auxhabitante;
}
}
}
}
void PaisesHabitantes::ordenarPorHabitantes()
{
for (int k = 0; k < 5; k++)
{
for (int f = 0; f < 4 - k; f++)
{
if (habitantes[f] < habitantes[f + 1])
{
char auxpais[40];
strcpy_s(auxpais,40, paises[f]);
strcpy_s(paises[f],40, paises[f + 1]);
strcpy_s(paises[f + 1],40, auxpais);
int auxhabitante;
auxhabitante = habitantes[f];
habitantes[f] = habitantes[f + 1];
habitantes[f + 1] = auxhabitante;
}
}
}
}
void PaisesHabitantes::imprimir()
{
for (int f = 0; f < 5; f++)
{
cout << paises[f] << " - " << habitantes[f] << "\n";
}
}
int main()
{
PaisesHabitantes ph;
ph.cargar();
ph.ordenarPorNombres();
cout << "Ordenado por nombres" << "\n";
ph.imprimir();
ph.ordenarPorHabitantes();
cout << "Ordenado por cantidad de habitantes" << "\n";
ph.imprimir();
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace :OrdenamientoVectoresParalelos2