using System.Collections.Generic;
using System.Threading.Tasks;
namespace CAI_Expendedora
public const string opcEncender = "1";
public const string opcListarLatas = "2";
public const string opcInsertarLata = "3";
public const string opcExtraerLata = "4";
public const string opcConocerBalance = "5";
public const string opcMostrarStock = "6";
public const string opcSalir = "S";
const string menu = "Ingrese una opción:\n" + opcEncender + " - Encender la maquina\n"
+ opcListarLatas + " - Listar latas disponibles\n" + opcInsertarLata + " - Insertar una lata\n"
+ opcExtraerLata + " - Comprar lata\n" + opcConocerBalance + " - Conocer el balance\n"
+ opcMostrarStock + " - Conocer el stock\n" + opcSalir + " - Salir y apagar la maquina";
static void Main(string[] args)
Expendedora expend = new Expendedora();
ingreso = Console.ReadLine().ToUpper();
if (!ServicioValidacion.ValidarStringNoVacio(ingreso))
Console.WriteLine("Debe ingresar al menos un caracter.");
else if (ingreso != opcEncender && ingreso != opcListarLatas && ingreso != opcInsertarLata && ingreso != opcExtraerLata && ingreso != opcConocerBalance && ingreso != opcMostrarStock && ingreso != opcSalir)
Console.WriteLine("Debe ingresar un codigo valido.");
} while (!(ServicioValidacion.ValidarStringNoVacio(ingreso)) || (ingreso != opcEncender && ingreso != opcListarLatas && ingreso != opcInsertarLata && ingreso != opcExtraerLata && ingreso != opcConocerBalance && ingreso != opcMostrarStock && ingreso != opcSalir));
if (!expend.Encendida && opcElegida != opcSalir)
if (opcElegida == opcEncender)
expend.EncenderMaquina();
Console.WriteLine("Se ha encendido la maquina");
Console.WriteLine("La maquina no se encuentra encendida");
else if (expend.Encendida)
if (opcElegida == opcEncender)
Console.WriteLine("La maquina ya se encuentra encendida");
else if (opcElegida == opcListarLatas)
Console.WriteLine(expend.ListaDatosDeLatas());
else if (opcElegida == opcInsertarLata)
else if (opcElegida == opcExtraerLata)
Console.WriteLine("La maquina expendedora se encuentra vacia");
else if (opcElegida == opcConocerBalance)
else if (opcElegida == opcMostrarStock)
Console.WriteLine("La maquina expendedora se encuentra vacia");
else if (opcElegida == opcSalir)
Console.WriteLine("Se ha apagado la maquina");
} while (opcElegida != opcSalir);
Console.WriteLine("Ha salido de la ejecución de expendedora satisfactoriamente.");
private static void IngresarLata(Expendedora expendedora)
Lata lataCopiada = new Lata();
Console.WriteLine(expendedora.ListaDatosDeLatas());
Console.WriteLine("Ingrese el codigo de la lata a ingresar");
codigo = Console.ReadLine().ToUpper();
if (!ServicioValidacion.ValidarStringNoVacio(codigo))
Console.WriteLine("Debe ingresar al menos un caracter.");
lataCopiada = expendedora.ValidarCodigoVsListaLatas(codigo);
double precio = ServicioValidacion.PedirDoubleMayorAZero("Ingrese el precio de la lata");
double volumen = ServicioValidacion.PedirDoubleMayorAZero("Ingrese el volumen de la lata");
Lata lataAAgregar = new Lata(lataCopiada.Codigo, lataCopiada.Nombre, lataCopiada.Sabor, precio, volumen);
expendedora.AgregarLata(lataAAgregar);
Console.WriteLine("Se ha agregado satisfactoriamente la lata de " + expendedora.DevuelveUltimaLata());
catch (CodigoInvalidoException codExcep)
Console.WriteLine(codExcep.Message);
catch (CapacidadInsuficienteException capExcep)
Console.WriteLine(capExcep.Message);
private static void ExtraerLata(Expendedora expendedora)
Lata lataMatcheaCodigo = new Lata();
Console.WriteLine(expendedora.ListaDatosDeLatas());
Console.WriteLine("Ingrese el codigo de la lata que desea comprar");
codigo = Console.ReadLine().ToUpper();
if (!ServicioValidacion.ValidarStringNoVacio(codigo))
Console.WriteLine("Debe ingresar al menos un caracter.");
lataMatcheaCodigo = expendedora.ValidarCodigoVsListaLatas(codigo);
expendedora.ComprobarStock(codigo);
double dinero = ServicioValidacion.PedirDoubleMayorAZero("Ingrese el dinero");
Lata lataExtraida = expendedora.ExtaerLata(codigo, dinero);
Console.WriteLine("Se ha extraido una lata " + lataExtraida.DevuelveLatas());
catch (CodigoInvalidoException codExcep)
Console.WriteLine(codExcep.Message);
catch (SinStockException stoExcep)
Console.WriteLine(stoExcep.Message);
catch (DineroInsuficienteException dinExcep)
Console.WriteLine(dinExcep.Message);
private static void ObtenerBalance(Expendedora expendedora)
Console.WriteLine(expendedora.GetBalance());
private static void MostrarStock(Expendedora expendedora)
Console.WriteLine(expendedora.PasarStock());
using System.Collections.Generic;
using System.Threading.Tasks;
namespace CAI_Expendedora
static class ServicioValidacion
public static bool ValidarStringNoVacio(string stringAValidar)
if (stringAValidar == "")
public static double PedirDoubleMayorAZero(string mensaje)
string mensError = "Debe ingresar un valor mayor a 0.";
Console.WriteLine(mensaje);
if (!double.TryParse(Console.ReadLine(), out valor))
Console.WriteLine(mensError);
Console.WriteLine(mensError);
using System.Collections.Generic;
using System.Threading.Tasks;
namespace CAI_Expendedora
class SinStockException : Exception
public SinStockException() : base("No hay stock para la lata seleccionada")
using System.Collections.Generic;
using System.Threading.Tasks;
namespace CAI_Expendedora
public Lata(string codigo, string nombre, string sabor)
public Lata(string codigo, string nombre, string sabor, double precio, double volumen)
private double GetPrecioPorLitro()
double cantLitrosLata = this._volumen / 1000;
double precioXLitro = this._precio / cantLitrosLata;
public string DevuelveLatas()
return this._codigo + " - " + this._nombre + " " + this._sabor;
public override string ToString()
return string.Format("Nombre: {0}, Sabor: {1}, $/L Precio por litro: {2}", this._nombre, this._sabor, this.GetPrecioPorLitro());
using System.Collections.Generic;
using System.Threading.Tasks;
namespace CAI_Expendedora
_latas = new List<Lata>();
public Expendedora(string proveedor)
this._proveedor = proveedor;
_latas = new List<Lata>();
public void AgregarLata(Lata lataAInsertar)
if (GetCapacidadRestante() == 0)
throw new CapacidadInsuficienteException();
_latas.Add(lataAInsertar);
public Lata ValidarCodigoVsListaLatas(string codigo)
Lata lataEncontrada = new Lata();
foreach (Lata lataABuscar in _latasDeMenu)
if (lataABuscar.Codigo == codigo)
lataEncontrada = lataABuscar;
throw new CodigoInvalidoException();
public Lata conseguirUltimaLataStockXCodigo(string codigo)
Lata ultimaLata = new Lata();
foreach (Lata lataABuscar in _latas)
if (lataABuscar.Codigo == codigo)
ultimaLata = lataABuscar;
public Lata ExtaerLata(string codigo, double dinero)
Lata ultimaLataXCodigo = conseguirUltimaLataStockXCodigo(codigo);
ComprobarDinero(ultimaLataXCodigo, dinero);
int indice = _latas.FindLastIndex(delegate (Lata lata) {
return lata.Codigo == codigo;
this._dinero = ultimaLataXCodigo.Precio + this._dinero;
return ultimaLataXCodigo;
public string GetBalance()
string dinero = "El dinero que tiene la maquina expendedora es $" + this._dinero;
string stock = "la cantidad de latas que posee en stock es de " + this._latas.Count + " latas.";
return dinero + " y " + stock;
private int GetCapacidadRestante()
return this.capacidad - _latas.Count;
private void cargaInicialDeLatas()
_latasDeMenu = new List<Lata>();
_latasDeMenu.Add(new Lata("CO1", "Coca Cola", "Regular"));
_latasDeMenu.Add(new Lata("CO2", "Coca Cola", "Zero"));
_latasDeMenu.Add(new Lata("SP1", "Sprite", "Regular"));
_latasDeMenu.Add(new Lata("SP2", "Sprite", "Zero"));
_latasDeMenu.Add(new Lata("FA1", "Fanta", "Regular"));
_latasDeMenu.Add(new Lata("FA2", "Fanta", "Zero"));
public string ListaDatosDeLatas()
string lista = "Listado de latas:\n";
foreach (Lata lataAListar in _latasDeMenu)
lista = lista + lataAListar.DevuelveLatas() + "\n";
public string DevuelveUltimaLata()
return _latas.LastOrDefault().DevuelveLatas();
public void EncenderMaquina()
public void ApagarMaquina()
public bool ComprobarDinero(Lata lataAComprar, double dineroCompra)
if (dineroCompra >= lataAComprar.Precio)
throw new DineroInsuficienteException();
private int StockXCodigo(string codigo)
foreach (Lata lataXCodigo in _latas)
if (codigo == lataXCodigo.Codigo)
public bool ComprobarStock(string codigo)
int contador = StockXCodigo(codigo);
throw new SinStockException();
public string PasarStock()
foreach (Lata lataEnStock in _latas)
stock = stock + lataEnStock.ToString() + "\n";