• Domingo 28 de Abril de 2024, 22:50

Autor Tema:  Programa Con Vectores Y Ordenamiento Con Strings  (Leído 5545 veces)

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Programa Con Vectores Y Ordenamiento Con Strings
« en: Jueves 29 de Noviembre de 2007, 22:14 »
0
Hola a todos, ando practicando un poco de C y me quedé un poco atorado en este tema. Ya logré comprender la mayor parte y se me hizo facil, debido a que ya los habia usado en otro lenguaje de programación... en fin tengo una gran duda con un pequeño programa, consiste en lo siguiente:
Crear 7 vectores, el primero almacenará los nombres de 1 hasta 21 estudiantes, los 5 siguientes almacenaran calificaciones, y el 7 se usara calcular el promedio, una vez capturados los estudiantes debe mostrarme en pantalla los 3 primeros lugares, obviamente en forma descendente.

Preguntaran ¿que he hecho?... pues casi todo, de hecho solo falta un pequeño detalle que llevo mas de 2 dias sin poder corregirlo. El detalle es que si puedo ordenar las calificaciones, pero obviamente no me respeta los nombres almacenados en el primer vector, por ejemplo si almacene 3 estudiantes y el promedio de cada uno es:
Daniel 60.00
Jorge 85.45
Raul  70.00

La salida del programa es:
Daniel 85.45
Jorge 70.00
Raul 60.00

Como ven me ordena los promedios, pero no los nombres, espero me puedan ayudar, en el codigo veran comentado un intento fallido que hice :(

Código: Text
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.     char  nombre[30][20];
  6.     float cal1[20];
  7.     float cal2[20];
  8.     float cal3[20];
  9.     float cal4[20];
  10.     float cal5[20];
  11.     float prom[20];
  12.    
  13.     int alumnos;
  14.     int i;
  15.     int j;
  16.     float temp;
  17.    
  18.     printf("De cuantos alumnos quieres saber el promedio? ");
  19.     scanf("%i", &alumnos);
  20.    
  21.     for(i=0;i<alumnos;i++)
  22.     {
  23.         printf("\nNombre del alumno: ");
  24.         scanf("%s",&nombre[i]);
  25.         printf("Calificacion de Programacion III: ");
  26.         scanf("%f",&cal1[i]);
  27.         printf("Calificacion de Paquetes de computo III: ");
  28.         scanf("%f",&cal2[i]);
  29.         printf("Calificacion de Ingles IV: ");
  30.         scanf("%f",&cal3[i]);
  31.         printf("Calificacion de Algebra Lineal: ");
  32.         scanf("%f",&cal4[i]);
  33.         printf("Calificacion de Electricidad y Magnetismo: ");
  34.         scanf("%f",&cal5[i]);
  35.         prom[i]=(cal1[i]+cal2[i]+cal3[i]+cal4[i]+cal5[i])/5;
  36.     }
  37.      
  38.      
  39.     for(i=0;i<=alumnos;i++)
  40.     {
  41.         for(j=i+1;j<=alumnos-1;j++)
  42.         {
  43.             if(prom[i]<=prom[j])
  44.             {
  45.                 temp=prom[j];
  46.                 prom[j]=prom[i];
  47.                 prom[i]=temp;  
  48.                 //nombre[i]=nombre[int(prom[i])];
  49.                 //Crei que asi podria ser pero me marca
  50.                 //el sig. error: ISO C++ forbids assignment of arrays  
  51.             }
  52.         }
  53.     }
  54.    
  55.     for(i=0;i<3;i++)
  56.     {
  57.         printf("\n%s %.2f",nombre[i],prom[i]);
  58.     }
  59.            
  60.          
  61.     fflush(stdin);
  62.     getchar();
  63.     return 0;
  64. }
  65.  
Saludos

PD: Mi compilador es MinGW bajo el IDE Dev-C++

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #1 en: Viernes 30 de Noviembre de 2007, 01:14 »
0
Bueno.. esto es lo que yo haría:
1.- Buscar las 3 mayores calificaciones y almacenarlas en tres variables (o un array de 3...)
2.- Recorrer el array de calificaciones comparando sus valores con cada una de estas calificaciones, y al encontrarlas, decirle que imprima el nombre que ocupe ese lugar y la calificacion..

Con tu mismo ejemplo:
Daniel 60.00
Jorge 85.45
Raul 70.00

Código: Text
  1. Buscar las 3 mayores calificaciones
  2. cal1 = 60.00
  3. cal2 = 85.45
  4. cal3 = 70.00
  5. for (cada elemento del array de calificaciones)
  6.    if (cal1 == Miarraydecalif[i])
  7.    imprime (MiarraydeNombres[i] cal1) //o bien imprime(MiarraydeNombres[i] Miarraydecalif[i])
  8.  

