[ Foro de Pascal ]

AYUDA PASCAL TRABAJO FINAL

02-May-2011 11:06
Manuel Molina
4 Respuestas

estoy intentado solucionar un problema con un programa de pascal de un curso nivel básico que no se como acabarlo.

Me han ayudado pero la ayuda  me llega a través de Delhip y la verdad hay cosas diferentes que no se aplicar.

Necesito por tanto si es posible tu ayuda pero claro, a nivel básico de pascal.

Te envío el programa, este compila. No se que he realizado mal pero en el enunciado el programa debe sumar, sacar la media, suma total etc. Creo que las funciones estan bien codificadas pero no hay forma de que se lleven acabo.En fin como ves estoy algo liado, lo que pasa es que estoy haciendo un curso a distancia y como hay poca gente que siga con Pascal a estos niveles pues me veo negro para acabarlo, por cierto este es el último programa que tengo que hacer del curso.

Si te es posible por favor ayudarme, te lo agradecería sino de todas formas te doy las gracias y te pido disculpas por las molestas.

te envio archivo adjunto con todo lo que llevo codificado. Practicamente esta acabado pero me faltan esos códigos que solo la experiencia pues verlo rápidamente

El enunciado de programa es el siguiente:

gestionar una biblioteca:

El programa deberá almacenar la informacion de cada libro:

Titulo
autor
tema
precio
prestado
* NOMBRE
*CORREO ELECTRONICO
*FECHA DEL PRESTAMO

Las operaciones sobre su biblioteca serán:

dar alta
car baja
introducir datos un un prestamo
modificar datos.
preesentar listados de su biblioteca:
*listado de todos los libros
*listado de los libros prestados
*listado con precios maxijmo, minimos, la media y el valor total de su coleccion.

Codigo de programa que esta para afinarlo , si me ayudais os lo agradecería y si no puede ser muchas gracias de todas formas.

PROGRAM Bibliotecas;


(*CONSTANTES DEL PROGRAMA, EL TAMAÑO MÁXIMO DE LA LÍNEA Y DE LA BIBLIOTECA*)
CONST
(*Tamaño de la biblioteca*)
  TAMBIBLIOTECA = 5;  
(*Tamaño máximo de la línea*)  
  TAMMAXI     = 25;
 
TYPE
(* REGISTRO ANIDADO QUE DEFINE LAS CARACTERÍSTICAS DE CADA LIBRO *)
  (* Datos del Préstamo *)
Tprestado = record
nom_apellidos : string [TAMMAXI];
email         : string [TAMMAXI];
fecha  : integer;
codigo_libro  : integer;
end;

(* Datos del libro *)
Tlibro = record
datos  : Tprestado;
codigo : integer;
titulo : string [TAMMAXI];
autor  : string [TAMMAXI];
tema   : string [TAMMAXI];
precio : integer;
alta   : Boolean;
activo : Boolean;
end;

(* -- TABLA SOBRE LA QUE VAMOS A TRABAJAR EN EL PROYECTO BIBLIOTECA --*)
Tbiblioteca = array[1..TAMBIBLIOTECA] of Tlibro;
(* -- FICHERO SOBRE LA QUE VAMOS A ALMACENAR LOS DATOS DE LA BIBLIOTECA--*)
  Tfichero = file of Tlibro;

(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! FUNCIONES Y PROCEDIMIENTOS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)

(* -- LEE DEL TECLADO TODA LA INFORMACIÓN DE UN LIBRO QUE SE LE PASA--*)

PROCEDURE lee_libro(var libro: Tlibro);

begin

writeln;
libro.alta:= true;  (*Siempre el alta de un libro es true*)
libro.activo:=false; (*Siempre el es false hasta que se modifique el libro *)
writeln('Codigo: ');
readln(libro.codigo);
writeln('Titulo: ');
readln(libro.titulo);
writeln('Autor: ');
readln(libro.autor);
writeln('Tema: ');
readln(libro.tema);
writeln('Precio: ');
readln(libro.precio);
writeln;

end;
(*--PARA BUSCAR POSICION LIBRE Y DAR ALTA UN LIBRO --*)
PROCEDURE alta_libro(VAR biblioteca: Tbiblioteca; longitud: integer);
(*variables para almacenar las búsquedas*)
var

encontrado : Boolean;
posicionlibre : integer;
fin : Boolean;
i: integer;

begin

encontrado:= false; (* Cuando sea TRUE es que he encontrado la posición *)
posicionlibre:= 1; (* Empiezo a buscar por la uno *)
i:= 1;  (* Para ir recorriendo la tabla *)
fin:= false; (* He llegado al final de la tabla *)

for i:= 1 to longitud do

  begin

While(encontrado = false) AND (fin = false) do (*aplicamos bucle mientras las condicienes de encontrado y fin sea false *)

if biblioteca[i].alta = false then begin (*Si alta es false y encontrado es verdadero obtenemos una posición libre*)
encontrado := true;
posicionlibre := i;
end

else

if i <> TAMBIBLIOTECA then begin  (*sumamos 1 posición a la posición libre*)
posicionlibre:= posicionlibre + 1;
end

else
 
fin:= true;
end;

begin

