fork download
  1. module Ejemplo =
  2.  
  3. open System
  4. open Microsoft.FSharp.Reflection
  5. open System.Collections.Generic
  6.  
  7. type Diametro = Pequeño | Mediano | Grande
  8. type Color = Narana | Amarilla | Verde
  9. type Maduración = Pasada | Óptima | ``Ligeramente inmadura`` | ``Completamente inmadura``
  10. type Forma = Redonda | ``Otra Forma``
  11. type Peso = ``Menos 100g`` | ``Entre 100 y 200g`` | ``Entre 200 y 300g`` | ``Entre 300 y 400g`` | ``Entre 400 y 500g`` | ``Mayor 500g``
  12.  
  13. type Naranja = { Diametro: Diametro; Color: Color; Maduración: Maduración; Forma: Forma; Peso: Peso }
  14.  
  15. let Preguntar<'a>() =
  16. let opciones = FSharpType.GetUnionCases(typeof<'a>)
  17. let printOpcion (o: UnionCaseInfo) = sprintf "%i - %s" o.Tag o.Name
  18.  
  19. let preguntar() =
  20. printf "Selecciona %s: %s:\r\n" typeof<'a>.Name (String.Join(", ", opciones |> Seq.map(printOpcion)))
  21. match Int32.TryParse(Console.ReadLine()) with
  22. | (true, input) ->
  23. match opciones |> Seq.tryFind(fun o -> o.Tag = input) with
  24. | Some(case) -> Some(FSharpValue.MakeUnion(case,[||]) :?> 'a)
  25. | None -> None
  26. | (_, _) -> None
  27.  
  28. let mutable resultado = None
  29. while resultado.IsNone do
  30. resultado <- preguntar()
  31.  
  32. resultado.Value
  33.  
  34. let PreguntarPeso() =
  35. printf "Introduce El peso para la selección anterior:\r\n"
  36. let mutable resultado = None
  37. while resultado.IsNone do
  38. resultado <-
  39. match Int32.TryParse(Console.ReadLine()) with
  40. | (true, input) -> Some(input)
  41. | (_, _) -> None
  42.  
  43. resultado.Value
  44.  
  45. [<EntryPoint>]
  46. let main argv =
  47.  
  48. let naranjas = Dictionary<_,int>()
  49.  
  50. let mutable continuar = true
  51. while continuar do
  52. let naranja = {
  53. Diametro = Preguntar<Diametro>();
  54. Color = Preguntar<Color>();
  55. Maduración = Preguntar<Maduración>();
  56. Forma = Preguntar<Forma>();
  57. Peso = Preguntar<Peso>()}
  58.  
  59. let peso = PreguntarPeso()
  60.  
  61. if naranjas.ContainsKey(naranja) then
  62. naranjas.[naranja] <- naranjas.[naranja] + peso
  63. else
  64. naranjas.Add(naranja, peso)
  65.  
  66. let mostrar (naranja, peso) =
  67. "Diametro: %A Color: %A Maduración: %A Forma: %A Peso: %A Total: %i\r\n" naranja.Diametro naranja.Color naranja.Maduración naranja.Forma naranja.Peso peso
  68.  
  69. for n in naranjas do
  70. mostrar(n.Key, n.Value)
  71.  
  72. printf "¿Continuar (S/N)? "
  73. continuar <- Console.ReadKey().Key = ConsoleKey.S
  74.  
  75. 0
Success #stdin #stdout 0.25s 25976KB
stdin
2
1
3
0
3
30
n
stdout
Selecciona Diametro: 0 - Pequeño, 1 - Mediano, 2 - Grande:
Selecciona Color: 0 - Narana, 1 - Amarilla, 2 - Verde:
Selecciona Maduración: 0 - Pasada, 1 - Óptima, 2 - Ligeramente inmadura, 3 - Completamente inmadura:
Selecciona Forma: 0 - Redonda, 1 - Otra Forma:
Selecciona Peso: 0 - Menos 100g, 1 - Entre 100 y 200g, 2 - Entre 200 y 300g, 3 - Entre 300 y 400g, 4 - Entre 400 y 500g, 5 - Mayor 500g:
Introduce El peso para la selección anterior:
Diametro: Grande Color: Amarilla Maduración: Completamente inmadura Forma: Redonda Peso: Entre 300 y 400g Total: 30
¿Continuar (S/N)?