martes, 30 de junio de 2009

Gestión de los clientes de un hotel

Después de haber hablado tanto de ficheros, le proponemos un programa, algo más completo, en el que se controla la presencia de los clientes de un hotel. El núcleo fundamental del programa es un fichero de acceso directo en el que se incluyen los datos más importante de cada cliente:

• nombre y apellido,

• fecha de llegada y

• precio de la habitación por día.

Para tener acceso a los registros individuales se utiliza como "clave" el mismo número de las habitaciones. En el supuesto de que el hotel tenga 100 habitaciones, utilizaremos los números del 1 al 100 para apuntar a los registros. Evidentemente este número se puede modificar cambiando la línea 170.

Las funciones desempeñadas por el programa son:

• registro de una nueva llegada, con indicación en el fichero del precio de la habitación, de la fecha de llegada y del nombre del huésped;

• impresión de la lista de nombres de los clientes alojados en el hotel;

• en caso de partida, cálculo del importe a pagar, y, finalmente,

• cierre del programa.

Las fechas de llegada y partida, proporcionadas en la forma de día y mes, se convierten en número del día del año (1-365) para facilitar el cálculo de los días de estancia. Por sencillez no se tiene en cuenta el año y, por consiguiente, el programa no funcionaría para clientes que estuvieran en el hotel "a caballo" entre dos años. Los días de estancia se calculan como diferencia entre la fecha de partida y la de llegada más uno (línea 4120). Ello es así para tener en cuenta que se paga la habitación aunque sólo se permanezca en el hotel desde la mañana a la tarde; si no está de acuerdo puede suprimirlo.

Así, en la línea 250 comprobamos con LOF( 1) si el fichero no ha ocupado todavía ningún bloque; en tal caso saltamos a la subrutina de la línea 1000, que graba 100 registros con 38 caracteres nulos cada uno (CHR$(0)). Dése cuenta que esto se hace con la variable IN$ que se definió como buffer en la línea 230, mientras que en la 220 usamos PR$, AR$ y NC$. Esto es totalmente correcto siempre que en una misma operación sólo usemos uno de los dos buffers creados. Cuando utilicemos normalmente el programa, además del fichero principal (HOTEL), se debe utilizar otro pequeño fichero (que hemos elegido secuencial) en el que indicar las habitaciones libres (HABITACIONES). Este fichero contiene una copia del vector LIB (100) en el que están indicadas las habitaciones libres con un 0, y las ocupadas, con un 1. Así, cuando se inicializa el fichero HOTEL se inicializará también el fichero HABITACIONES, todo él con valores 0 (línea 1170).

Cuando se ejecuta el programa, lo primero que sucede es que el fichero HABITACIONES se copia en LIB (líneas 270-340). A continuación aparece el menú, que pide al conserje del hotel la operación que desea efectuar.

Si es la llegada de un nuevo cliente, el programa busca, en el vector LIB, si hay habitación libre (líneas 2020-2120). CAM es el número de la habitación que ha de asignarse al cliente (con el número 0 todas las habitaciones están ocupadas). El bucle establecido en las líneas 2060-2080 busca el primer elemento nulo del vector LIB:

2070 IF LIB(K) = 0 THEN CAM = K:K = CA

En caso afirmativo, K se hace igual al número de la habitación, y luego, para salir correctamente del bucle, se establece K=CA (CA es el número total de las habitaciones),

Si no hay ninguna habitación libre, el programa imprimirá un aviso (línea 2100),

Una vez encontrada una habitación libre (CAM) se deben dar los datos de entrada: nombre del cliente, fecha de llegada y precio. La fecha se convierte en el día del año DA (subrutina de la línea 5000), La escritura en el buffer definido en la línea 220 con la instrucción FIELD se realiza con las tres instrucciones LSET (líneas 2230-2250). Las variables numéricas PREC y DA son convertidas en cadenas con MKS$. En la línea 2270 se graba en el fichero el registro de la habitación CAM e inmediatamente después (¡sería lamentable que un conserje lo olvidara!) se indica automáticamente que la habitación está ya ocupada LIB (CAM) = 1.

La subrutina para la lectura de los clientes alojados en el hotel es muy sencilla. Con la instrucción IF THEN en la línea 3030 se buscan las habitaciones ocupadas; a partir de ellas se lee el registro con GET# y luego se imprimen los datos.

Cuando se va un cliente, a través de su número de habitación PA se lee el registro, a partir del cual se obtiene el precio de la habitación y el día de llegada. Con éstos y la fecha de partida que se solicita se calcula el importe total a pagar (línea 4180). Inmediatamente después se pone a "cero" el registro (línea 4250-4260) y se indica que está libre la habitación correspondiente en el vector LIB.

El cierre del .programa copia el vector LIB en el fichero HABITACIONES para permitir el correcto control del hotel en la siguiente ejecución del programa, y luego cierra los dos ficheros HOTEL y HABITACIONES.

Damos a continuación las variables utilizadas en el programa:

• CA número de habitaciones del hotel,

• PR$i PREC precio de la habitación,

• DD.MM día y mes,

• AR$DA día del año,

• NC$ NOM$ nombre y apellidos del cliente,

• IN$ cadena nula de inicialización,

• LIB vector de ocupación de las habitaciones del hotel,

• CAM primera habitación libre,

• PA habitación del huésped,

• DE días de estancia,

• PAG importe del servicio.

100 REM ************************ 110 REM * RECEPCION. DE HOTEL * 120 REM ************************

130 REM 140 REM 150 REM lé>0 REM

170 CA=100:REM NUMERO DE HABITACIONES DEL HOTEL 160 DIM LIBICA):REM VECTOR HABITACIONES LIBRES 190 REM

200 OPEN "R",#l,"HOTEL",38 210 REM

220 FIELD #1,4 AS PR*,4 AS AR*,30 AS NC* 230 FIELD #1,38 AS IN* 240 REM

250 IF LOF(l>=0 THEN GOSUB íOOO 260 REM

270 REM ---- PREPARACION DE VECTOR LIB ----

280 REM ---- DE LAS HABITACIONES LIBRES ---

300 OPEN "I",#2,"HABITACIONES" 310 REM

320 FOR J=l TO CA 330 INPUT #2,LIB(J) 340 NEXT J 350 REM 360 REM

370 REM----MENU DE RECEPCION----

3BO REM

390 CLS: REM BORRADO DE LA PANTALLA 400 REM

5120 REM 5130 REM 5140 REM

8000 REM ---- CIERRE DEL PROGRAMA ----

8010 REM

8020 REM ---- ALMACENAMIENTO DEL VECTOR ----

8030 REM---DE LAS HABITACIONES LIBRES---

8040 OPEN "O",#2,"HABITACIONES" 8050 REM

8060 POR J=l TO CA 8070 PRINT #2.LIB(J) 8080 NEXT J 8090 REM

8100 CLOSE #2:REM CIERRE DEL FICHERO DE LAS HABITACIONES 8110 REM

8120 CLOSE #l:REM CIERRE DEL FICHERO DEL HOTEL 8130 REM

8140 PRINT "FINAL DEL TRABAJO" 8150 REM 8160 END

No hay comentarios:

Publicar un comentario