Pascal/Turbo Pascal - Grabar en la salida de fichero estándar...¿...?

 
Vista:

Grabar en la salida de fichero estándar...¿...?

Publicado por Guille (7 intervenciones) el 26/08/2008 22:00:43
Hola he terminado de hacer una practica sobre realizar listas de alumnos de una academia
pero como son muchos registros en total 150, 10 cursos, cada uno con 3 grupos, y cada grupo con 5 plazas para cada alumno, el caso es que las listas las muestro por pantalla (las de un curso) pero si luego vuelvo al menu y quiero que me muestre otra vez una lista me da este error "Stack overflow" y no hay recursividad infinita....,
en el enunciado de la practica me pone que "grabe la lista en la salida de fichero estandar" y considere que es que las pase por pantalla, esta mal lo que he hecho? que es eso de la salida de fichero estnadar?, y como hago para que los datos que le meto de cada alumno se guarden para que cuando vuelva ha abrir el programa esten ahi. Me dicen que no use ficheros.....¿? y si solo se pueden hacer con ficheros como lo hago?

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por Diego Romero (996 intervenciones) el 27/08/2008 08:30:13
Sobre lo de "stack overflow" sin ver el códig fuente es imposible saber qué está pasando. Si dices que te sucede bajo ciertas condiciones *sospecho* que se trata de algo relacionado con el paso de parámetros a una función o procedimiento (cuando usas parámetros por valor en una función o procedimiento, los datos se duplican, lo que consume el stack).

El "fichero estandar" es la pantalla (una vieja costumbre de Unix que debería ser desterrada de la jerga computacional, no todos los SO tratan la pantalla como un archivo, como lo hace Unix). Lo que me llama poderosamente la atención es cuando dices "y como hago para que los datos que le meto de cada alumno se guarden para que cuando vuelva ha abrir el programa esten ahi. Me dicen que no use ficheros...", pues tienes razón, sin usar archivos eso es imposible. Así que esa parte del enunciado no tiene sentido.

Así que reto a tu profesor a que recupere los datos de trabajo de una ejecución a otra SIN usar archivos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por Guille (7 intervenciones) el 28/08/2008 06:43:52
ok gracias, debo haber entendido yo mal el enunciado, porque como voy a usar muchisimos registros pense que tendria que guarda la info cada vez que termino de usar el programa, y con lo del fichero estandar me lie del todo pero nada ya esta hecho el programa aunque con el mismo problema de el stack, podria dejarte el codigo pero es demasiado largo y te llevaria mucho tiempo xD en vez de eso me gustaria que me respondieras a otra duda mas URGENTE que me ha surgido con la ultima practica que tengo que hacer : tengo que simular la gestion de un correo electronico y bueno asi es como va el tema:

Creo una tabla de usuarios, cada usuario con su registro, esto lo hare con un fichero para guardar la info una vez deje de usar el programa.

A continuacion tengo que crear el menu principal, que esta compuesto por:

Accceder a correo, Darse de alta, darse de baja, salir. Hasta aqui se hacer esto, aunque es la primera vez que uso ficheros pero basicamente es buscqueda cambiar leer, borrar etc.

El problema esta en la opcion acceder a correo, aqui tengo que crear otro menu con las siguientes opciones:

Leer Correo, Mandar correo, salir.

El problema esta en que cada usuario tiene su buzon con varios mensajes que puede almacenar borra o crear para mandar a otro usuario
caracteristicas del mensaje:

• Remite (Maximo 8 caracteres).
• Asunto (Maximo 80 caracteres).
• Contenido (Maximo 500 caracteres).

Y yo esto no tengo ni idea de como hacerlo. Creo otro campo mas en el registro de cada usuario?, o creo otra tabla de registros con el buzon de cada uno nose no lo entiendo bien esto, puedo hacer que un campo de un registro sea de tipo fichero? o es absurdo lo que acabo de decir...? , soy novatisimo con esto y nose como enlazar esto de los buzones con los usuarios, alomejor es una tonteria, si me das una idea te lo agradecere eternamente xD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por Diego Romero (996 intervenciones) el 28/08/2008 08:39:42
Es un problema de base de datos.

A ver. Curso rápido y acelerado de base de datos xD.

Una entidad es un objeto que está representado en la base de datos. Por ejemplo, un usuario del sistema de correo es una entidad, un mensaje de correo es otra entidad.

