P_68_E11-Cadenas+con+Nombre+y+Numero

=__**Leer nombres y edades y obtener la media de las edades**__=

> Leer cadenas formadas por un nombre y un número (edad) obtener la media de las edades leídas

code format="pascal" PROGRAM P_68_E11 ; { strin_11 } USES Crt ; CONST iLONG_FISICA      = 20 ; iNUMERO_DE_CADENAS = 10 ; iINCORRECTO       = -1 ; TYPE tsCadenas = String [iLONG_FISICA] ;

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

WHILE (sCadena[Length (sCadena)] = ' ') AND (Length (sCadena) > 0) DO                Delete (sCadena, Length (sCadena), 1) ;

fnsEliminarEspaciosInicFin := sCadena ; END ;

PROCEDURE SepararNombreNumero (   sCadena : tsCadenas;                               VAR sNombre : tsCadenas;                               VAR iNumero : Integer) ; VAR i, iPosUltLetra, iPosicError : Integer ; cMayuscula             : Char ; sNumero               : tsCadenas ; BEGIN sCadena := fnsEliminarEspaciosInicFin (sCadena) ;

IF Length (sCadena) = 0 THEN BEGIN iNumero := iINCORRECTO ; sNombre := '' ; END ELSE BEGIN sCadena := UpCase (sCadena) ; iPosUltLetra := 0 ; FOR i := 1 TO Length (sCadena) - 1 DO          BEGIN cMayuscula := UpCase (sCadena [i]) ;

IF (('A' <= cMayuscula) AND (cMayuscula <= 'Z')) AND (('0' <= sCadena [i+1]) AND (sCadena [i+1] <= '9')) THEN iPosUltLetra := i ; END ;

IF iPosUltLetra = 0 THEN BEGIN sNombre := '' ; iNumero := iINCORRECTO ; END ELSE BEGIN sNombre := Copy (sCadena, 1, iPosUltLetra ) ; sNumero := Copy (sCadena, iPosUltLetra +1, Length (sCadena)) ;

VAL (sNumero, iNumero, iPosicError) ; IF iPosicError <> 0 THEN iNumero := iINCORRECTO ;

END ; END ; END ;

VAR {-- Variables del programa principal -} iNumCadena, iCorrectos, iEdad, iSumaEdades, iEdadMenor  : Integer ; sCadena, sNombre,  sNombreMenor : tsCadenas ; cEspera                         : Char ;

BEGIN { programa principal } WriteLn ; WriteLn (' Programa que calcula media de las edades de ', iNUMERO_DE_CADENAS,            ' personas') ; Writeln ; Writeln ('Escribir la edad seguida del nombre sin espacios entre ellos (ej. Eva12)'); Writeln ;

iCorrectos := 0 ; iSumaEdades := 0 ; iEdadMenor := MAXINT ;

FOR iNumCadena := 1 TO iNUMERO_DE_CADENAS DO      BEGIN Writeln ; Write (iNumCadena:3, ' : Nombre y Edad (ej. Eva12): ') ; Readln (sCadena) ;

SepararNombreNumero (sCadena, sNombre, iEdad) ;

Writeln ; WriteLn ('     -- Nombre: #', sNombre, '#') ; WriteLn ('      Edad: ', iEdad) ;

IF iEdad <> iINCORRECTO THEN BEGIN IF iEdad < iEdadMenor THEN BEGIN iEdadMenor  := iEdad ; sNombreMenor := sNombre ; END ; iSumaEdades := iSumaEdades + iEdad ;

iCorrectos  :=  iCorrectos + 1 ; END ; END ;

Writeln ; Writeln ; Writeln ('-'); IF iCorrectos = 0 THEN BEGIN Writeln ('No se ha introducido ningun dato correcto: NombreEdad (ej. Eva12)') ; END ELSE BEGIN Write    ('Edad media: ', iSumaEdades / iCorrectos :0:2) ; Write    ('Edad menor: ', iEdadMenor) ; Write    ('    Nombre: ', sNombreMenor) ; END ; Writeln ('-');

Writeln ; cEspera := ReadKey ;

END. { Fin de STRIN_11.PAS } code