Necesito me ayudeis a ver que código esta mal preincipalmente el menu. no estoy muy  seguro si es correcto lo que he codificado
PROGRAM Bibliotecas;
(* Tamaño de cada registro que se pide *)
CONST
   TAMMAXI            = 40;
   TAMBIBLIOTECA     = 25;
   
TYPE
(* registro anidado que define las características de cada libro *)
   
   Tprestado = record
      
      nom_apellidos : string [TAMMAXI];
      email         : string [TAMMAXI];
      fecha        : char;
      end;
   
   
   Tlibro = record
         datos  : Tprestado;
         titulo : string [TAMMAXI];
         autor  : string [TAMMAXI];
         tema   : string [TAMMAXI];
         precio : integer;
         alta   : boolean;
      
         end;
   
   
(* -- TABLA SOBRE LA QUE VAMOS A TRABAJAR EN EL PROYECTO BIBLIOTECA --*)
   Tbiblioteca = array[1..TAMBIBLIOTECA] of Tlibro;
      Tfichero = file of Tlibro;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
(*!!!!!!!!!!!!!!!!    VARIABLES GLOBALES           !!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
VAR
libro     : Tlibro;
prestado  : Tprestado;
biblioteca: Tbiblioteca;
libro_prestado : Boolean;
alta      : Boolean;
fichero   : char;
opc        : integer;
opc1      : integer;
nombre    : string;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
(*!!!!!!!!!!!!!!!! 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;
   writeln('Alta o baja (true, false): ');
   readln(libro.alta);
   writeln('Titulo: ');
   readln(libro.titulo);
   writeln('Autor: ');
   readln(libro.autor);
   writeln('Tema: ');
   readln(libro.tema);
   writeln('Precio: ');
   readln(libro.precio);
   writeln;
   
end;
(* PRESENTAR LISTADOS DE LA BIBLIOTECA *)
PROCEDURE imprime_libro(libro: Tlibro);  
begin
                                         
      writeln('--------------------------------------');
      writeln('LISTADO POR LIBRO');
      writeln('--------------------------------------');
      
      writeln('Alta o baja (true o false)',libro.alta);
      writeln('Titulo : ', libro.titulo);
      writeln('Autor : ' , libro.autor);
      writeln('Tema : ', libro.tema);
      writeln('Precio : ',libro.precio);
        writeln;
      writeln('--------------------------------------');
   
end;
PROCEDURE lee_prestamos(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;
   
end;
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('----------------------------------------');
      
lee_prestamos(prestado);
      
   end;
   
end;
(* -- CON ESTE PROCEDIMIENTO PRETENDO BUSCAR Y MODIFICAR SU ESTADO DE ALTA, BAJA O MODIFICAR --*)
PROCEDURE busca_datos( biblioteca: Tbiblioteca; longitud: integer; buscado: char);
var
       i  : integer;
encontrado: Boolean;
begin
encontrado:= false;
for i:= 1 to longitud do
   begin
    
      if biblioteca .titulo = buscado then begin
      imprime_libro(biblioteca);
      encontrado:= true;
      end;
   
   end;
      
   begin
   
      if encontrado = false then begin
      lee_libro(biblioteca);
      end;
      
   end;
end;
(* -- PENDIENTE DE REALIZAR --*)
(* PROCEDURE baja_libro( var libro: Tlibro; longintud: integer);
begin
end; *)
(* -- PENDIENTE DE REALIZAR --*)
(*procedure modificar_datos(var prestado: Tprestado; longitud:integer);
begin
end;*)
(* lISTADOS DE TODOS LOS LIBROS *)
PROCEDURE imprime_libros(biblioteca: Tbiblioteca; longitud: integer);
var
i: integer;
begin
for i:= 1 to longitud do
   begin
      writeln('--------------------------------------');
      writeln('LISTADO DE TODOS LOS LIBROS BIBLIOTECA');
      writeln('--------------------------------------');
      
      imprime_libro(biblioteca);
   
   end;
   
end;
(* FUNCION QUE DEVUELVE EL VALOR TOTAL DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION suma_coleccion(biblioteca: Tbiblioteca; longitud: integer): real;
var
i: integer;
suma: integer;
begin
suma:= 0;
for i:= 1 to longitud do
   begin
   
      suma:= suma + biblioteca.precio;
      
   end;
   
end;
(* FUNCIÓN QUE DEVUELVE VALOR MÁXIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Maximo(bibliooteca: Tbiblioteca; longitud: integer): integer;
var
i: integer;
max: integer;
begin
max:= 0;
for i:= 1 to longitud do
   begin
   
      if max < biblioteca.precio then
         
         max:= biblioteca.precio;
      
         Maximo:= max;
   
   end;
   
end;
(* FUNCION QUE DEVUELVE VALOR MÍNIMO DE LA COLECCION DE LA BIBLIOTECA *)
FUNCTION Minimo(biblioteca: Tbiblioteca; longitud: integer): real;
var
i: integer;
min: integer;
begin
min:= 0;
for i:= 1 to longitud do
   begin
   
      if min > biblioteca.precio then
      
      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;
var
i: integer;
suma_coleccion: integer;
begin
suma_coleccion:= 0;
   
for i:=  1 to longitud do
   
      begin
      
         suma_coleccion:= suma_coleccion + biblioteca.precio;
         Media:= suma_coleccion/1.0+longitud;
      
      end;
      
end;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
(*!!!!!!!!!!!!!!!!    Funciones de ficheros   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
(*-- ALMACENA DATOS LEIDOS DE UN FICHERO --*)
  
PROCEDURE graba_fichero(nombre: string; biblioteca: Tbiblioteca; longitud: integer);
Var
  i : integer;
  fichero : Tfichero;
Begin   
  assign(fichero, nombre);
   rewrite(fichero);
for i:= 1 to longitud do
      write(fichero, biblioteca);
      
   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);
   
   end;
      
   close(fichero);
   
End;
(*-- FUNCIÓN QUE PRESENTA MENÚ Y DEVUELVE OPCIÓN ELEGIDA --*)
FUNCTION Menu: INTEGER;
VAR
opc: integer;
BEGIN
   repeat
   
      writeln('-----------------------------');
      writeln('MENÚ DE GESTIÓN DE BIBLIOTECA');
      writeln('-----------------------------');
      writeln;
      writeln('1. ALTA DE LIBRO');
      writeln('2. BAJA DE LIBRO');
      writeln('3. DATOS DE PRÉSTAMO');
      writeln('4. MODIFICACIÓN DE DATOS');
      writeln('5. GUARDAR DATOS EN FICHEROS');
      writeln('6. LECTURA DE DATOS DE FICHERO');
      writeln('7. PRESENTACIÓN DE LISTADO DE BIBLIOTECA');
            
      writeln;
      writeln('8. SALIR');
      writeln('OPCION:  ');
      readln(opc);
       until ( (opc>=1) and (opc <=7) or (opc=8)    );
 Menu := opc;
End;   
(*--  FUNCIÓN QUE PRESENTA UN SUBMENU DE LA OPCION 6 DEL MENÚ PRINCIPAL Y DEVUELVE LA OPCION ELEGIDA --*)
FUNCTION submenu: INTEGER;
VAR
opc1: integer;
BEGIN
   repeat
   
      writeln('------------------------------------------');
      writeln('MENÚ PRESENTACIÓN DE LISTADO DE BIBLIOTECA');
      writeln('------------------------------------------');
      writeln;
      writeln('9. LISTADO DE TODOS LOS LIBROS DE LA BIBLIOTECA');
      writeln('10. LISTADO DE LIBROS PRESTADOS');
      writeln('11. LISTADO DE PRECIOS MÁXIMOS, MÍNIMOS, LA MEDIA Y EL VALOR TOTAL DE LA COLECCIÓN');
      writeln;
      writeln('12. VOLVER MENU PRINCIPAL');
      writeln('OPCION: ');
      readln(opc1);
      until ( (opc1>=9) and (opc<=11) or (opc1=12) );
submenu:= opc1;
END;
      
      
   
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
(*!!!!!!!!!!!!!!!!    PROGRAMA PRINCIPAL          !!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)   
BEGIN
   repeat
   
      opc:= Menu;
      
      case opc of
      
         1: lee_libro(libro);
         2: busca_datos(biblioteca, TAMBIBLIOTECA, buscado);
         3: lee_prestamos(biblioteca);
         4: busca_datos(biblioteca, TAMBIBLIOTECA, buscado);
         5: begin
            writeln('Introduzca el nombre del fichero de datos: ');
            readln(nombre);
            graba_fichero(nombre, biblioteca, TAMBIBLIOTECA);
            end;
         6: begin
            writeln('Introduzca el nombre del fichero: ');
            readln(nombre);
            lee_fichero(nombre, biblioteca, TAMBIBLIOTECA);
            end;
         7: opc1;
      end;
   until(opc=8);
   
   repeat
      opc1:= Submenu;
      
      case opc1 of
      
         9: imprime_libros(biblioteca, TAMBIBLIOTECA);
         10: imprime_prestados(prestado, TAMBIBLIOTECA);
         11: begin
            writeln('--------------------------------------------------------------');
            writeln('LISTADO DE PRECIOS MAXIMOS, MINIMOS, LA MEDIA Y EL VALOR TOTAL');
            writeln('--------------------------------------------------------------');
            writeln('Valor máximo: ');
            maximo(biblioteca, TAMBIBLIOTECA);
            writeln('Valor mínimo: ');
            minimo(biblioteca, TAMBIBLIOTECA);
            writeln('Valor medio: ');
            media(biblioteca, TAMBIBLIOTECA);
            writeln('Valor total Biblioteca');
            suma_coleccion(biblioteca, TAMBIBLIOTECA);
            end;
         12: opc;
       end;
   until(opc1=12);
END.
			
			
			
				¿Para que abres dos veces un post para el mismo problema?
http://foro.elhacker.net/programacion_general/ejercicio_en_pascal_estoy_con_el_ultimo_ejercicio-t324667.0.html