Obviamente, no es código... ni siquiera sé si se puede calificar como pseudocódigo, pero espero que se entienda...

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #2 en: Viernes 30 de Noviembre de 2007, 02:44 »
0
Hola, se entiende perfectamente, incluso llegue a pensar algo similar, el problema es que en el paso 1:
Citar
Bueno.. esto es lo que yo haría:
1.- Buscar las 3 mayores calificaciones y almacenarlas en tres variables (o un array de 3...)
Al momento de almacenar las 3 mayores calificaciones en un nuevo vector de 3, automaticamente pierdo la posicion de los nombres, es decir ya no coincidirian con los de la posicionb que debe ser, eso fue lo que entendi deja pongo en practica el pseudocodigo y ya te aviso.

Desde ya gracias de antemano

saludos

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #3 en: Viernes 30 de Noviembre de 2007, 03:05 »
0
Cita de: "robbie110487"
Hola, se entiende perfectamente, incluso llegue a pensar algo similar, el problema es que en el paso 1:
Al momento de almacenar las 3 mayores calificaciones en un nuevo vector de 3, automaticamente pierdo la posicion de los nombres, es decir ya no coincidirian con los de la posicionb que debe ser, eso fue lo que entendi deja pongo en practica el pseudocodigo y ya te aviso.

Desde ya gracias de antemano

saludos
Claro, pero la solucion no esta en asociar las posiciones del nuevo vector a las del vector de nombres, sino las del viejo...

Supon que las 3 mayores calificaciones las almacenas en un array llamado cal (el otro, donde tienes todas las calificaciones, no solo las mayores, es lo que yo he llamado MiarraydeCalif..
Entonces haces dos for anidados:
Código: Text
  1. for(i = 0 to cal.tamaño -1)
  2.   for(j = 0 to MiarraydeCalif.tamaño-1)
  3.    if( cal[i] == MiarraydeCalif[j])
  4.       imprime (MiarraydeNombres[j] cal[i]) // o bien, imprime (MiarraydeNombres[j] MiarraydeCalif[j])
  5.  

Las posiciones que tienes que comparar son las del array de todas las calificaciones, con las del array de todos los nombres, si comparas las del array de las mayores calificaciones con las del de los nombres, entonces sí que perderás el orden.

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #4 en: Sábado 1 de Diciembre de 2007, 00:41 »
0
Bien, en teoria funciona, ahora el problema es si 2  o mas alumnos tienen el mismo promedio, veré como lo soluciono, muchas gracias, aunque lo ideal hubiera sido la asignación entre vectores, pero el ISO C++ lo prohibe...

En fin, gracias :D

Saludos

Edito: Pues no no funcionó al final... seguire investigando  :comp:

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #5 en: Sábado 1 de Diciembre de 2007, 03:41 »
0
Revise tu codigo, y la solucion es tan simple como que cambies de lugar el nombre al mismo tiempo que cambias la calificacion de lugar, pero debes usar la funcion strcpy para copiar a un temporal el nombre para hacer el intercambio, ademas descubri un error en la declaracion del vector de nombres, bueno, a continuacion te dejo que cambios tienes que hacer:

Código: Text
  1.  
  2.     // Primero debe de ir la dimension del vector de cadenas, y despues el tamaño de la cadena
  3.     char  nombre[20][30];
  4.  
  5.  

Código: Text
  1.  
  2.     float temp;
  3.     // Una variable temporal para el intecambio del nombre
  4.     char temp_nombre[30];
  5.  
  6.  

Código: Text
  1.  
  2.     for (i=0;i<=alumnos;i++)
  3.     {
  4.         for (j=i+1;j<=alumnos-1;j++)
  5.         {
  6.             if (prom[i]<=prom[j])
  7.             {
  8.                 temp=prom[j];
  9.                 prom[j]=prom[i];
  10.                 prom[i]=temp;
  11.                 // fijate la utilizacion de la funcion strcpy para hacer el intercambio
  12.                 strcpy(temp_nombre, nombre[j]);
  13.                 strcpy(nombre[j], nombre[i]);
  14.                 strcpy(nombre[i], temp_nombre);
  15.             }
  16.         }
  17.     }
  18.  
  19.  

Espero te ayude.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #6 en: Sábado 1 de Diciembre de 2007, 09:50 »
0
Excelente ProfesorX muchas gracias funciona de lujo, entonces se necesita strcopy para asignar cadenas... ya que yo usaba el mismo metodo ese de intercambiar la variable temporal pero me decia que el ISO C++ prohibe la asignacion de arreglos...

En fin muchas gracias, estudiaré las funciones de string.h que parecen muy utiles para el manejo de cadenas.

Saludos

Solenbum

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Programa Con Vectores Y Ordenamiento Con Strings
« Respuesta #7 en: Sábado 1 de Diciembre de 2007, 12:59 »
0
Aquí tienes una buena web de explicación de strcpy, strcmp, memcpy, ... y algnas mas seguro que te interesarán:

www.cplusplus.com/reference/clibrary/cstring/

Está en inglés, pero se entiende y está bien explicado, que es realmente lo que importa.