RE:Grabar en la salida de fichero estándar...¿...?
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?