elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [VB.NET(FrameWork)] Matriz (arrays) o Colecciones?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [VB.NET(FrameWork)] Matriz (arrays) o Colecciones?  (Leído 2,449 veces)
gnxa95

Desconectado Desconectado

Mensajes: 1


Ver Perfil
[VB.NET(FrameWork)] Matriz (arrays) o Colecciones?
« en: 15 Julio 2018, 04:21 am »

Buenas comunidad, desde ya agradecido por las respuestas que puedan llegar a dar, miren tengo una duda, estuve en un parcial de programacion con visual basic y necesito ayuda de ustedes para resolver este problema:

1.por cada compra ingresar el sector que desea, el numero de butacas a comprar y el dni de cada uno de los asistentes.
    a.el numero maximo de lugares por compra es 4.
    b.el dni tiene que ser un numero unico y positivo

(El punto 1 lo hice con facilidad (el punto 2 esta mas abajo del code))

Código:
Module Parcial_butacas
    Sub Main()
        Dim ingrese_butacas As Byte

        Ingreso_butacas("Ingrese numero de butacas a reservar: ", ingrese_butacas)

        For i = 1 To ingrese_butacas
            Console.WriteLine("Ingrese DNI persona {0}", i)
            Ingreso_dni(ingrese_butacas)
        Next

        Dim sector_preferencial(5, 10) As UInt32
        Console.WriteLine("Ingrese en que sector va a reservar:  1-Sector Preferencial 2-Sector Platea:")
       

    End Sub

    Sub Ingreso_butacas(ByRef msj As String, ByRef ingreso As Byte)
        Do
            Console.WriteLine(msj)
            ingreso = Console.ReadLine()
        Loop While ingreso > 4
    End Sub
    Sub Ingreso_dni(ByRef ingreso As Byte)
        Dim ingrese_dni As UInt32
        ingrese_dni = Console.ReadLine()
    End Sub
End Module

2. el teatro se organiza en sectores y cada sector tiene las butacas ubicadas en filas y columnas con particularidad que la primera fila tiene 10 butacas y cada fila posterior tieene mas butacas.
      a.sector preferencial: tiene 5 filas, la primera con 10 columnas y se agrega una butaca en cada fila posterior.
      b.sector platea: tiene 10 filas, la primera con 15 columnas y se agrega dos butacas mas en cada fila posterior.


Bueno queda claro que al resolverl el punto 2.a, el 2.b sale solo xd... lo triste es que el parcial no entrege en 0, porque no hice ni el 25%, xd,,, y tengo recuperatior para despues de julio, desde ya voy a estar agradecido y si necesitan algo mio se los brindo xd... (no tanto), estare editando el msj para tenerlo actualizado,....


desde ya muchas gracias por su tiempo.. y cualqiero cosa al privado.. gracias...


por cierto la duda del punto 2,a y 2,b... que me conviene usar(arrays, colleccion y que tipo de collecciion) y porque?


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: [VB.NET(FrameWork)] Matriz (arrays) o Colecciones?
« Respuesta #1 en: 15 Julio 2018, 16:55 pm »

De entrada, decirte que éste es el foro de vb6, el de NEt está mas arriba... pero bueno ya lo moverá algún moderador si se percata de ello.

También señalarte que con las etiquetas Geshi, has hecho la mitad, le has puesto el 'code', pero te falta asignarle al VBNET, desplegando el combo, s epuede buscar. No se indica el lenguaje específico, cuando no sigue ningún lenguaje esecífico, pero si es así, es preferible usarlo, porque se colorea basado en su sintaxis y resulta más cómodo de leer...


Iba a ir al asunto que trata, pero visto lo visto, procede primero una larga crítica sobre aspectos que conviene usar correctamente...

Por ejemplo la forma de nombrar variables y métodos, más que nada para enseñarte a hacerlo correctamente....

