Una ayuda simple (visual basic, 2017)

Iniciado por DSREY, 15 Agosto 2017, 01:19 AM

0 Miembros y 1 Visitante están viendo este tema.

DSREY

hola, lo que pasa es q me enviaron a hacer un algoritmo donde llame por un sub proceso a la fecha, y ponerle rangos a la fecha, se q hay una variable q se llama "DATE" y con eso ya se pone el formato fecha y ademas ya tiene los rangos establecidos, pero aca la tarea es hacerlo con "integer" el proposito es q me de cuenta como funcionan los rangos, para otros usos. en fin eh diseñado aqui el algoritmo para llamar a la fecha, pero no se como colocarle los rangos, si me pueden guiar un poco en esto se los agradeceria, y si tienen alguna idea para q se vea mas estetico mi algoritmo o la presentacion agradeceria cualquier idea, aprendo de todo lo que practico.

Imports System.Console
Module Module1

   Sub Main()
       FechaRangos()


       ReadLine()
   End Sub
   Sub FechaRangos()
       Dim dia, mes, año As Integer

       WriteLine("ingrese la fecha")
       WriteLine("Dia:")
       dia = ReadLine()
       'Necesito que almacene el dia, solo si se coloca un numero entre 1 y 31

       WriteLine("Mes:")
       mes = ReadLine()
       'Necesito que almacene el mes, solo si se coloca un numero entre 1 y 12

       WriteLine("Año")
       año = ReadLine()
       'Necesito que almacene el año, solo si se coloca un numero mayor a 1800 y menor a 2020

       WriteLine("|dia|mes|año|")

       WriteLine("{0}-{1}-{2}", dia, mes, año)

   End Sub

End Module

Serapis

Piensa un poco... Cómo lo resolverías de 'forma humana'?. Supongamos que me pides el año y yo te doy por respuesta: 1518 ... qué harías tú, para asegurarte que te dé un valor en el rango 1800-2020?

DSREY

#2
bueno estuve pensando como hacer lo de los rangos y se me ocurre algo como

año  = readline() si año >1800 y año <2020, caso contrario (preguntar año nuevamente)

el problema es q nose como plantear eso en el algoritmo

y bueno claro previamente ingresar un mensaje q diga solo puede ingresar años entre 1800 y 2020, y ademas luego de eso tengo q aumentar try and catch para q me envie el mensaje de la falla en lo q ingrese

Serapis

Bien. Ves com te has respondido tú mismo?.

Efectivamente si lo piensas... al yo darte respuesta, tu deber es comprobarla, y si yo te doy una fecha errada, tu deber es indicarme que un mensaje 'no es correcto, proporciones un valor en el rango x-y y volverme a pedir de nuevo el dato... y repetir hasta que 'aborte' o dé un valor correcto. (el problema de las consolas, cuando se dispone de interfaz de usuario, se pone un control y los valores mínimo y maximo ajustan el rango, entonces no hay posibilidad de salirse del rango).

Entonces del pensamiento, de la idea, pasamos al pseudocódigo:

Hacer
   Pedir entrada 'x' con el mensaje 'm'
   Comprobar si 'x' está en el rango
Repetir mientras x fuera de rango


Ese pseudocódigo, representa la idea, y es breve porque es 'genérico', pero se puede expandir, desde el momento en que conocemos ciertos detalles, y podemos hacerlo más 'específico':

buleano EnRango = FALSE //declaración de una variable...
Hacer
   Pedir 'año' al usuario con el mensaje "Ingrese un año entre los límites: 1800 y 2020 (ambos incluído)"
   Si ((año mayor o igual que 1800) y (año es igual o menor que 2020)) luego
       EnRango = TRUE
   Fin si
Repetir mientras (EnRango=FALSE)


...y esto debieras tu ya poder traducirlo a algo más específco como es el lenguaje que quieras usar...
No hay nada complejo, un bucle do...while, entrada de datos, condicional y comparación matemática...

p.d.: dejemos de lado la posibilidad de que el usuario aborte, se trata de un simple ejercicio..

DSREY

#4
gracias, lo hice tal cual, y si me salio ya lo de los rangos... mira quedo asi:

Imports System.Console

Module Module1

   Sub Main()
       rangos()

       ReadLine()
   End Sub
   Sub rangos()
       Dim dia, mes, año As Integer
       Dim rango As Boolean = False

       Try
           WriteLine("ingrese la fecha")
           Do
               WriteLine("Dia:")

               dia = ReadLine()
               If dia >= 1 And dia < 32 Then
                   rango = True

               Else
                   WriteLine("'Ingrese un dia entre el rango: 1 - 31'")
               End If
           Loop While rango = False
           Do
               WriteLine("Mes:")
               mes = ReadLine()
               If mes >= 1 And mes < 13 Then
                   rango = False

               Else
                   WriteLine("'Ingrese un mes entre el rango: 1 - 12'")
               End If
           Loop While rango = True

           Do
               WriteLine("Año")
               año = ReadLine()
               If año >= 1800 And año < 2020 Then
                   rango = True

               Else
                   WriteLine("'Ingrese un año entre el rango: 1800 - 2020'")
               End If
           Loop While rango = False
       Catch e As Exception
           WriteLine(e.Message)
       End Try

       WriteLine("|dia|mes|año|")

       WriteLine("{0}-{1}-{2}", dia, mes, año)

   End Sub

End Module



ahora tengo otra duda...
como vez utilice un try y catch para ver el mesaje de error cuando en lugar de ingresar un numero ingresan una letra, y bueno cuando eso pasa no se cierra la ejecucion pero si la lleva al final,

la pregunta es:

como hago para q cuando ingresen una letra en lugar de un numero me bote el mesaje de error al ingresar letra en lugar de numero (eso ya esta) y ademas se pueda volver a repetir la accion.?

ingrese la fecha
Dia:
r
La conversión de la cadena "r" en el tipo 'Integer' no es válida.
|dia|mes|año|
0-0-0


asi es como sale ahorita,
pero en lugar de llevarme al final q me permita volver a ingresar los datos del dia o mes o año, en donde haya el error...
xq sino corre asi:
ingrese la fecha
Dia:
21
Mes:
14
'Ingrese un mes entre el rango: 1 - 12'
Mes:
12
Año
r
La conversión de la cadena "r" en el tipo 'Integer' no es válida.
|dia|mes|año|
21-12-0

Serapis

es lo mismo... un bucle do...


Cazado = FALSE
Hacer
   Intentar
       EnRango = FALSE
       Hacer
          ... dia ' Hacemos la idea de que esta línea representa el ´codigo para el día
        Repetir mientras EnRango = FALSE       

       Cazado = TRUE
   Cazar error
       Mensaje "Escriba solo números 'porfaplis'..."
   Final intento
Repetir mientras Cazado = FALSE


Esto solo para el día, haz lo mismo para mes y lo mismo para año, si quieres generar un solo bucle para todos, crea una función para devolver el valor correcto en el rango:



Entero = Funcion PedirValorEnRango(Maximo, minimo, MensajeRango, MensajeError)
    Intentar
          EnRango=FALSE
          Hacer
              Pedir valor
              si (Valor >=Minimo) y (valor <=Maximo) luego
                   EnRango=TRUE
              Sino
                   Mostrar MensajeRango
              Fin si
          Repetir mientras EnRango=False
          Devolver Valor
    Cazar Error
         Mostrar MensajeError
         Devolver -1
   Final intento
Fin Funcion


Y esta función se llamaríamás simple desde un código similar a:

    Hacer
        Dia = PedirValorEnRango(1,31, "Números delmes entre 1 y 31", "Por favor solo números, no letras ni palabras.")
    Repetir mientras Dia = -1

    Hacer
        Mes = PedirValorEnRango(1,12, "Mes debe ser un número entre 1 y 12", "Por favor solo números, no letras ni palabras.")
    Repetir mientras Mes = -1

    Hacer
        Año = PedirValorEnRango(1800,2020, "Año debe ser entre 2800 y 2020", "Por favor solo números, no letras ni palabras.")
    Repetir mientras Año = -1

    Mostrar día, mes y año

       

DSREY

Gracias NEBIRE,

Todo  esto ha sido de mucha utilidad... tengo examen de programacion en dos semanas asi q me estoy alistando para la prueba xq mi profesor siempre nos plantea ejercicios de cosas q no ha explicado... como por ejemplo esto del "do" "loop while" anidado con boolean true-false