Cuando se tienen vectores y matrices paralelas y se ordena uno de ellos hay que tener la precaución de intercambiar los elementos de los vectores o matrices paralelas.
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<stdio.h> #include<conio.h> #include<string.h> void cargar(char nombres[5][40],int notas[5]) { int f; for(f=0;f<5;f++) { printf("Ingrese el nombre del alumno:"); gets(nombres[f]); printf("Ingrese la nota del alumno:"); scanf("%i",¬as[f]); fflush(stdin); } } void ordenar(char nombres[5][40],int notas[5]) { int k,f; int auxnota; char auxnombre[40]; for(k=0;k<4;k++) { for(f=0;f<4-k;f++) { if (notas[f]<notas[f+1]) { auxnota=notas[f]; notas[f]=notas[f + 1]; notas[f+1]=auxnota; strcpy(auxnombre, nombres[f]); strcpy(nombres[f], nombres[f+1]); strcpy(nombres[f+1],auxnombre); } } } } void imprimir(char nombres[5][40],int notas[5]) { int f; printf("Listado de alumnos ordenados por notas en forma descendiente\n"); for(f=0;f<5;f++) { printf("%s - %i\n",nombres[f],notas[f]); } } int main() { char nombres[5][40]; int notas[5]; cargar(nombres,notas); ordenar(nombres,notas); imprimir(nombres,notas); getch(); return 0; }
En la función main definimos la matriz y el vector:
int main() { char nombres[5][40]; int notas[5];
La función cargar recibe la matriz y el vector para proceder a su carga por teclado:
void cargar(char nombres[5][40],int notas[5]) { int f; for(f=0;f<5;f++) { printf("Ingrese el nombre del alumno:"); gets(nombres[f]); printf("Ingrese la nota del alumno:"); scanf("%i",¬as[f]); fflush(stdin); } }
En el proceso de ordenamiento dentro de los dos for verificamos si debemos intercambiar los elementos del vector notas:
for(k=0;k<4;k++) { for(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:
auxnota=notas[f]; notas[f]=notas[f + 1]; notas[f+1]=auxnota;
y simultánemamente procedemos a intercambiar los elementos de la matriz paralela (con esto logramos que el vector continúen siendo paralelo a la matriz):
strcpy(auxnombre, nombres[f]); strcpy(nombres[f], nombres[f+1]); strcpy(nombres[f+1],auxnombre);
Como vemos utilizamos dos auxiliares distintos porque los elementos de la matriz y el vector son de distinto tipo (int y cadena de caracteres)
Si deseamos ordenar alfabéticamente la condición dependerá de la matriz nombres.
programa128.c #include<stdio.h> #include<conio.h> #include<string.h> void cargar(char paises[5][40],int habitantes[5]) { int f; printf("Carga de paises y habitantes.\n"); for(f=0;f<5;f++) { printf("Ingrese el nombre del pais:"); gets(paises[f]); printf("Ingrese la cantidad de habitantes:"); scanf("%i",&habitantes[f]); fflush(stdin); } } void ordenarPorNombres(char paises[5][40],int habitantes[5]) { int k,f; char auxpais[40]; int auxhabitante; for (k=0;k<4;k++) { for(f=0;f<4-k;f++) { if (strcmp(paises[f],paises[f+1])>0) { strcpy(auxpais,paises[f]); strcpy(paises[f],paises[f+1]); strcpy(paises[f+1],auxpais); auxhabitante=habitantes[f]; habitantes[f]=habitantes[f+1]; habitantes[f+1]=auxhabitante; } } } } void ordenarPorHabitantes(char paises[5][40],int habitantes[5]) { int k,f; char auxpais[40]; int auxhabitante; for (k=0;k<4;k++) { for(f=0;f<4-k;f++) { if (habitantes[f]<habitantes[f+1]) { strcpy(auxpais,paises[f]); strcpy(paises[f],paises[f+1]); strcpy(paises[f+1],auxpais); auxhabitante=habitantes[f]; habitantes[f]=habitantes[f+1]; habitantes[f+1]=auxhabitante; } } } } void imprimir(char paises[5][40],int habitantes[5]) { int f; for(f=0;f<5;f++) { printf("%s - %i \n",paises[f],habitantes[f]); } } int main() { char paises[5][40]; int habitantes[5]; cargar(paises,habitantes); ordenarPorNombres(paises,habitantes); printf("Ordenados alfabeticamente\n"); imprimir(paises,habitantes); ordenarPorHabitantes(paises,habitantes); printf("Ordenados por cantidad de habitantes\n"); imprimir(paises,habitantes); getch(); return 0; }