Cada entidad debe ser identificada unívocamente, esto quiere decir que por ejemplo, no haya dos usuarios iguales o un mismo usuario no puede estar dos veces en la misma base de datos. Para esto cada entidad debe tener un identificador único y no repetido que le identifica unívocamente. Por ejemplo el usuario "Juan Perez" tiene el identificador 1 y hay otro "Juan Perez" que tiene el identificador 6, 1 y 6 aunque comparten el mismo nombre son dos usuarios diferentes por lo tanto son dos entidades diferentes.

Como verás, a cada entidad le corresponde un registro en la base de datos.

Un mensaje de correo es también una entidad, por lo tanto también debe tener un identificador unívoco.

Lo que yo llamo "identificador unívoco" se corresponde con una clave, identificador y clave es casi lo mismo. No pueden repetirse y sirve para acceder a una entidad en particular despejando toda ambiguedad, es decir, si quiero leer el registro cuya clave es 1 debo estar seguro que no hay más que un registro con esa clave.

Ahora vamos con las relaciones.

Evidentemente un usuario de tu sistema de correo puede tener más de un mensaje de correo en su buzón. Cuando a una entidad le corresponden muchas instancias de otra entidad, se dice que existe una "relación de uno a muchos" o bien, en tu caso, que la entidad "mensaje de correo" es grupo repetitivo de la entidad usuario.

Para establecer esa relación, la entidad mensaje de correo además de tener una clave que le identifica en sí misma necesita contener la clave de la entidad con la cual está relacionada. Es decir, necesita dos claves (a esto se le llama "tupla" o "clave compuesta"). En tu caso, cada mensaje de correo además de su propia clave necesita tener la clave del usuario al cual pertenece ese mensaje de correo.

Supongamos que tenemos la tabla "usuarios" que contiene estos registros:

1|Juan Perez|...
2|Diego Romero|...
3|Guille|...

El número es el identificador unívoco, es decir, la clave.
Por lo tanto la tabla que contiene los mensajes de correo que llamaré "mensajes" debería contener algo así:

1|1|Mi primer mensaje|...
1|2|Hola|...
2|1|Re: Hola|...
2|2|Reunión|...
3|1|Prueba de correo|...

El primer número se corresponde con la clave de usuario al cual pertenece ese mensaje. El segundo es un número de orden. Ambos números componen la clave compuesta de cada registro y significa que 1|1 es el primer mensaje del usuario 1 (Juan Perez). 2|1 es el primer mensaje del usuario 2 (Diego Romero) y así... Como la clave debe ser unívoca no puede haber dos registros que contengan la misma "tupla" (es decir, no puede haber dos o más registros en la tabla "mensajes" cuya clave compuesta sea 2|2, porque esa tupla ya existe).

Esto resuelve el problema que surge de la pregunta "¿Cuáles son los mensajes de correo de Juan Perez?", los que cuya clave compuesta comienzan con el 1. Y responde la pregunta "¿A quién pertenece el mensaje cuya clave es '3|1'?", a Guille.

Pascal no es un manejador de base de datos. Lo que te permite implementar esto como mejor te parezca. Tiene la contra de que eres tú, el programador, el encargado de implementar todos los mecanismos necesarios para que no se viole la coherencia de la base de datos (por ejemplo, Pascal no se va a quejar si intentas guardar un registro cuya clave ya existe en el archivo, porque Pascal no entiende de claves, cosa que sí haría un verdadero lenguaje manejador de base de datos).

Bien pues, en Pascal puedes implementar esto de muchas maneras. Yo te voy a mostrar una forma de hacerlo, la que me resulta más intuitiva aunque quizá no la más sencilla de implementar.

Comienzo declarando los registros de los archivos a usar:

type
tstr40=string[40];
tstr8=string[8];
tstr80=string[80];

tusuario=record
id: integer; { Clave }
nombre: tstr40;
end; { tusuario }

tmensaje=record
idusuario: integer; { aquí el id del usuario }
idmensaje: integer; { aquí el número de orden }
idremitente: integer; { aquí el id de la persona que envió el mensaje }
remitente: tstr8; { aquí el nombre de la persona que envió el mensaje }
asunto:tstr80;
contenido:string;
end; { tmensaje }

Una salvedad. No existe un tipo de dato Turbo Pascal que sea capaz de almacenar 500 caracteres de una sola vez, tal como pide el enunciado, así que lo dejo como string (255 caracteres).

