[ Foro de Pascal ]

Contar espacios en blanco

06-Feb-2014 20:17
Invitado (Carlos Jurado)
20 Respuestas

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


06-Feb-2014 23:43
Luis Torres (+18)

¿Tienes algo del código ya hecho? Por favor, colócalo.


07-Feb-2014 12:41
Invitado (Carlos Jurado)

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.
     


07-Feb-2014 16:34
Luis Torres (+18)

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.


07-Feb-2014 16:47
Invitado (Carlos Jurado)

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.


07-Feb-2014 21:29
Luis Torres (+18)

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.


08-Feb-2014 10:40
Invitado (Carlos Jurado)

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


08-Feb-2014 12:50
Nacho Cabanes (+83)

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.


09-Feb-2014 00:40
Invitado (natalia tavora)

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.



09-Feb-2014 01:06
natalia tavora

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.


 


09-Feb-2014 13:03
Invitado (Carlos Jurado)

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


09-Feb-2014 15:28
Invitado (Carlos Jurado)

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.
   


09-Feb-2014 23:07
natalia tavora

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.



10-Feb-2014 11:47
Invitado (Carlos Jurado)

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.


10-Feb-2014 14:57
Nacho Cabanes (+83)

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.


10-Feb-2014 17:29
Invitado (Carlos Jurado)

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?


10-Feb-2014 19:47
Nacho Cabanes (+83)

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".


10-Feb-2014 23:26
Invitado (Carlos Jurado)

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.


11-Feb-2014 00:02
Nacho Cabanes (+83)

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.



11-Feb-2014 15:24
Invitado (Carlos Jurado)

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.


14-Feb-2014 16:10
Invitado (Carlos Jurado)

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