Blog de conocimiento gratuito: linux, programación, open source, bases de datos, android, frameworks, web e informática en general.
Hoy vamos a ver un pequeño sistema de estacionamiento en el lenguaje de programación C, también conocido como ANSI C. Es un ejercicio resuelto. El mismo dice así:
Un estacionamiento posee 10 puestos para carros y 6 para moto. La empresa desea un software que le permita mantener el registro de los autos que entran y salen del estacionamiento para saber cuáles puestos quedan libres.
Consideraciones del sistema.
Veamos cómo hacer este ejercicio de estacionamiento en C.
Vamos a usar un arreglo de structs. Cada struct o estructura de C va a representar un lugar en el estacionamiento, y este tendrá varias propiedades como su estado (ocupado, desocupado), placas, hora de entrada, etcétera.
Las fechas (horas de entrada) las vamos a manejar como marcas de tiempo o timestamps que son un número entero, y después vamos a crear otra función que las va a formatear como fecha local.
Como vamos a tener todo como entero, sacar la diferencia de tiempo será muy fácil ya que tendremos la diferencia en segundos.
Iremos trabajando todo en un arreglo, y dividiremos el trabajo en funciones para poder hacerlo más sencillo.
Comencemos viendo la estructura de un lugar en el estacionamiento. Es un struct de C y se ve así:
Las horas no son las horas que lleva estacionado el vehículo, sino las horas que el vehículo planea estar dentro del estacionamiento (para, más tarde, calcular el costo extra). Luego declaramos un arreglo y lo inicializamos:
Como puedes ver, primero coloqué los carros y después las motos; todos pertenecen al mismo arreglo pero los diferencia el tipo.
La declaración está en la línea 26 y la limpieza está en la función que aparece al inicio.
Veamos cómo se registra un vehículo. Primero tenemos que verificar que el lugar sea correcto, que no esté ocupado y que no exista un vehículo con esas mismas placas.
Tenemos el menú donde solicitamos las placas, horas y lugar:
Y después invocamos a la función que modifica el arreglo, pasándole el índice del elemento que tiene que modificar (debido a que los arreglos se pasan por referencia, va a modificar al arreglo original):
Simplemente le ponemos el estado ocupado y marcamos la hora de entrada. Para obtenerla invocamos a time
pasándole NULL
, de modo que nos devuelve el timestamp de la hora actual.
Para solicitar el lugar al que ingresa el vehículo, debemos mostrar el estado de los lugares, quién los ocupa y desde cuándo.
El listado queda así:
Lo que hace es listar todos los lugares y su estado junto con la fecha de entrada (aquí estamos convirtiendo el timestamp a fecha). Así de simple.
Para terminar con nuestro programa en C para gestionar un estacionamiento, veamos cómo marcar la salida de un vehículo. Aquí es en donde se calcula el tiempo transcurrido, costos, etcétera.
Primero un menú para solicitar el lugar y verificar si ese lugar está ocupado:
Luego tenemos a la función que invoca a otras 2: la que realmente hace el cálculo y la que limpia el lugar.
Por favor nota que en el caso de la limpieza del lugar estamos recibiendo un apuntador al elemento del arreglo de los lugares. Esto es porque no estamos recibiendo el arreglo completo.
Toda la magia y operaciones suceden en la función calcularEImprimirInformacionSalida
. Ahí calculamos la diferencia y cobramos las horas que el vehículo solicitó al entrar, sin importar si alcanzó ese tiempo o no.
Luego nos fijamos en el tiempo extra y en caso de que exista multiplicamos los minutos extra (tomando en cuenta también las horas, por ello la multiplicación por 60) por el costo de cada minuto extra.
Arriba te mostré las funciones más importantes, pero no es todo el código. El código completo queda así:
Yo lo he probado con el compilador GCC y Dev-C++; en ambos lugares funciona correctamente aunque no recomiendo usar Dev-C++.
Para terminar te dejo con más tutoriales de C en mi blog.