[ Foro de Pascal ]

fichero

18-Apr-2014 20:32
Invitado (pedronel)
14 Respuestas

hola cordial saludo , debo recuperar un examen y la proxima semana el viernes es el recuperativo , de archivos y listas enlazadas , estudiando encontre este foro espero me sirva de apoyo
queria preguntarles por este ejercicio que fue uno de los que salio en el examen

dado un fichero referente a autos con indice ( marca     matricula   color), si su clave de busqueda es matricula, realizar el fichero invertido por el descriptor color, osea que la lista de datos ahora debe ser ( color   matricula    marca )

por favor ayudenme es importante para mi pasar el examen.cualquier ayuda lo que sea se los agradezco


20-Apr-2014 13:32
Nacho Cabanes (+31)

La pregunta es demasiado ambigua, especialmente si quieres aplicar la respuesta a un examen, porque en ese caso deberás orientarlo tanto como sea posible a lo que esperes que tus profesores te vayan a pedir.

Algunas de las cosas que no dejas claras:

- Esos datos (marca, matrícula, color), ¿son parte de un "record" o son datos independientes?

- ¿El fichero es de texto o está formado por "records"?

- Si el fichero es de texto, ¿cómo separas un campo de otro para diferenciarlos?

- Hablas de listas enlazadas... tendrás algún esqueleto de cómo estéis usando las listas en tu centro de estudios (¿listas enlazadas simples? ¿listas dobles? ¿puedes usar una pila?).

- También hablas de "clave de búsqueda"... ¿qué usas (o debes usar) para implementarla?

Intenta hacer un fuente "que se acerque" para que te podamos ayudar con dudas puntuales, en vez de esperar que alguien haga un programa completo por ti, que además podría no ajustarse a lo que necesitas y resultarte inútil.


20-Apr-2014 14:17
Invitado (pedronel)

buenas, la cuestion no es que me soluciones el programa de manera completa,me da igual,pero choca un poco la respuesta que das, por lo menos lo veo asi, lo que intentaba era una ayuda que no encontre, ademas por que quiza el que complica el programa es ud profesor y no yo, el ejercicio  no se trata de listas enlazadas ni nada de esos temas que aun no he visto,solo es un tema de ficheros de texto puro, donde no se menciona "records" y donde la separacion de datos es a traves de un espacio (s) tal cual se hace en los archivos de texto en general, tambien mencione lo clave de busqueda y esta claro que dice que es a traves del campo matricula y el ejemplo pense que se entenderia facil, sin necesidad de tener que rellenar todos los campos, pero si hacia falta pues ahi va:

autos.txt

alfa romeo   2222 BJT     negro
audi              3333 GBV   blanco
kia                 4444 GXD   rojo


lo esperado segun el planteamiento del ejercicio:

negro    2222 BJT    alfa romeo
blanco  3333 GBV   audi
rojo      4444  GXD   kia


20-Apr-2014 18:23
Nacho Cabanes (+31)

Quizás si complico el problema es porque he pensado en lo que pides y en lo que hay que hacer para resolverlo, y no me parece un problema trivial.

Por una parte, lo de las listas enlazadas es algo a lo que tú mismo das pie cuando dices "el viernes es el recuperativo , de archivos y listas enlazadas" ... "este ejercicio que fue uno de los que salio en el examen". De modo que suena a que sea un ejercicio en el que haya que practicar tanto los archivos como las listas enlazadas.

Por otra parte, ordenar datos sin saber cuantos hay, es algo que tendrás que hacer usando listas enlazadas, o bien con un array sobredimensionado, o bien haciendo dos lecturas del fichero (la primera para contar datos y la segunda realmente para leer). Si te piden que lo hagas de alguna forma concreta, o si tú ya has decidido cual usar, será más fácil ayudarte cuantos más detalles des sobre la implementación que quieres.

En cuanto a cómo leer de un fichero de texto, lo tienes aquí:

http://www.nachocabanes.com/pascal/cupas5/cupas07.php

(es fácil, poco más que un "while not eof").

Las nociones básicas de cómo ordenar datos están aquí (apartado 4.1.7):

http://www.nachocabanes.com/pascal/cupas5/cupas04.php

(también es fácil... para un único array; se complicará ligeramente si es un array de records y un poco más si son 3 arrays paralelos).

Tu ejemplo sigue siendo ambiguo, porque tienes espacios tanto en las matrículas como en las marcas de los vehículos, y además las matrículas siempre contienen un espacio pero las marcas a veces lo contienen y a veces no. Si al menos en los colores nunca va a haber espacios, el planteamiento para analizar cada línea puede ser:

- El color estará a continuación del último espacio.

- El primer espacio que esté seguido de una cifra numérica marcará la separación entre marca y matrícula.


El hecho de que el enunciado no mencione "records" no quiere decir que tú no debas usarlos. La alternativa es usar 3 arrays paralelos, pero tendrás que optar por uno de esos dos planteamientos, porque si no, no podrás ordenar usando como criterio un dato que está en el medio de una cadena, en una posición variable.


Lo de que la "clave de búsqueda" es simplemente el primer campo que aparece en cada línea del fichero, es algo que queda claro con el ejemplo, pero no antes.


21-Apr-2014 00:44
Invitado (pedronel)

buenas, ok profesor tienes razon en muchas cosas, sin embargo la verdad el ejercicio no es de listas enlazadas es verdad que escribi de archivos y listas enlazadas pero lo que pasa es que solo puse el de archivos para ir poco a poco, los otros dos puntos del examen fueron de listas enlazadas, pero en este caso este punto solo era de archivos , asi que pido disculpas por no haber sido claro y haber confundido con mis palabras el ejercicio.

profesor por que dices lo de no saber cuantos datos hay, si en el ejemplo que se planteo se trata de 3 tipos de autos , osea que supongo profesor para que me permitas tu ayuda que sera la opcion que mencionas:"o bien haciendo dos lecturas del fichero (la primera para contar datos y la segunda realmente para leer)."

la parte que me mencionas de los espacios en el archivo de ejemplo efectivamente tienes toda la razon por lo que tambien le pido disculpas, realmente me equivoque al teclear, pero en ningun caso van espacios, asi que el archivo es:
autos.txt

alfaromeo    2222BJT     negro
audi              3333GBV   blanco
kia                 4444GXD   rojo


la parte que me mencionas, con "El hecho de que el enunciado no mencione "records" no quiere decir que tú no debas usarlos" tienes razon porque si que es verdad que el profesor menciono que debia usarse records , disculpame en ello , con lo cual te pido partiendo de tus razones mas que ciertas , me ayudes por favor a un planteamiento en el que pueda poder realizar el ejercicio, agradeciendo lo que puedas hacer y extenderte al respecto y pidiendo disculpas por todo.


21-Apr-2014 12:20
Nacho Cabanes (+31)

Con esos cambios de planteamiento,  ya me parece más fácil de afrontar para un principiante.

Pues si te parece, vamos a hacerlo en 5 aproximaciones sucesivas: te propondré 5 mini-problemas, cada uno de los cuales podrás resolver en menos de 10 minutos, y que te llevarán a la solución final en menos de una hora, ayudando a que no queden muchas "lagunas" en tus conocimientos:

1.- Crea un programa que lea todo el contenido del fichero "autos.txt" y vaya volcando cada línea a un fichero "autos2.txt".

2.- Amplíalo de modo que permita guardar las líneas de ese fichero en un "array de strings" y lo que vuelque al fichero "autos2.txt" sea el contenido del array invertido (de la última línea a la primera).

3.- Ordena alfabéticamente el contenido del fichero y vuélcalo ordenado (como todavía son líneas de texto, posiblemente obtendrás el mismo orden que en el fichero original; puedes desordenar el fichero para comprobar que estás ordenando correctamente).

4.- Lee el fichero y guárdalo en un array de "records", en vez de un "array de strings". Al volcar al fichero "autos2.txt", escribe los campos en orden distinto: color - matricula - marca

5.- Ordena el fichero por el campo "color" antes de volcar a "autos2.txt".


Pon aquí tus soluciones y tus dudas a cada uno de esos mini-problemas, y te ayudo con lo que no hayas conseguido. De momento, aquí tienes algunas pistas:

1.- Si no sabes cómo leer de un fichero de texto, lo tienes aquí (apartado 7.1):

http://www.nachocabanes.com/pascal/cupas5/cupas07.php


2.- Si no has manejado arrays, están en el apartado 4:

http://www.nachocabanes.com/pascal/cupas5/cupas04.php


3.- Las nociones básicas de cómo ordenar datos están aquí (apartado 4.1.7):

http://www.nachocabanes.com/pascal/cupas5/cupas04.php


4.- Los "records" están en el apartado 4.3:

http://www.nachocabanes.com/pascal/cupas5/cupas04c.php


5.- Debería ser muy fácil, con lo que has visto para (3) y (4).


22-Apr-2014 21:45
Invitado (pedronel)

