[ Foro de Pascal ]
Hola profesor Nacho, después de varias semanas sin poder entrar al foro, por motivos de tiempo, estuve retomando cosas y aquí estoy, en esta ocasión pido tu generosa ayuda y me indiques ante todo:
1- Según mi código, ¿ que me falta para que me lea el contenido de la ultima palabra que es donde estoy teniendo el problema ?, la cuestión de mi programa es mostrar en pantalla cuantas veces se repite un texto en una frase , ambas introducidas desde teclado.
ejemplo tal cual:
frase de entrada: el corazon del coronel
texto a buscar: el
resultado: el texto "el" aparece en la frase : 3 veces.
Bien tal como tengo mi programa y te pido por favor lo ejecutes para que así, quizá tu si puedas dar con la cuestión del porque solo me esta tomando hasta el ultimo espacio, sin tener en cuenta la ultima palabra de la frase, es decir en mi caso y para cualquier frase, me busca y me da el contador ok pero hasta el ultimo espacio, sin tomarme la ultima palabra de la frase, en el ejemplo me da como resultado que aparece 2 veces por que el "el" de coronel no me lo esta tomando y así para cualquier frase en su ultima palabra y no he dado como corregirlo:
program subsecuencia;
uses crt;
var frase, palabra,cad:string;
i,j,k,l,s,contador:integer;
sec_encontrada:boolean;
begin
clrscr;
writeln('digite una frase:');
readln(frase);
writeln('digite subsecuencia a encontrar :');
readln(cad);
writeln;
contador:=0;
palabra:='';
sec_encontrada:=false;
i:=1;
while i<=length(frase) do
{for i:=1 to length(frase) do}
begin
if (frase[i]<>' ') then
palabra:=palabra+frase[i]
else
begin
writeln(palabra);
l:=1;
while l<=length(palabra) do
begin
if palabra[l]=cad[1] then
begin
k:=l+1;
while k<=length(palabra) do
begin
s:=2;
if palabra[k]=cad[s] then
s:=s+1;
if s>length(cad) then
begin
contador:=contador+1;
s:=0;
end;
k:=k+1;
end;
end;
l:=l+1;
end;
palabra:='';
end;
i:=i+1;
end;
writeln;
writeln('el numero de apariciones de la subsecuencias ',cad , 'es : ',contador);
readkey;
end.
he intentado poner alguna condición que se me ocurre ,que me indique si es el ultimo espacio de la frase y no es no se ha llegado al fin de la longitud total de la cadena pero lo he puesto y aun así no me resulta, quizá por que no se si sea correcta mi idea o no se donde poner dicha condición, o incluso si es que me hace falta un nuevo: palabra:=palabra+frase[i] en alguna parte mas de mi código, te pido por favor me lo revises y me corrijas tal cual mi código para que me funcione.
nota: mi idea como puedes ver es ir tomando cada palabra e ir analizándola respecto al texto a buscar, etc...
2- si una vez puedes dar con lo que me falta, te pediría el favor con tu experiencia y tus geniales ideas me dieras otra forma de solución de tu parte seguramente mas eficiente y corta que la mía.
saludo.
Att. Oscar
Disculpa no se por que se desordena de esa forma el codigo , pues te lo copie estructuradamente legible.
Hola Oscar,
No te preocupes. Supongo que luego lo editan o corrigen. Por que a mi me pasa igual. Lo copio con sus tabulaciones en el Geany y luego queda todo esparramado.
Sí, yo puedo editar la consulta, para marcar dónde empieza y acaba el programa, y que así la sintaxis se vea coloreada y resulte más fácil de leer. Aun así, tu fuente está "demasiado tabulado" y desbordará en la mayoría de pantallas. Intenta no pasar de la columna 80.
Sobre el problema de que te pare en el último espacio y no al final de la última palabra, suele haber una solución tan simple como efectiva: añade un espacio adicional al final de la cadena, justo antes de procesarla. Eso puede hacer que la lógica siga siendo sencilla (más que considerar el caso especial del final de cadena) y el gasto de memoria adicional es casi inexistente.
profesor disculpa pero la verdad no comprendo nada de lo que me dices, acaso no hay manera entonces de arreglarlo en mi codigo, me gustaria un poco mas de ayuda de tu parte y si la logica que utilice esta bien encaminada o me puedes facilitar alternativas un poco mas claras, disculpa si no logro entenderte en tu respuesta anterior, gracias
Prueba esto:
writeln('digite una frase:');
readln(frase);
frase := frase + ' '; { Espacio final para simplificar comprobaciones }
;-)
Cordial saludo Nacho.
Mira con lo que me propones si que es verdad que ahora si me toma el análisis en todas las palabras de la frase , aun así no me resulta el conteo, por favor ejecuta mi código con la modificación ,quizá te des cuenta que este haciendo mal, entre otras cosas porque considero que no esta del todo desfasado mi análisis, tan solo hay algo que no veo y por lo que no me esta resultando, quizá para ti con tu experiencia lo veas mas claro que yo.
lo raro es que para la frase del ejemplo:
frase de entrada: el corazon del coronel
texto a buscar: el
resultado: el texto "el" aparece en la frase : 3 veces.
sin embargo para frases como:
frase de entrada: la palabra no calla
texto a buscar: la
resultado: el texto "el" aparece en la frase : 5 veces. //INCORRECTO DEBERÍA SER 3
frase de entrada: oscar oscar oscar ostras
texto a buscar: os
resultado: el texto "el" aparece en la frase : 5 veces. // INCORRECTO DEBERÍA SER 4
GRACIAS POR TOMARTE TU TIEMPO EN ANALIZARLO EN EJECUCIÓN Y ME INDIQUES QUE ES LO QUE ESTA MAL Y POR LO QUE ME ESTA FUNCIONANDO MAL.
Nota: si algún compañero del foro tiene una solución quizá mas corta me gustaría saberla,gracias por su atención a todos.
program subsecuencia;
uses crt;
var frase, palabra,cad:string;
i,j,k,l,s,contador:integer;
sec_encontrada:boolean;
begin
clrscr;
writeln('digite una frase:');
readln(frase);
writeln('digite subsecuencia a encontrar :');
readln(cad);
frase:=frase+' ';
writeln;
contador:=0;
palabra:='';
sec_encontrada:=false;
i:=1;
while i<=length(frase) do
{for i:=1 to length(frase) do}
begin
if (frase[i]<>' ') then
palabra:=palabra+frase[i]
else
begin
writeln(palabra);
l:=1;
while l<=length(palabra) do
begin
if palabra[l]=cad[1] then
begin
k:=l+1;
while k<=length(palabra) do
begin
s:=2;
if palabra[k]=cad[s] then
s:=s+1;
if s>length(cad) then
begin
contador:=contador+1;
s:=0;
end;
k:=k+1;
end;
end;
l:=l+1;
end;
palabra:='';
end;
i:=i+1;
end;
writeln;
writeln('el numero de apariciones de la subsecuencias ',cad , 'es : ',contador);
readkey;
end.
?????
X-D
Perdona, Óscar, se me había pasado. Yo usaría "copy" para extraer subcadenas de la longitud que buscas y compararlas con el texto que quieres contar:
program Subcadena;
var
frase, cadena, subcadenaActual: string;
cantidad: integer;
i: integer;
begin
write('Escriba una frase: ');
readLn(frase);
write('Escriba la subcadena a encontrar: ');
readLn(cadena);
cantidad := 0;
for i:=1 to length(frase)-length(cadena)+1 do
begin
subcadenaActual := copy(frase, i, length(cadena) );
if subcadenaActual = cadena then
cantidad := cantidad + 1;
end;
writeLn('Aparece ', cantidad, ' veces');
end.
(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.)