[ Foro de Pascal ]

cadena

06-May-2014 20:36
Invitado (fer97)
7 Respuestas

hola me podrian ayudar con un programita, cualquier ayuda sera importante.
la cuestion es que debo realizar un programa que dada una palabra y un caracter, muestre por pantalla la posicion en la palabra donde aparece por ultima vez dicho caracter, gracias por su colaboracion


06-May-2014 23:26
Nacho Cabanes (+30)

La palabra será un "string". Deberás recorrerla con un "for", mirando cada una de las letras que la componen.

Tienes dos alternativas:

- Recorrer de principio a final. Memorizas la posición en la que la encuentres. El valor final corresponderá a la última vez que aparecía.

- Recorrer de final a principio. En cuanto aparezca, interrumpes la búsqueda.


07-May-2014 13:39
Invitado (fer97)

hola profesor nacho.
queria pedirte el favor y me corrijas cuestiones que veas innecesarias o que pueden ayudarme a resumir mi programa, el siguiente codigo esta basado en la segunda sugerencia que me haces, agradezco cualquier sugerencia:

nota: el programa me corre ok y me da el resultado ok , solo quiero ver si puede ser mas resumido o corregir algo que ves peligroso no se.

 
program posicionultimocaracter;
uses crt;
var
    i,pos,n:byte;
	palabra:string;
	caract:char;
	encontrado:boolean;
begin
 writeln('digite una palabra:');
 readln(palabra);
 writeln('digite caracter a buscar: ');
 readln(caract);
 encontrado:=false;
 n:=length(palabra);
 while (n>=1) and (encontrado=false) do
  begin
   if palabra[n]=caract then
    begin
	 encontrado:=true;
     pos:=n;
	end; 
	n:=n-1;
  end;	
writeln('la ultima aparicion del caracter ',caract,' se encuentra en la posicion:',pos);
readln;
end.
 



07-May-2014 13:52
Nacho Cabanes (+30)

Está muy bien.

Sólo te falta un "if" al final: comprueba qué ocurre cuando la letra no aparezca.


07-May-2014 14:32
Invitado (fer97)

ok , profesor muchisimas gracias, y tendre encuenta lo que me dices del if final, gracias


07-May-2014 23:53
Invitado (fer97)

hola profesor queria preguntarte por una duda que me surge al desarrollar el ejercicio con la primera sugerencia que me indicaste, la segunda lo resolvi incluso con el if que me sugeriste y todo ok, pero desarrollandolo como te digo con la primera opcion , la cual intento resolver usando tanto for como while y al intentar agregar la parte del if que me sugeriste para cuando la palabra no contiene al caracter buscado ahi obtengo el problema:

 
program posicionultimocaracter;
uses crt;
var
    i,pos:byte;
	palabra:string;
	caract:char;
	encontrado:boolean;
begin
 writeln('digite una palabra:');
 readln(palabra);
 writeln('digite caracter a buscar: ');
 readln(caract);
 for i:=1 to length(palabra)  do
    if palabra[i]=caract then
      pos:=i;
{i:=1;
while i<=length(palabra)  do
 begin
   if palabra[i] = caract then
     pos:=i;
  i:=i+1;
 end;  }
 if i>length(palabra) then
     writeln('el caracter ', caract,'no se encuentra en la palabra')
	 else
	    writeln('la ultima aparicion del caracter ',caract,' se encuentra en la posicion:',pos);
readln;
end.
 


pues cuando uso el for o el while crecientemente( de 1 a length(palabra), tengo entendido que en el caso de mauricio e intentar buscar porejemplo el caracter :'e' , el cual no se encuentra, en ambos caso recorre toda la longitud de l apalabra que en este caso seria de 8, por lo tanto saldria de cualquiera de los ciclos cuando i>8, que es lo que intento inmediatamente despues preguntar en:

 
if i>length(palabra) then
     writeln('el caracter ', caract,'no se encuentra en la palabra')
	 else
	    writeln('la ultima aparicion del caracter ',caract,' se encuentra en la posicion:',pos);
 


en este desarrollo de tu sugerencia no he tomado ninguna variable booleana por que puede darse el caso que dicho caracter este al final de la cadena y por tanto no debe haber una variable que termine el ciclo, podrias corregirme el codigo y explicarme mas profundamente que es lo que esta sucediendo, mil gracias


08-May-2014 21:54
Invitado (fer97)

En espera de tu ayuda, gracias


09-May-2014 11:09
Nacho Cabanes (+30)

Te he leído, Fer97, pero cuando la pregunta es para analizar un fuente, necesito tiempo para probarlo, y ahora mismo no lo tengo. Tengo varias cosas urgentes que terminar todavía. Mañana espero poder sentarme frente al ordenador de casa con un poco de relax y poder leer tu pregunta con tranquilidad, ver los posibles problemas de tu fuente y proponerte alguna solución.

Edito: sin probar el fuente veo dos fallos, así que te lo comento ya: tu "for" va desde 1 hasta length, así que nunca llegará a ser mayor que "length" y tu condición de no existencia no se cumplirá nunca. De hecho, esa condición no debería comprobar el valor de "i", que es la variable de iteración, sino el de "pos", que es la que verifica si lo has encontrado.

Yo lo que haría es dar a "pos" el valor inicial 0; si al salir sigue teniendo ese valor, es que la letra no se ha encontrado:

 
program posicionultimocaracterFor;
var
    i,pos:byte;
    palabra:string;
    caract:char;
begin
 pos := 0;
 writeln('digite una palabra:');
 readln(palabra);
 writeln('digite caracter a buscar: ');
 readln(caract);
 for i:=1 to length(palabra)  do
    if palabra[i]=caract then
      pos:=i;
 if pos = 0 then
     writeln('el caracter ', caract,'no se encuentra en la palabra')
	 else
	    writeln('la ultima aparicion del caracter ',caract,' se encuentra en la posicion:',pos);
end.
 


(Y efectivamente, un "for" recorre toda la cadena hasta el final, aunque lo encuentres, al contrario que "while". Una alternativa es incluir un "break" dentro del "for", pero es una alternativa poco elegante, porque si vas a tener que cortar la iteración es porque realmente no se trataba de una estructura adecuada para usar un "for" sino un "while").






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