¿Preguntas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por guille (7 intervenciones) el 29/08/2008 04:56:08
hola gracias por tu tiempo, entonces segun lo que dices tendre que crear 2 tablas una para usuarios y la otra para mensajes y en cada registro hago que se relacionen en el campo de la id_buzon string (xxx), pero tengo una duda:
Cada vez que se de alta alguien, y le pido los datos nombre, calve, como completo los demas campos (id_buzon y Nmensajes)?. al inicializar las tabla de usuarios tendre que poner todos los registros de 000 a 100 en el campo id_buzon? porque el usuario no me las va a dar, las tengo que inicializar en orden yo. Si lo hago de esta manera inicializando de 000 a 100 las id_buzon de todos lo registros y los demas campos tambien inicializados a ' ' (vacio), entonces al dar de alta tendre que buscar una entrada vacia ' ' del campo nombre por ejemplo y si la encuentro rellenarlo de nuevo todo el registro menos la id:buzon no? pero como se hace esto en un fichero tipo txt.

Supongamos que encuentro un campo nombre vacio entonces reescribo ese registro, pero como hago esto? si el campo id_buzon esta detras del nombre y encuentro el caracter vacio y empiezo a reescribir no lo hara bien no? porque empieza a escribir despues de haber encontrado 'nombre'=' vacio' pff que lio sino tendria que crear sin inicializar nada y cada vez que un usuario se registre la id_de su buzon sera igual a la suma de la id del ultimo usuario registrado +1, pero eso es posible? como se haria?, estoy usando ficheros tipo text porque es el unico que me se como funciona mas o menos, madre mia que cacao me estoy haciendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por Diego Romero (996 intervenciones) el 29/08/2008 09:01:23
Al dar de alta un usuario nuevo creas un registro nuevo en la tabla (archivo) "usuarios" con los datos que proporciona el usuario más su ID, ese ID lo generas tú automáticamente. Puede ser cualquier cosa mientras no esté repetido con algún registro anterior y dado el caso lo más fácil es que sea consecutivo con el inmediato anterior. En definitiva, solo tienes que agregar un registro nuevo al archivo, nada más.

Respecto de los mensajes, como al darse de alta el usuario no tiene mensajes, no haces nada con el archivo de mensajes. Pero en caso de que el usuario almacene un mensaje nuevo, procedes de la misma manera que con el alta de usuario con la salvedad de que debes buscar qué ID tiene el último de los mensajes almacenados para ese usuario (o 1 si no tiene ninguno anterior).

Pero, yo estoy hablando de archivos con tipo, no de archivos txt. Es decir, los archivos que declaras en Pascal como:

arch: file of type;

Y no como:

arch: text;

Hacer todo esto con archivos txt (text) es 10 veces más complicado porque con los archivos txt no puedes insertar o modificar al medio del archivo.

¿Sabes qué es un archivo con tipo en Pascal?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Grabar en la salida de fichero estándar...¿...?

Publicado por Guille (7 intervenciones) el 30/08/2008 04:44:12
Pues tienes razon con archivos tipo text es imposible para mi asi que los estoy haciendo con los tipo "file of tregistro".
Tengo hecho la mitad mas o menos (400 lineas mas o menos) La creacion de la tabla usuarios, las Altas, las Bajas pero la siguiente opcion Acceder a correo me tiene quemadisimo porque me obceco en 1:mandar correo, 2:leer correo:

el mensaje tiene estos campos:
dir_buzon,
Remite,
Asunto, y
contenido,

le pido el nombre del destinatario busco el registro en la tabla usuarios y cogo su Dir_buzon poniendosela en el campo del registro mensaje, el campo contenido y asunto los rellena por teclado entonces aki nose si ponerle un campo mas "Nmensajes" porque cuando envio mas de uno y en su dir_buzon existen mas de un mensaje con su mismo dir_buzon pero con Nmensaje, igual a 1, 2 ,3 4,... y este borra alguno intermedio (el 2 por ejemplo) luego al mandarle otro se decolocaria todo y no sabria a donde mandarlo o que mensaje leer segun el numero, o me equivoco? si tienes alguna forma de hacerlo te suplico me la digas. Perdona que sea tan pesado pero es que tengo que enviar esta ultima practica antes del domingo por la tarde sino todas las practicas que he hecho durante el verano no habran servido para nada...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar