[ Foro de Pascal ]

insertar en frase...

21-Jan-2014 16:38
Invitado (Carlos Jurado)
21 Respuestas

Buenos dias profesor Nacho  y compañeros del foro.
Me vino muy bien encontrar esta pagina,he visto varios ejercicios de compañeros y respuestas y me parece excelente pagina y espacio.
en esta ocasion queria pediros la ayuda con un ejercicio que basicamente lo que pretende es que cada vocal de una frase sea reemplazada por el monosilabo 'pa', espero vuestra ayuda y agredecido a todos por su aporte.

yo intento hacer algo como esto:


...
for i:=1 to length(frase)
begin
 inicial:=frase[i];
 case frase[i]  of
  'a':insert('pa', frase[i],i+1)
  'e':insert('pa', frase[i],i+1)
 ...


bueno esta es mi idea profesor y compañeros pero hasta ahi llego por que no se como ir almacenando estos cambios en la nueva cadena( frase) que resultara de la insercion de dicho monosilabo, me gustaria poder contar con su ayuda al respecto, y disculpen las molestias estoy iniciando, gracias y saludos a toda la comunidad


21-Jan-2014 16:56
Nacho Cabanes (+83)

Recuerda que en estas mismas páginas tienes una referencia básica (que se va ampliando poco a poco) de varios lenguajes, entre ellos Pascal.

Por ejemplo, aquí tienes la ayuda de "insert", que necesitarás:
http://www.aprendeaprogramar.com/referencia/view.php?f=insert&leng=Pascal
y aquí la de "delete":
http://www.aprendeaprogramar.com/referencia/view.php?f=delete&leng=Pascal
Efectivamente, tendrás que insertar con "insert", y luego (o antes) eliminar la vocal con "delete". Podría ser algo como:


...
for i:=1 to length(frase)
begin
 case frase[i]  of
  'e': begin delete(frase,i,1); insert('pa', frase,i+1); end;
 ...


Un último detalle... ¿da igual en qué orden sustituyas las vocales? Piensa qué puede ocurrir al cambiar "a" por "pa"...


21-Jan-2014 19:02
Invitado (Carlos Jurado)

gracias profesor, si por supuesto que he leido tus documentos y en especial el dedicado a insert, delete, copy , sin embargo creo que no me hice entender con el proposito que busco , la idea no es eliminar la vocal y en su lugar insertar el monosilabo 'pa', la idea es la siguiente ,atraves de un ejemplo:

frase inicial: esta es una frase de ejemplo
frase resultante: epastapa epas upanapa frapasepa depa epajepamplopa

espero por favor me ayudes en ,mi duda planteada originalmente, es decir:


...
for i:=1 to length(frase)
begin
 inicial:=frase[i];
 case frase[i]  of
  'a':insert('pa', frase[i],i+1)
  'e':insert('pa', frase[i],i+1)
 ...


bueno esta es mi idea profesor y compañeros pero hasta ahi llego por que no se como ir almacenando estos cambios en la nueva cadena( frase) que resultara de la insercion de dicho monosilabo, me gustaria poder contar con su ayuda al respecto, y disculpen las molestias estoy iniciando, gracias y saludos a toda la comunidad


21-Jan-2014 19:05
Luis Torres (+18)

Es muy diferente sustituirlas con un ciclo for creciente que con un ciclo for decreciente. Con el primero no te da el resultado esperado. Yo hice un código con un for decreciente y te lo dejo a continuación:


program Pa;

var
 frase: string;
 i: integer;

BEGIN
 write('Introduzca una cadena: '); readln(frase);
 for i:= length(frase) downto 1 do
  Begin
    case frase[i] of
      'a': begin
             delete(frase,i,1);
             insert('pa',frase,i);
           end;
      'e': begin
             delete(frase,i,1);
             insert('pa',frase,i);
           end;
      'i': begin
             delete(frase,i,1);
             insert('pa',frase,i);
           end;
      'o': begin
             delete(frase,i,1);
             insert('pa',frase,i);
           end;
      'u': begin
             delete(frase,i,1);
             insert('pa',frase,i);
           end;
    end;
  End;
 writeln('La cadena resultante es: ',frase);
 readln;
END.



21-Jan-2014 22:30
Nacho Cabanes (+83)

Entendido, Carlos, pero tu mensaje original hablaba de reemplazar, no de insertar conservando la vocal.

La respuesta de Luis es perfecta, muy completa. Tanto en la suya como en la mía tendrías que eliminar los "delete" si no hay que reemplazar. En cualquier caso, verás que la única diferencia real con tu forma de hacerlo es que tienes mal el segundo parámetro de "insert": no debe ser "frase[i]" sino "frase":


insert('pa', frase, i+1);


Y tienes que tener presente que cada vez que insertas estás cambiando la longitud de la cadena. Eso supondría que tuvieras que incrementar el contador en 2 unidades si cuentas desde el principio, o bien, como propone Luis, que cuentes desde el final.


22-Jan-2014 00:07
Luis Torres (+18)

Cuando escribí mi respuesta no estaba el mensaje de Carlos Jurado, sino el del profesor Nacho Cabanes, por lo que no había leído la corrección de que la vocal debía ser conservada en la cadena. De todas maneras aquí te dejo el código que deja las vocales en la frase:


program Pa2;

var
 frase: string;
 i: integer;

BEGIN
 write('Introduzca una cadena: '); readln(frase);
 for i:= length(frase) downto 1 do
  Begin
    case frase[i] of
      'a': begin
             insert('pa',frase,i+1);
           end;
      'e': begin
             insert('pa',frase,i+1);
           end;
      'i': begin
             insert('pa',frase,i+1);
           end;
      'o': begin
             insert('pa',frase,i+1);
           end;
      'u': begin
             insert('pa',frase,i+1);
           end;
    end;
  End;
 writeln('La cadena resultante es: ',frase);
 readln;
END.



22-Jan-2014 00:11
Nacho Cabanes (+83)

Efectivamente, Luis. Las respuestas anónimas no están visibles hasta que son supervisadas, de modo que él lo escribió antes (por poco) de que tú escribieras tu respuesta, pero todavía no estaba accesible.


22-Jan-2014 00:40
natalia tavora

YO LO HARIA UNA FUNCION....


function agregarpa(palabra:string):string;
VAR
tam,I,F:integer;
AUXILIAR:STRING;
ENCONTRO:BOOLEAN;
begin
tam:=length(palabra);
palabra:=upcase(palabra);
encontro:=false;
f:=0;
for i:=0 to tam do
	begin
		if ((palabra[i]='A')or(palabra[i]='E')or(palabra[i]='I')or(palabra[i]='O')OR (palabra[i]='U'))THEN
		BEGIN
			ENCONTRO:=TRUE;
		END;	
			IF (ENCONTRO=TRUE)THEN
			BEGIN
				AUXILIAR[F]:=PALABRA[I];
				AUXILIAR[F+1]:='P'
				AUXILIAR[F+2]:='A'
				F:=F+3;//
			END;
			IF ENCONTRO=FALSE THEN
			BEGIN
				AUXILIAR[F]:=PALABRA[I];
				F:=F+1
			END;
	END;
	AGREGARPA:=AUXILIAR;
END;



22-Jan-2014 16:23
oscar gomez

Hola a todos, no me habia fijado en este hilo , el ejercicio parece interesante, gracias Carlos Jurado por exponerlo,y gracias por supuesto a las respuestas de nacho, luis y natalia, se aprende mucho en este foro la verdad yo hace dos semestres termine positivamente esta materia en la universidad y aun me fascina estar resolviendo y mirar soluciones a ejercicios interesantes como este. lo unico si es con el permiso de Luis que como siempre brillante, no comprendo por que dice:
"Es muy diferente sustituirlas con un ciclo for creciente que con un ciclo for decreciente", acaso el programa no tendria solucion con un for creciente, creo a mi punto de vista que se podria utilizando una variable nfrase y utilizar la funcion concat, pero bueno no se si seria complicar la solucion del ejercicio que plantea nuestro compañero, seria quiza que luis o el profesor por alusion nos indicaran si es correcta mi sugerencia o esta de mas, gracias.


22-Jan-2014 23:37
Nacho Cabanes (+83)

Hay varias formas de hacerlo con un bucle creciente, por ejemplo, incrementando en más de uno la posición (en 3, si insertas 2 letras) o concatenando en una cadena auxiliar en vez de modificar la original.

Aun así, si lo haces desde el final hacia el principio te puedes evitar muchas de esas complicaciones.


23-Jan-2014 02:22
Luis Torres (+18)

Ok, pero ¿cómo modifico la condición de finalización del ciclo for? Se toma lenght(cad) como constante, no varía nunca.

Yo intenté hacerlo utilizando una cadena auxiliar con un ciclo creciente for, y aquí les dejo el código:


program CadenaPa;

var
 i: integer;
 cad: string;
 cadAux: string;

BEGIN
  cadAux:= '';
  write('Introduzca una cadena: '); readln(cad);
  for i:=1 to length(cad) do
   Begin
     cadAux:= cadAux + cad[i];
     if cad[i] in ['a','e','i','o','u'] then
      begin
        cadAux:= cadAux + 'pa';
      end;
   End;
  cad:= cadAux;
  writeln('La cadena resultante es: ',cad);
  readln;
END.



23-Jan-2014 12:06
oscar gomez

Hola, a todos.
Efectivamente luis, tu forma de resolverlo es la mas oportuna, entre otras cosas por que para compañeros como carlos que inicia es mucho mas entendible y comprensible hacerlo con el for creciente que el decreciente por que este ultimo puede llevar a mal interpretaciones, ademas por que lo abordaste de manera muy sencilla, felicitaciones una vez mas y como siempre de mi parte por que eres brillante. y por supuesto al profesor nacho por su explicacion por que efectivamente yo lo hubiese hecho con el concat y una cadena auxiliar. un saludo a todos, se aprende mucho de este foro.


23-Jan-2014 22:48
oscar gomez

Una cuestion, esperando tu ayuda profesor o luis que gentilmente has querido hecharme una mano para seguir avanzando en aprender.
queria preguntaros si el caso fuese el de adicionar la silaba 'pa' en una de las palabras de la frase que lleve vocales mudas y el planteamiento del programa fuese el mismo pero con la salvedad que si existe una palabra con vocales mudas se tenga en cuenta la primera de ellas, como podria modificar la solucion que luis ha planteado inicialmente:


program Pa2;
 
var
 frase: string;
 i: integer;
 
BEGIN
 write('Introduzca una cadena: '); readln(frase);
 for i:= length(frase) downto 1 do
  Begin
    case frase[i] of
      'a': begin
             insert('pa',frase,i+1);
           end;
      'e': begin
             insert('pa',frase,i+1);
           end;
      'i': begin
             insert('pa',frase,i+1);
           end;
      'o': begin
             insert('pa',frase,i+1);
           end;
      'u': begin
             insert('pa',frase,i+1);
           end;
    end;
  End;
 writeln('La cadena resultante es: ',frase);
 readln;
END.


ejemplo de ese tipo de palabras en la frase: inquieto, donde en este caso deberia quedar: ipanqupaietpa,  otro palabra seria porejemplo: antigua donde el resultado deberia ser: apantipagupaa pues se debe en ambos ejemplos tomar y adicionar 'pa' solo en la primera de las vocales en casos de vocales mudas como son los ejemplos.

es que lo he intentado pero no lo he conseguido y es algo que se me ocurrio y me gustaria vuestra ayuda para dicho caso, agredeciendo de ante mano toda la ayuda que me brinden, gracias