if fin = true then   (* Se nos indica cuando no tenemos más posiciones libres en la biblioteca *)
writeln(' No hay sitio en la tabla para los libros');
if encontrado = true then
begin
lee_libro(biblioteca[posicionlibre]);
writeln('Se ha guardado el libro en la posicion',posicionlibre);
end;
end;

end;
(* PROCEDIMIENTO PARA LEER LA BIBLIOTECA*)
PROCEDURE lee_biblioteca(var biblioteca: Tbiblioteca; longitud: integer);
(* variable que utilizamos en la tabla*)
var

i: integer;

begin

for i:= 1 to longitud do

begin

writeln('Introduzca los datos del libro: ' , i);
lee_libro(biblioteca[i]);

end;

end;

(* PRESENTAR LISTADOS DE LA BIBLIOTECA *)
PROCEDURE imprime_libro(libro: Tlibro);  

begin
                                       
writeln('--------------------------------------');
writeln('----------LISTADO POR LIBRO-----------');
writeln('--------------------------------------');
writeln('alta : ', libro.alta);
writeln('Prestado: ', libro.activo);
writeln('Codigo : ', libro.codigo);
writeln('Titulo : ', libro.titulo);
writeln('Autor : ' , libro.autor);
writeln('Tema : ', libro.tema);
writeln('Precio : ', libro.precio);
       writeln;
writeln('--------------------------------------');

end;
(* PROCEDIMIENTO QUE NOS IMPRIME POR PANTALLA LOS DATOS DEL LIBRO *)
PROCEDURE imprime_biblioteca(biblioteca: Tbiblioteca; longitud: integer);

var

i: integer;

begin

for i:= 1 to longitud do

begin

imprime_libro(biblioteca[i]);

end;

end;

(* PROCEDIMIENTO PARA INTRODUCIR DATOS DE LOS PRESTAMOS*)
PROCEDURE hacer_prestamo(var prestado: Tprestado);

begin

writeln;
writeln('------------------------------------');
writeln('INTRODUCIR DATOS PRESTAMO BIBLIOTECA');
writeln('------------------------------------');
writeln('Introducir Nombre y Apellidos: ');
readln(prestado.nom_apellidos);
writeln('Email: ');
readln(prestado.email);
writeln('Fecha del Prestamo: ');
readln(prestado.fecha);
writeln('Codigo Libro: ');
readln(prestado.codigo_libro);
writeln;

end;
(* PROCEDIMIENTO PARA IMPRESION DE PRESTAMOS*)
PROCEDURE imprime_prestamo(prestado: Tprestado);

begin

writeln('----------------------------------------');
writeln('-----LISTADO DE LIBROS PRESTADOS--------');
writeln('----------------------------------------');
Writeln(' Nombre y Apellido: ', prestado.nom_apellidos);
writeln(' Email: ' ,prestado.email);
writeln('Fecha de prestamo: ' ,prestado.fecha);
writeln('Codigo Libro: ',prestado.codigo_libro);

end;

(* PROCEDIMIENTO QUE NOS IMPREME POR PANTALLA EL PROCEDIMIENTO ANTERIOR *)
PROCEDURE imprime_prestados(prestado: Tprestado; longitud: integer);

var

i:  integer;

begin

for i:= 1 to longitud do;

begin

writeln('----------------------------------------');
writeln('-----LISTADO DE LIBROS PRESTADOS--------');
writeln('----------------------------------------');
imprime_prestamo(prestado);

end;

end;

(* -- CON ESTE PROCEDIMIENTO PRETENDO BUSCAR Y MODIFICAR SU ESTADO DE ALTA, BAJA --*)

PROCEDURE baja_modificacion(biblioteca: Tbiblioteca; longitud: integer; buscado: integer);

var

      i  : integer;
encontrado: Boolean;

begin
(* Variable encontrado siempre a false *)
encontrado:= false;

for i:= 1 to longitud do

begin

if biblioteca[i].codigo = buscado then begin (*Si el codigo de la biblioteca es igual al introducido se llama al procedimiento imprime_libro*)
imprime_libro(biblioteca[i]); (*Llamada al procedimiento*)
encontrado:= true;    (*Ponemos encontrado a true*)
biblioteca[i].alta:=false;
end;

end;

begin

if encontrado = false then begin (* Si  la busqueda anterior no se produce no lee la siguiente línea*)
writeln('Libro no encontrado');
end;

end;


end;
(* PROCEDIMIENTO PARA LA BUSQUEDA Y MODIFICACION DE DATOS*)
PROCEDURE modificacion(biblioteca: Tbiblioteca; longitud: integer; buscado: integer);
(*variables del buble de la tabla y encontrado*)
var
i  : integer;
encontrado: Boolean;

begin

encontrado:= false; (* Ponemos encontrado a false para procedes a la busqueda*)

for i:= 1 to longitud do

begin
(* if que nos permite buscar en la biblioteca un codigo introducido *)
if biblioteca[i].codigo = buscado then begin  
imprime_libro(biblioteca[i]);
encontrado:= true;
biblioteca[i].alta:=true;
end;
(* if que nos permite introducir datos nuevos sobre un mismo libro *)
if biblioteca[i].codigo = buscado then begin
writeln('Modificar Libro');
lee_libro(biblioteca[i]);
end;

end;

