+Caesar

Program hola;
uses crt;
const
z=3;
type letra=(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,V,X);
var
s:string;
i,j:integer;
fin:text;
fout:text;
l:letra;
begin
assign(fin,'caesar.in');
assign(fout,'caesar.out');
reset(fin);
rewrite(fout);
read(fin,s);
for i:=1 to ord(s[0]) do
for j:=1 to 21 do
if(s=l[j]) then write(fout,l[j+3]);
end.
Con este programa pretendía hacer otra versión del caesar en el que alfabeto se reduce a las letras de type letra. Pero este programa me da más errores que lineas(en la definición de variables creo que las confunde con type letra o algo así). Me podrías decir que tengo que modificar o de que forma tengo que realizar el programa.
Gracias

1 respuesta

Respuesta
1
En primer lugar, perdona la tardanza, pero es que estaba de vacaciones. Acabo de volver, y son las tres de la madrugada, así que, por ahora, sólo lo voy a mirar un poco por encima. Mañana lo miraré más a fondo. Y te daré una explicación más amplis.
El type letra que defines es un tipo enumerado. Esto quiere decir que una variable de tipo letra puede contener el símbolo (atención: no el carácter) A, B, C, etc. Los tipos enumerados, en Pascal, se pueden ver como una definición de constantes en que el primer símbolo que defines tiene un ord() igual a 0, el segundo, 1, etc. No se puede consultar su valor, no se pueden "escribir" (con write, writeln, etc). Sólo se puede asignar a una varable, comparar, hallar el anterior en el tipo (pred()) o el posterior(succ()) si existen (si no dará error) Para mi gusto, su utilidad es más para hacer más legibles los programas que para cualquier otra cosa.
Una variable de tipo letra, entonces, contendrá un único valor que será el símbolo a, el B, etc. No se puede tratar como un array. Tampoco, como ya he dicho, se puede imprimir.
Para hacerlo sólo para las letras, puedes intentar lo siguiente: para cada carácter, halla el ord() de dicho carácter. Si no corresponde a una
letra (problema 1), lo escrbes. Si corresponde a una letra, piensa cómo puedes hacer una traslación directa de la siguiente forma:
La 'A' se convertiría en 'D' (3 caracteres más)
la 'B', en 'E'
...
la 'U', en 'X'
la 'V', en 'Y'
la 'W', en 'Z'
la 'X', en 'A'
la 'Y', en 'B'
y, por último, la 'Z' en 'C'
No es muy difícil: piénsalo, ya ya me dirás.
Bueno, me voy a dormir. Mañana repasaré el resto del programa, que ahora no estoy para muchos trotes.
Muchas gracias por la ayuda. ¿Tardanza? Tardanza para mi sería esperar una semana, tu respuesta fue inmediata. Ahora me he dado cuenta de que lo que no se corresponda en lo natural con su ascii de tres números adelante lo puedo cambiar manualmente. De todas formas me interesaría saber si se puede hacer en forma de type, trabajando con esa enumeración.
Yo diría que utilizar un tipo enumerado para este problema (que no sea el tipo char, que es un tipo enumerado) no es más que una enorme pérdida de tiempo y, además, sólo consigue hacer más incomprensible la solución. Para mi gusto, hay pocos casos en los que crear un tipo enumerado es útil: por ejemplo, para definir estados (abierto, cerrado), (cmiendo, pensando, esperando), etc.
El tipo enumerado tiene varios problemas a la hora de darles otra aplicación:
1.- No se pueden definir nuevos valores más que modificando el programa.
2.- No puede asignarse un valor a una variable de tipo enumerado a partir del valor entero que le corresponde como ord(), salvo si hacemos un bucle que haga los succ() necesarios.
3.- No se puede dar un valor leyendo desde la entrada estándar, ni se puede escribir en la salida estándar, ni se pueden leer/escribir en un fichero de texto, ni ee ficheros de tipo "no compatible" con el tipo.
Espero que haya sido suficiente. Si tienes más dudas, no dudes en preguntar.
SkullGirl.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas