[ Foro de Pascal ]
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
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"...
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
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.
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.
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.
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.
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;
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.
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.
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.
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.
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
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".
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.
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 ...
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
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
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?
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.
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
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.)