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?