Lista+de+registros+-+Cuentas+corrientes

=Gestión de una lista de registros (Información de cuentas corrientes=

Operaciones con un array de registros. Cada registro tiene dos campos: números de cuenta y saldo

Operaciones:

-
1. Dar de alta una nueva cuenta (sin repeticiones y en orde de número de cuenta) 2. Eliminar una cuenta 3. Mostrar datos de una cuenta 4. Informacion del total de cuentas 5. Saldos máximo, Minimo y Medio 6. Listado de las cuentas

code format="pascal" PROGRAM P_90_E_03 ; USES Crt ; CONST iMAX_CUENTAS = 10 ;

TYPE tsNumerosCuentas = String [23] ;

trgTipoElementos = RECORD sNumCuenta : tsNumerosCuentas ; rSaldo : Real ; END ;

targListasCuentas = ARRAY [1.. iMAX_CUENTAS] OF trgTipoElementos ;

FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN ClrScr ; Writeln ; Writeln ; Writeln ('============= MENU DE OPCIONES ============'); Writeln (' 1.   Dar de alta una nueva cuenta') ; Writeln (' 2.   Eliminar una cuenta') ; Writeln (' 3.   Mostrar datos de una cuenta') ; Writeln (' 4.   Informaci¢n del total de cuentas') ; Writeln (' 5.   Saldos m ximo, M¡nimo y Medio') ; Writeln (' 6.   Listado de las cuentas') ; Writeln ; Writeln (' 0.   Terminar') ; Writeln ; Write  ('       Pulsa el n£mero de la opci¢n: ') ; REPEAT cOpcion := ReadKey ; UNTIL cOpcion IN ['0'..'6'] ; Writeln (cOpcion) ;

fncLeerOpcion := cOpcion ; END ;

FUNCTION fniBuscarPosicMayor ( sNumeroCuenta : tsNumerosCuentas ;                     CONST argLista : targListasCuentas ;                     iLongLista     : Integer) : Integer ; VAR boEncontrado : Boolean ; iPosic      : Integer ; BEGIN boEncontrado := FALSE ; iPosic      := 1 ; WHILE (NOT boEncontrado) AND (iPosic <= iLongLista) DO     IF sNumeroCuenta <= argLista[iPosic].sNumCuenta THEN boEncontrado := TRUE ELSE iPosic := iPosic + 1 ;

fniBuscarPosicMayor := iPosic END ;

FUNCTION fniBuscarPosicIgual (      sNumeroCuenta : tsNumerosCuentas ;               CONST argLista      : targListasCuentas ;                     iLongLista    : Integer) : Integer ; VAR boEncontrado : Boolean ; iPosic      : Integer ; BEGIN boEncontrado := FALSE ; iPosic      := 1 ; WHILE (NOT boEncontrado) AND (iPosic <= iLongLista) DO      IF sNumeroCuenta = argLista[iPosic].sNumCuenta THEN boEncontrado := TRUE ELSE iPosic := iPosic + 1 ;

IF boEncontrado THEN fniBuscarPosicIgual := iPosic ELSE fniBuscarPosicIgual := 0 END ;

PROCEDURE InsertaNumCuentaSaldoEnPosicion (CONST rgElemento : trgTipoElementos ;                   VAR argLista     : targListasCuentas ;                    VAR iLongLista   : Integer ;                        iPosicion    : Integer) ; VAR i : Integer ; BEGIN FOR i := iLongLista DOWNTO iPosicion DO      argLista[i + 1] := argLista [i] ;

argLista [iPosicion] := rgElemento ;

iLongLista := iLongLista + 1 ; END ;

PROCEDURE EliminarNumCuentaSaldoEnPosicion (VAR argLista    : targListasCuentas ;                   VAR iLongLista   : Integer ;                       iPosicion    : Integer) ; VAR i : Integer ; BEGIN FOR i := iPosicion + 1 TO iLongLista DO     argLista[i - 1] := argLista [i] ;

iLongLista := iLongLista - 1 ; END ;

PROCEDURE MostrarCuentas (CONST argLista : targListasCuentas ;                        iLongLista : Integer) ; VAR i : Integer ; BEGIN Writeln ; Writeln ('NUMERO DE CUENTA':25, 'Saldo':15) ; Writeln ('===================================',          '=================='); FOR i := 1 TO iLongLista DO     WITH argLista [i] DO          Writeln (sNumCuenta:25, rSaldo:15:2);

Writeln ('===================================',          '=================='); END ;

PROCEDURE MostrarInformacion (CONST argLista : targListasCuentas ;                         iLongLista : Integer) ; VAR i     : Integer ; rTotal : Real ; BEGIN rTotal := 0 ; FOR i := 1 TO iLongLista DO      rTotal := rTotal + argLista[i].rSaldo ;

Writeln ; Writeln ('N£mero de cuentas: ', iLongLista) ; Writeln ('Saldo      Total: ', rTotal:0:2) ; END ;

FUNCTION fniBuscarSaldoMaximo (CONST argLista : targListasCuentas ;                         iLongLista : Integer) : Integer ; VAR i, iPosicMaximo : Integer ; rSaldoMaximo   : Real ; BEGIN rSaldoMaximo := argLista[1].rSaldo ; iPosicMaximo := 1 ;

FOR i := 2 TO iLongLista DO      IF rSaldoMaximo < argLista[i].rSaldo THEN BEGIN rSaldoMaximo := argLista[i].rSaldo ; iPosicMaximo := i ; END ;

fniBuscarSaldoMaximo := iPosicMaximo ; END ;

FUNCTION fniBuscarSaldoMinimo (CONST argLista : targListasCuentas ;                        iLongLista : Integer) : Integer ; VAR i, iPosicMinimo : Integer ; rSaldoMinimo   : Real ; BEGIN rSaldoMinimo := argLista [1].rSaldo ; iPosicMinimo := 1 ;

FOR i := 2 TO iLongLista DO      IF rSaldoMinimo > argLista [i].rSaldo THEN BEGIN rSaldoMinimo := argLista [i].rSaldo ; iPosicMinimo := i ; END ;

fniBuscarSaldoMinimo := iPosicMinimo ; END ;

FUNCTION fnrCalcularSaldoMedio (CONST argLista  : targListasCuentas ;                          iLongLista : Integer) : Real ; VAR i     : Integer ; rTotal : Real ; BEGIN rTotal      := 0  ;

FOR i := 1 TO iLongLista DO      rTotal := rTotal + argLista[i].rSaldo ;

fnrCalcularSaldoMedio := rTotal / iLongLista ; END ;

{- variables del programa principal } VAR cOpcion, cEspera : Char ; rgUnCuenta      : trgTipoElementos ; argListaCuentas : targListasCuentas ; iLongLista      : Integer ; sNumCuenta      : tsNumerosCuentas ; rSaldo          : Real ; iPosicion, iPosicMaximo, iPosicMinimo    : Integer ;

BEGIN {--- programa principal ---} iLongLista    := 0 ;

REPEAT cOpcion := fncLeerOpcion ; Writeln ; CASE cOpcion OF       '1' : BEGIN IF iLongLista = iMAX_CUENTAS THEN Writeln ('la lista ya est llena') ELSE BEGIN Write ('Escribe el n£mero de cuenta: ') ; REPEAT ReadLn (sNumCuenta) ; UNTIL Length (sNumCuenta) > 0 ;

iPosicion := fniBuscarPosicIgual (sNumCuenta,                                                  argListaCuentas,                                                   iLongLista) ;

IF iPosicion <> 0 THEN Writeln ('Ya existe una cuenta con el N£mero:', sNumCuenta) ELSE BEGIN rgUnCuenta.sNumCuenta := sNumCuenta ;

Write ('Escribe           el saldo: ') ; Readln (rgUnCuenta.rSaldo) ;

iPosicion := fniBuscarPosicMayor (sNumCuenta,                                                     argListaCuentas,                                                      iLongLista) ;

InsertaNumCuentaSaldoEnPosicion (rgUnCuenta,                                                    argListaCuentas,                                                     iLongLista,                                                     iPosicion) ; END ; END ; END ; { cOpcion = '1'}

'2' : BEGIN IF iLongLista = 0 THEN Writeln ('La lista est vac¡a') ELSE BEGIN Write ('Escribe el n£mero de cuenta: ') ; REPEAT ReadLn (sNumCuenta) ; UNTIL Length (sNumCuenta) > 0 ;

iPosicion := fniBuscarPosicIgual (sNumCuenta,                                                argListaCuentas,                                                 iLongLista) ; IF iPosicion = 0 THEN Writeln ('No existe esa cuenta') ELSE EliminarNumCuentaSaldoEnPosicion (argListaCuentas,                                                   iLongLista,                                                    iPosicion) ; END ; END ; { cOpcion = '2'}

'3' : BEGIN IF iLongLista = 0 THEN Writeln ('La lista est vac¡a') ELSE BEGIN Write ('Escribe el n£mero de cuenta: ') ; REPEAT ReadLn (sNumCuenta) ; UNTIL Length (sNumCuenta) > 0 ;

iPosicion := fniBuscarPosicIgual (sNumCuenta,                                                argListaCuentas,                                                iLongLista) ; IF iPosicion = 0 THEN Writeln ('No existe esa cuenta') ELSE WITH argListaCuentas [iPosicion] DO                     BEGIN Writeln ('N£mero de cuenta: ', sNumCuenta) ; Writeln ('          Saldo: ', rSaldo:0:2) ; END ; END ; END ; { cOpcion = '3'}

'4' : BEGIN IF iLongLista = 0 THEN Writeln ('La lista est vac¡a') ELSE MostrarInformacion (argListaCuentas, iLongLista) ; END ; { cOpcion = '4'}

'5' : BEGIN IF iLongLista = 0 THEN Writeln ('La lista est vac¡a') ELSE BEGIN iPosicMaximo := fniBuscarSaldoMaximo (argListaCuentas,                                                    iLongLista) ;

iPosicMinimo := fniBuscarSaldoMinimo (argListaCuentas,                                                    iLongLista) ;

rSaldo := fnrCalcularSaldoMedio (argListaCuentas,                                               iLongLista) ;

WITH argListaCuentas [iPosicMaximo] DO                   Writeln ('Saldo M ximo: ', rSaldo:10:2,                             ' - N£mero de cuenta: ', sNumCuenta:3);

WITH argListaCuentas [iPosicMinimo] DO                   Writeln ('Saldo M¡nimo: ', rSaldo:10:2,                             ' - N£mero de cuenta: ', sNumCuenta:3);

Writeln (' Saldo Medio: ', rSaldo:10:2) ; END ; END ; { cOpcion = '5'}

'6' : BEGIN IF iLongLista = 0 THEN Writeln ('La lista est vac¡a') ELSE MostrarCuentas (argListaCuentas, iLongLista) ; END ; { cOpcion = '6'} END ; IF cOpcion <> '0' THEN cEspera := ReadKey ;

UNTIL cOpcion = '0' ;

writeln ; cEspera := ReadKey ;

END. { FIN del programa P_90_E03.PAS } code