Pascal/Turbo Pascal - AYUDA POR FAVOR

 
Vista:

AYUDA POR FAVOR

Publicado por Andrés (7 intervenciones) el 07/11/2006 20:51:28
Hola si alguien sabe como hacerlo se lo agradesco

Me pide escribir un programa que ingrese texto escrito en teclado telefónico y despliegue su traducción tecla por tecla.
Cada tecla del 0 al 9 tienen diferentes caracteres,por ejemplo:
Tecla Caracteres
1 . , - ; ¿ ? ¡ ! 1
2 a b c á 2
Yo hasta ahora hice esto:

VAR
car:char;
termina:boolean;

Procedure multi(tecla:char;VAR fin_de_linea:boolean);
Const
centinela='$';
MaxMensaje=50;
Type
secuencia=ARRAY[0..10] OF char;
mensaje=ARRAY[1..MaxMensaje] OF char;
Var
primero:char;
let:secuencia;
mens:mensaje;
ind:integer;
contador_mens:integer;

Procedure LeerCaracter(VAR c:char;VAR fin:boolean);
BEGIN
IF eoln THEN
BEGIN
fin:=TRUE;
readln;
END
ELSE
BEGIN
fin:=FALSE;
read(c);
END;
END;

PROCEDURE BuscarSimbolosTecla(tecla:char;VAR letras:secuencia);
BEGIN

CASE tecla OF
'0':BEGIN
letras[0]:=' ';
letras[1]:='0';
letras[2]:=centinela;
END;
'1':BEGIN
letras[0]:='.';
letras[1]:=',';
letras[2]:='-';
letras[3]:=';';
letras[4]:=':';
letras[5]:='¿';
letras[6]:='?';
letras[7]:='!';
letras[8]:=1;
letras[9]:=centinela;
END;
'2':BEGIN
letras[0]:='a';
letras[1]:='b';
letras[2]:='c';
letras[3]:='á';
letras[4]:='2';
letras[5]:=centinela;
END;
'3':BEGIN
letras[0]:='d';
letras[1]:='e';
letras[2]:='f';
letras[3]:= '‚';
letras[4]:= '3';
letras[5]:= centinela;
END;
'4': BEGIN
letras[0]:= 'g';
letras[1]:= 'h';
letras[2]:= 'i';
letras[3]:= '¡';
letras[4]:= '4';
letras[5]:= centinela;
END;
'5': BEGIN
letras[0]:= 'j';
letras[1]:= 'k';
letras[2]:= 'l';
letras[3]:= '5';
letras[4]:= centinela;
END;
'6': BEGIN
letras[0]:= 'm';
letras[1]:= 'n';
letras[2]:= 'o';
letras[3]:= '¢';
letras[4]:= '¤';
letras[5]:= '6';
letras[6]:= centinela;
END;
'7': BEGIN
letras[0]:= 'p';
letras[1]:= 'q';
letras[2]:= 'r';
letras[3]:= 's';
letras[4]:= '7';
letras[5]:= centinela;
END;
'8': BEGIN
letras[0]:= 't';
letras[1]:= 'u';
letras[2]:= 'v';
letras[3]:= '£';
letras[4]:= '';
letras[5]:= '8';
letras[6]:= centinela;
END;
'9': BEGIN
letras[0]:= 'w';
letras[1]:= 'x';
letras[2]:= 'y';
letras[3]:= 'z';
letras[4]:= '9';
letras[5]:= centinela;
END;
END;
END;

PROCEDURE MostrarMensaje(VAR msj:mensaje);
BEGIN
IF contador_mens <= 50 THEN
BEGIN
msj[contador_mens]:= let[ind];

END
ELSE
fin_de_linea:=true;
END;
BEGIN
contador_mens:= 0;
Leercaracter(tecla,fin_de_linea);
WHILE NOT fin_de_linea DO
BEGIN
ind:= 0;
(* Comienza repeticion *)
primero:=tecla;
BuscarSimbolosTecla(primero,let);
(* Mostrar primer simbolo *)
writeln(tecla,' ->',mens[contador_mens] + let[ind] );
LeerCaracter(tecla,fin_de_linea);
WHILE NOT fin_de_linea AND (tecla = primero) DO
BEGIN
(* Sigue repetici¢n *)
ind:=ind + 1;
IF let[ind] = centinela THEN
ind:= 0;
(* Mostrar siguiente simbolo *)
writeln(tecla,' ->',mens[contador_mens] + let[ind]);
LeerCaracter(tecla,fin_de_linea);
END;
(* Termino repeticion *)
contador_mens:=contador_mens + 1;
MostrarMensaje(mens);

END;
END;

BEGIN
{programa principal}

read(car);
IF car = 'M' THEN
BEGIN
termina:=false;
multi(car,termina);
END
ELSE
writeln;

END.

Mi duda esta en como guardar el simbolo al mensaje,sabiendo que al repetir teclas t cuentan solo 1 al mensaje,y despues quiero leer de vuelta cosa que me aparescar el simbolo anterior que tenia guardado en el mensaje mas el que leo en el momento,t doy un ejemplo de salida del programa.
la primera linea que aparece a continuacion es lo que leo y despues despliega su traduccion.

>>> M777766699903-3305552022244488323
7 ->p
7 ->q
7 ->r
7 ->s
6 ->sm
6 ->sn
6 ->so
9 ->sow
9 ->sox
9 ->soy
0 ->soy
3 ->soy d
- ->soy d
3 ->soy dd
3 ->soy de
0 ->soy de
5 ->soy de j
5 ->soy de k
5 ->soy de l
2 ->soy de la
0 ->soy de la
2 ->soy de la a
2 ->soy de la b
2 ->soy de la c
4 ->soy de la cg
4 ->soy de la ch
4 ->soy de la ci
8 ->soy de la cit
8 ->soy de la ciu
3 ->soy de la ciud
2 ->soy de la ciuda
3 ->soy de la ciudad
>>>

Muchas gracias.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:AYUDA POR FAVOR

Publicado por Emanuel (1 intervención) el 07/11/2006 22:27:50
mmm... No creo que te sea de gran ayuda, pero vos podes mejorar el codigo ;)..
Usa los CASE

program caracteres;
uses crt;
var
num1 :integer;
caracter: char;
const
message1 = 'Inserte un numero: ';
begin
write(message1);
readln(num1);
case num1 of
1:
begin
write('El caracter es: X'); { Aca pones el caracter que quieras }
end;
2:
begin
write('El caracter es: X') { Igual que arriba... Y pones hací susecibamente hasta el final. Cuando llegues al ultimo numero, pone: }
end;
else
begin
writeLn('Error - No a seleccionado ningun numero');
end;
end;
...
Espero que te sirva el ejemplo :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA POR FAVOR

Publicado por Andres (7 intervenciones) el 07/11/2006 23:57:08
En realidad mi duda no esta ahi sino en como guardar el mensaje.
Igual Gracias.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA POR FAVOR

Publicado por Carlos Guimaraenz (265 intervenciones) el 08/11/2006 01:26:34
Hola Andrés!! Aquí te muestro algo que pude hacer... sales del programa con la tecla 's'. Cambias de letra o símbolo presionando la misma tecla... para cambiar al siguiente lugar debes presionar ENTER.
No he llegado a comentarlo, pero te explico en palabras:
TBotones es un arreglo con 10 teclas, que son strings conteniendo los símbolos correspondientes (por ej.: 5 --> klm5). Cuando el usuario presiona una tecla, se verifica que sea válida (del '0' al '9', o 's' para salir, o ENTER para cambiar de posición). Si es un caracter numérico, si es el mismo que presioné antes, pasa al siguiente símbolo (circular), sino empieza con el 1º del nuevo caracter presionado. Si es ENTER, paso a la siguiente posición, y si es 's' termino la ejecución. En la variable «mensaje» se va guardando el mensaje, por si necesitas guardarlo en un archivo por ejemplo. Espero que te sea de utilidad. Un abrazo!

<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
program SMSCelulares;

uses crt,dos;

type

TBoton = string[9];

TBotones = array['0'..'9'] of TBoton;

{procedure que inicializa los simbolos de cada boton}
procedure InicializarBotones(var botones : TBotones);
begin
botones['0']:=' 0';
botones['1']:='.,-;:¨?!1';
botones['2']:='abc 2';
botones['3']:='def‚3';
botones['4']:='ghi¡4';
botones['5']:='jkl5';
botones['6']:='mn¤o¢6';
botones['7']:='pqrs7';
botones['8']:='tuv£8';
botones['9']:='wxyz9';
end;

{CODIGO PRINCIPAL}
var
mensaje : string;
posX,posY,i : byte;
tecla,anterior : char;
botones : TBotones;
validas : set of char;
begin
ClrScr;
InicializarBotones(botones);
validas:=['0'..'9','s',Chr(13)];
mensaje:='';
posX:=1;
posY:=1;
anterior:='$'; {cualquier simbolo}
i:=1;
repeat
repeat
tecla:=ReadKey;
until(tecla in validas);
if (tecla >= '0') and (tecla <= '9') then
begin
GoToXY(posX,posY);
if tecla = anterior then
begin
if i < Length(botones[tecla]) then
i:=i + 1
else
i:=1;
end
else
i:=1;
Write(botones[tecla][i]);
end
else
if tecla = Chr(13) then
begin
mensaje:=mensaje + botones[tecla][i];
if posX < 80 then
posX:=posX + 1
else
begin
posY:=posY + 1;
posX:=1;
end;
end;
anterior:=tecla;
until(tecla = 's');
end.
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA POR FAVOR

Publicado por Andrés (7 intervenciones) el 08/11/2006 03:07:48
Agradezco mucho la ayuda que me distes pero me veo en la imposibilidad de usar determinadas palabras que la tarea me impide,a saber: uses, crlscr, gotoxy, crt, readkey, shortint, longint, string, etc.

No sé sin el uso de esas palabras,podras atender mi duda de nuevo gracias salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA POR FAVOR

Publicado por Carlos Guimaraenz (265 intervenciones) el 08/11/2006 03:25:39
La verdad es que estás bastante limitado... realmente no veo cómo se podría hacer sin utilizar todo eso...
Espero que alguien pueda darte una mano porque en este momento no se me ocurre nada. Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar