2

Como desarrollar un software de parqueadero sin BD usando listas y diccionarios

A continuación te muestro como use todos los conceptos aprendidos en este curso, para desarrollar un software de parqueaderos sin usar una Base de datos, solo con el uso de listas y diccionarios lleve a cabo ese programita que aunque parezca sencillo tiene su trabajito, pero a continuación lo comparto con ustedes y lo explico, por si alguno quiere verlo y guiarse para algo. Agradezco si me quieren dejar alguna opción de mejora,

El modelo de negocio que quise llevar a cabo fue el de fuera un sistema de parqueadero dinámico donde el administrador digite la cantidad y nombre de los parqueaderos, puede que solo tenga espacio para 10 carros pero 20 motos, esto los digitara y a cada espacio asignara un nombre el cual el sistema dará dinámicamente a cada registro de vehículo. El costo por hora de cada vehículo esta quemado en el código. cuando se ingrese un vehículo se seleccionara si es moto o carro, o si quiere retirar un vehículo deberá digitar la placa del vehículo, si el parqueadero ya no tiene lugares disponibles saldrá un mensaje que diga PARQUEADERO LLENO.
A continuación detallare el código en parte, explicando que se uso, porque y para que se usa.

  1. Se capturan los datos por parte del usuario donde indica cuantos campos de vehículos quiere registrar y los nombres de los mismos y se aprecia el valor por fracción para cada tipo de vehículo:
    Captura de pantalla 2023-04-08 165623.png
    Para esto use el casteo a int y el input para recibir el valor de cuantos parqueaderos desea registrar y en la parte de los nombres los registros usando el agregar un registro nuevo a una lista que ya cree mas arriba y que se llama “name_camp_cars” y “name_camp_moto”, cuando las declaro están vacías pero según la cantidad de parqueaderos, se llenaran con un diccionario en cada posición, para esto son las {}.
    Salida:
    prueba 1.png
    Y en la consola nos pediría los datos según la cantidad de campos de parqueadero que hayamos colocado, en mi caso para la prueba coloco 2 para carro y 2 para moto y registre los nombres para el carro A1, A2 y para moto B1, B2 y como podemos ver salen un mensaje indicando cuales lugares se tienen disponibles.

  2. A continuación podremos ver como están declaradas las variables del registro de un vehículo al parqueadero, están son “register_car” y “register_motorcycle” (a este punto creo que ya habrán notado mi spanglish pero bueno me divertía jejej) ahora debo saber si hay lugares disponibles de parqueaderos para ambos vehículos, esto lo realizo con for que recorre la lista y que la x va pasando por cada ítem y preguntando si el la key ‘avaliable’ esta es True ósea que si esta libre y nos dice si al menos hay uno, y si no, nos saldrá un mensaje de parqueadero de motos lleno, de carros o de ambos si es el caso. y a continuación preguntara cual opciones deseas realizar, si registrar un nuevo vehículo o darle salida a uno y por consiguiente cobrar.
    entra a ciclo.png
    y en la consola tenemos las siguientes opciones:
    prueba 2.png

  3. Para la siguiente parte digitaríamos 1 para registrar una entrada de un vehículo al parqueadero.
    En el siguiente código podemos apreciar como se hizo el uso al condicional if en el cual validamos si el valor ingresado es digito, ósea si no es 1 o 2 la opción registrada, si no que es una palabra u otra opción no permitida, para esto nos aseguramos con esta condición. Ya luego si la validación le permite continuar procedemos a revisar con un “ELIF” y ver si registro una moto o un carro, para lo siguiente vamos a validar la parte de moto que es la misma que la de un carro el único cambio seria el nombre de las variables pero la lógica es la misma.
    A continuación solo se le solicita el numero de la placa para el registro, y ya el campo del parqueadero es seleccionado al azar de los campos disponibles con la opción “random.choice” que como recordamos se debe importar la librería randon “import random” el cual esta en las primeras líneas de código como lo dictan las buenas practicas; para la obtencion de la fecha importe la librería “datetime” de la siguiente manera “from datetime import datetime” y obtuve en la variable “hour_inside” la hora de ingreso obtenida desde el servidor o pc donde este corriendo el programa.
    Luego para registrar un vehículo doy un “append” a la lista “register_motorcycle” donde guardo de nuevo un diccionario.
    codigo 3.png
    ya sea para carro o moto se realizara de la misma manera y en la consola se tiene el siguiente resultado:
    prueba 3.png

  4. Ahora si lo que se quiere es dar salida a un vehículo digitando la opción 2, se tiene el siguiente código, en donde solicitamos la opción que desea realizar el usuario, para esto como lo vimos anteriormente validamos que sea una opción valida, si ingreso una opción valida de retirar un vehículo, para este caso vamos a realizar la prueba como la parte de codigo de dar salida a una moto, tenemos que se solicita la placa del vehículo a dar salida y lo guardamos en la variable “placa_pay” y este valor lo buscamos en la lista de diccionarios que habíamos creado al momento de realizar el ingreso, primero se valida si la placa existe y toda la validación la realizamos dentro del if que vemos en la linea 111 en cual recorremos la lista de igual manera con un for y validando que el registro tenga la el “Action”==“Entro” ya que luego veremos como actualizamos este valor cuando se le da salida a un vehículo, continuando con nuestro ejercicio vemos que si esto nos da una lista vacía ósea toda esa condición da “[]” esto nos dice que no existe ese valor, bueno así lo valide yo, puede ser que haya otra mejor manera de hacerlo, si cumple con esta condición nos arrojaría el mensaje de “LA PLACA CONSULTADA NO FUE ENCONTRADA” y se daría un “continue” para que salga de ahi y vuelva al ciclo sin terminar el programa; luego obtenemos los datos del vehículo consultado como lo es la hora de entrada en la variable “hour_inside” y el lugar de estacionamiento que tiene asignado en la variable “place_our”, procedemos a realizar el cobro de cuanto duro el vehiculo alli, para esto tomamos la hora actual, menos la hora de entrada del vehiculo, esta la convertimos a segundos con la opción “.total_seconds()” lo dividimos en 3600 que son los segundos que tiene una hora, luego este valor puede llegar a ser un float o un entero puesto que el vehículo pudo haber estado por 1.5 horas parqueadero, lo que hacemos es que lo llevamos a valor techo con la opcion “math.ceil(total)” hacemos uso de una ayuda mediante la libreria que importe llamada “import math” y ya luego procedemos a realizamos una multiplicación sencilla por el valor de la hora y nos dice cuanto deberá pagar.
    A continuación realizamos la operación de liberar el espacio del parqueadero para que otro vehículo pueda ocupar el lugar para esto hacemos usamos de un for el cual recorre la lista de “name_camp_moto” y valida el lugar de parqueo a liberar, esto lo convierto a string y lo saco de una lista porque ese era el valor que tenia guardado y cambiamos los valores de “Avalible” a True para que quede libre ese espacio.
    y por ultimo procedemos a modificar el registro de entrada para añadir la hora y fecha de salida, lo que pago y la “Action” cambio a ‘salio’ esto para llevar un registro de todo vehículo registrado y poder si se quiere añadir un poco mas de código y sacar la cuenta de cuanto se cobro en el día.
    codigo 4.png

Y en la consola tenemos lo siguiente:
prueba 4.png

Para la parte de carros seria la misma lógica, así que con esto concluye mi proyecto, fue un reto que yo mismo me propuse el cual disfrute realizando, espero les sirva de algo y aquí les dejo todo el código por si alguno lo quiere ver mejor, probar o hacerle cambios:

from datetime import datetime
import random
import math

#Definir cuantos cupos tiene el parqueadero en motos y carros
print(’////BIENVENIDO AL SISTEMA DE PARQUEADEROS GALVIS////’)
print(’----------------------------------------------------’)
camp_cars = int(input('Ingresa la cantidad de parqueaderos para carros: '))
camp_motorcycles = int(input('Ingresa la cantidad de parqueaderos para motos: '))

#Definir los campos del parqueadero
name_camp_cars = []
name_camp_moto = []

while int(len(name_camp_cars)) < camp_cars:
name_camp_cars.append({‘place’: str(input('Ingresa el nombre del campo del parqueadero de carro: ')),‘avalible’:True})
#print(name_camp_cars)

while int(len(name_camp_moto)) < camp_motorcycles:
name_camp_moto.append({‘place’: str(input('Ingresa el nombre del campo del parqueadero de moto: ')),‘avalible’:True})
#print(name_camp_moto)

#Definir tarifa de cobro por tiempo
cost_frac_car = 2000
cost_frac_moto = 1000

#Registrar entrada de vehicula o cobrar parqueadero
register_car = []
register_motorcycle =[]

while True:
#recorrer un for dentro de una lista para consultar los diccionarios que hay
place_free_moto = [x[‘place’] for x in name_camp_moto if x[‘avalible’] == True]
place_free_car = [x[‘place’] for x in name_camp_cars if x[‘avalible’] == True]
print(‘lugares disponibles:’,place_free_car,place_free_moto)

print(‘QUE OPCION DESEAS REALIZAR?’)
options = input(‘1. Registrar nuevo vehiculo \n2. Registrar salida de vehiculo:\n opcion >:’)
#Validar que el dato no sean letras
if options.isdigit() and options !=‘1’ and options !=‘2’:
print(‘NO SE ADMITEN LETRAS SOLO LAS OPCIONES 1 o 2’)
#Opcion para registrar Moto
elif options == ‘1’:
if len(place_free_moto) > 0 or len(place_free_car) > 0:

type_vehicule= input('QUE TIPO DE VEHICULO DESEAS REGISTRAR?\n1.Moto\n2.Carro\nopcion >:')

 iftype_vehicule.isdigit() and type_vehicule !='1'and type_vehicule !='2':
   print('NO SE ADMITEN LETRAS SOLO LAS OPCIONES 1 o 2')

  #registrar Motoelif (type_vehicule =='1'and len(place_free_moto) > 0):

  #print('ingreso a registrar moto')
  placa= str(input('POR FAVOR INGRESA LA PLACA DEL VEHICULO >:'))
  hour_inside= datetime.now().strftime('%Y-%m-%d %H:%M')
  place_random = random.choice(place_free_moto)
  #print(place_random)
  register_motorcycle.append({'place':place_random, 'placa': placa, 'hour_inside': hour_inside, 'Action':'Entro'})

  for x in name_camp_moto:
    if x['place'] == place_random:
      x['avalible'] = False
  print('El registro de vehiculos es el siguiente: ', register_motorcycle)

  #Registrar Carro
 eliftype_vehicule =='2'and len(place_free_car) > 0:

  #print('ingreso a registrar carro')
  placa= str(input('POR FAVOR INGRESA LA PLACA DEL VEHICULO >:'))
  hour_inside= datetime.now().strftime('%Y-%m-%d %H:%M')
  place_random = random.choice(place_free_car)
  #print(place_random)
  register_car.append({'place':place_random, 'placa': placa, 'hour_inside': hour_inside, 'Action':'Entro'})

  for x in name_camp_cars:
    if x['place'] == place_random:
      x['avalible'] = False
  print('El registro de vehiculos es el siguiente: ', register_car)

 elif len(place_free_moto) == 0:
   print('PARQUEADERO DE MOTOS LLENO')
 elif len(place_free_car) == 0:
   print('PARQUEADERO DE CARROS LLENO')    
 #print('final',type_vehicule, placa,hour_inside)else:
  print('POR FAVOR INTRODUZCA UNA SELECCION VALIDA')
  print('##############################################################################')

else :
  print('PARQUEADERO LLENO, ESPERE QUE SALGA UN VEHICULO')

#option de retirar un vehiculo, aqui se dira cuanto se cobra y cuanto
elif options == ‘2’:
#juntar las dos listas para buscar el registro en una sola lista
option_cash = input('POR FAVOR DIGITE EL TIPO DE VEHICULO A COBRAR\n 1.Moto.\n 2.Carro.\n Opcion: ')

if option_cash.isdigit() and option_cash !=‘1’ and option_cash !=‘2’:
print(‘NO SE ADMITEN LETRAS SOLO LAS OPCIONES 1 o 2’)

#Registrar salida de una moto ##############################
if option_cash == ‘1’:
placa_pay = str(input('POR FAVOR DIGITE LA PLACA A COBRAR: '))

#se valida que se encuentre la placa consultadaif str([x['Action'] for x in register_motorcycle if x['placa'] == placa_pay and x['Action'] == 'Entro']) == '[]':
  print('LA PLACA CONSULTADA NO FUE ENCONTRADA')
  continue

hour_inside = [x['hour_inside'] for x in register_motorcycle if x['placa'] == placa_pay and x['Action'] == 'Entro']
place_out = [x['place'] for x in register_motorcycle if x['placa'] == placa_pay and x['Action'] == 'Entro']

#calcular tiempo de cobro

hour_now = datetime.now().strftime('%Y-%m-%d %H:%M')
total = datetime.strptime(hour_now, '%Y-%m-%d %H:%M') - datetime.strptime(str(hour_inside[0]), '%Y-%m-%d %H:%M')
total = total.total_seconds()
total = total / 3600
#Convertir el tiempo de parqueo a un entero para poderlo multiplicar por el costo
total = math.ceil(total)
total = total * cost_frac_moto
print('Tu valor a pagar de parqueo es => ',total)

#liberar parqueadero
for x in name_camp_moto:
 if x['place'] == str(place_out[0]):
  x['avalible'] = True    
print('for', name_camp_moto, place_out)
#Actualizar volante de salida con hora de salida y pago total para llevar un registro
for x in register_motorcycle:
 if x['placa'] == placa_pay:
  x['hour_out'] = datetime.now().strftime('%Y-%m-%d %H:%M')
  x['pay_all'] = total
  x['Action'] = 'salio'

print('los vehiculos motorizados registrados son los siguientes: ', register_motorcycle)

#Registrar salida de un carro######################
elif option_cash == ‘2’:
placa_pay = str(input('POR FAVOR DIGITE LA PLACA A COBRAR: '))

#se valida que se encuentre la placa consultadaif str([x['Action'] for x in register_car if x['placa'] == placa_pay and x['Action'] == 'Entro']) == '[]':
  print('LA PLACA CONSULTADA NO FUE ENCONTRADA')
  continue

hour_inside = [x['hour_inside'] for x in register_car if x['placa'] == placa_pay and x['Action'] == 'Entro']
place_out = [x['place'] for x in register_car if x['placa'] == placa_pay and x['Action'] == 'Entro']

#calcular tiempo de cobro

hour_now = datetime.now().strftime('%Y-%m-%d %H:%M')
total = datetime.strptime(hour_now, '%Y-%m-%d %H:%M') - datetime.strptime(str(hour_inside[0]), '%Y-%m-%d %H:%M')
total = total.total_seconds() 
total = total / 3600

#Convertir el tiempo de parqueo a un entero para poderlo multiplicar por el costo
total = math.ceil(total)
total = total * cost_frac_car
print('Tu valor a pagar de parqueo es => ',total)

#liberar parqueadero
for x in name_camp_cars:
 if x['place'] == str(place_out[0]):
  x['avalible'] = True 

print('for', name_camp_cars,place_out)

#Actualizar volante de salida con hora de salida y 
for x in register_car:
 if x['placa'] == placa_pay:
  x['hour_out'] = datetime.now().strftime('%Y-%m-%d %H:%M')
  x['pay_all'] = total
  x['Action'] = 'salio'

print('los vehiculos registrados son los siguientes: ', register_car)

else:
print(‘POR FAVOR INTRODUZCA UNA SELECCION VALIDA’)
else:
print(‘POR FAVOR INTRODUZCA UNA SELECCION VALIDA’)

Archivo parquedero.py
https://www.mediafire.com/file/128udd1a4jw1fhf/parqueadero.py/file

Escribe tu comentario
+ 2
2
15060Puntos

Excelente codigo, solo tengo una pequeña duda