[ Foro de Pascal ]

como calcular la frecuencia de cada letra en cada palabra...

08-Jun-2012 21:09
oscar gomez
4 Respuestas

cordial saludo profesor nacho cabanes y compañeros.

si leo dos palabras por teclado,queria preguntarles como puedo hacer la definicion de variables para poder por cada palabra almacenar en un array la frecuencia de sus letras, ,mi idea es porejemplo si las palabras son:

carro y vaca

tener en dos vectores o en una matriz es que no se como podria ser, para tener porejemplo para la palabra carro un vector con la frecuencia de sus letras, al igual que para la palabra vaca en otro vector la frecuencia de sus letras y luego como podria comparar dichos vectores para saber si son iguales en todas sus frecuencias de letras.

ojala puedan ayudarme es una idea que tengo para un programa y en esta parte estoy bloqueado. mil gracias a todos.


10-Jun-2012 07:31
Nacho Cabanes (+84)

La frecuencia de las letras se puede guardar en un array cuyos índices sean las letras, y que almacene la cantidad de apariciones de cada letra:

var
 frecuencia: array['a'..'z'] of integer;


Si tienes varias palabras, podrías usar un array como ese para cada palabra.


10-Jun-2012 15:10
oscar gomez

gracias profesor Nacho por responder a nuestras consultas.

profesor exactamente lo habia trabajado tal me lo indicas,ahora se que mi idea esta correcta sin embargo tengo el problema de como incremento la frecuencia para la segunda palabra, yo intento hacer lo siguiente:
...
type

 talfabeto=array[1..26] of char;
 tfrecletraspalabras: array['a'..'z'] of integer;


var
palabra:string[20];
alfabeto:talfabeto;
frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;
i,j,l:integer;
...

{inicializo a cero los indices para las frecuencias de cada una de las dos palabras}

for l:='a' to 'z' do
 begin
  frecuLetraspal1[l]:=0;
  frecuLetraspal2[l]:=0;
end;

for i:=1 to 26 do {array alfabeto con sus elementos el alfabeto}
 alfabeto[i]:=chr(i+96);

for i:=1 to 2 do
begin
 writeln('escriba la palabra',i,':');
 readln(palabra[i]);
 end;

{***** aqui esta mi problema....}
for i:=1 to 2 do
for j:=1 to length(palabra[i]) do
 begin
  letra:=palabra[j];
  for k:=1 to 26 do
   if letra=alfabeto[k] then
      inc(frecuLetraspal1[chr(k)]);
  end;

te quiero pedir tu ayuda a corregirme o indicarme que debo hacer pues lo que intento como ves en este ultimo fragmento es incrementar la frecuencia de las letras de cada palabra( palabra1 y palabra 2), pero la verdad NO SE COMO HACER PARA INCREMENTAR EL CASO DE LA PALABRA2(frecuLetraspal2),como deberia ser el codigo para mejorar lo que intento hacer profesor,y como luego podria comparar los dos arrays: frecuLetraspal1 y frecuLetraspal2. te lo agradeceria es que estoy frenado en ello hace dias. mil gracias por tu atencion y siempre valiosa ayuda.


11-Jun-2012 12:15
Nacho Cabanes (+84)

Si planteas "frecuenciaDeLetras" como un array de dos dimensiones, te será más fácil de automatizar ese tipo de operaciones:


var
  frecuLetraspa: array[1..2] of tfrecletraspalabras;

...

for i:=1 to 2 do 
  for j:=1 to length(palabra[i]) do
    begin
    letra:=palabra[j];
    for k:=1 to 26 do
      if letra=alfabeto[k] then
        inc(frecuLetraspa[i][chr(k)]);
    end;


11-Jun-2012 20:58
oscar gomez

cordial saludo profesor nacho.

solo una duda al respecto,cuando haces:
inc(frecuLetraspa[i][chr(k)]);

por que puede hacerse de esta forma si frecuLetraspa es un vector y no una matriz, o es que se esta trabajando con vectores paralelos, ojala puedas sacarme de esta duda.


ahora bien profesor ya teniendo para cada palabra sus frecuencias como hago para saber si son iguales, pues yo intento hacer algo pero no me esta saliendo,¿como podria hacerlo, ojala me heches una mano en ello:

yo intento hacer:

identidad:=false;
for l:='a' to 'z' do
  if freculetraspal[1][l] = freculetraspal[2][l] then
    identidad:=true
    else
     identidad:=false;


if identidad = true then
 writeln('sus frecuencias son iguales')
 else
  writeln('sus frecuencias no son iguales');


pero siempre me sale en ejecucion:
" sus frecuencias son iguales", que podre estar haciendo mal ?

gracias por tu ayuda.    









(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)