[ Foro de Pascal ]

subcadena

28-Apr-2014 12:09
oscar gomez
9 Respuestas

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


28-Apr-2014 12:11
oscar gomez

Disculpa no se por que se desordena de esa forma el codigo , pues te lo copie estructuradamente legible.


28-Apr-2014 21:07
Invitado (Marc)

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.


28-Apr-2014 22:01
Nacho Cabanes (+31)

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.


28-Apr-2014 22:27
oscar gomez

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


28-Apr-2014 22:33
Nacho Cabanes (+31)

Prueba esto:

 
writeln('digite una frase:');
readln(frase);
frase := frase + ' ';  { Espacio final para simplificar comprobaciones }
 


;-)


29-Apr-2014 13:20
oscar gomez

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.


29-Apr-2014 13:20
oscar gomez


 
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.
 


 


06-May-2014 20:31
oscar gomez

?????


06-May-2014 23:37
Nacho Cabanes (+31)

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.)