Eliminar+espacios+adicionales

=__**Eliminar espacios adicionales**__= > Escribir un programa que lea una línea de texto que contenga espacios adicionales, al principio, entre palabras y al final de la frase. El programa deberá eliminar todos los espacios adicionales y contar las palabras que tiene la frase. Para ello se utilizarán los siguientes subprogramas:


 * ** Iniciales ** ||  || Recibe una cadena de caracteres y devuelve la misma cadena sin los espacios del principio de la frase. ||
 * ** Finales ** ||  || Realiza la misma operación con los espacios del final de la frase. ||
 * ** Intermedios ** ||  || Realiza la misma operación con los espacios intermedios adicionales, dejando un único espacio entre palabras. ||
 * ** Contar ** ||  || Contará las palabras que tiene una frase que no tiene espacios adicionales. ||


 * Nota**: Las operaciones de eliminación de los espacios en blanco se realizarán sobre la propia cadena, sin utilizar otra cadena auxiliar.

code format="pascal" PROGRAM String_9 ; CONST iLONG_FISICA = 80   ; cUN_ESPACIO  = ' '  ; sDOS_ESPACIOS = ' ' ; TYPE tsCadenas = String [iLONG_FISICA] ;

FUNCTION fnsIniciales (sCadena : tsCadenas) : tsCadenas ; BEGIN WHILE (sCadena[1] = cUN_ESPACIO) AND (Length (sCadena) > 0) DO       Delete (sCadena, 1, 1) ;

fnsIniciales := sCadena ; END ;

FUNCTION fnsFinales (sCadena : tsCadenas) : tsCadenas ; BEGIN WHILE (sCadena[Length (sCadena)] = cUN_ESPACIO) AND (Length (sCadena) > 0) DO       Delete (sCadena, Length (sCadena), 1) ;

fnsFinales := sCadena ; END ;

FUNCTION fnsIntermedios (sCadena : tsCadenas) : tsCadenas ; VAR byPosicion : Byte ; BEGIN byPosicion := Pos (sDOS_ESPACIOS, sCadena) ;

WHILE (byPosicion <> 0) DO       BEGIN Delete (sCadena, byPosicion, 1) ; byPosicion := Pos (sDOS_ESPACIOS, sCadena) END ;

fnsIntermedios := sCadena ; END ;

FUNCTION fnbyContar (sCadena : tsCadenas) : Byte ; VAR i, byPalabras : Byte ; BEGIN IF Length (sCadena) = 0 THEN byPalabras := 0 ELSE BEGIN byPalabras := 1 ;

FOR i := 1 TO Length (sCadena) DO          IF sCadena[i] = cUN_ESPACIO THEN byPalabras := byPalabras + 1 ; END ;

fnbyContar := byPalabras ; END ;

{- Variables del programa principal ---} VAR sCadena : tsCadenas ;

BEGIN {************* PROGRAMA PRINCIPAL *******************} Writeln ('Escriba una frase con excesivos espacios en blanco:'); Readln (sCadena) ;

Writeln ('Cadena leída Limitada por el caracter #:') ; Writeln ('#', sCadena, '#') ;

sCadena := fnsIniciales (sCadena) ; { Eliminar espacios iniciales }

sCadena := fnsFinales (sCadena) ;  { Eliminar espacios finales }

{ Eliminar espacios excesivos Intermedios } sCadena := fnsIntermedios (sCadena) ;

Writeln ('Cadena sin espacios excesivos: ') ; Writeln ('#', sCadena, '#') ;

Writeln ('Número de palabras: ', fnbyContar (sCadena) ) ; END. code

{- Otra versión de la función que elimina espacios ** intermedios **}

code format="pascal" FUNCTION fnsIntermedios (sCadena : tsCadenas) : tsCadenas ; VAR i : Byte ; BEGIN

FOR i := Length (sCadena) DOWNTO 2 DO     IF ( sCadena[i]    = sUN_ESPACIO ) AND ( sCadena[i - 1] = sUN_ESPACIO ) THEN Delete (sCadena, i, 1) ;

fnsIntermedios := sCadena ; END ; code