- Una varible, propiedad, debe llevar por nombre SIEMPRE lo que en la gramática del español se llama NOMBRE COMUN.... porque son eso, nombres... Valor, Temperatura, Edad, Año, etc... En cambio si son constantes (valores preconfigurados, conviene además que lleven un adjetivo. Ejemplo: ColorRojo= hex0000FF ColorAzul= HexFF0000)
- Los métodos, en cambio son verbos... Imprimir(esto)... Ordenar(lalista)... Añadir(UnItem)... Vaciar(), etc...
- Aunque el lenguaje lo admita, no uses las barras bajas para dar nombres a tus variables, en general se deben dejar para las constantes y sobretodo son usados por los eventos de objetos instanciados...
...que el propio lenguaje crea así. Como una medida de evitar en lo posible la coincidencia con métodos que los usuarios pudieran tener... Aunque es harto difícil que un método que uno cree venga a llamarse igual que la suma de un "nombre instancia de objeto" + "nombre de evento del objeto instanciado", no es infalible.... siguiendo la norma de "nombre instancia de  objeto" + "_" + "nombre evento", se puede garantizar la ausencia de duplicidad de nombres de métodos y con ello la conflictividad, pero solo si a cambio el propio programador se aplica su parte no usando barras bajas en los nombres.

Usar nombre, no usar verbo ni barra baja, en nombres de variables, propiedades, etc...
Citar
Dim ingrese_butacas As Byte
Dim CantidadButacas as Byte ' o también CantidadButacasReservadas

Usar verbo, no nombre ni barra baja en nombres de métodos y funciones.
Citar
Sub Ingreso_butacas(...)
Sub IngresarButacas(...)

Luego está línea es muy deficiente:
Código
  1. Ingreso_butacas("Ingrese numero de butacas a reservar: ", ingrese_butacas)
Aparte del nombre del método ya comentado y de la variable pasada en el segundo parámetro... resulta que no precisa ser pasado ningún parámetro.
El primero porque si el método va a recibir siempre la misma cadena de texto, ese parámetro (el texto), puede yacer en el propio método, no perdiendo tiempo en pasarlo desde fuera, además se aísla más claramente el método y si a futuro hay que cambiar el texto, basta buscar la función y cambiar el texto ahí... ahora si decides cambiar el texto y el método es llamado desde 20 sitios, tendrías que cambiarlo en los 20 sitios).
El segundo parámetro también sobra... a la entrada siempre es 0 y es usado para devolución (por referencia), y como es un método y por tanto no devuelve nada, lo razonable es que se convierta en una función y devuelva dicho valor...

Luego esa línea y el propio método serán cambiados mucho mejor así:
Código
  1. CantidadButacas = IngresarButacas()
  2.  
  3. private function IngresarButacas() as byte
  4.    dim msj as string = "Ingrese numero de butacas a reservar: "
  5.    Dim cantidad as byte  ' ingreso
  6.  
  7.    ' ...
  8.    ' ....
  9.  
  10.   Devolver cantidad
  11. End function

La siguiente crítica es que siempre que se solicita a un usuario un valor, un algo en general, debe dársele la oportunidad de cambiar de opinión o corregir/confirmar... imagina que quisera poner 4, pero por error hubiera tecleado 44 (a veces la pulsación de teclas tienen un tiempo de repetición inesperado por el usuario, y sin darse cuenta su pulsación genera dos pulsaciones.... que le exigen por ejemplo tener que introducir 44 nombres, DNIs, (que ni siquiera tiene, ni sabe), etc... sería inaceptable... imagina si introduje 4444...
En tu caso, como limitas a 4 el valor máximo, por ahí corriges cierta parte, pero todavía dejas al aire si pone 0...

Con esas ideas en mente, rediseñamos, la función para ser más coherente y certera con la propia realidad cotidiana.

Código
  1. private function IngresarButacas() as byte
  2.    dim msj1 as string, msj2 as string  
  3.    Dim cantidad as byte  ' ingreso
  4.    Dim Confirmacion as boolean
  5.  
  6.    msj1 = "Ingrese numero de butacas a reservar (máximo 4, 0 para abortar) "  
  7.    msj2 = "Confirme si está de acuerdo con el valor ingresado (0=Cambiar, 1=Conforme)" ' el valor se ve en la consla justo en la línea previa
  8.    Do
  9.        Do
  10.            Console.WriteLine(msj1)
  11.            cantidad = Console.ReadLine()
  12.        Loop While (cantidad > 4)
  13.        Console.WriteLine(msj1)
  14.        Confirmacion = (Console.ReadLine()  =  1)
  15.    Loop while Confirmacion=false
  16.  
  17.    Return Cantidad
  18. End function

A la devolución de la función debes verificar si el valor devuelto es 0 (Abortar), en cuyo caso se sale de la función y no se hace nada más.
Si un valor 0 no es admisible, en el bucle dentro de la función debe condicionarse a repetirse "While ((Cantidad=0) or ( Cantidad>4)) "   (tambien "Until ((cantidad>=1) and (Cantidad<=4)) " )

Lo siguiente es que si se debe obtener los DNI, se aproveche la misma función para solicitarlo...
Naturalmente entonces ahora procede cambiar el nombre de la función para que qrefleje mejor lo que hace: IngresarDatos o mejor aún ReservarEntradas

Otro punto a resolver es que si se aportan más de un DNI, no hay ningún sustrato para almacenarlos, es decir el nuevo valor entrado sobrescribe el valor previo... Si la cantidad máxima de reserva es 4, procede declarar un array de 4 elementos a nivel del módulo (es un valor pequeño, no hay problema en ocupar algo más de espacio, si a cambio nos resuelve cuanlquier número entre 1 y 4 ).

Código
  1. private dim Identificaciones(0 to 3) as uint32
  2.  
  3. private function IngresarDatos() as byte
  4.    dim msj1 as string, msj2 as string, msj3 as string  
  5.    Dim cantidad as byte  ' ingreso
  6.    Dim Confirmacion as boolean
  7.    dim i as byte, j as byte, k as byte  
  8.  
  9.    msj1 = "Ingrese numero de butacas a reservar (máximo 4, 0 para abortar) "  
  10.    msj2 = "Confirme si está de acuerdo con el valor ingresado (0=Cambiar, 1=Conforme)"
  11.    msj3 = "Ingrese DNI persona  {0}  (un valor positivo mayor que 0)"
  12.  
  13.    ' 1º Ingresar cantidad de butacas...
  14.    Do
  15.        Do
  16.            Console.WriteLine(msj1)
  17.            cantidad = Console.ReadLine()
  18.        Loop While (cantidad > 4)
  19.        If Cantidad = 0 ) then exit function ' ABORTAR....
  20.  
  21.        Console.WriteLine(msj2)
  22.        Confirmacion = (Console.ReadLine()  =  1)
  23.    Loop while (Confirmacion=false)
  24.  
  25.    ' 2º Ingresar DNI
  26.    for i= 0 to cantidad-1
  27.        do
  28.            do
  29.                Console.WriteLine(msj3, i)
  30.                k = Console.ReadLine()  '
  31.            loop while  (k<1)  ' se exige que sea positivo y razonablemente mayor que 0
  32.  
  33.            ' Verificamos que no esté repetido (comprobando con los valores anteriores ya entrados
  34.            Confirmacion = TRUE
  35.            for j= 0 to i-1
  36.                if (k = Identificaciones(j) ) then
  37.                    Confirmacion = FALSE
  38.                    exit for
  39.                end if
  40.            next            
  41.        loop While (Confirmacion=False) ' se vuelve a preguntar mientras se repita el valor entrado...
  42.  
  43.        Identificaciones(i) = k
  44.    next
  45.  
  46.    Return Cantidad
  47. End function


Respecto de la segunda parte, declaras como se reparte el teatro, pero no señalas que pide el problema...


Y en cuanto a la última cuestión...
Cuando algo es lineal y finito suele recurrirse a un array.
Si las eliminaciones e inserciones serán contínuas, redimensionar un array constantemente no es admisible a tales casos se suele usar listas enlazadas, donde las inserciones y eliminaciones tienen un coste fijo y admisible.
Si las búsquedas priman sobre el resto, debe considerarse que métodos se disponen para proveer solución rápida, para textos y sobretodos cuando son en cantidad enorme, una tabla hash, es iremplazable, el coste de búsqueda es unitario al de acceso aleatorio en un array + el tiempo de hashear el texto a buscar.
Nuevamente si la cantidad es pequeña, un array puede valer, pero redimensionar 1 millón de elemtnos cada vez que se añade o elimina no es práctica... para cantidad pequeñas vale.
Una técnica con arrays es declarar un tamaño mínimoy cuando se alcanza duplicarlo, pero eaunque es válido para añadidos, noes igualmente válido si hay eliminaciones.

Cuando los datos a almacenar son algo más complejos que un simple datos suele recurrirse a una simple estructura que mantenga los datos, en tu caso del ejemplo dado es lo más apropiado.
Código
  1. private structure DatosButaca
  2.    DNI as uint32
  3.    Butaca as short 'si están numeradas del 1 al x vale un número, si tiene fila y asiento, lo siguiente
  4.    ' Usa butaca o esto de aquí abajo, no ambas cosas
  5.    Fila as byte
  6.    Asiento as Byte
  7. end structure
  8.  
  9. Bin CantidadReservas as byte
  10. Dim Entradas(0 to 3) as DatosButaca  ' aunque se declaren 0 a 3, solo se ocupan la cantidad que señala 'CantidadReservas

Si los datos requieren cierta manipulación, la propia estructura puede contener métodos para adecuar los datos...

Cuando los datos van a precisar ciertos métodos genéricos (como ordenar), puede recurrirse a colecciones genéricas o específicas que reúnan los cometidos que precisamos... no puede darse una indicación precisa, porque cada caso debe tratarse y considerarse individualmente.

Si los datos serán bastante complejos y los métodos de las colecciones nos resultan inútiles (no los vamos a usar), o bien los queremos usar, pero no se adecúan al modo en que precisamos, toca crearse una clase que albergue el tipo de datos específico y dotarle de métodos propios, incluso una clase que sea una colección y que almacene tipos primarios (array), estructuras, clases... e incluso si una colección se aproxima a lo que queremos hacer si la colección deja extender métodos, podríamos crear tales métodos y para el resto (inserciones, eliminaciones, búsquedas, cuenta, iterar) utilizar los métodos extendidos (ésto último suele ser a menudo más rápido que construir una colección propia desde cero...

El punto d epartida siempre ha de ser el array, y si no resulta suficiente ver si un array de estructuras, etc...
En fin, no puede darse una regla genérica, solo aproximaciones, orientaciones, pero cada caso debe estudiarse según sus propias circunstancias... cantidades que puede albergar, concurrencia de acceso a ítems, si prolifran las búsquedas, las inserciones, las eliminaciones... el tipo de datos/datos almacenados y qué se va a hacer con tales datos... aunque las colecciones suelen compartir métodos comunes, cada cual tiene sentido explícito para ciertas cosas  y otras para otros (si no para qué hacer distintas implementaciones)...

Para saber sobre cada cual de las colecciones, lo mejor es visitar la página de Mocosoft (MSDN)... y leer, que para eso está... carece de sentido hacer un copy-paste de allí, ni tampoco tiene sentido que uno tenga que hacer un resumen de cada colección... el trabajo de aprendizaje exige leer por tu cuenta y no que te den todo mascado de 'segunda mano'...

Si aclaras que te reclama el problema en la segunda parte, miro de hecharte un pequeño cable...


« Última modificación: 15 Julio 2018, 17:13 pm por NEBIRE » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: [VB.NET(FrameWork)] Matriz (arrays) o Colecciones?
« Respuesta #2 en: 15 Julio 2018, 17:40 pm »

por cierto la duda del punto 2,a y 2,b... que me conviene usar(arrays, colleccion y que tipo de collecciion) y porque?

Puesto que esa es la única pregunta específica que has formulado, es a lo único que haré referencia. Recuerda que en el foro no se hacen ni se piden tareas.

No he leido el comentario completo de @NEBIRE, pero de todas formas es que no puedes ponerte a reflexionar sobre el uso de una colección genérica específica u otra sin haber progresado más en ese 75% del código (y de la UI) que te falta por hacer, las optimizaciones o refactorizaciones se hacen más tarde, no al principio. Primero deberías plantearte como vas a diseñar el modelo para representar los datos, que según creo haber entendido son dos "sectores" (sector preferencial y sector platea) con varias diferencias cada uno, así que podrías partir por declarar una interfaz a la que llamaríamos "ITheaterSector", con propiedades y métodos para representar el número de filas, columnas, butacas y en fin lo que sea necesario... y cuando tengas eso, una interfaz, una clase que implemente dicha interfaz y que represente a un "sector", entonces ya puedes plantearte otras cosas...

Saludos.
En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda con arrays o matriz?
Programación Visual Basic
ricardovinzo 4 3,997 Último mensaje 10 Junio 2008, 23:36 pm
por CeLaYa
una duda con colecciones
Java
RockAqp 1 2,053 Último mensaje 26 Mayo 2010, 22:36 pm
por Leyer
Manual 02 para aprender YII FRAMEWORK [ Instalacion de Mbmenu en YII FRAMEWORK]
PHP
Graphixx 0 5,946 Último mensaje 10 Noviembre 2011, 19:43 pm
por Graphixx
colecciones
Programación General
pipelojunior 0 1,467 Último mensaje 26 Abril 2012, 16:48 pm
por pipelojunior
MOVIDO: [VB.NET(FrameWork)] Matriz (arrays) o Colecciones?
Programación Visual Basic
Eleкtro 0 1,317 Último mensaje 15 Julio 2018, 17:40 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines