Ejercicio Pascal

Iniciado por cosmolei, 3 Junio 2016, 21:28 PM

0 Miembros y 1 Visitante están viendo este tema.

cosmolei

Hola debo de resolver el siguiente ejercicio:

Ficheros y césar
En la práctica 3 construiste un programa que calculaba el cifrado César de una frase, dado un
desplazamiento. Para descifrar un texto cifrado, es necesario conocer el desplazamiento con el
que se codificó para recuperar la letra. No obstante, si no se conoce dicho desplazamiento, se
puede deducir. Si el texto está en español se sabe que, estadísticamente, la letra que más se
utiliza es la letra "e" (tanto mayúscula como minúscula). Por tanto, se puede asumir que la
letra que más aparece en el texto cifrado es la representación de la "e" y con ello deducir el
desplazamiento.
Escriba un programa PASCAL que descifre un fichero de texto (cuyo nombre es
introducido por el usuario) utilizando la técnica anteriormente expuesta y lo muestre por
pantalla, junto con la letra que más se repite y el desplazamiento usado, tal y como se muestra
en el siguiente ejemplo:
Contenido del fichero 'texto.txt' Salida del programa
Kr sgy hxkbk jkyvoyzk ky kr zktkx
ktikxxgjuy ruy sktkyzkxky jkr
jkyzotu.
Introduce nombre de fichero: texto.txt
La letra que mas aparece es la: k
El desplazamiento estimado es de: 6
texto.txt descifrado es:
El mas breve despiste es el tener
encerrados los menesteres del destino.
Para poder descifrar el texto, debes haber deducido primero el desplazamiento y, para ello,
debes haber buscado la letra que más aparece, y compararla con la "e" para calcular el
desplazamiento. Puede que te sea útil recordar alguno de los ejercicios de la práctica 4.



Para ello he llevado a cabo lo siguiente:

program descifrado;
type
   
   tpVector = array ['a'..'z'] of integer;

   
   function aMinus(letra:char):char;
   // Pre: letra es una letra mayuscula o minuscula
   // Post: la funcion devuelve la letra minuscula
   begin
      if (letra>='A') and (letra<='Z') then
         aMinus:=chr(ord(letra)-ord('A')+ord('a'))
      
      else
         aMinus:=letra;
      
   end;
   
   procedure Apariciones (var f:text;var v:tpVector;var des:integer);
   
   // Pre: Texto es el fichero que vamos a descifrar,v es el vector que contiene el numero de la aparicion de cada letra, des es el desplazamiento respecto de 'e'
   // Post: El procedimiento devuelve el valor del desplazamiento, y la letra que mas ha aparecido
   var i,a:char;
   begin
      for i:='a' to 'z' do
         v:=0;
      reset(f);
      while not eof(f) do
      begin
         while not eoln(f) do
         begin
            read(f,i);
               if ((i>='A') and (i<='Z')) or ((i>='a') and (i<='z')) then begin
                  aMinus(i);
                  v:=v+1;
         end;
         readln(f);
      end;
   
      a:='a';
      for i:='a' to 'z' do
      begin
         if v[a]>v then
            a:=i
         else
            a:=a;
      end;
      {Comparacion del vector para ver cual es la letra que mas veces ha aparecido}
      write('La letra que mas aparece es la: ',a);
      
      des:=ord(a)-ord('e');
      write('El desplazamiento esperado es de: ',des);
      {Comparar la letra que mas ha aparecido con la e para concretar el desplazamiento}
      
      end;
   end;
   
   procedure descifrarcesar (var texto:text; var des:integer;);
   // Pre: Texto es el fichero que vamos a descifrar,des es el desplazamiento que vamos a des aplicar a cada letra del fichero
   // Post: El procedimiento devuelve el fichero de texto descifrado
   var i,a:char;
   begin
      reset(f);
      while not eof(texto) do
      begin
         while not eoln(texto) do
         begin
            read(f,i);
               if ((i>='A') and (i<='Z')) or ((i>='a') and (i<='z')) then
               begin
                  a:=char(ord(i)+des);
                  write(a);
               end;
         end;
         readln(f);
         writeln();
      end;
   end;
               

var
   fichero:text; a:string[20], vectorletras:tpVector; d:integer;
begin
   write('Introduce nombre de fichero: ');
   read(a);
   {No apliczar funcion dentro de funcion}
   assign(f,a);
   Apariciones(fichero,vectorletras,d):
   descifrarCesar(fichero,des);
end.
   
   
me da error al compilar en el procedure Descifrar cesar de:
syntax error identifier expected but ')' found

Alguien le ve algun fallo más y me puede decir como solucionar este?

_TTFH_3500

Código (pascal) [Seleccionar]
Procedure descifrarcesar (VAR texto: text; VAR des: Integer);

El punto y coma antes del paréntesis de cerrado no va.

Como Pascal no es Case-Sensitive trata de escribir los identificadores con mayúscula al comienzo y otros todo es mayúscula como EOLN EOF AND OR BEGIN END VAR TYPE
Queda mucho más legible.

Ejemplo:
Código (pascal) [Seleccionar]
PROGRAM Muestra2 (input, output);
CONST
    medio = 0.5;
VAR
    num  : Real;
    a, b : Integer;
BEGIN
    ReadLn(num); (* Obtener un valor para num de
                          la entrada estandar *)

    a := round (num);
    b := trunc (num + medio);
    WriteLn (num, a, b) (* Exhibir num, a, y b *)
END.

cosmolei

Cita de: _TTFH_3500 en  4 Junio 2016, 02:39 AM
Código (pascal) [Seleccionar]
Procedure descifrarcesar (VAR texto: text; VAR des: Integer);

El punto y coma antes del paréntesis de cerrado no va.

Como Pascal no es Case-Sensitive trata de escribir los identificadores con mayúscula al comienzo y otros todo es mayúscula como EOLN EOF AND OR BEGIN END VAR TYPE
Queda mucho más legible.

Ejemplo:
Código (pascal) [Seleccionar]
PROGRAM Muestra2 (input, output);
CONST
    medio = 0.5;
VAR
    num  : Real;
    a, b : Integer;
BEGIN
    ReadLn(num); (* Obtener un valor para num de
                          la entrada estandar *)

    a := round (num);
    b := trunc (num + medio);
    WriteLn (num, a, b) (* Exhibir num, a, y b *)
END.


Hola, he conseguido ya que el programa se compile, pero una vez lo ejecuto me da un runtime error que no consigo solucionar, no veo donde esta el problema, si me pudierais os lo agradecería