| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
juanjuanjuan
Registrado: 10 Feb 2014 Mensajes: 4
| Publicado: 10/02/2014 8:43 pm | | | Título: Ayuda C - Archivos - Ordenamiento |
| Buen dia a todos! Estoy aprendiendo a programar en C y llegue a la parte de Archivos. Busque muchisimos tutoriales en google y en youtube pero no termino de entender como empezar los ejercicios. Supongo que dps de ayudarme a dar los primeros pasos lo voy a poder terminar solo..
En un archivo yo tengo millones de nombres de personas. Necesito guardar los 100 primeros nombres ordenados alfabeticamente en un vector.. el nombre del archivo llega a la funcion como parametro
Habia pensado guardar los primeros 100 de esos millones que me pasan y dps, si encuentra uno anterior, que saque el que estaba y ponga ese, pero no me los terminaria dando alfabeticamente y cre oque quedaria un quilombo... estoy bastante complicado porque no se como arrancar, si me pueden dar una mano se los agradezco muchisimo!
Gracias! Juan |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 12/02/2014 1:53 am | | | Título: |
| Esta respuesta no te va a servir de mucho, porque se ve que ya has pensado las distintas estrategias:
A la que estás comentando, de incorporar los primeros 100 nombres y luego ir sustituyendo en esa lista de 100 por los nombres que cumplieran la condición, yo especificaría que siempre que añadieras un nombre, lo hicieras de forma ordenada. Así llegarías al vector de 100 nombres ordenados, y el mismo algoritmo que has usado para meter los primeros 100 nombres te serviría para ir sustituyendo los nuevos nombres en su sitio correcto, en caso de que su ordinal fuera anterior a los que tienes.
La otra opción es que ordenes el array de nombres entero, y luego selecciones los primeros 100 nombres.
No sé decirte cual es más costoso en términos de eficacia, pero los dos pasan a fin de cuentas por recorrer el array entero de nombres y hacer la ordenación.
Yo empezaría por definir un algoritmo que implementase la ordenación, y luego ya vería cómo o a qué aplicarlo.
Saludos _________________ Aprendiendo |
| | Volver arriba | |  | juanjuanjuan
Registrado: 10 Feb 2014 Mensajes: 4
| Publicado: 12/02/2014 10:25 am | | | Título: |
| Gracias por responder!
Lo que yo pense es hacer esto: Primero, ordeno alfabeticamente los primeros 100 nombres del archivo. Despues, entro en el nombre 101, veo si es mayor que el 100. Si es mayor que el 100, dejo la lista como esta. Si es menor que el 100, veo el 99. Asi sucesivamente
Creo que esa es la solucion, pero no se como escribirlo...
Gracias! |
| | Volver arriba | |  | | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 12/02/2014 1:50 pm | | | Título: |
| Pues realmente, ahora que lo expresas así, veo que no hay diferencia entre ordenar los primeros 100 elementos y luego ir buscando los siguientes para meterlos en la lista de 100. Quiero decir que el mismo algoritmo será el usado desde el primer elemento hasta el último. Lo único, que en el vector sólo cabrán 100 elementos.
Si tienes que usar el vector, yo haría algo así: Si es primer elemento->insertar elemento Si no es primer elemento, hacer un recorrido de los elementos del vector hasta encontrar el primer mayor, e insertarlo antes de él Si el nº de elementos del vector llega a 100, eliminar el último elemento una vez insertado el elemento.
Para hacer la comprobación, si usas elementos de tipo string, te ahorras ir comparando caracter a caracter, si no, pues como te decía, puedes empezar por implementar una función que retorne el mayor de las dos cadenas a comparar. _________________ Aprendiendo |
| | Volver arriba | |  | juanjuanjuan
Registrado: 10 Feb 2014 Mensajes: 4
| Publicado: 12/02/2014 7:38 pm | | | Título: |
| Gracias por responder!
Si entendi bien lo que me decis, estaria recorriendo el vector mas de 1 vez. Solamente puede ser recorrido 1 vez.
Hago un ejemplo mas corto. Tengo 10 numeros y solamente tengo que imprimir los primeros 5:
Tengo: 3 4 7 2 1 5 6 8 9 0
Primero, guarda: 3 4 7 2 1 Ordena: 1 2 3 4 7 Agarra el 5. Lo mete en el lugar del 7 Agarra el 6. Lo deja afuera Agarra el 8. Lo deja afuera Agarra el 9. Lo deja afuera Agarra el 0. Ve que es mas chico que el 5, asi que va al lado. Ve que es mas chico que el 4. Ve que es mas chico que el 3, 2 y 1. Lo pone ne e llugar del 1 y el 5 lo descarta
Queda: 0 1 2 3 4
Se entiende?
La forma de pensarla ya la tengo.. el problema esta en escribir el codigo.. realmente no se como hacerlo!
Muchas graciasssss |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 13/02/2014 2:29 am | | | Título: |
| Hola:
No me refería a eso exactamente. Siguiendo tu ejemplo, yo haría esto:
Tengo: 3 4 7 2 1 5 6 8 9 0
Imagina un array de 5 elementos con todos los valores a -1
La idea es guardar los valores de forma ordenada, desde el primer momento:
3 4 7 2 1 5 6 8 9 0 --Lista origen
-1 -1 -1 -1 -1 --Lista destino ----------------------------------- 4 7 2 1 5 6 8 9 0 --Lista origen
3 -1 -1 -1 -1 --Lista destino ------------------------------------ 7 2 1 5 6 8 9 0 --Lista origen
3 4 -1 -1 -1 --Lista destino ------------------------------------- 2 1 5 6 8 9 0 --Lista origen
3 4 7 -1 -1 --Lista destino -------------------------------------- 1 5 6 8 9 0 --Lista origen
2 3 4 7 0 --Lista destino --------------------------------------- 5 6 8 9 0 --Lista origen
1 2 3 4 7 --Lista destino ---------------------------------------- 6 8 9 0 --Lista origen
1 2 3 4 5 --Lista destino ---------------------------------------- 8 9 0 --Lista origen
1 2 3 4 5 --Lista destino ---------------------------------------- 9 0 --Lista origen
1 2 3 4 5 --Lista destino --------------------------------------- 0 --Lista origen
1 2 3 4 5 --Lista destino -------------------------------------- --Lista origen
0 1 2 3 4 --Lista destino ---------------------------------------
Vamos, que es lo mismo que tú dices, pero empezando la ordenación desde el principio, no cuando tenga rellenos los primero n integrantes de la lista ordenada a obtener
Si quieres ver métodos de ordenación, mira aqui: http://c.conclase.net/orden/ _________________ Aprendiendo |
| | Volver arriba | |  | | juanjuanjuan
Registrado: 10 Feb 2014 Mensajes: 4
| Publicado: 13/02/2014 5:09 am | | | Título: |
| Esa parece una gran idea!
La parte que mas se me complica del ejercicio es reemplazar un nombre por otro en el array (supongo que se hace cambiando "donde apunta" el puntero..). Me podes dar una mano con eso? Gracias! |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 13/02/2014 1:09 pm | | | Título: |
| Hola:
Pues te pongo el ejemplo del array de int del que hemos hablado:
| Código: | #include <iostream> using namespace std;
const int LISTA_CHICA=5; const int LISTA_GRANDE=10;
void insertarOrdenado (int valor, int v[LISTA_CHICA], int contador);
int main() { int lista[LISTA_GRANDE]= {3,4,7,2,1,5,6,8,9,0}; int valores[LISTA_CHICA]= {3,5,8,5,4}; int contador=0; for (int i=0; i<LISTA_GRANDE; i++) { insertarOrdenado (lista[i],valores, contador); if (contador<=LISTA_CHICA) { contador++;//esta variable la necesito para que no me recorrar todo el array hasta que no estén llenados los primeros LISTA_CHICA valores } for (int i=0; i<LISTA_CHICA; i++) { cout<<valores[i]<<" - "; } cout<<endl; }
return 0; }
void insertarOrdenado(int valor, int v[LISTA_CHICA], int contador) { cout<<"Insertando: "<<valor<<endl; int i=0; while (v[i]<valor && i<contador) { i++; } for (int j=LISTA_CHICA-1;j>i;j--) { v[j]=v[j-1]; } v[i]=valor; }
|
Algunas notas: El hecho de iniciar el array de 5 elementos a 0 es para que no alberguen valores "raros", pero funcionará con cualquier valor previo que tenga.
La variable contador me sirve para que de primeras no me recorra todo el array, sino sólo hasta el máximo de valores que he insertado de la lista grande hasta el momento. Una vez he llegado a las primeras 5 inserciones (en éste caso), ya me interesa que recorra el array. Serguramente que haya mejores formas de hacerlo.
Y por último, éste algoritmo te puede servir si los nombres que tienes que comparar son string, ya que tiene sobrecargado el operador < y >. Si no, tendrás que crear una función extra que te evalúe que cadena de char es menor, a la hora de insertarlas.
Espero que te sirva. Saludos! _________________ Aprendiendo |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |