Pascal/Turbo Pascal - Frecuencia de caracteres en un fichero

   
Vista:

Frecuencia de caracteres en un fichero

Publicado por MAnuuu (10 intervenciones) el 16/08/2010 13:51:13
wenas a todos haber el programa que estoy haciendo es muy tedioso por lo menos para mi nivel de experiencia jeje lo ultimo q necesito para acabarlo es tengo diferentes ficheros de texto y me manda calcular la frecuencia de cada caracter ascii dentro del texto en plan lee una a x ejemplo y cuenta 1 a luego lee dos puntos me cuenta 1 vuelve a haber otra pues mas 2.
La unica forma de hacerlo que se me ocurre es hacer 256 contadores para cada caracter ascii y como q supongo yo q abra otra forma menos tediosa agradeceria una respuesta porque se me an acabado las ideas y google no arroja nada :(.
Gracias y un saludo ;).
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:Frecuencia de caracteres en un fichero

Publicado por micropais (209 intervenciones) el 16/08/2010 20:40:59
uses crt;
var cnt_X: array['a'..'z'] of longint;
var i:char;
var caracter:char;

begin
clrscr;
caracter:=#0; // arbitrario, en char no existe cadena vacia ''
while caracter<>'0' do
begin
writeln;
writeln ( 'introduce un caracter a..z + intro , escribe 0 salir');
readln( caracter);

if ( caracter in ['a'..'z'] )
then inc ( cnt_X[caracter] )
else writeln ('el caracter [',caracter, '] no se tendr  en cuenta');

// ----------------------------
for i:='a' to 'z' do
begin
write(i,':',cnt_X[i],' ');
end;
// ----------------------------

end; // fin del bucle while

writeln;
writeln('programa finalizado');
readln;

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:Frecuencia de caracteres en un fichero

Publicado por MAnuuu (10 intervenciones) el 17/08/2010 01:04:08
Gracias amigo el problema esta en que no puedo usar CRT para hacerlo y no solo es de la A a la Z son todos los caracteres ascii puntos, puntos y coma, exclamaciones, numeros, simbolos, etc. Creo que me voy a volver crazy xDD.
Muxas gracias de todas formas tio :D
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:Frecuencia de caracteres en un fichero

Publicado por epayan (71 intervenciones) el 17/08/2010 05:13:09
eso no es problema , ahi esta sin CRT
usa un poco el coco para hacer lo demas , el buen micropais , te puso las bases

var cnt_X: array['a'..'z'] of longint;
var i:char;
var caracter:char;

begin

caracter:=#0; // arbitrario, en char no existe cadena vacia ''
while caracter<>'0' do
begin
writeln;
writeln ( 'introduce un caracter a..z + intro , escribe 0 salir');
readln( caracter);

if ( caracter in ['a'..'z'] )
then inc ( cnt_X[caracter] )
else writeln ('el caracter [',caracter, '] no se tendr en cuenta');

// ----------------------------
for i:='a' to 'z' do
begin
write(i,':',cnt_X[i],' ');
end;
// ----------------------------

end; // fin del bucle while

writeln;
writeln('programa finalizado');
readln;

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:Frecuencia de caracteres en un fichero

Publicado por MAnuuu (10 intervenciones) el 17/08/2010 11:44:33
Wenass tio haber esq el problema esta en que no es solo con valores de la A a la Z sino con todos los valores de la tabla ascii. Mejor explico de que va el programa que tengo que hacer:
-Tengo que crear un programa en el cual ingrese el nombre de n ficheros y luego tenga un menu que tenga Codificar Decodificar y Salir. En la parte de codificar consiste en abres el fichero que quiero codificar lo recorres entero carcter a caracter y vas guardando la frecuencia de repeticion de cada caracter, y luego se miraria cual es el caracter que mas se repite y mirar tambien cuantas vecs se repite: xejemplo la C es la letra con mayor frecuencia de aparicion en el texto con 400 repeticiones, entonces ese 400 es lo que le tengo q sumar a cada caracter de texto para codificarlo.
Luego hay que hacer mas cosas por ahi pero lo unico que me falta es solo el algoritmo de busqueda del caracter que mas se repite.

function buscarX (fichero: string): integer;
var
i: integer;
Letra: char;
cont: integer;
begin
Letra:= 'x';
cont:= 0;
for i:= 1 to Length (fichero) do (*Con la funcion length recorremos la linea desde el primer caracter al ultimo*)
if linea[i] = Letra then
cont:= cont+1;
buscarX:= cont;
end;

Por ejemplo esta es una funcion de un programa que tenia por ahi con esta funcion cambiando el valor de Letra lo que hace es que con el for recorre el texto desde el primer caracter hasta el fin de texto y lo condicionamos a que si en cualquier posicion del texto hay una X (en este caso) sumamos +1 al contador.
Ahora aqui mi problema, para saber cuantas vecs se repite un caracter en un texto no hay problema ninguno aora crear 256 contadores para todos los caracteres del codigo ascii es un tanto arduo.
Asi que agradeceria muchisimo una ayuda a mi problema, es sin mas detectar en un texto el caracter que mas se repite (pero no solo de A a Z). GRACIAS A MIS POSIBLES SALVADORES!!
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:Frecuencia de caracteres en un fichero

Publicado por micropais (209 intervenciones) el 17/08/2010 12:16:40
Gracias epayan , hola MAnuuu , aqui no se suelen hacer tareas completas y tampoco era mi intencion que el programa fuera tu tarea si eso es lo que desea cambia el enunciado , pues hay mucha gente en este foro que hace tareas previo pago.

¿Que te impide ? hacer esto :

var cnt_X: array[#0..#255] of longint;

Esto abarca TODOS los caracteres incluidos los de control . claro que tendras que adaptarlo a tu códe , tampoco es la unica solucion eso es lo bueno de
pascal y sobre todo de los pascaleros . la mejor forma de seguro es la que te hayan dado tus profes , busca en tu material haber que habeis dado y que podeis usar.
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:Frecuencia de caracteres en un fichero

Publicado por MAnuuu (10 intervenciones) el 17/08/2010 12:49:58
Wenas micropais siento haber parecido ansioso, es que llevo con esto 5 dias y el profesor esta de vacaciones por eso ando como loco.
Gracias a ciertas pistas que saque de vosotros llegue a esta conclusion:

function buscarX (fiche: string): integer;
var
i: integer;
x: char;
cont: integer;

begin

for x:= #1 to #255 do
begin
cont:= 0;
for i:= 1 to Length (fiche) do (*Con la funcion length recorremos la linea desde el primer caracter al ultimo*)
begin
if linea[i] = x then
cont:= cont+1;
end;

writeln('Hay ' ,cont, ' caracteres: ' ,x);
end;
buscarX:= cont;
end;

Modifique la funcion que cree y lo puse en otra perspectiva lo que hace esta funcion es coger el primer caracter ascii y compararlo con todo el texto y si esta me lo guarda y me imprime por pantalla cuantas veces esta repetido el caracter y asi con todos los caracteres. Ahora lo unico que me falta es el como quedarme solo con el valor que mas se repite ya que en el contador no almaceno nada lo que hago es que me diga tienes tantas As x ejemplo y luego vuelve a ponerse a 0 el contador para la siguiente caracter. ¿Como podria crear un array del contador para que me diga en cont[1] el caracter #1 se repite X veces luego sea en cont[2] el caracter #2 se repite X veces y asi sucesivamente? ¿Y luego como haria para detectar solo el mayor y que se imprima por pantalla? Ya con esto ultimo estaria acabada la funcion y ya acabaria mi programa. Gracias y perdon por parecer desesperado.
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:(Solucionado) Frecuencia de caracteres fichero

Publicado por MAnuuu (10 intervenciones) el 17/08/2010 16:01:21
Wenas a todos despues de probar y probar ya me a salido es un metodo un poco rudimentario pero funciona jeje:

function buscarX (fiche: string): integer;
var
i: integer;
x: char;
cont: integer;
conta: integer;

begin

conta:=0;
for x:= #1 to #255 do
begin

for i:= 1 to Length (fiche) do
begin
if linea[i] = x then
cont:= cont+1;
end;

writeln('Hay ' ,cont, ' caracteres: ' ,x);
if cont>=conta then
conta:= cont;
if cont<conta then
conta:=conta;
cont:= 0;

end;

writeln('El valor que mas se repite, se repite ',conta,' veces');


buscarX:= cont;
end;

Y con esto ya detectaria el caracter que mas veces se repite :D gracias por vuestras respuestas un saludo.
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:(Solucionado) Frecuencia de caracteres fichero

Publicado por micropais (209 intervenciones) el 17/08/2010 18:36:18
hola MAnuuu me alegro de que te hayamos sido de utilidad y me alegro mucho mas por el simple echo de que tu mente trabaje , pues de eso se trata , algun dia seras tu uno mas de los que ayude a los pascaleros , echar una mano y crear la tarea entera son dos cosas muy diferentes. y aunque no lo creas la segunda perjudica bastante al pascalero , lo veras con el tiempo ¡¡¡ 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