Ayuda C - Archivos - Ordenamiento

Iniciado por juanjuanjuanjuan, 11 Febrero 2014, 14:39 PM

0 Miembros y 1 Visitante están viendo este tema.

juanjuanjuanjuan

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 a resolver los ejercicios. Supongo que dps de ayudarme a dar los primeros pasos lo voy a poder terminar solo..

El modelo de ejercicio que yo quiero hacer es:
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

amchacon

Yo guardaría todos los nombres, los ordeno y cojo los 100 primeros.

¿C o C++? En C++ eso se hace rápido con con una estructura map:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <map>

using namespace std;

int main
{
    map<string,bool> Nombres;
    ifstream archivo("Nombre.txt");
    string aux;

    if (!archivo) throw "Archivo no encontrado...";
   
    while (archivo.good())
    {
         getline(archivo,aux);
         Nombres[aux] = true;
    }

    string Nombres[100];
    int i = 0;

    for (map<string,bool>::iterator it = Nombres.begin(); it != Nombres.end(); it++)
    {
         cout<<"Guardando: "<<it->first<<endl;
         Nombres[i++] = it->first;
    }
    return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

juanjuanjuanjuan

Gracias por la respuesta!

El lenguaje es C

En el ejercicio me dicen que solamente se puede usar 1 vector, asi que no puedo ordenar los millones de nombres e imprimir los 100 primeros (yo tmb habia pensado eso jajaj)

Creo que la idea es guardar los 100 primeros en orden alfabetico y despues ir "actualizando" esos 100 primeros a medida que se recorre el archivo donde estan los otros millones de nombres, se entiende?

O sea, si fuera con numeros, guarda primero 0 3 y 9, dps encuentra un 8 entoncs borra el 9 y pone el 8, dps encuentra un 1 y corre el 3 al lugar del 8 y pone el 1 en lugar del 3 y asi...

Graciassssss!

amchacon

Bueno en C se complica un poco más el asunto al no poder usar contenedores STL. Pero tampoco mucho más.

El algoritmo ya lo tienes tú hecho realmente:

1º Leer los primeros 100 nombres.
2º Lo ordenas alfabeticamente.
3º ¿No quedan más nombres por leer? Terminado.
4º Lee el siguiente nombre.
5º ¿Va después del último nombre?. Si es así volvemos al paso 3.
6º Coges la posición donde debería ir, sobreescribes el nombre que estaba antes. Vuelves al paso 3.

El paso 6º puede ser un poco más complejo de ver, lo pongo con más detalle:

1º ¿Va antes del primer nombre? Devolvemos esa posicion y ya hemos terminado.
2º Recorremos el array desde 1 hasta 100.
3º ¿Va antes del nombre actual? Terminamos el bucle y devolvemos la posición actual.
4º En caso contrario volvemos al paso 2.


Todo esto puede sonar un poco complicado así leído, por eso te invito a que intentes ir escribiendo código ya. No te lo pienses mucho.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

juanjuanjuanjuan

#4
Cita de: amchacon en 12 Febrero 2014, 03:40 AM
Bueno en C se complica un poco más el asunto al no poder usar contenedores STL. Pero tampoco mucho más.

El algoritmo ya lo tienes tú hecho realmente:

1º Leer los primeros 100 nombres.
2º Lo ordenas alfabeticamente.
3º ¿No quedan más nombres por leer? Terminado.
4º Lee el siguiente nombre.
5º ¿Va después del último nombre?. Si es así volvemos al paso 3.
6º Coges la posición donde debería ir, sobreescribes el nombre que estaba antes. Vuelves al paso 3.

El paso 6º puede ser un poco más complejo de ver, lo pongo con más detalle:

1º ¿Va antes del primer nombre? Devolvemos esa posicion y ya hemos terminado.
2º Recorremos el array desde 1 hasta 100.
3º ¿Va antes del nombre actual? Terminamos el bucle y devolvemos la posición actual.
4º En caso contrario volvemos al paso 2.


Todo esto puede sonar un poco complicado así leído, por eso te invito a que intentes ir escribiendo código ya. No te lo pienses mucho.

Eso es exactamente lo que pense! Me alegra saber que por ahi voy bien jaja. El problema es que voy a necesitar usar la parte de ficheros (los nombres me los dan en un archivo y los tengo que sacar de ahi) y tambien voy a necesitar MUCHO de punteros (es un tema que tengo un poco flojo)

Por eso les pido ayuda.. hace 1 semana que estoy tratando de resolverlo y a lo maximo que llegue es a esto que me escribiste recien..

Si alguno me puede dar una mano con el codigo, se lo super agradezco!




Edito: para comparar los nombres y ordenarlos, tendria que usar la funcion "strcmp"