[ Foro de Pascal ]

Necesito ayuda

12-Jun-2011 23:15
Miguel Angel Perez Perez
3 Respuestas

Me piden cosas imposibles de entrega y necesitaria que me echaran un cable he conseguido hacer algunas cuantas cosas pero me estoy volviendo loco :

El ejercito de la nacion de Freedonia quiere gestionar la adjudicacion de puestos para los tenientes
recien licenciados. Para ello se va a trabajar con dos listas:
Candidatos a los puestos con sus datos (DNI, nombre, apellidos, fecha de nacimiento, nota media
del expediente y preferencias: 3 codigos de puesto de trabajo como maximo, ordenados de mayor a
menor preferencia).
Listas de puestos a adjudicar. Cada plaza se identi ca de manera unvoca mediante el codigo del
puesto de trabajo que consta de 9 caracteres (por ejemplo: 5J004/001, 5J008/003, 5J042/004).
Ademas para cada puesto se almacenan los siguientes datos: UCO y localidad.
Al iniciarse, a aplicacion debera realizar automaticamente las siguientes operaciones:
1. Insertar puestos desde un chero (ver anexo B).
2. Insertar candidatos desde un chero (ver anexo B).
Ademas, debera permitir al usuario realizar las siguientes operaciones:
1. Insertar un nuevo candidato desde teclado.
2. Eliminar un candidato introduciendo su DNI.
3. Mostrar por pantalla la lista de candidatos ordenados por DNI.
4. Mostrar por pantalla la lista de puestos.
5. Calcular la adjudicacion de puestos.
Una vez se haya realizado la adjudicacion de puestos, el usuario solo podra acceder a las opciones de
\Mostrar por pantalla...".
Cada vez que se interrogue al usuario con cada uno de los datos a introducir, o cuando se lean de
chero, se validara la correccion de los mismos (para la correccion del DNI vease el Anexo A). Ademas
se debera comprobar que el candidato que se introduce por teclado no esta ya en la base de datos. Se
utiliza el numero del DNI como referencia para veri car si el candidato ya esta en la base de datos. Para
eliminar a un candidato, la aplicacion preguntara por su DNI y procedera a eliminarlo de la base de
datos.
La adjudicacion de plazas se realizara segun la nota del expediente y las preferencias de cada candi-
dato. Si la primera preferencia de un candidato esta ya adjudicada (ya no aparece en la lista de puestos
a adjudicar), se intentara asignarle su segunda preferencia y, en caso de que tampoco este disponible,
con la tercera preferencia. Como resultado de la adjudicacion se incluiran los datos del puesto de trabajo
(codigo, localidad y UCO) entre los datos del candidato al que se le ha adjudicado dicho puesto. Al nal
del proceso, los candidatos sin puesto adjudicado deberan tener como codigo de puesto: 0?000/000 (dato
a tener en cuenta en cada insercion de un nuevo candidato).











program prog;
{$mode objfpc}
{$R+}
type
  tDia=1..31;
  tMes=1..12;
  tAnyo=1900..3000;

{funcion que saca el primer item de una lista de items separados por ; y lo devuelve}
{devuelve falso si ya no quedan items en la lista}
function sacarCampo(var linea:string; var campo:string):boolean;
var
  p : byte;
begin
  if linea = '' then
     sacarCampo := false
  else
  begin
     p := pos(';',linea);  {buscamos el primer separador}
     if p <> 0 then
     begin
       {Copiamos el campo, y lo quitamos de la linea }
       campo := copy(linea,1, p-1);
       delete(linea,1,p);
     end
     else
     begin
       campo := linea;
       delete(linea,1,length(linea));
     end;
     sacarCampo := true
  end
end;



{funcion que procesa una linea de un fichero de puestos vacantes}
{devuelve falso si no se han podido reconocer correctamente todos los campos}
function procesarLineaPuesto(linea:string; var codigo, UCO, destino:string):boolean;
var
  ok  : boolean;
begin
   ok := true;
   ok := ok and sacarCampo(linea,codigo);
   ok := ok and sacarCampo(linea,UCO);
   ok := ok and sacarCampo(linea,destino);
   procesarLineaPuesto:=ok
end;

{funcion que abre un fichero de texto}
{devuelve true si la operacion se ha realizado con exito; falso en caso contrario}
function abrirFichero(var entrada:Text; nombre:String):boolean;
begin
  {asignar a la variable el nombre de un fichero}
  assign(entrada, nombre);
  try
     {abrir el fichero}
     reset(entrada);
     abrirFichero:=true;
  except
     writeln('ERROR! El fichero no existe');
     writeln('Ponga el fichero de entrada en el mismo directorio que su programa *.pas.');
     abrirFichero:=false
  end;
end;

{procedimiento para cargar los candidatos desde un fichero}
{a terminar por el alumnado}
procedure cargarCandidatos(var listaCandidatos:tListaCandidatos);
var
  nombre, linea:string;
  entrada:Text;
begin
  {Abrimos un fichero cuyo nombre se introduce desde el teclado}
  repeat
     writeln('Introduzca el nombre del fichero con candidatos');
     readln(nombre);
  until (length(nombre)>0) and abrirFichero(entrada, nombre);

  {Se lee el contenido del fichero linea por linea}
  while NOT EOF(entrada) do
  begin
     readln(entrada,linea);

     {llamada a procesarLineaCandidato}
      {NO SE COMO TERMINAR}
     ...
  end;

  {Cerramos el fichero}
  {SIEMPRE hay que cerrar un fichero ya abierto al finalizar las operaciones con el}
  close(entrada);

end;

{procedimiento para cargar la lista de puestos desde un fichero}
{a terminar por el alumnado}
procedure cargarPuestos(var listaPuestos:tListaPuestos);
var
  nombre, linea:string;
  entrada:Text;
begin
  {Abrimos un fichero cuyo nombre se introduce desde el teclado}
  repeat
     writeln('Introduzca el nombre del fichero con puestos');
     readln(nombre);
  until (length(nombre)>0) and abrirFichero(entrada, nombre);

  {Se lee el contenido del fichero linea por linea}
  while NOT EOF(entrada) do
  begin
     readln(entrada,linea);

     {llamada a procesarLineaPuesto}
     {NO SE COMO TERMINAR}
     ...
  end;

  {Cerramos el fichero}
  {SIEMPRE hay que cerrar un fichero ya abierto al finalizar las operaciones con el}
  close(entrada);

end;


begin

end.


13-Jun-2011 01:40
Antonio P.G.

Hola Miguel Ángel.

Cualquier enunciado derivado del amigo Groucho siempre parecerá interesante.

Sin embargo, ¿cuál es la pregunta en concreto?

¡Un saludo!

Por cierto, la función "procesarLineaPuesto" la puedes simplificar así (creo, ya que si alguno no se cumple, que pienso que es lo que buscas, será FALSE:

function procesarLineaPuesto(linea:string; var codigo, UCO, destino:string):boolean;
begin
    procesarLineaPuesto:= sacarCampo(linea,codigo) and sacarCampo(linea,UCO) and sacarCampo(linea,destino)
end;


13-Jun-2011 15:55
Miguel Angel Perez Perez

Es que con lo que tengo no se acabar lo que me piden, mi nivel es aun bastante basico


14-Jun-2011 10:13
Nacho Cabanes (+84)

Es que en ese fuente falta mucho por hacer. Supongo que querrán que mantengas en memoria un "array" con los datos de todos los candidatos. La ficha de cada candidato sería un "record". Lo primero sería que crearas esa estructura y las funciones necesarias para introducir datos desde teclado.

Para los puestos, sería similar (aunque si he entendido bien, no necesitas un "record" para cada puesto, debería bastar con un "string".

Así, lo más sencillo sería introducir puestos por teclado (aunque no te lo piden, pero te vendrá bien para practicar), y luego mostrar puestos por pantalla.

Después yo haría lo mismo para candidatos.

Luego pasaría a las funciones de manejo de ficheros.

Finalmente, la adjudicación (y el cambio de estado que conlleva).

Ve intentando cada parte y preguntando dudas, porque el manejo de arrays deberías conocerlo ya si te enfrentas a ejercicios como éste.






(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.)