24-Jan-2014 13:44
Nacho Cabanes (+83)

Tres matices que debes tener en cuenta, Óscar:

1.- Según la implementación del bucle "for" en cada compilador, es muy posible que al hacer "insert" no recorras la cadena completa, porque el límite del "for" se analiza sólo una vez, así que se va a recorrer sólo hasta la última posición según la longitud inicial, pero tú estás cambiando la longitud, así que puedes no analizar las letras del final.

2.- Si tras una "i" insertas "pa" y sigues analizando en orden, volverás a insertar "pa" tras una "a" que antes no existía.

3.- No necesitas usar "case", porque vas a hacer la misma operación en todos los casos. Te bastaría con un "if" para decir "si es la A, o la E, o la I..."

Por otra parte, no sé a qué te refieres con una "vocal muda". Para mí, una letra muda es una que no se pronuncia, algo que no ocurre con las vocales en el idioma español, excepto (si te refieres a eso) con la "u" en "que", "qui", "gue", "gui".

Pero en tu ejemplo, dices que "inquieto" debería convertirse en "ipanqupaietpa", de modo que has añadido "pa" tras la primera "i", pero también tras la "u" de "qu", que no se pronuncia.

También hablas de que " antigua" se debería convertir en "apantipagupaa", y ahí estás añadiendo "pa" tras cada vocal menos la última.

Dejando de lado lo de las vocales mudas, una forma más sencillo de plantearlo, volcando a una cadena auxiliar, podría ser:


program Pa2b;
 
var
	frase, frase2: string;
	i: integer;
 
begin
	write('Introduzca una cadena: '); readln(frase);
	frase2 := '';
	for i:= 1 to length(frase)  do
		begin
		frase2 := frase2 + frase[i];
		if frase[i] in ['a','e','i','o','u'] then
			frase2 := frase2 + 'pa';
		end;
	frase := frase2;
        writeln('La cadena resultante es: ',frase);
end.


Si quieres no incluir el caso de "que", "qui", "gue", "gui", bastaría con perfilar ese "if" para eliminar el caso de que sea una "U", que tenga delante alguna letra y sea "G" o "Q" y tenga detrás otra letra, que sea "E" o "I".


24-Jan-2014 15:30
oscar gomez

buenos dias profesor nacho.
tu explicacion es bastante amplia, sin embargo como bien explicas tu en mi caso estaba algo confundido con lo de letras mudas quiza dije mal las cosas, de hecho probando tu codigo final encuentro que no me hace lo que yo queria, es decir si ejecuto la palabra antigua, olvidando lo de letras mudas yo quiero que el resultado sea: " antigua" se debería convertir en "apantipagupaa", como ves estoy o quiero añadir "pa" tras cada vocal menos la última. efectivamente es lo que quiero es decir que si hay una palabra con mas de una vocal seguidas se tome la primera de ellas como es el caso de antigua en la letra u , pues la a que le sigue no la quiero tomar encuenta para agregar la silaba 'pa', por lo tanto en tu codigo final que deberia hacer para dicho caso ahora mejor explicado quiza por mi parte,? mil gracias por tu ayuda profesor.


24-Jan-2014 15:50
Nacho Cabanes (+83)

Cualquier mejora posterior consistirá básicamente en refinar ese "if". Por ejemplo, si es sólo para la primera vocal, cuando haya varias seguidas, deberías añadir un "y la anterior no es una vocal". También debes tener cuidado para no salirte de la palabra: no mirar más allá del principio o del final, de modo que tendrías algo como


if frase[i] in ['a','e','i','o','u'] 
    and i > 1
    and not (frase[i-1] in ['a','e','i','o','u'])
    then ...



24-Jan-2014 16:06
oscar gomez