profesor una cuestion, quiero ir poco a poco con tus 5 sugerencias.por ello quiero preguntarte me saques de una duda, por que se menciona en el ejercicio:
dado un "fichero con indice"  y la clave de busqueda es matricula. que implican estos dos conceptos en el ejercicio?? o son un mismo concepto, es que al tratarse de un archivo de texto me confunde un poco eso del indice y de la clave de busqueda (matricula).
gracias


23-Apr-2014 00:47
Nacho Cabanes (+31)

Como los ficheros de texto están formados por líneas de longitud arbitraria, no hay forma de saltar directamente hasta una cierta línea. La alternativa es crear un índice (en una primera lectura, o a la vez que se van guardando los datos), que anote la posición física en la que comienza cada línea. Este índice normalmente se guarda en un segundo fichero.

En tu caso, podría ser un fichero auxiliar que anote cada palabra y la línea en la que está, o (preferiblemente) la posición física del fichero, pero eso tendrías que preguntárselo a tu profesor.

Ante la duda, siempre opta por la opción más sencilla: puedes empezar por suponer que se refiere a un fichero de texto normal, en el que la primera palabra de cada línea es la que actúa como clave para las búsquedas.


23-Apr-2014 19:59
Invitado (pedronel)

Gracias profesor por tu tiempo.
profesor si no es mucho pedirte por favor me puedes dar un pequeño ejemplo al respecto de lo que me explicas:"Como los ficheros de texto están formados por líneas de longitud arbitraria, no hay forma de saltar directamente hasta una cierta línea. La alternativa es crear un índice (en una primera lectura, o a la vez que se van guardando los datos), que anote la posición física en la que comienza cada línea. Este índice normalmente se guarda en un segundo fichero."
quiza me quede mas claro , que la teoria, mil gracias


25-Apr-2014 15:02
Invitado (pedronel)

profesor ademas del post anterior permiteme preguntarte porque,hay necesidad de volcar cada línea a un fichero "autos2.txt". no se puede trabajar directamente sobre el archivo original?gracias por resolver mis dudas


26-Apr-2014 00:37
Luis Torres (+12)

Perdonen que me meta, pero sería mejor que hicieras cada uno de los problemas "sencillos" que propuso el profesor y, además, colocaras el código aquí. De esta forma se podrán aclarar cada una de las dudas o quizás al resolverlos esas dudas irán desapareciendo con el trabajo.

Saludos.


26-Apr-2014 01:20
Invitado (pedronel)

en alusion a tu comentario luis, por si no te has ddo cuenta precisamente mi ultima pregunta de este hilo es tal cual para ir paso a paso segun lo indicado por el profesor pero como iniciando tengo esa duda en la primera de las ideas por resolver todo el problema, "porque,hay necesidad de volcar cada línea a un fichero "autos2.txt". no se puede trabajar directamente sobre el archivo original ?"por eso se la pregunto, creo que antes de poner un comentario leas bien ... y si lo que te interesa es la solucion al mismo y no la sabes pues tambien puedes preguntar y si es que la sabes mal haces en no aportar nada tan solo intentar disuadir mi pregunta que hago directamente al profesor.Dsiculpame si quiza te parezco grosero no es mi intencion pero espero entiendas mis palabras y seas conciente en que desde mi punto de vista te has equivocado en tu apreciacion.


26-Apr-2014 03:10
Nacho Cabanes (+31)

Pedronel, ten un poco de respeto a Luis, que es el usuario más participativo del foro de Pascal, y siempre da respuestas muy bien encaminadas.

En cuanto a tus dos preguntas, la segunda es importante, y demuestra que necesitas hacer los ejercicios porque es una pregunta básica. En un fichero de texto no se puede hacer lectura y escritura simultánea. No es sólo que la mayoría de lenguajes no lo permitan. Es que tiene poco sentido, porque cada línea tendrá longitud distinta, así que no puedes reemplazar una línea de 40 listas con otra de 10. Qué ocurriría con los 30 bytes fantasma intermedios? Debes volcar a un segundo fichero.

La primera es una curiosidad avanzada. No divagues (aún). Asimila los fundamentos y después ya dialogamos sobre estructuras más avanzadas.

Y lo más importante: no seas grosero. Y menos aún con quien pretende ayudarte.


26-Apr-2014 23:06
Invitado (pedronel)

jajaja grosero profesor vanga ya, no veo donde esta la ayuda del compañero luis jaja suerte me piro de este foro chingado donde solo se aporta mandandote a estudiar mas  y poco de codigo que chingada jaja


26-Apr-2014 23:48
Nacho Cabanes (+31)

Es cierto, no eres grosero... X-D

Adiossssss






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)