program dicc;
uses crt;
const {array con el diccionario}
palabras: array[0..31] of string = ('zero', 'one', 'two',
'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten',
'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen',
'seventeen', 'eighteen', 'nineteen', 'twenty', 'thirty', 'forty',
'fifty', 'sixty', 'seventy', 'eighty', 'ninety', 'hundred',
'thousand', 'million', 'negative');
var
i: byte;{indice para ir recorriendo el array}
num, aux: longint;{num: numero que representa cada linea; aux:auxiliar}
palabra, frase: string;{frase:cada linea nueva que se lee}
f, ff: text;{ficheros de entrada y salida}
negativo: boolean;
function numero(s:string): longint;
{transforma una palabra en su numero correspondiente}
begin
i:=0;
while (palabras[i]<>s) do inc(i);
if i<=20 then
numero:=i
else
if (i=31) then
begin
negativo:= true;
numero:=0;
end
else
if i<28 then
numero:= 20+((i mod 10)*10)
else numero:= 0;
end;
procedure sacarnumeros;
{para cada numero leido en letras se sacan sus digitos}
var k: byte;
begin
k:=1;
while k<=length(frase) do
begin
palabra:='';
while (frase[k]<>' ') and (k<=length(frase)) do
begin
palabra:=palabra+frase[k];
inc(k);
end;
aux:= aux + numero(palabra);
if i=28 then aux:= aux*100;
if i=29 then begin
num:= num + (aux*1000);
aux:=0;
end;
if i=30 then begin
num:= aux*1000000;
aux:=0;
end;
inc(k);
end;
end;
begin
assign(f, 'ING.DAT');
reset(f);
assign(ff, 'ING.RES');
rewrite(ff);
while not(eof(f)) do
begin
readln(f, frase);
num:= 0;
aux:=0;
negativo:= false;
sacarnumeros;
num:=num+aux;
if negativo then writeln(ff, 0-num)
else writeln(ff, num);
end;
close(f);
close(ff);
end. |