ARREGLOS VISUAL.NET

Iniciado por rochro, 27 Junio 2014, 23:38 PM

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

rochro

Hola, soy nueva con lo que es el desarrollo pero estoy intentando en que me salga un simulador de semana gps (referencia:  http://gps.geo.upm.es/www/calactal.htm) donde al colocar el día (del 1 al 365) me bote como resultado la semana gps que le corresponde: ejem:  034 corresponde a 1778. El código que generé y el cual no me funciona, es el siguiente:


           
Código (vbnet) [Seleccionar]
Dim semanagps As Integer
            Dim i As Integer = textbox1.text
            Dim numdia(i) As Integer
         
            numdia(0) = Nothing   
            numdia(1) = 1773          'si nos fijamos en el calendario la semana 1773
            numdia(2) = 1773          'tiene del día 1 al 4 y las demás semanas tendrán
            numdia(3) = 1773          'los siete días que comprende la semana, es por
            numdia(4) = 1773          'ello que genero el for.
            For i = 5 To 365 Step 1
                For k = 1773 To 1825 Step 1
                   For j = 1 To 7 Step 1
                       numdia(i) = k + 1
                    Next
                Next
            Next

            semanagps = numdia(i)


De repente mi lógica esta mal, quisiera que me apoyen por favor.

Gracias de antemano.



engel lex

#1
esto entiendo en tu codigo

por cada i hasta 365
por cada k en el rango
por cada j
numdia en la posicion i es igual a k +1

así que
Código (vbnet) [Seleccionar]
numdia(5) = 1826
numdia(6) = 1826

... ergo hasta el final...



observa con detalle... i te apunta a la posicion de el array... k genera un numero... j repite 7 veces la operación por cada k asignando el mismo valor de k+1 en el mismo i

creo que es mejor que hagas 2 for...

Código (vbnet) [Seleccionar]
k = 1773
para i desde 5 hasta 365, step 7 (para ir de 7 en 7)
Código (vbnet) [Seleccionar]
k = k+1
para j desde 0 a 6
numdia(i+j) es igual k


i te mueve semana a semana... j te mueve entre los días de la semana... como el numero (1773) solo cambia una vez por semana k se suma 1 en el ciclo exterior y j rellena el interior con este valor...


(sorry por lo de las etiquetas :P lo daba por pseudo-psuedo-codigo ya que era solo una explicación XD pero lo tendré en cuenta)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#2
Reacuerdo haber solucionado un tema parecido para VisualBasicScript, quizás te sirva de algo: http://foro.elhacker.net/scripting/batch_obtener_nombre_con_extension-t410321.0.html;msg1926804#msg1926804

Tu metodología no me parece la mas idonea, más si estás empezando, ya que tanto For anidado y además especificando pasos solo puede acabar liandote,
te muestro otro enfoque más liviano que he ideado:



Código (vbnet) [Seleccionar]
   ' Creo un Array para almacenar como referencia el rango de semanas GPS.
   ' Al valor inicial hay que descontarle un '1' (1772) porque el índice de un array empieza por '0'.
   Private ReadOnly GPSWeeks As Integer() =
       Enumerable.Range(1773 - 1, 1825).ToArray

   ' Obtengo la cantidad de dias del año actual.
   ' Esto lo hago por los años bisiestos, que tienen '1' día más (366).
   Private ReadOnly TotalDaysInYear As Integer =
       (From month As Integer In Enumerable.Range(1, 12)
       Select DateTime.DaysInMonth(Now.Year, month)).Sum

   ' Ya estamos listos para iterar los elementos ...del modo que uno prefiera :), esto solo es un ejemplo:
   Private Sub Test() Handles MyBase.Shown

       Dim sb As New System.Text.StringBuilder

       For DayOfYear As Integer = 1 To TotalDaysInYear ' (365 or 366)

           ' Obtengo la fecha exacta dado el número del día del año actual.
           Dim DateOfYear As DateTime = New DateTime(Now.Year, 1, 1).AddDays(DayOfYear - 1)

           sb.AppendLine(String.Format("Day Of Year: {0}", CStr(DayOfYear)))
           sb.AppendLine(String.Format("Date: {0}", CStr(DateOfYear)))
           sb.AppendLine(String.Format("GPS Week: {0}", CStr(Me.GPSWeeks(DatePart(DateInterval.WeekOfYear, DateOfYear)))))

           MessageBox.Show(sb.ToString, "GPS Calendar Info - By Elektro",
                           MessageBoxButtons.OK, MessageBoxIcon.Information)

           sb.Clear()

       Next DayOfYear

   End Sub





@engel lex

Porfavor, ya que tienes el detalle de llevar las normas del foro en tu firma, la próxima vez podrías intentar respetar la utilización de las etiquetas GeShi, no es un muy buen ejemplo :P...








rochro

Cita de: Eleкtro en 28 Junio 2014, 02:54 AM




Está muy bien, ahora trato de adecuar tu codigo a mi aplicacion, ya que el día lo tendria que ingresar en un text ejem: 52 y que me de como resultado la semana ejem: del dia 52 la semana gps es 1780.

Gracias elektro =)

Eleкtro

#4
es muy facil de adaptar, incluso puedes crear una función de uso genérico para devolver todos los datos necesarios (dias, semanas gps) en un objeto, ejemplo:

Código (vbnet) [Seleccionar]
Public Class GPSTest : Inherits Form

   ' TKey   = Day of year
   ' TValue = GPS Week
   Friend ReadOnly GPSDictionary As Dictionary(Of Integer, Integer) = Me.GetGPSDictionary

   Private Function GetGPSDictionary() As Dictionary(Of Integer, Integer)

       Dim ThisYear As Integer = Now.Year

       Dim DaysInThisYear As Integer = (From month As Integer In Enumerable.Range(1, 12)
                                        Select DateTime.DaysInMonth(ThisYear, month)).Sum

       Dim GPSWeeks As IEnumerable(Of Integer) = Enumerable.Range(1773 - 1, 1825)

       Dim Result As New Dictionary(Of Integer, Integer)

       For Day As Integer = 1 To DaysInThisYear

           Result.Add(Day, GPSWeeks(DatePart(DateInterval.WeekOfYear,
                                             New DateTime(ThisYear, 1, 1).AddDays(Day - 1))))

       Next Day

       Return Result

   End Function

   Private Sub Test() Handles MyBase.Load

        MessageBox.Show(Me.GPSDictionary(CInt(InputBox("Intoduce un dia del año", "Dia del año", 1))), "Semana GPS:",
                        MessageBoxButtons.OK, MessageBoxIcon.Information)

        Application.Exit()

   End Sub

End Class


Saludos








rochro

Cita de: Eleкtro en 30 Junio 2014, 18:45 PM
es muy facil de adaptar, incluso puedes crear una función de uso genérico para devolver todos los datos necesarios (dias, semanas gps) en un objeto, ejemplo:


Elektro, muchas gracias por apoyarme. Está OK  :D