begin
(* if que nos indica cuando un codigo de libro no ha sido encontrado *)
if encontrado = false then begin
writeln('Libro no encontrado');
end;

end;


end;
(* PROCEDIMIENTO PARA LA IMPRESION POR PANTALLA DE LOS LIBROS *)
PROCEDURE imprime_libros(biblioteca: Tbiblioteca; longitud: integer);
(* variable del bucle de la biblioteca *)
var

i: integer;

begin

for i:= 1 to longitud do

begin
(* llamada al procedimiento *)
imprime_libro(biblioteca[i]);

end;

end;
(* FUNCION QUE DEVUELVE EL VALOR TOTAL DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION suma_coleccion(biblioteca: Tbiblioteca; longitud: integer): real;
(*variable del bucle de la biblioteca *)
var

i: integer;

begin

suma_coleccion:= 0;

for i:= 1 to longitud do

begin
(*calculo donde sumamos todos libros de la biblioteca *)
suma_coleccion:= suma_coleccion + biblioteca[i].precio;

end;

end;

(* FUNCIÓN QUE DEVUELVE VALOR MÁXIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Maximo(biblioteca: Tbiblioteca; longitud: integer): real;
(*variables del buble y para almacenar el maximo del precio*)
var

i: integer;
max: integer;

begin

max:= 0;

for i:= 1 to longitud do

if max < biblioteca[i].precio then begin  (*Calculo del maximo precio de la biblioteca *)
  max:= biblioteca[i].precio;
  Maximo:= max;
end;
end;

(* FUNCION QUE DEVUELVE VALOR MÍNIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Minimo(biblioteca: Tbiblioteca; longitud: integer): real;
(*variables del bucle de biblioteca y min para almacenar el mínimo*)
var
i: integer;
min: integer;

begin

min:= 0;

for i:= 1 to longitud do

if min > biblioteca[i].precio then begin (*Calculo del mínimo precio de la biblioteca*)
(*min:= biblioteca.precio;*)
Minimo:= min;
end;

end;

(* FUNCION QUE DEVUELVE EL VALOR MEDIO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Media(biblioteca: Tbiblioteca; longitud: integer): real;
(*Variables del bucle y suma_coleción*)
var

i: integer;
suma_coleccion: integer;

begin

suma_coleccion:= 0;

for i:= 1 to longitud do

begin

suma_coleccion:= suma_coleccion + biblioteca[i].precio; (*calculo para averiguar la media del valor del precio de la biblioteca*)
Media:= suma_coleccion/TAMBIBLIOTECA;

end;

end;

(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!   FUNCIONES DE FICHERO  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)

(*-- ALMACENA DATOS LEIDOS DE UN FICHERO --*)
PROCEDURE graba_fichero(nombre: string; var biblioteca: Tbiblioteca; longitud: integer);
Var
 i : integer;
 fichero : Tfichero;
Begin
 assign(fichero, nombre);
rewrite(fichero);

for i:= 1 to longitud do
if(biblioteca[i].alta = true) then         (* DEBE DE GUARDAR SOLO LOS LIBROS QUE COMO ALTA SEA TRUE*)
write(fichero, biblioteca[i]);

close(fichero);
End;

(*-- LEE DATOS DEL FICHERO --*)
PROCEDURE lee_fichero(nombre: string; var biblioteca: Tbiblioteca; longitud: integer);

Var
 i : integer;
fichero : Tfichero;

Begin
 i := 0;

assign(fichero, nombre);
reset(fichero);

   while ( not(eof(fichero)) AND (i<TAMBIBLIOTECA) ) do begin
   i := i+1;
   read(fichero, biblioteca[i]);

end;

close(fichero);

End;

(*-- FUNCIÓN QUE PRESENTA MENÚ Y DEVUELVE OPCIÓN ELEGIDA --*)
FUNCTION Menu: INTEGER;
(*VARIABLE DE LAS DIFERENTES OPCIONES DEL MENÚ*)
VAR

opc: integer;

BEGIN
(*BUCLE*)
repeat
(* PRESENTACIÓN EN PANTALLA DEL MENÚ Y LAS OPCIONES A ELEGIR *)
writeln('-----------------------------');
writeln('MENU DE GESTION DE BIBLIOTECA');
writeln('-----------------------------');
writeln;
writeln('1. ALTA DE LIBRO');
writeln('2. BAJA DE LIBRO');
writeln('3. DATOS DE PRESTAMO');
writeln('4. MODIFICACION DE DATOS');
writeln('5. GUARDAR DATOS EN FICHEROS');
writeln('6. LECTURA DE DATOS DE FICHERO');
writeln;
writeln('***PRESENTACION DE LISTADO DE BIBLIOTECA***');
writeln;
writeln('7. LISTADO DE TODOS LOS LIBROS DE LA BIBLIOTECA');
writeln('8. LISTADO DE LIBROS PRESTADOS');
writeln('9. LISTADO DE PRECIOS MAXIMOS, MINIMOS, LA MEDIA Y EL VALOR TOTAL DE LA COLECCION');  

writeln('10. SALIR');
writeln('OPCION:  ');
readln(opc);
until ( (opc>=1) and (opc <=9)or(opc=10));

Menu := opc;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!    VARIABLES GLOBALES           !!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
VAR

prestado  : Tprestado; (*variable de registro*)
biblioteca: Tbiblioteca; (*variable de registro*)
opc  : integer; (*variable de menú*)
nombre    : string; (*variable de utilización, guardar y leer de fichero*)
buscado   : integer; (*variable de procedimiento de busqueda*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!    PROGRAMA PRINCIPAL          !!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)  

BEGIN
(*Bucle*)
repeat

opc:= Menu;

case opc of

1: alta_libro(biblioteca, TAMBIBLIOTECA); (*llamada procedimiento para altas de libro*)
 
2: begin (*codigo para dar de baja un libro*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
writeln('Introducir codigo: ');
readln(buscado);
baja_modificacion(biblioteca, TAMBIBLIOTECA, buscado); (*LLamada procedimiento*)
writeln('Cambiar estado del libro: ');
alta_libro(biblioteca, TAMBIBLIOTECA);
end;
3: begin (*codigo para introducir datos de prestamos de libros*)
hacer_prestamo(prestado);
writeln('Introduzca el nombre del fichero de prestamo: ');
readln(nombre);
graba_fichero(nombre, biblioteca, TAMBIBLIOTECA); (*LLamada procedimiento*)
end;

4: begin (*codigo para modificar datos de libro*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
writeln('Introducir codigo: ');
readln(buscado);
modificacion(biblioteca, TAMBIBLIOTECA, buscado);(*LLamada procedimiento*)
end;

5: begin (*Codigo para grabar fichero*)
writeln('Introduzca el nombre del fichero de datos: ');
readln(nombre);
graba_fichero(nombre, biblioteca, TAMBIBLIOTECA);  (*LLamada procedimiento*)
  end;
6: begin (*Codigo para lectura de fichero*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
imprime_biblioteca(biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
  end;
7: begin (*Codigo para la lectura de todos los libros*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
imprime_biblioteca(biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
  end;

8: begin (*Codigo para listados de libros y datos prestados*)
writeln('Introduzca el nombre del fichero de prestamo: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
imprime_prestados(prestado, TAMBIBLIOTECA); (*LLamada procedimiento*)
end;
9: begin (*codigo para sacar estadisticas del precio de los libros*)
writeln('Introduzca el nombre del fichero : ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA); (*llamada procedimiento*)
writeln('--------------------------------------------------------------');
writeln('LISTADO DE PRECIOS MAXIMOS, MINIMOS, LA MEDIA Y EL VALOR TOTAL');
writeln('--------------------------------------------------------------');
writeln('Valor maximo: ');
Maximo(biblioteca, TAMBIBLIOTECA); (*LLamada procedimiento*)
writeln('Valor minimo: ');
Minimo(biblioteca, TAMBIBLIOTECA); (*LLamada procedimiento*)
writeln('Valor medio: ');
Media(biblioteca, TAMBIBLIOTECA); (*LLamada procedimiento*)
writeln('Valor total Biblioteca: ');
suma_coleccion(biblioteca, TAMBIBLIOTECA); (*LLamada procedimiento*)

  end;


 
end;
until(opc=10);


END.


03-May-2011 16:55
Nacho Cabanes (+84)

La mayoría de las ideas están bien, aunque hay cosas hechas de forma muy engorrosa. Por ejemplo, en vez de

until ( (opc>=1) and (opc <=9)or(opc=10));

parece más razonable

until ( (opc>=1) and (opc <= 10));

o incluso

until ( opc in [1..10]);


Pero lo grave es que hay varias decisiones que no son consecuentes. Por ejemplo: si das de alta un libro (opción 1) y luego pides ver un listado (opción 7), se te pregunta un nombre de fichero, cuando es muy probable que no hayas guardado nada en fichero.

Sugerencias que sea más "utilizable" con pocos cambios:

- Que las búsquedas trabajen en memoria, sin preguntar fichero.

- Que se guarde automáticamente en fichero tras cada cambio (alta / baja / modificación).

- Que si no se guarda automáticamente, al menos el nombre del fichero de datos sea prefijado, para que no haya que pedirlo a cada pasada.


Aun así, cuando un programa de casi 700 líneas no funciona, lo mejor suele ser cambiar el planteamiento. Deberías volverlo a hacer desde cero, copiando y pegando si quieres, pero añadiendo cada nueva función y probándola por completo antes de añadir otra nueva.

Yo seguiría este orden:

- Añadir datos con sólo dos campos.

- Mostrar los datos añadidos.

- Mostar los datos que cumplan una condición (p.ej.: prestados)

- Calcular estadísticas sobre los datos añadidos.

- Modificar un dato.

- Borrar un dato.

- Guardar en fichero.

- Cargar de fichero.

- Completar con el resto de campos.

Pero cada vez que des uno de esos pasos, lo pruebas, y quizá incluso guardas el proyecto con un nombre nuevo (p.ej., biblioteca_01, biblioteca_02, biblioteca_03...) para poder volver atrás si "algo deja de funcionar".

Si no vas poco a poco, acabarás con un programa enorme... que no funcionará, como te ha pasado esta vez. Reescríbelo, aunque sea copiando y pegando, y pregunta las dudas con cada fragmento de código pequeño, sin esperar a que "todo sea un gran problema".


03-May-2011 17:35
Manuel Molina

Tienes razón Nacho, el problema es que tengo que terminarlo entre hoy y mañana. Pero practicamente lo tengo acabado, aunque me he atrancado en el procedimiento PROCEDURE hacer_prestamo( var prestado: Tprestado); este esta mal planteado.

El algoritmo es el siguiente:pedir código de libro a prestar.
buscar el código en la lista biblioteca.
si se ha encontrado, pedir los datos del préstamo y meterlos en la posición adecuada de la biblioteca, fin si.

Oye muchas gracias por contestarme, la verdad es que como tu dices lo he intentado hacer de golpe y ahora tengo un problemón de codigo y tiempo.

Tengo esto hecho pero no me compia, esta mal:

PROCEDURE hacer_prestamo(var biblioteca: Tbiblioteca; longitud: integer; buscado: integer);

var

 i: integer;  
encontrado: Boolean;

begin

encontrado:= false;

for i:= 1 to longitud do;



if biblioteca[i].codigo = buscado then begin
encontrado:= true;  
 writeln(' Introducir Nombre y Apellido: ');
 readln(Tprestado.nom_apellidos);
 writeln(' Introducir Email:  ');
 readln(Tprestado.email);
 writeln(' Introducir Fecha: ');
 readln(Tprestado.fecha);
end;



end;


te pongo el resto del programa para que veas el progreso:

PROGRAM Bibliotecas;

(*CONSTANTES DEL PROGRAMA, EL TAMAÑO MÁXIMO DE LA LÍNEA Y DE LA BIBLIOTECA*)
CONST
(*Tamaño de la biblioteca*)
  TAMBIBLIOTECA = 5;  
(*Tamaño máximo de la línea*)  
  TAMMAXI     = 25;
 
TYPE
(* REGISTRO ANIDADO QUE DEFINE LAS CARACTERÍSTICAS DE CADA LIBRO *)
  (* Datos del Préstamo *)
Tprestado = record
nom_apellidos : string [TAMMAXI];
email         : string [TAMMAXI];
fecha  : integer;
end;

(* Datos del libro *)
Tlibro = record
datos  : Tprestado;
codigo : integer;
titulo : string [TAMMAXI];
autor  : string [TAMMAXI];
tema   : string [TAMMAXI];
precio : integer;
alta   : Boolean;
activo : Boolean;
end;

(* -- TABLA SOBRE LA QUE VAMOS A TRABAJAR EN EL PROYECTO BIBLIOTECA --*)
Tbiblioteca = array[1..TAMBIBLIOTECA] of Tlibro;
(* -- FICHERO SOBRE LA QUE VAMOS A ALMACENAR LOS DATOS DE LA BIBLIOTECA--*)
  Tfichero = file of Tlibro;

(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! FUNCIONES Y PROCEDIMIENTOS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)

(* -- LEE DEL TECLADO TODA LA INFORMACIÓN DE UN LIBRO QUE SE LE PASA--*)

PROCEDURE lee_libro(var libro: Tlibro);

begin

writeln;
libro.alta:= true;  (*Siempre el alta de un libro es true*)
libro.activo:=false; (*Siempre el es false hasta que se modifique el libro *)
writeln('Codigo: ');
readln(libro.codigo);
writeln('Titulo: ');
readln(libro.titulo);
writeln('Autor: ');
readln(libro.autor);
writeln('Tema: ');
readln(libro.tema);
writeln('Precio: ');
readln(libro.precio);
writeln;

end;
(*--PARA BUSCAR POSICION LIBRE Y DAR ALTA UN LIBRO --*)
PROCEDURE alta_libro(VAR biblioteca: Tbiblioteca; longitud: integer);
(*variables para almacenar las búsquedas*)
var

encontrado : Boolean;
posicionlibre : integer;
fin : Boolean;
i: integer;

begin

encontrado:= false; (* Cuando sea TRUE es que he encontrado la posición *)
posicionlibre:= 1; (* Empiezo a buscar por la uno *)
i:= 1;  (* Para ir recorriendo la tabla *)
fin:= false; (* He llegado al final de la tabla *)



  begin

While(encontrado = false) AND (fin = false) do (*aplicamos bucle mientras las condicienes de encontrado y fin sea false *)

if biblioteca[i].alta = false then begin (*Si alta es false y encontrado es verdadero obtenemos una posición libre*)
encontrado := true;
posicionlibre := i;
end;

if (i = TAMBIBLIOTECA) then begin  (*sumamos 1 posición a la posición libre*)
fin:= true;
end;


begin

if fin = true then   (* Se nos indica cuando no tenemos más posiciones libres en la biblioteca *)
writeln(' No hay sitio en la tabla para los libros');
if encontrado = true then
begin
lee_libro(biblioteca[posicionlibre]);
writeln('Se ha guardado el libro en la posicion',posicionlibre);
end;
end;

end;

end;


(* PRESENTAR LISTADOS DE LA BIBLIOTECA *)
PROCEDURE imprime_libro(libro: Tlibro);  

begin
                                       
writeln('--------------------------------------');
writeln('----------LISTADO POR LIBRO-----------');
writeln('--------------------------------------');
writeln('alta : ', libro.alta);
writeln('Prestado: ', libro.activo);
writeln('Codigo : ', libro.codigo);
writeln('Titulo : ', libro.titulo);
writeln('Autor : ' , libro.autor);
writeln('Tema : ', libro.tema);
writeln('Precio : ', libro.precio);
       writeln;
writeln('--------------------------------------');

end;
(* PROCEDIMIENTO QUE NOS IMPRIME POR PANTALLA LOS DATOS DEL LIBRO *)
PROCEDURE imprime_biblioteca(biblioteca: Tbiblioteca; longitud: integer);

var

i: integer;

begin

for i:= 1 to longitud do

begin

imprime_libro(biblioteca[i]);

end;

end;

(* PROCEDIMIENTO PARA INTRODUCIR DATOS DE LOS PRESTAMOS*)
PROCEDURE hacer_prestamo(var biblioteca: Tbiblioteca; longitud: integer; buscado: integer);

var

 i: integer;  
encontrado: Boolean;

begin

encontrado:= false;

for i:= 1 to longitud do;



if biblioteca[i].codigo = buscado then begin
encontrado:= true;  
 writeln(' Introducir Nombre y Apellido: ');
 readln(Tprestado.nom_apellidos);
 writeln(' Introducir Email:  ');
 readln(Tprestado.email);
 writeln(' Introducir Fecha: ');
 readln(Tprestado.fecha);
end;



end;
(* PROCEDIMIENTO PARA IMPRESION DE PRESTAMOS*)
PROCEDURE imprime_prestamo(prestado: Tprestado);

begin

writeln('----------------------------------------');
writeln('-----LISTADO DE LIBROS PRESTADOS--------');
writeln('----------------------------------------');
Writeln(' Nombre y Apellido: ', prestado.nom_apellidos);
writeln(' Email: ' ,prestado.email);
writeln('Fecha de prestamo: ' ,prestado.fecha);


end;

(* PROCEDIMIENTO QUE NOS IMPREME POR PANTALLA EL PROCEDIMIENTO ANTERIOR *)
PROCEDURE imprime_prestados(prestado: Tprestado; longitud: integer);

var

i:  integer;

begin

for i:= 1 to longitud do;

begin

writeln('----------------------------------------');
writeln('-----LISTADO DE LIBROS PRESTADOS--------');
writeln('----------------------------------------');
imprime_prestamo(prestado);

end;

end;

(* -- CON ESTE PROCEDIMIENTO PRETENDO BUSCAR Y MODIFICAR SU ESTADO DE ALTA, BAJA --*)
PROCEDURE baja_modificacion(biblioteca: Tbiblioteca; longitud: integer; buscado: integer);

var

      i  : integer;
encontrado: Boolean;

begin
(* Variable encontrado siempre a false *)
encontrado:= false;

for i:= 1 to longitud do

begin

if biblioteca[i].codigo = buscado then begin (*Si el codigo de la biblioteca es igual al introducido se llama al procedimiento imprime_libro*)
imprime_libro(biblioteca[i]); (*Llamada al procedimiento*)
encontrado:= true;    (*Ponemos encontrado a true*)
biblioteca[i].alta:=false;
end;

end;

begin

if encontrado = false then begin (* Si  la busqueda anterior no se produce no lee la siguiente línea*)
writeln('Libro no encontrado');
end;

end;


end;
(* PROCEDIMIENTO PARA LA BUSQUEDA Y MODIFICACION DE DATOS*)
PROCEDURE modificacion(biblioteca: Tbiblioteca; longitud: integer; buscado: integer);
(*variables del buble de la tabla y encontrado*)
var
i  : integer;
encontrado: Boolean;

begin

encontrado:= false; (* Ponemos encontrado a false para procedes a la busqueda*)

for i:= 1 to longitud do

begin
(* if que nos permite buscar en la biblioteca un codigo introducido *)
if biblioteca[i].codigo = buscado then begin  
imprime_libro(biblioteca[i]);
encontrado:= true;
biblioteca[i].alta:=true;
end;
(* if que nos permite introducir datos nuevos sobre un mismo libro *)
if biblioteca[i].codigo = buscado then begin
writeln('Modificar Libro');
lee_libro(biblioteca[i]);
end;

end;

begin
(* if que nos indica cuando un codigo de libro no ha sido encontrado *)
if encontrado = false then begin
writeln('Libro no encontrado');
end;

end;


end;
(* PROCEDIMIENTO PARA LA IMPRESION POR PANTALLA DE LOS LIBROS *)
PROCEDURE imprime_libros(biblioteca: Tbiblioteca; longitud: integer);
(* variable del bucle de la biblioteca *)
var

i: integer;

begin

for i:= 1 to longitud do

begin
(* llamada al procedimiento *)
imprime_libro(biblioteca[i]);

end;

end;
(* FUNCION QUE DEVUELVE EL VALOR TOTAL DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION suma_coleccion(biblioteca: Tbiblioteca; longitud: integer): real;
(*variable del bucle de la biblioteca *)
var

i: integer;

begin

suma_coleccion:= 0;

for i:= 1 to longitud do

begin
(*calculo donde sumamos todos libros de la biblioteca *)
suma_coleccion:= suma_coleccion + biblioteca[i].precio;

end;

end;

(* FUNCIÓN QUE DEVUELVE VALOR MÁXIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Maximo(biblioteca: Tbiblioteca; longitud: integer): real;
(*variables del buble y para almacenar el maximo del precio*)
var

i: integer;
max: integer;

begin

max:= 0;

for i:= 1 to longitud do

if max < biblioteca[i].precio then begin  (*Calculo del maximo precio de la biblioteca *)
  max:= biblioteca[i].precio;
  Maximo:= max;
end;
end;

(* FUNCION QUE DEVUELVE VALOR MÍNIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Minimo(biblioteca: Tbiblioteca; longitud: integer): real;
(*variables del bucle de biblioteca y min para almacenar el mínimo*)
var
i: integer;
min: integer;

begin

min:= 0;

for i:= 1 to longitud do

if min > biblioteca[i].precio then begin (*Calculo del mínimo precio de la biblioteca*)
min:= biblioteca[i].precio;
Minimo:= min;
end;

end;

(* FUNCION QUE DEVUELVE EL VALOR MEDIO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Media(biblioteca: Tbiblioteca; longitud: integer): real;
(*Variables del bucle y suma_coleción*)
var

i: integer;
suma_coleccion: integer;

begin

suma_coleccion:= 0;

for i:= 1 to longitud do

begin

suma_coleccion:= suma_coleccion + biblioteca[i].precio; (*calculo para averiguar la media del valor del precio de la biblioteca*)
Media:= suma_coleccion/(TAMBIBLIOTECA);

end;

end;

(* PROCEDIMIENTO DONDE ENGLOBA LAS 4 FUNCIONES DONDE SE PIDEN EL CÁLCULO DE VALORES DE LA BIBLIOTECA*)
Procedure Resultados( biblioteca: Tbiblioteca; longitud: integer);

Begin
writeln;
writeln(' Suma: ', Media(biblioteca, TAMBIBLIOTECA):0:1);
writeln(' Maximo:  ', Maximo(biblioteca, TAMBIBLIOTECA):0:1);
writeln(' Minimo:  ', Minimo(biblioteca, TAMBIBLIOTECA):0:1);
writeln(' Media: ', Media(biblioteca, TAMBIBLIOTECA):0:1);
writeln;
End;

(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!   FUNCIONES DE FICHERO  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)

(*-- ALMACENA DATOS LEIDOS DE UN FICHERO --*)
PROCEDURE graba_fichero(nombre: string; var biblioteca: Tbiblioteca; longitud: integer);
Var
 i : integer;
 fichero : Tfichero;
Begin
 assign(fichero, nombre);
rewrite(fichero);

for i:= 1 to longitud do
if(biblioteca[i].alta = true) then         (* DEBE DE GUARDAR SOLO LOS LIBROS QUE COMO ALTA SEA TRUE*)
write(fichero, biblioteca[i]);

close(fichero);
End;

(*-- LEE DATOS DEL FICHERO --*)
PROCEDURE lee_fichero(nombre: string; var biblioteca: Tbiblioteca; longitud: integer);

Var
 i : integer;
fichero : Tfichero;

Begin
 i := 0;

assign(fichero, nombre);
reset(fichero);

   while (not(eof(fichero)) AND (i<TAMBIBLIOTECA) ) do begin
   i := i+1;
   read(fichero, biblioteca[i]);

end;

close(fichero);

End;

(*-- FUNCIÓN QUE PRESENTA MENÚ Y DEVUELVE OPCIÓN ELEGIDA --*)
FUNCTION Menu: INTEGER;
(*VARIABLE DE LAS DIFERENTES OPCIONES DEL MENÚ*)
VAR

opc: integer;

BEGIN
(*BUCLE*)
repeat
(* PRESENTACIÓN EN PANTALLA DEL MENÚ Y LAS OPCIONES A ELEGIR *)
writeln('-----------------------------');
writeln('MENU DE GESTION DE BIBLIOTECA');
writeln('-----------------------------');
writeln;
writeln('1. ALTA DE LIBRO');
writeln('2. BAJA DE LIBRO');
writeln('3. DATOS DE PRESTAMO');
writeln('4. MODIFICACION DE DATOS');
writeln('5. GUARDAR DATOS EN FICHEROS');
writeln('6. LECTURA DE DATOS DE FICHERO');
writeln;
writeln('***PRESENTACION DE LISTADO DE BIBLIOTECA***');
writeln;
writeln('7. LISTADO DE TODOS LOS LIBROS DE LA BIBLIOTECA');
writeln('8. LISTADO DE LIBROS PRESTADOS');
writeln('9. LISTADO DE PRECIOS MAXIMOS, MINIMOS, LA MEDIA Y EL VALOR TOTAL DE LA COLECCION');  

writeln('10. SALIR');
writeln('OPCION:  ');
readln(opc);
until ( (opc>=1) and (opc <=9)or(opc=10));

Menu := opc;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!    VARIABLES GLOBALES           !!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
VAR

prestado  : Tprestado; (*variable de registro*)
biblioteca: Tbiblioteca; (*variable de registro*)
opc  : integer; (*variable de menú*)
nombre    : string; (*variable de utilización, guardar y leer de fichero*)
buscado   : integer; (*variable de procedimiento de busqueda*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!    PROGRAMA PRINCIPAL          !!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)  

BEGIN
(*Bucle*)
repeat

opc:= Menu;

case opc of

1: alta_libro(biblioteca, TAMBIBLIOTECA); (*llamada procedimiento para altas de libro*)
 
2: baja_modificacion(biblioteca, TAMBIBLIOTECA, buscado);  (* llamada procedimiento *)
3: begin (*codigo para introducir datos de prestamos de libros*)
writeln('Introducir el código del libro: ');
readln(buscado);
hacer_prestamo(biblioteca,TAMBIBLIOTECA, buscado);

end;

4: begin (*codigo para modificar datos de libro*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
writeln('Introducir codigo: ');
readln(buscado);
modificacion(biblioteca, TAMBIBLIOTECA, buscado);(*LLamada procedimiento*)
end;

5: begin (*Codigo para grabar fichero*)
writeln('Introduzca el nombre del fichero de datos: ');
readln(nombre);
graba_fichero(nombre, biblioteca, TAMBIBLIOTECA);  (*LLamada procedimiento*)
  end;
6: begin (*Codigo para lectura de fichero*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
imprime_biblioteca(biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
  end;
7: begin (*Codigo para la lectura de todos los libros*)
writeln('Introduzca el nombre del fichero: ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
imprime_biblioteca(biblioteca, TAMBIBLIOTECA);(*LLamada procedimiento*)
  end;

8: imprime_prestados(prestado, TAMBIBLIOTECA); (*LLamada procedimiento*)

9: begin (*codigo para sacar estadisticas del precio de los libros*)
writeln('Introduzca el nombre del fichero : ');
readln(nombre);
lee_fichero(nombre, biblioteca, TAMBIBLIOTECA); (*llamada procedimiento*)
writeln('--------------------------------------------------------------');
writeln('LISTADO DE PRECIOS MAXIMOS, MINIMOS, LA MEDIA Y EL VALOR TOTAL');
writeln('--------------------------------------------------------------');
Resultados(biblioteca, TAMBIBLIOTECA); (*Llamada a procedimiento resultados, donde he aprendido que cuando que creando este procedimiento si funciona,
pero si lo haces llamando a cada función pues no*)

  end;


 
end;
until(opc=10);


END.


03-May-2011 19:30
Nacho Cabanes (+84)

Lo siento, pero es que no acabo de entender la lógica de cómo lo pretendes hacer, porque no aclaras lo que hace cada parámetro a las funciones, y en muchas ocasiones no es evidente.

Insisto en que, aunque te quede poco tiempo, o lo haces bien, o no va a salir jamás.  

Por ejemplo, en "hacer_prestamo" supongo que le pasas el array y su longitud para no usar variables globales, y que la variable "buscado" se refiere al número de libro que vas a buscar. Pero aun suponiendo que esté en lo cierto, hay mucho que corregir. Algunas de las cosas:

- Si quieres recorrer todas las fichas, no puedes hacer

For i:= 1 To longitud Do;

porque es línea termina en un punto y coma, así que no repite nada. En todo caso, sería

For i:= 1 To longitud Do
 begin
 ..
 end;

(o al menos quitar el punto y coma, si sólo repites una orden)

pero es que no necesitas recorrer todo el array si buscas por el número de ficha. Sí será necesario si buscas por código, así que supondré que es eso (entonces, llama "codigoBuscado" a la variable o pon comentarios que lo aclaren).

- Para dar un valor a una variable, no se usa el tipo de datos, sino la variable en sí: no tiene sentido hacer

readln(Tprestado.nom_apellidos);

sino

readln(biblioteca[i].datos.nom_apellidos);

- No usas la variable "encontrado" al final del proceso: deberías avisar en caso de no encontrar nada, o, por el contrario, eliminarla.

- Deberías marcar de alguna forma que ese libro ya se ha prestado, o seguir algún criterio alternativo, como dejar a 0 o a cadena vacía los valores de los que no están prestados. En algún momento, deberían poder "devolverse préstamos".

Esa función debería ser algo como:

(* PROCEDIMIENTO PARA INTRODUCIR DATOS DE LOS PRESTAMOS *)
(* Parámetros:
* biblioteca: el array que contiene los libros
* longitud: tamaño -real- del array
* codigoBuscado: codigo del libro que se desea prestar
*)
Procedure hacer_prestamo(Var biblioteca: Tbiblioteca; longitud: integer;
   codigoBuscado: integer);
Var
 i: integer;
Begin
 For i:= 1 To longitud Do
     Begin
     If biblioteca[i].codigo = codigoBuscado Then
       Begin
         {biblioteca[i].prestado := true;}
         writeln(' Introducir Nombre y Apellido: ');
         readln(biblioteca[i].datos.nom_apellidos);
         writeln(' Introducir Email:  ');
         readln(biblioteca[i].datos.email);
         writeln(' Introducir Fecha: ');
         readln(biblioteca[i].datos.fecha);
       End;
     End;
End;



(La línea de "prestado := true" está comentada porque no tiene sentido en tu fuente).

Por cierto, intenta no dejar líneas en blanco en el cuerpo de la función, y dejar dos entre una función y otra, para mejorar la legibilidad. Si tus funciones son largas y complejas, y decides separar bloques dentro de una función usando una línea en blanco, entonces deja 3 entre una función y otra.



03-May-2011 22:58
Manuel Molina

Muchísimas gracias.
un saludo nacho.






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