gracias profesor, disculpa que siga con el hilo, solo me queda una inquietud, cuando haces referencia a esta explicacion tuya:
1.- Según la implementación del bucle "for" en cada compilador, es muy posible que al hacer "insert" no recorras la cadena completa, porque el límite del "for" se analiza sólo una vez, así que se va a recorrer sólo hasta la última posición según la longitud inicial, pero tú estás cambiando la longitud, así que puedes no analizar las letras del final.

lo dices por lo que mencinaba el compañero luis cuando se referia que lo mejor era hacerse con un bucle for decreciente, for i:= length(frase) downto 1 do? si es asi por favor explicame por que no sucede en dicho caso del for decreciente, por que la verdad no lo asimilo


24-Jan-2014 16:18
oscar gomez

y por que en:
if frase[i] in ['a','e','i','o','u']
   and i > 1
   and not (frase[i-1] in ['a','e','i','o','u'])
   then ..

haces and i>1 ???
gracias


24-Jan-2014 16:26
oscar gomez

me sale error typo mismash
??? en
if frase[i] in ['a','e','i','o','u']
  and i > 1
  and not (frase[i-1] in ['a','e','i','o','u'])
  then ..

porque?


24-Jan-2014 17:27
oscar gomez

PROFESOR NACHO YA LO TENGO, MIL GRACIAS TUS EXPLICACIONES MAGISTRALES ME AYUDARON , NO LO VEIA PERO AQUI HACIENDO PRUEBAS DE MI LOGICA LO LOGRE, PERO LA GRAN PARTE TE LA DEBO A TI,MIL GRACIAS, POR MI EL HILO ESTA FINALIZADO EN ESTE CASO.GRACIAS UNA VEZ MAS TAMBIEN A LUIS Y  NATALIA.


24-Jan-2014 18:19
oscar gomez

profesor que molestia contigo , disculpame es que me surge una inquietud haciendo ahora pruebas, de si lo que se quisiera ahora es que la silaba 'pa' se ponga en el caso de letras seguidas al final de ellas que variacion tendria que hacer en mi codigo que te pongo a continuacion?  mi codigo que hace lo que anteriormente queria es:


program Pa2b;
uses crt; 
var
	frase, frase2: string;
	i: integer;
 
begin
 writeln;writeln;writeln;writeln;
 clrscr;
	write('Introduzca una cadena: '); readln(frase);
	frase2 := '';
	for i:= 1 to length(frase)  do
		begin
		 frase2 := frase2 + frase[i];
		 if frase[i] in ['a','e','i','o','u'] then
		 begin
		  if i>=1 then
		    if not (frase[i-1] in ['a','e','i','o','u']) then
   			  frase2 := frase2 + 'pa';
	         end;
		end;
	frase := frase2;
        writeln('La cadena resultante es: ',frase);
        readln;
end.


con este codigo veras que si lo ejecutas para la palabra:
antigua, el resultado sera:
apantipagupaa

y para la palabra inquieto:
el resultado es:
ipanqupaietopa

lo cual es lo que queria , sin embargo me surge esta duda si lo que quisiera es:

antiguo, el resultado ahora fuese:
apantipaguopa

y para inquieto:
ipanquiepatopa

que cambios en mi codigo debo realizar es que llevo rato intentando opciones y no me sale, ademas tambien deje sin darme cuenta algo que me decias de controlar que no me salga ni del inicio ni del final en el caso de una frase, como podria hacer esa restriccion en mi codigo? mil gracias y de verdad disculpame, pero solo quiero seguir aprendiendo y contigo y este foro he avanzado muchsiimo. espero sepas ayudarme


24-Jan-2014 18:32
Nacho Cabanes (+83)

Sería muy parecido, pero no mirarías la posición "i-1", sino la "i+1", para ver que no hay ninguna a continuación (y, por tanto, que es la última).

Nuevamente, deberías comprobar que no te sales del array, pero esta vez por el final, así que no mirarías si "i>1", sino si "i<length(frase)".






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