[ Foro de Pascal ]
cordial saludo profesor y compañeros aqui nuevamente.
queria preguntarles como puedo contar el numero de espacios en blanco que hay en una frase y que luego pueda añadir nuevos espacios entre los que originalmente tiene la frase, hasta que la frase adquiera un nueva longitud dada por teclado.
Agradezco inmensamente cualquier ayuda que puedan aportarme, pues es un tema nuevo para mi el de cadenas y que se me esta dificultando...
¿Tienes algo del código ya hecho? Por favor, colócalo.
hola luis gracias por responderme.mira el codigo que tengo es poco y quiza esta mal , este tema es nuevo para mi y ojala puedas ayudarme.
program NumEspaciosAñadir;
uses crt;
var
texto:string;
i,contador:integer;
c:char;
begin
write('digite un texto: ');
readln(texto);
for i:=1 to length(texto) do
begin
c:=texto[i];
if c= ' ' then
contador:=contador +1;
end;
end.
Luis no se esto es lo que se me ocurrio para contar el numero de espacios del texto, no se si este bien mi logica, de esta parte. la otra parte se me ocurre que podria quiza mediante un while ir recorriendo el texto y donde encuentre un espacio añadir uno nuevo asi hasta el final de la cadena y quiza con un repeat luego volver a hacer el recorrido en la cadena añadiendo nuevos espacios hasta que se alcance el tamaño deseado que se da por teclado, pero ahi es donde tengo problemas no me sale como puedo plasmar esta mi idea a codigo,si pudieras ayudarme luis te lo agradezco mucho.
Pues, está bien hecho, lo único que se te olvidó fue inicializar "contador" en cero antes de realizar el conteo. Además debes mostrar los resultados, al final, con un writeln.
Hola luis gracias por responderme, ok tienes razon en lo de inicializar el contador a cero, y la otra parte como podria ser luis, dame tu ayuda por favor.
Si hiciste el código anterior debes saber cómo mostrar en pantalla la cantidad de espacios en blanco que está almacenada en la variable "contador". Eso sería lo más sencillo de hacer.
Hola luis, gracias por responderme, sin embargo lo que pide el programa no se trata de lo ultimo que me sugieres , permiteme pedirte por favor lee nuevamente de que se trata el ejercicio y es que ahi la ultima parte del programa es lo que no he podido hacer, no se trata de:"mostrar en pantalla la cantidad de espacios en blanco que está almacenada en la variable "contador""ojala puedas ayudarme y gracias
No entiendo. Sí se trata de lo que te dice Luis: la cantidad de espacios la has almacenado en la variable "contador", sólo falta que muestres su valor.
En cuanto a lo de añadir nuevos espacios hasta completar una longitud dada, permíteme que te proponga primero un ejercicio ligeramente más fácil pero que se acerca mucho, y que posiblemente te ayudará a entender lo que necesitas: "a partir de una cadena texto, genera otra que contenga los espacios duplicados".
Si consigues hacer eso (que no es difícil), estarás mucho más cerca de poder añadir un número arbitrario de espacios, que es lo que te proponen.
si entendi bien y donde encontras un espacio tenes qeu agregar otro... por ejemplo "san luis" (1 espacio) seria "san luis"(2 espacios) se me ocurre algo asi
program NumEspaciosAñadir;
uses crt;
var
Auxiliar,texto:string;
i,contador:integer;
c:char;
begin
write('digite un texto: ');
readln(texto);
f:=1;
contador:=0;
for i:=1 to length(texto) do
begin
c:=texto[i];
if texto[i]<> ' ' then
Begin
Auxiliar[f]:=texto[i];
f:=f+1;
End;
if texto[i]=' ' then
Begin
contador:=contador+1;
Auxiliar[f]:=' ';
Auxiliar[f+1]:=' '
f:=f+2;
End;
end;
writeln('la cantidad de espacios es: ', contador');
end.
ahora lo que entendi de tu primer post se me ocurre algo asi
program NumEspaciosAñadir;
uses crt;
var
Auxiliar,texto:string;
espacios,LongNueva,i,contador:integer;
c:char;
begin
write('digite un texto: ');
readln(texto);
LongNueva:=length(texto);
repeat
write('digite un numero mayor a: ',LongNueva);// pido un numero para saber cuantos espacios agregar...
readln(LongNueva);
until(LongNueva>length(texto)); // controlo que sea mas grande que la longitud de la palabra
//porque necesito que texto tengo la cantidad que el usuario me pide
espacios:=LongNueva-(length(texto));// asi obtengo la cantidad de espacios que tengo que agregar...
f:=1;
contador:=0;
for i:=1 to length(texto) do
begin
if (texto<>' ')then
begin
Auxiliar[f]:=texto[i];
f:=f+1;
end;
if (texto[i]=' ') and(espacios>0)then //espacios>0 si todavia me quedan espacios por agregar...
Begin
contador:=contador+1;// primero solo cuento la cantidad de espacios que tiene la frase
Auxiliar[f]:='';//el espacio que ya estaba
Auxiliar[f+1]:=''
f:=f+2;//porque +1 seria el espacio que le agregue
espacios:=espacios-1;//resto un espacio
End;
end;
write('la cantidad de espacios de la palabra ingresada es: ', texto);
write('la nueva palabra es: ', auxiliar);
end.
Hola, gracias natalia eres muy amable por tomarte el tiempo de ayudarme.
sin embargo he probado tu programa pero no da el resultado esperado, si que hay cosas que estan muy bien y que he entendido gracias a ti porejemplo cosas como:
write('digite un texto: ');
readln(texto);
LongNueva:=length(texto);
repeat
write('digite un numero mayor a: ',LongNueva);// pido un numero para saber cuantos espacios agregar...
readln(LongNueva);
until(LongNueva>length(texto));
esto lo entiendo muy bien gracias a ti, y no se me habia ocurrido.
tambien cuando haces:
espacios:=espacios-1;//resto un espacio
sin embargo al ejecutarlo no me resulta como lo esperaba, dejo el codigo modificado para que funcione hasta lo que tu hiciste porque habian errores y los corregi para que compilra y ejecutara, sin embargo fijate que el resultado queda en blanco.
program NumEspaciosAdir;
uses crt;
var
Auxiliar,texto:string;
espacios,LongNueva,i,f,contador:integer;
c:char;
begin
write('digite un texto: ');
readln(texto);
LongNueva:=length(texto);
repeat
write('digite un numero mayor a ',LongNueva, ':');
readln(LongNueva);
until(LongNueva>length(texto));
espacios:=LongNueva-(length(texto));
f:=1;
contador:=0;
for i:=1 to length(texto) do
begin
if (texto<>' ')then
begin
Auxiliar[f]:=texto[i];
f:=f+1;
end;
if (texto[i]=' ') and(espacios>0)then
Begin
contador:=contador+1;
Auxiliar[f]:=' ';
Auxiliar[f+1]:=' ';
f:=f+2;
espacios:=espacios-1;
End;
end;
writeln('la cantidad de espacios de la palabra ingresada es: ', texto);
writeln('la nueva palabra es: ', auxiliar);
readln;
end.
la idea es agregar los espacios que faltan distribuidos uniformemente digamos en la cadena original hasta que la frase alcance el tamaño deseado por el usurio.
ojala puedan ayudarnos un poco mas el profesor o los compañeros que tengan una idea de como solucionarlo.
un ejemplo seria:
este es un texto de prueba
tamaño nuevo :40
fijate que el texto tiene una longitud original 26, ok tu calculas bien el numero de espacios que dado el tamaño nuevo faltaria para completar o añadirle a la frase para que alcance dicha longitud, ahora el resultado lo que deberia hacer y es lo que no me sale es agregar esos 14 espacios restantes en la frase original de manera uniforme es decir, cada vez agregar un nuevo espacio en cada espacio que ya habia en la original y luego asi sucesivamente haciendo nuevas pasadas para recorrer la frase que va resultando con nuevos espacios hasta agotarlos, de tal manera que la frase de ejemplo tendria tres pasadas hasta añadir los 14 espacios restantes:
este....es....un....texto....de...prueba
fijate que ahora la cadena tiene 19 espacios de los cuales 5 eran los originales, asi que los 14 restantes de esos 19 son los que se añadieron sucesivamente por cada pasada a la longitud de la frase, osea:
este..es..un..texto..de..prueba //primeara pasada con 5 nuevos espacios en la frase original
este...es...un...texto...de...prueba //2da pasada con 5 nuevos espacios ya van 10 espacios nuevos
este....es....un....texto....de...prueba // 3ra pasada con 4 espacios nuevos que alcanzarian los 14 que necesitabamos para que ahora la frase tenga un tamaño 40
espero cualquier ayuda adicional y mil gracias
como puedo insertar con el comando insert un nuevo espacio en una cadena, es una idea que se me ocurrio pero no se como hacerlo pues intento hacer:
if texto[i]=' ' then
begin
insert('',texto,i); //aqui tengo otra duda si pongo '' o ' ' ??
...
pero no se me inserta ese espacio en la cadena texto, o es que lo estoy haciendo mal, te agradezco tu intervencion profesor nacho cabanes y compañeros.
ahi lo revise y lo correji... solo falta correjir un pequeño error.... el programa le agrega los espacios donde corresponde pero se come la cantidad de espacios en las letras del final, por ejemplo si pones mar del plata te devuelve mar del pla voy a ver si puedo correjirlo pero por ahora este es el codigo....
se me ocurre que el error debe estar en el numero final del for.... tal vez deberia probar con for i:=j to ((length(texto))+ espacio) do o algo asi....
program NumEspacios;
uses crt;
var
Auxiliar,texto:string;
j,f, espacios,LongNueva,i,contador:integer;
c:char;
begin
clrscr;
writeLn('digite un texto: ');
readln(texto);
LongNueva:=length(texto);
repeat
writeLn('digite un numero mayor a: ',LongNueva);// pido un numero para saber cuantos espacios agregar...
readln(LongNueva);
until(LongNueva>length(texto)); // controlo que sea mas grande que la longitud de la palabra
//porque necesito que texto tengo la cantidad que el usuario me pide
espacios:=(LongNueva-(length(texto)));// asi obtengo la cantidad de espacios que tengo que agregar...
f:=0;
contador:=0;
J:=0;
for i:=j to (length(texto)) do
begin
if (texto[i]<>' ')then
begin
Auxiliar[f]:=texto[i];// mientras sea distinto copio en la nueva palabra los caracteres que no son espacio...
f:=f+1;
end;
if((texto[i]=' ')and(espacios>0))then //espacios>0 si todavia me quedan espacios por agregar...
Begin
contador:=contador+1;// primero solo cuento la cantidad de espacios que tiene la frase
Auxiliar[f]:=' ';//el espacio que ya estaba
Auxiliar[f+1]:=' ';
f:=f+2;//porque +1 seria el espacio que le agregue
espacios:=espacios-1;//resto un espacio
End;
end;
clrscr;
writeln('la cantidad de espacios de la palabra ingresada es: ', contador);
writeln('la Nueva palabra es: ',Auxiliar);
readln;
end.
como puedo insertar con el comando insert un nuevo espacio en una cadena, es una idea que se me ocurrio pero no se como hacerlo pues intento hacer:
if texto[i]=' ' then
begin
insert('',texto,i);
...
pero no se me inserta ese espacio en la cadena texto, o es que lo estoy haciendo mal, te agradezco tu intervencion profesor nacho cabanes y compañeros.
Las ideas que estáis planteando son buenas, pero hay alguna posible fuente de errores.
Por ejemplo, es peligroso hacer cosas como
Auxiliar[f+1]:=' ';
porque puede desbordar el tamaño del array o la cadena. Es más fiable (y más adaptable a otros lenguajes) concatenar al final de la cadena:
Auxiliar := Auxiliar + ' ';
Por otra parte, para insertar hay que indicar un espacio, no una cadena vacía:
insert(' ',texto,i);
pero no se debe hacer sobre la misma cadena, porque el valor límite de un "for" (en Pascal) no se vuelve a comprobar en cada pasada, de modo que la cadena va creciendo pero no se recorre hasta el final (por eso a Natalia no le aparecía el texto completo).
Lo que yo haría es: para duplicar espacios, recorrería la cadena inicial; si la letra que he encontrado no es un espacio, la vuelco a la cadena de destino; si es un espacio, vuelco dos espacios.
Pasar de ahí a un número arbitrario de espacios es aplicar esa misma idea varias veces, de la manera que dice Carlos: dar varias pasadas, cada una de las cuales aumentará un espacio en cada zona de separación de palabras. Se termina cuando la longitud actual es la deseada.
buenos dias profesor nacho.
gracias por respondernos y por tus aclaraciones.
queria si preguntarte cuando dices:
"Lo que yo haría es: para duplicar espacios, recorrería la cadena inicial; si la letra que he encontrado no es un espacio, la vuelco a la cadena de destino; si es un espacio, vuelco dos espacios. "
como harias ese volcado profesor, podria ser algo asi, sino por favor corrigeme y ayudame:
Auxiliar:='';
for i:=1 to length(texto) do
begin
if texto[i] <> ' ' then
Auxiliar:=auxiliar + texto[i]
else
begin
if texto[i]= ' ' then
Auxuliar:=Auxiliar + ' '
end;
y en ese caso se mostraria como cadena resultante Auxiliar ?
es que tengo la gran duda si es asi, como sabe el programa en que posicion debe ir ese nuevo espacio, me refiero a la parte del else.
gracias por toda la ayuda que puedas prestarnos con ello
una pregunta adicional , en que casos es necesario teniendo una variable definida como string , pasarla a un vector?
Se parece mucho, pero tu código es un poco redundante y tiene un error: guardas un espacio si hay dos espacios (que no es lo que se pretende hacer, y además no se puede conseguir de esa manera):
auxiliar := '';
for i:=1 to length(texto) do
if texto[i] <> ' ' then
auxiliar := auxiliar + texto[i]
else { si texto[i] es ' ' }
auxiliar := auxiliar + ' ';
Y generalmente no necesitarás convertir un string a vector... porque en Pascal un string ES un vector. La definición original de "string[n]" era "packed array[1..n] of char".
hola profesor hago lo que me indicaste con alguna modificacion tratando de que el ejercicio me salga por fin pero no logro como hacer, por favor te pido ejecutes mi codigo para que puedas ver tu en que estoy fallando o que me hace falta, para que el resultado sea el esperado, pruebalo si gustas con el ejemplo que indique al inicio del post:
este es un texto de prueba
tamaño nuevo :40
resultado esperado:
este....es....un....texto....de...prueba
los puntos es para ver bien la adicion de los nuevos espacios, pero en realidad serian espacios en blanco.
mi codigo es :
program NumEspaciosAdicionar;
uses crt;
var
auxiliar,texto:string;
espacios,LongNueva,LongO,i:integer;
begin
clrscr;
writeln('digite un texto: ');
readln(texto);
LongO:=length(texto);
repeat
write('digite un numero mayor a ',LongO, ':');
readln(LongNueva);
until(LongNueva>length(texto));
espacios:=LongNueva-LongO;
auxiliar:= '';
repeat
for i:=1 to length(texto) do
begin
if texto[i] <> ' ' then
auxiliar := auxiliar + texto[i]
else { si texto[i] es ' ' }
begin
auxiliar:=auxiliar + ' ';
espacios:=espacios-1;
end;
end;
until (espacios <=0);
writeln('la nueva cadena es: ');
writeln(auxiliar);
readln;
end.
por favor ayudame a coregirlo para que me funcione es que llevo tres dias y nada, eso si he aprendido mucho con el y tus explicaciones, hechame una mano por favor para que me indiques tal cual lo tengo que me hace falta o que esta mal, mil gracias por tu ayuda y disculpame, intento aprender.
No has llegado a completar la versión que duplica espacios, y que te habría ayudado a terminar de comprender el problema.
Tu solución todavía tiene algún error, como que tras cada pasada vuelves a partir del texto original, en vez de tomar la cadena (auxiliar) modificada. Tampoco reinicias esa cadena auxiliar, por lo que en cada pasada todavía contiene "basura" de la pasada anterior. Además, si en cada pasada duplicas los espacios, donde había un espacio luego habrá 2, 4, 8 y 16, en vez de 2-3-4-5, de modo que no debes duplicar todos, sino añadir un nuevo espacio al final (o al principio) de cada bloque de espacios.
Una posible solución, poco probada, que puede necesitar algún retoque, podría ser:
program AnyadirEspacios;
uses
crt;
var
auxiliar,texto: string;
espacios,LongNueva,i: integer;
begin
clrscr;
{ Pedir texto }
writeLn('escriba un texto:');
readLn(texto);
{Pedir nueva longitud }
repeat
writeLn('escriba un numero mayor a ',length(texto), ': ');
readLn(LongNueva);
until(LongNueva > length(texto));
{Y rellenar con espacios }
espacios := LongNueva - length(texto);
repeat
auxiliar := ''; { En cada pasada, el auxiliar debe ser nuevo }
for i := 1 to length(texto) do
begin
if texto[i] <> ' ' then { si no es espacio, tomo la letra }
auxiliar := auxiliar + texto[i]
else { si texto[i] es un espacio }
begin
espacios := espacios - 1;
if (espacios > 0) { Y quedan espacios por poner }
and (i < length(texto)) { Y quedan caracteres }
and (texto[i+1] <> ' ') { Y es ultimo espacio del bloque }
then
auxiliar := auxiliar + ' '
else { Si es espacio, pero no ultimo del bloque, no debo duplicar }
auxiliar := auxiliar + texto[i];
end
end;
texto := auxiliar; { Volvemos a empezar con el texto resultante }
until (espacios <=0);
writeln('la nueva cadena es: ');
writeln(texto);
readln;
end.
buen dia profesor nacho,gracias por responder y tus explicaciones que me han sacado de un mar de dudas como porejemplo la de hacer:
texto := auxiliar; { Volvemos a empezar con el texto resultante }
y el error que tenia de no inicializar donde debia, auxiliar:='';
sin embargo al ejecutarlo no da el resultado esperado,pues esta poniendo los espacios mal distribuidos, porejemplo:
este es un texto de prueba
el resultado que mustra es:
este.....es.....un...texto...de...prueba
cuando el correcto deberia ser:
este....es....un....texto....de...prueba
cuando te refieres a "ultimo espacio del bloque " a que espacio te refieres al que puede existir al final del texto ??'
he hecho el seguimiento entero de tu solucion profesor pero esta controlado por lo visto todo lo que de puede y aun asi no da el resultado esperado, si pudieras verlo una vez mas profesor o cualquier compañero que siga este hilo me dejan alta mente agradecido por que con este ejercicio he aprendido mas que con ejercicios de cadenas mas comunes.
Hola profesor nacho muchisimas gracias por tu ayuda y por tu inmensa labor, eres un extraordinario profesor y persona por que ayudar a quienes estamos aprendiendo es admirable dado que conocemos de tu poquisimo tiempo y aun asi nos atiendes de la mejor forma y con brillantes.
profesor despues de tantas vueltas a este ejercicio pude lograr realizarlo sin duda por tu ayuda valiosa, es verdad que cambie un poco la solucion y lo hice y funciona que a la final es lo importante, mil gracias de corazon.
(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.)