Ejercicio+de+lista+de+clientes

=Ejercicio de lista de clientes=

Ejemplo de programa que manipula un array de registros:

Mantener una lista (array) de clientes: >> 1. Añadir un cliente a la lista (en orden creciente de edad) >> 2. Borrar un cliente de la lista >> 3. Mostrar contenido de la lista

code format="pascal" PROGRAM Clientes ; USES Crt ;

CONST MAX_CLIENTES = 50 ;

TYPE tsCadenas    = String [30] ; tasDosCadenas = ARRAY [1..2] OF tsCadenas ;

trgNombrCompl = RECORD sNombre   : tsCadenas ; asApellido : tasDosCadenas END ;

trgPersonas = RECORD rgIdent   : trgNombrCompl ; sDireccion : tsCadenas ; byEdad    : Byte ; END ;

targListasPersonas = ARRAY [1..MAX_CLIENTES] OF trgPersonas ;

VAR argListaClientes : targListasPersonas ; iNumClientes    : Integer ; cOpcion, cEspera : Char ;

FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN ClrScr ; WriteLn ('********* MENU DE OPCIONES *********') ; WriteLn ('1.- Añadir un nuevo cliente') ; WriteLn ('2.- Borrar un registro') ; WriteLn ('3.- Mostrar lista de clientes') ; WriteLn ('0.- Terminar') ; WriteLn ; Write (' Pulsa la tecla de la opción: ') ; REPEAT cOpcion := ReadKey UNTIL ('0' <= cOpcion) AND (cOpcion <= '3') ;  {  cOpcion IN ['0'..'3'] } WriteLn (cOpcion) ; WriteLn ;

fncLeerOpcion := cOpcion END ;

PROCEDURE LeerPersona (VAR rgPersona : trgPersonas) ; BEGIN WITH rgPersona, rgIdent DO     BEGIN Write ('          Nombre: ') ; ReadLn (sNombre) ; Write (' Primer apellido: ') ; ReadLn (asApellido[1]) ; Write ('Segundo apellido: ') ; ReadLn (asApellido[2]) ; Write ('       Dirección: ') ; ReadLn (sDireccion) ; Write ('            Edad: ') ; ReadLn (byEdad) END END ;

PROCEDURE MostrarPersona (CONST rgPersona : trgPersonas) ; BEGIN WITH rgPersona, rgIdent DO     BEGIN WriteLn ('  Nombre: ', asApellido[1], ' ',asApellido[2],               ', ', sNombre) ; WriteLn ('Dirección: ', sDireccion) ; WriteLn ('    Edad: ', byEdad) END END ;

FUNCTION fniBuscarMayor (     byEdad           : Integer ;                         CONST argListaClientes : targListasPersonas ;                               iNumClientes     : Integer) : Integer ; { Retorna la posición del primer elemento de la lista de edad mayor o igual que byEdad, y si no hay mayores, devuelve la posición iNumClientes + 1. } VAR i : Integer ; boEncontrado : Boolean ; BEGIN i := 1 ; boEncontrado := FALSE ;

WHILE NOT boEncontrado AND (i <= iNumClientes) DO        IF byEdad <= argListaClientes[i].byEdad THEN boEncontrado := TRUE ELSE i := i + 1 ;

fniBuscarMayor := i END ;

PROCEDURE InsertarCliente (CONST rgCliente        : trgPersonas ;                            VAR   argListaClientes : targListasPersonas ;                            VAR   iNumClientes     : Integer;                                  iPosicion        : Integer) ; VAR i : Integer ; BEGIN FOR i := iNumClientes DOWNTO iPosicion DO      argListaClientes [i + 1] := argListaClientes [i] ;

argListaClientes [iPosicion] := rgCliente ;

iNumClientes := iNumClientes + 1 END ;

PROCEDURE AnyadirEnOrden (CONST rgCliente        : trgPersonas ;                           VAR   argListaClientes : targListasPersonas ;                           VAR   iNumClientes     : Integer) ; VAR iPosicion : Integer ; BEGIN iPosicion := fniBuscarMayor (rgCliente.byEdad, argListaClientes,                               iNumClientes) ;

InsertarCliente (rgCliente, argListaClientes, iNumClientes, iPosicion) END ;

