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(); } void main() { NotaAlumnos na; na.cargar(); na.ordenar(); na.imprimir(); }
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"; } } void 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(); cin.get(); }Este proyecto lo puede descargar en un zip desde este enlace :OrdenamientoVectoresParalelos2