[ Foro de Pascal ]

Ayuda en un pequeño programa: buscar y reemplazar en palabra

24-Mar-2014 06:25
Invitado (Eliecer)
3 Respuestas

Buen día. Estoy creando un pequeño programa que sirva para buscar y reemplazar una palabra (o parte de esta) por otra. El caso es que algo sale mal al querer usar la función "insert" para reemplazar la palabra, ya que me sale muchas veces la palabra reemplazada a la izquierda del texto ingresado. Agradecería mucho su ayuda... Dejo el código del programa para explicarme mejor:


program ins;
uses crt;
var
texto,pal1,pal2:string;
posi,x:integer;

begin
clrscr;
readln(texto); {Texto a ingresar. Ejemplo: Hernando Hernandez}
readln(pal1); {palabra a reemplazar. Ejemplo: 'Her'}
readln(pal2);  {palabra a insertar. Ejemplo: 'Fer'}
for x:= 1 to length(texto) do
begin
posi:=pos(pal1,texto);
delete(texto,posi,length(pal1));
insert(pal2,texto,posi);
end;
writeln(texto);
readkey;
end.



24-Mar-2014 10:40
Nacho Cabanes (+83)

No necesitas un "for" para algo así: si la palabra tiene 20 letras, no querrás reemplazar 20 veces, sino la cantidad de veces que realmente contenga esa subcadena.

Prueba a plantearlo con un "while": "mientras (todavía) lo contenga, lo reemplazo.


24-Mar-2014 16:40
Invitado (Eliecer)

Hola, antes que nada gracias por responder. Realicé el programa de modo similar, con un 'repeat, y dió mejores resultados. Sin embargo, a la hora de insertar texto, se inserta una vez más de las deseadas. Por ejemplo, si escribo "Hernando Hernandez" al final sale reemplazado como "FerFernando Fernandez". No deseo que el programa siga insertando cuando la variable 'posi' sea 0. Probablemente sea una tontería, pero no logro captar que hago mal, jaja. He aquí el código:


program ins;
uses crt;
var
texto,pal1,pal2:string;
posi,cont,x:integer;

begin
clrscr;
readln(texto); {Texto a ingresar. Ejemplo: Hernando Hernandez}
readln(pal1); {palabra a reemplazar. Ejemplo: 'Her'}
readln(pal2);  {palabra a insertar. Ejemplo: 'Fer'}
cont:=0;
repeat
begin
posi:=pos(pal1,texto);
delete(texto,posi,length(pal1));
cont:=cont+1;
insert(pal2,texto,posi);
end
until posi = 0;
writeln(texto);
readkey;
end.



25-Mar-2014 14:24
Nacho Cabanes (+83)

Insisto: hazlo con un "while", que quizá no repita, si la condición no se cumple.

Ten en cuenta que un "repeat" siempre da una primera pasada, y estás obteniendo una posición que luego no compruebas si es válida. Si lo quieres hacer con un "repeat", al menos necesitarás afinar el interior, en vez de reemplazar a ciegas.






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