PROCEDURE AnyadirCliente (VAR argListaClientes : targListasPersonas ;                         VAR iNumClientes     : Integer) ; VAR rgCliente : trgPersonas ; BEGIN IF iNumClientes < MAX_CLIENTES THEN BEGIN                                     {la lista no está completa } LeerPersona (rgCliente) ; AnyadirEnOrden (rgCliente, argListaClientes, iNumClientes) ; WriteLn ('--- Añadido el cliente --- ') END ELSE WriteLn ('No se puede añadir más clientes: la lista está llena') END ;

FUNCTION fniBuscarCliente (     rgIdentificacion : trgNombrCompl ;                           CONST argListaClientes : targListasPersonas ;                                 iNumClientes     : Integer) : Integer ; { Retorna la posición del cliente buscado, y si no existe retorna 0 } VAR i : Integer ; boEncontrado : Boolean ; BEGIN i := 1 ; boEncontrado := FALSE ;

WHILE NOT boEncontrado AND (i <= iNumClientes) DO      WITH argListaClientes[i], rgIdent DO            IF (sNombre = rgIdentificacion.sNombre) AND (asApellido[1] = rgIdentificacion.asApellido[1]) AND (asApellido[2] = rgIdentificacion.asApellido[2]) THEN boEncontrado := TRUE ELSE i := i + 1 ;

IF boEncontrado THEN fniBuscarCliente := i  ELSE fniBuscarCliente := 0 END ;

PROCEDURE EliminarCliente (VAR argListaClientes : targListasPersonas ;                            VAR iNumClientes     : Integer;                                iPosicion        : Integer) ; VAR i : Integer ; BEGIN FOR i := iPosicion TO iNumClientes - 1 DO      argListaClientes [i] := argListaClientes [i + 1] ; iNumClientes := iNumClientes - 1 END ;

PROCEDURE BorrarCliente (VAR argListaClientes : targListasPersonas ;                        VAR iNumClientes     : Integer) ; VAR rgIdentificacion : trgNombrCompl ; iPosicion       : Integer ; BEGIN IF iNumClientes >= 1 THEN BEGIN WITH rgIdentificacion DO        BEGIN Write ('          Nombre: ') ; ReadLn (sNombre) ; Write (' Primer apellido: ') ; ReadLn (asApellido[1]) ; Write ('Segundo apellido: ') ; ReadLn (asApellido[2]) END ;

iPosicion := fniBuscarCliente (rgIdentificacion, argListaClientes,                                    iNumClientes) ; IF iPosicion <> 0 THEN BEGIN               { se ha encontrado al Cliente buscado } EliminarCliente (argListaClientes, iNumClientes, iPosicion) ;

WriteLn ('--- Borrado el cliente --- ') END ELSE WriteLn ('¡ No existe ese cliente !') END

ELSE WriteLn ('La lista de clientes está vacía') END ;

PROCEDURE MostrarClientes (CONST argListaClientes : targListasPersonas ;                                iNumClientes     : Integer) ; VAR i : Integer ; cEspera : Char ; BEGIN IF iNumClientes = 0 THEN WriteLn ('La lista de clientes está vacía') ELSE BEGIN WriteLn ; WriteLn ('Contenido de la lista de clientes: ') ; WriteLn ; FOR i := 1 TO iNumClientes DO         BEGIN MostrarPersona (argListaClientes[i]) ; cEspera := ReadKey ; WriteLn END ; WriteLn ('') END END ;

BEGIN {******************** Programa Principal *************************} iNumClientes := 0 ;           { inicialmente la lista está vacía }

REPEAT cOpcion := fncLeerOpcion ; CASE cOpcion OF          '1' : AnyadirCliente  (argListaClientes, iNumClientes) ; '2' : BorrarCliente (argListaClientes, iNumClientes) ; '3' : MostrarClientes (argListaClientes, iNumClientes) END ;

IF cOpcion <> '0' THEN BEGIN Write ('                     Pulsa una tecla para continuar') ; cEspera := ReadKey END UNTIL cOpcion = '0'

Writeln ; Write ('                     Pulsa una tecla para finalizar') ; cEspera := ReadKey

END. { FIN DE CLIENTES.PAS } code