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


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


  Mostrar Mensajes
Páginas: 1 ... 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ... 92
311  Programación / .NET / Re: Ayuda con un programa de VBNET que no funciona correctamente en: 6 Agosto 2017, 06:52
Bufff... el formulario tiene unas 16.400 líneas de código... Eso es casi 1Mb. Pero es que además el código es completamente espagueti... Desisto de perder tiempo revisándolo.

Si te diré al menos, que cuando tengas que eliminar varios ítems, recórrelo siempre desde el final hacia atrás... si tienes que eliminar el íitem 25 y el 144, si eliminas primero el 25, el 144 ocupará luego la posición 143... si eliminas primeor el 144 (que ocupa esa posición), podrás luego perfectamente eliminar el 25 (que también sigue estando en su posición)...
Se llega al caso de qu si hay 150 elementos y hay que eliminar 10, si empiezas desde abajo, cuando vayas a eliminar el 144, ya ni siquiera existe el ítem 144. Mientras exista un ítem, no hacerlo bien implica eliminar uno erróneo y dejar (posiblemente) que debiera habers eeliminado (depende de si están contiguos, salteados, etc...).
Así tatar de eliminar un ítem inexistente arroja errores.

No obstante como además lo tienes conectado a una base de datos, puede que el error te lo esté dando por allí, antes de actualizar la vista.

En fin elimina los ítems deseados empezando desde el último y avanzando hacia atrás... y a ver si te sigue generando el error.

Desde luego bucear en ese código, como se dice a veces "ni cobrando"... Crea clases , encapsula métodos en ellas y pásalas a otros módulos... No dejes todo el peso en un único formulario... Verlo es como entrar en una ciudad por donde pasó un sunami, solo se ve CAOS  :silbar: :silbar: :silbar:
312  Programación / Java / Re: Codigo para crear SUDOKUS en: 5 Agosto 2017, 17:04
... pero llegue a un punto que no te entiendo y es la parte final de rellenar el sudoku como lo tienes en el siguiente codigo:

...por que tu hablas de codigo previo y codigo despues ???

Código:
//código previo
           ....el código intermedio (omitido por brevedad)
.... // código después...
Puse 'código previo' y 'código después', para no volver a poner la función completa... En ese tramo, lo que te indicaba era que justo esa parte (de la función) es la que se encarga de que si la 'obtención' de valores llega a un punto donde se bloquea, esa parte CRUCIAL, es la que dando 1, ó 2 pasos atrás, permite salir del bloqueo:
1 paso atrás: elimina toda la fila actual y la rehace.
2 pasos atrás: deshace también la fila previa, si tras deshacer 10 veces la fila actual, no logra avanzar (salir del bloqueo)... un bloqueo 'persistente', se debe a que no deja muchas opciones para la línea actual.

1- cual es ese array sudoku y para que sirve ? no lo entiendo la verdad

2- yo estoy trabajando con una matriz bidimensional y en mi funcion generadoraleatorio() es donde supuestamente lo lleno(Segun mi forma de hacerlo) pero no se en que lugar estaria metiendo este codigo que te muestro arriba el tuyo,
1 - Es el nombre que yo le he dado al array que guarda los valores... tu lo llamas matriz[][] y lo usas de modo bidimensional (filas y columnas, 9x9), yo lo llamo sudoku y usa índices (0 a 80).

2 - Yo hice una función llamada RellenarSudokuAlAzar, que es función principal para generar el sudoku por completo, es desde aquí donde se llama a la segunda función principal (para un solo valor al azar) y en esa donde se llama al resto...

Repongo la función completa, esta función la puse en el 'Respùesta #2' de este hilo  (IMPORTANTE: lee los comentarios en el pseudocódigo):
Código:
Funcion RellenarSudokuAlAzar()    
    Entero Fila, columna
    Byte Valor, Intentos

    Fila=0 // la primera fila, la podrías obtener al azar completamente en ese caso marcar aquí 1, para comenzar en la fila 1, la 0 no va a requerir todas las comprobaciones que pueden requerir las siguientes.
    Hacer  '// esto es fila, puede ser un bucle que va de 0 a 8
        Intentos = 0
        Columna = 0
        Hacer    
            Valor = SeleccionarValorAzar(Columna, Fila)  //la función que obtiene un valor de cada vez.
            Si (Valor>0) luego
                Sudoku((Fila * c_Nueve) + Columna) = valor   //Sudoku() es el array que mantiene internamente los valores.            
                Columna +=1
            Si no
                // Borra los valores de la fila actual
                Bucle para k desde 0 a columna
                    Sudoku((Fila * c_Nueve) + k) = 0
                Fin bucle

                // Tras 10 intentos en la misma fila, borramos también la fila previa
                Intentos += 1
                Si (Intentos = 10) luego
                    Si (Fila > 0) luego  // no podemos retroceder a filas más atrás que la primera.
                        Fila = (Fila - 1) // Borramos también la fila anterior (y si sucede otra vez, la previa, etc...)
                        Bucle para k desde 0 To c_Ocho
                            Sudoku((Fila * c_Nueve) + k) = 0                            
                        Fin Bucle
                    Fin si
                    Intentos = 0
                Fin si
                Columna = 0
            Fin si
        Repetir Mientras (Columna <9)
        Fila +=1
    Repetir Mientra (Fila<9)
Fin Funcion
// Al término de esta función se podría dibujar los valores en el tablero para verificar visualmente el resultado.

3- por otro lado tengo muchas dudas con la funcion de tomar ausentes por que pones como parametro un out NumAusentes

Código:
Array Byte = Funcion TomarAusentes(Array Byte Presentes(), Out Entero NumAusentes)
no entiendo por que pones ese valor ahi, o bueno creo saberlo, lo haces para tener el indice de ese vector pero lo que no se es por que tenerlo de parametro si al llamarlo de otra funcion como lo haces en
Código:
Array byte = GetArrayAusentes(Entero X, Entero Y,  Out Entero NumAusentes)

ese valor no lo utilizas de ninguna manera o por lo menos no lo veo que lo hagas para mi ese valor por parametro no sirve por que el dato que se utiliza es es que devuelve la funcion como tal.
Te aclaro... esta función devuelve un array. El array tiene 9 elementos, pero necesitamos también devolver otro valor. el de cuantos valores en ese array son 'útiles' (detrás de esos valores útiles hay ceros, no nos interesan).
El parámetro es de salida, es decir es devuelve por referencia (por puntero, una dirección de memoria).

Un ejemplo: Imagina una lista de 9 alumnos para el carnet de conducir... se examinan y aprueban solo 3, se devuelve una lista, con sus nombres, pero es preciso saber cuantos son. La lista sigue teniendo 9 elementos, no viene a cuento crear una nueva lista con exactamente los conductores aprobados, la reutilizamos.
Si no sabes pasar un parámetro por referencia, todavía puedes solucionarlo en tu código, recorriendo el array hasta que se encuentre un valor vacío (cero).
Es decir había una lista de 9 alumnos inscritos, creamos otra del mismo tamaño 8por si todos aprobaban), pero luego resulta que aprueban 3, ó 5 o 6, o todos o ninguno)... entonces en la lista entregada leemos nombres, con cada uno leído sumamos 1, cuando no haya más en la lista de aprobados, sabemos ya CUANTOS alumnos aprobaron. 3,5,6,todos, ninguno, etc...

Y porqué necesitamos saber cuantos valores 'útiles' (valores ausentes) tiene la lista?. Pués porque ahora vamos a sortear entre ellos, el elegido será el que se ponga en la casilla.
Si hay 5 valores ausentes (útiles),  (similar a los alumnos aprobados) y ocupan los puestos del 0 al 4, nosotros luego vamos a elegir al azar entre 0 y 4.
SIIIIIIII... elegimos ún índice, porque las funciones aleatorias no saben elegir al azar un valor 2,5,6,9, solo saben elegir un valor dentro de un rango dado, y dentro de ese rango los valores contenidos son elegibles. Si el 3,4,7 y8 quedan fuera del sorteo, significa que no debn ser elegibles, luego toca asignarles un número a los que si optan y luego por ese número (índice en el array), sabemos que valor salió elegido.
Imagina que son esos alumnos, podríamos hacer papelitos con sus nombres, pero OH, nuestro sistemá es matemático (míralo como si tuvieras un bingo de juguete con 100 bolitas, sacas todas y dejas una por cada alumno aprobado) y a cada bola se le asigna un nombre: La bola 0, para Juan, la bola 1 para Luis, la bola 2 par aandrés,etc... entonces hhaces mover el bombo, extraes la bola y cantas la que sale: Bola 2.... a qui
én corresponde? a Andres.... luego Andres salió elegido al azar...

Justo eso esa parte final, es la que hacen las líneas tras la función Tomarausentes:

Este trozo de código es un extracto al final de la función: "SeleccionarValorAzar"
Código:
// OJO: si el array queda vacío <----------- HAY UN BLOQUEO.
    Si (n=0) luego devolver 0 //y salir de la función tras devolver

    // Finalmente se toma un valor al azar entre 0 y n-1, que representa el indice del array Azar. Este array tiene exclusivamente los números que no aparecen ni en la fila, ni en columna, ni en bloque.
    k = Aleatorio( entre 0 y n-1)

    Devolver Azar(k) //ha salido la bola K, devlver el valor contenido en ese índice (si fuera un alumno, sería su nombre).


La verdad no me queda muy claro eso voy a colocar el codigo que tengo solo para que me ayudes a depurar errores pero solo faltaria que me explicaras eso que te pido para poder hacer las funciones de valor azar y la de permitido o admisible no entiendo el por que tu tienes otras mas tampoco.
Creo que debería quedarte todo claro ya...

Verás tu función "GeneradorAleatorio" sería equivalente a la que yo llamo: "RellenarSudokuAlAzar"....
Debe tener 2 bucles, uno por filas y otro interno para columnas. Dentro de ese es que en cada cilo se invoca "SeleccionarValorAzar(fila, columna)" esperando que se le devuelva un valor.
Si es mayor que 0 se asigna al array que mantiene los valores (tu llamas 'Matriz' a tu array, yo le llamo directamente 'Sudoku' a mi array)
Pero si el valor obtenido de regreso es 0, significa que hay una situación de bloqueo. Hay que eliminar la fila actual completa (se suma un intento y si se alcanzan 10 antes de poder completar la fila, se elimina también la fila anterior).


----------------------------------------------
Te comento por encima si veo bien tus funciones, pero debes probarlas siempre. Yo solo reviso la lógica, que es la parte que el IDE (seguramente uses Eclipse), no puede decirte nada...
 
- GeneradorAleatorio: Llámala como prefieras, pero esta función, impleméntala tomando como referencia la que yo llamo "RellenarSudokuAlAzar". Justo te acabo de dar unas palabras al respecto... y el pseudocódigo de la misma te lo he vuelto a poner completo, también más arriba en este mensaje.
 
Citar
 public static void GeneradorAleatorio() {
   
- GetFila: OK
 
Citar
  public static int [] GetFila(int matriz[][], int fila) {
   
- GetColumna: OK
 
Citar
  public static int [] GetColumna(int matriz [][], int columna) {
   
- GetCaja: OK, pero puede optimizarse saber a qué bloque (caja), nos estamos refiriendo (ya te comenté)
  
Citar
 public static int [] GetCaja(int matriz[][], int filas, int columnas) {


- unificarArray: OK, ahora sí...
 
Citar
  public static int[] unificarArray (int filas[], int columnas[], int caja[]) {
   
- TomarAusentes: CASI, te falta devolver el valor de k (yo lo hago por referencia como un parámetro). Si no lo devuelves de ninguna manera, deberás volver a calcular dicho valor en un bucle tras esta función (más arriba ya te comenté esto)  
  
Citar
 public static int [] TomarAusentes (int unificado[]){
       
La parte comentada es donde iria las funciones que me faltan por entender.
OK, en otro mensaje (un poco más tarde, ahora tengo cosas que hacer), te desgrano ambas funciones (son dos, no?): SeleccionarValorAzar y RellenarSudokuAlAzar
313  Informática / Multimedia / Re: Ordenar pistas audio en un USB en: 4 Agosto 2017, 18:42
Léete el manual si lo conservas, es posible que sin darte cuenta hayas pulsado alguna teclita, cuyo uso desconoces y resulta ser 'cambiar el orden a un orden "aleatorio"'.

Por otro lado, a veces el orden que siguen es alfabético, pero no siguiendo el nombre que le das si no el que consta en los tags del ID3 (sea nombre, número de pista, autor, etc...).
314  Foros Generales / Foro Libre / Re: Que ha pasado exactamente en Venezuela esta vez??? en: 4 Agosto 2017, 05:20
Y... ...ahora qué?...

¿Cuáles son las perspectivas de un venezolano descontento del gobierno? (me refiero obviamente a personas con dificultades para los recursos, diarios). Me temo que incluso gente con recursos, todavía tendrá problemas por culpa del desabastecimiento de productos en general...
315  Foros Generales / Foro Libre / Re: La NASA está buscando un "protector planetario" contra los extraterrestres en: 4 Agosto 2017, 05:01
La ciencia nunca ha negado que puedan existir extraterrestres.
Técnicamente no. Evidentemente la ciencia no es una persona, ni una organización, ni siquiera un ente... es más una consideración abstracta. Sin embargo a título personal, las personas más relevantes de la ciencia (cada unas en su momento), si lo han negado.

Lo que se niega es que hayan visitado la Tierra o estén actualmente en ella.
Bien, a esto no creo que pasen 20 años sin que salgamos de 'dudas' (para los que estamos en ese barro (y desdecirse para los que están en el barrizal más lejos).


De hecho llevan varias décadas en busca de vida extraterrestre (fuera de nuestro planeta)... desde que empezó el boom del espacio mas o menos...
Oh, sí claro...

------
El radiotelescopio de Arecibo lo que hace es recolecta datos radioastronómicos, aeronomía terrestre y radar planetarios para los científicos mundiales y actualmente se usa para la observación de objetos estelares.
Bla,bla,bla... si tienes criterio exponlo.
Para copiar y pegar contenido es mejor que no te molestes. Para abrir un tema, me parece valido, pero para participar resulta estúpido. Ofendes cuando haces eso, tratas a los demás como si fueran imbéciles...

¿No te cabe pensar que esos "copy->paste" que haces, solo tienen sentido para alguien analfabeto, o para chicos de 12-18 años que no tienen bagaje cultural y resulta necesario ilustrarles???.



316  Programación / .NET / Re: Usar un NumericUpDown como valor de const en: 4 Agosto 2017, 00:33
añade un messabox.message(mu.Tostring) a ambas funciones y ve cambiando valores al numeric a ver si cambia o no...

He de suponer que la declaración de MU y MD están en la misma clase que el control, no?????. Si no estás creando variables d eigual nombre en otra parte del proyecto...

Si tu código es así, con dos clases:

Código
  1. public class MisCosas
  2.  Public Md as decimal
  3.  
  4. '....
  5. End class
  6.  
  7. private class form1
  8.  
  9.    private sub NumericUpDown5_valuechanged(...
  10.          Md = NumericUpDown5.Value
  11.    En sub
  12. End class

Esto no va a funcionar...

Pero esto sí...
Código
  1. public class MisCosas
  2.  Public Md as decimal
  3.  
  4. '....
  5. End class
  6.  
  7. private class form1
  8.    private mc as new MisCosas
  9.  
  10.    private sub NumericUpDown5_valuechanged(...
  11.          mc.Md = NumericUpDown5.Value
  12.    En sub
  13. End class

Si tienes dudas muévete paso a paso pulsando F12... y así ves por donde pasa y por donde no...
317  Programación / .NET / Re: Usar un NumericUpDown como valor de const en: 3 Agosto 2017, 20:34
Ten en cuenta que antes de poder asignar un valor a una variable procedente de un control, antes debe haberse creado la instancia del control...
...Esto es, desde qué procedimiento estás asignando el valor del NumericupDown.

No sé si el código que has puesto es consecuente o si son dos intentos distintos. si es consecuente (uno le sigue al otro, es decir ambos están en activos), si ya has declarado mouted1 como constante, no puedes utilizarlo al mismo nivel como otro tipo. Si lo usas en otro nivel, será sombreando al que esté en un nivel más arriba... es decir no será copia ni tendrá nada que ver con la otra declaración.

Por otro lado, poque no aprovechas el evento Change del control NumericUpDown, para actualizar el valor de esa variable?
Código
  1. private sub NumericUpDown5_Change(.....
  2.    Mouted = e.value ' ...o Mouted= NumericUpDown5.value si solo hay ese objeto enganchado al evento...
  3. end sub
318  Programación / .NET / Re: Usar un NumericUpDown como valor de const en: 3 Agosto 2017, 19:06
Una constante, como su nombre indica es constante. Luego no puede adjudicarse ningún valor por procedimiento.

Cuando se compila el valor queda fijado... es decir todas las constantes con remplazadas por el valor contante. por eso siempre dará error cuando intentes asignarlo desde una ubicación que en sí misma no sea también una constante.

Es decir esto es válido:
Código
  1. Public Const c_Doce = 12
  2. Public Const c_Trece = (c_Doce +1)

Y es válido porque c_doce tiene un valor que es constante y c_doce +1 , al ser tanto c_doce y 1 valores constantes es válido.
Esto no es válido:
Código
  1. Public MiVar As integer = 12
  2. Public Const c_Doce = MiVar

En fin, tu debes saber si realmente necesitas una constante o una variable. Si has de asignar un valor desde un control numericUpDown, desde luego no es una constante lo que necesitas. O bien, no entiendes lo que significa constante.
Si todavía necesitas que el valor del control numericUpdown, quede en la constante, lo que debes hacer es revisar que valor tiene durante diseño y ese mismo valor consignarlo en la constante... que tiene numericUpDown5.Value = 52, pués vas a tu contante y le pones ese valor
Private Const mouted = 52

Pero no puedes asignarlo por código, porque entonces sería una variable.

Hay una solución pero no merece la pena en la mayoría de casos, aún así te la comento, por si soluciona tu caso (ya que siendo una variable, actúa realmente como una constante):

   
Código
  1. Private MiVar As Integer = 12
  2.  
  3.    Public Property Mouted As Integer
  4.        Get
  5.            Return MiVar
  6.        End Get
  7.        Set(ByVal value As Integer)
  8.            Static FirstTime As Boolean = False
  9.            If (FirstTime = False) Then
  10.                MiVar = value
  11.                FirstTime = True
  12.            'Else
  13.                 'Disparar error si se cree conveniente...
  14.            End If
  15.        End Set
  16.    End Property
  17.  
  18.  

Y que se utilizaría así:
Código
  1. Dim MD As Integer  = NumericUpDown5.Value
  2. Mouted = MD

Este código te permite asignar un valor procedente desde donde quieras, pero una sola vez, luego opera como si fuera una constante, se puede leer pero no escribir. y fíjate que por defecto, también le podemos dar inicialmente un valor...
319  Foros Generales / Foro Libre / Re: La NASA está buscando un "protector planetario" contra los extraterrestres en: 3 Agosto 2017, 18:45
Y si no creen para que crees tu que instalaron esta inmensa antena en Puerto Rico allá por los años 60's?: http://astrojem.com/instrumental/radiotelescopioarecibo.html
Que manía de mezclar cosas...
El radiotelescopio de Arecibo, nunca ha pertenecido a la NASA.
Y que lo haya usado (y siga usando) el SETI, tampoco tiene nada que ver con la NASA.

...por cierto, la imagen que has puesto, no se ve en tu mensaje, aparece el texto cuando le das a citar... pero que además está de más...

¿Cuando han dicho eso?
Je... qué gracioso.
Desde que nací, la ciencia oficial ha negado sistemáticamente, extraterretres, marcianos, ovnis, y todo lo que la fenomenología paranormal 'mueve'.

Y solo últimamente han empezado a recular, pero no a afirmar, solo a dejar en duda (que es lo que desde un principio debieron hacer)... en otro medio siglo, en la ciencia oficial constará como que 'siempre se creyó que fue así' y nunca aparecerá nada del menosprecio a tanta gente que no solo cree sino que ha vivido y sentido tales experiencias, fenómenos, etc...

-------------------

Cada vez más cerca de la Verdad, y aunque no es fácil aventurar, yo apuesto por que la vida extraterrestre es insuperablemente más polífica que la vida terretre y mira que aquí tenemos especies y especies... eso si, me da igual que el tamaño de esa vida sea el de una bacteria o del tamaño de una galaxia... que viva un microsegundo o que viva 20 mil millones de años. Vida es vida.

320  Programación / Java / Re: Codigo para crear SUDOKUS en: 3 Agosto 2017, 17:29
lo que hago para contar con la matriz en todo el codigo es declararla como static  como si fuera una variable global, eso mismo es lo que estaba intentando con los otros array ponerlos globales a ver si me funcionaba
Bien. Cuando unos parámetros, en este caso arrays se usan para unas funciones que se usan masivamente, es preferible crear el array una sola vez y luego solo sobrescribirlos. Obviamente de cara a explicaciones, es preferible que cada función se acompañe de exactamente los parámetros que necesite o es más fácil perderse por no ver o saber de donde salen esas variables...
De hecho, de cara a optimizarlo (primero haz que funcione y funcione bien, siempre es lo primero, luego ya se optimizará), a veces un array puede ser reutilizado en más de una función (uno debe tener claro cuando esto es así, para no interferir en los valores y tenerlos sucios esperando unos valores que fueron cambiados por otra función).

Por otro lado hay algunas cosas que no entiendo de tu codigo pero lo estoy intentando a mi manera tratando de interpretar tu codigo.
Cuando suceda, lo remarcas y luego que sumes varias (si las hay), preguntas por esas dudas.


A la hora de crear el unificado tengo problemas con el ciclo lo empiezo en 1 hasta <= 9 para que no tome los valores de 0 y me bota error, esto es lo que llevo hasta el momento no esta terminado ni depurado hay sobre la marcha me voy dando cuenta que me falta

Código:
   static int unificado[] = new int[9];
  
    public static void unificarArray() {
        for (int i = 0; i < 9; i++) {
            unificado[filas[i]] = unificado[filas[i]] + 1;
            unificado[columnas[i]] = unificado[columnas[i]] + 1;
            unificado[caja[i]] = unificado[caja[i]] + 1;
        }
        for (int i = 0; i < 9; i++) {
            System.out.print(unificado[i] + "\t");
        }
    }
No es eso lo que veo en tu código es más, no se ajusta a mi descripción, copio y pego la mía y verás que no se ajusta...
Al caso he retirado los comentarios previos y añadido otros que es donde debes fijarte. También retiro las etiquetas de code, para poner énfasis con negrita.

Array Byte = Funcion UnificarCubiculos(Array Byte Fila(), Array Byte Columna(), Array Byte Bloque())
    Array tipo Byte V(0 a c_Nueve)  // esto es, 10 ELEMENTOS. Este array es de 10 elementos

    // contar el número de presencias de cada valor...
    Bucle para k desde 0 a c_Ocho  // OJO: 0 a 8
        Si (Fila(k) > 0) luego   // Si no está vacía la casilla...
            V(Fila(k)) += 1
        fin si
        Si Columna(k) > 0 luego   // Si no está vacía la casilla...
            V(Columna(k)) += 1
        fin si
        Si (Bloque(k) > 0) luego   // Si no está vacía la casilla...
            V(Bloque(k)) += 1
        fin si
    Fin Bucle
  
    V(0) = 0 //Realmente no es necesario, ya que no llevó la cuenta de 'ceros'
    // Tu si llevas la cuenta al omitir, los condicionales d emás arriba, luego esto es aconsejable, no tanto como obligado 8más abajo mé extiendo sobre esto).


   // En tu versión, falta este bucle
    Bucle para k desde 1 a c_Nueve   //OJO: el bucle recorre desde 1 a 9
        Si (V(k) > 0) luego  //esto es imprescindible. Presencia, indica que aparece. Se consigna k, sólo si v(k) es mayor que 0, es decir si aparece.
            V(k) = k            
        Fin si
    Fin Bucle

    Devolver V        
Fin Funcion

En tu código también llevas la cuenta de 0, no importa, es más sencillo eliminar el condicional, pero en ese caso si será útil, al final la línea donde la comento como: " //Realmente no es necesario, ya que no llevó la cuenta de 'ceros'", como tu si has llevado la cuenta, ponlo a 0. Incluso aunque no se utilice ahora, un cambio a futuro, y que hayas olvidado que eso vale 0 podría darte dolores de cabeza intentando buscar el error. Es sólo una línea de código y evita problemas a futuro, es mejor ponerla.

Luego en mi 'versión' hay dos bucles, en uno genero la "tabla de conteo" de cada valor, pero eso es solo la primera parte, falta la segunda parte, donde en el otro la tabla de conteo se convierte en una "tabla de presencia".
En 'tu versión' el segundo bucle no existe, el que hay se remite al "System.out.print" que solo tiene efectos de verificación, pero le falta el 2º bucle que yo le pongo.

Ya he comentado que a efectos de optimización en ese segundo bucle se podría hacer la parte de la siguiente función, pero sería mucho más scuro, haciendo que cadas función haga una sola tarea (eso si, completa), queda perfectamente claro el propósito (único) de cada función...

- Una tabla de conteo: Es una tabla (array, unidimensional, bidimensional etc...) que lleva la cuenta de veces que aparece un determinado valor. Imagina un fichero de imagen, imagina que quieres obtener su histograma, necesitas contar cuantas veces aparece cada nivel de rojo, de verde y de azul en la imagen. Dando una imagen de 8bits por canal (un byte), se necesitará pués 3 arrays para contar los niveles de rojo, verde y azul. el array tendrá256 elementos por 256 son los niveles posibles para el rojo, verde y azul, es decir valores entrte 0 y 255...entonces leyendo la imagen con cada aparición haríamos algo como (para contarlos):
  arrRojo(Imagen.Rojo(n)) = arrRojo(imagen.Rojo(n)) +1
Que como se ve, no es distinto de nuestor caso, salvando el origen de los datos y el tamaño del array.
- Tabla de presencia: es una tabla donde lo único que necesitamos saber es que dicho valor aparece y nos da igual cuántas veces aparece... Esto puede hacerse directamente o a partir de la tabla anterior. De cara a entender, es preferible hacerlo indirectamente desde creando antes la tabla de conteo, así se vé con mucha claridad,  como se crea esta otra...
si arrRojo(nivel) > 0  luego
   arrRojo(nivel) = nivel
Fin si

Antes el array podía tener un valor elevado (más tratándose de una imagen si la imagen fuera casi toda blanca y tuviera pongamos un tamaño de 3500x2500 píxeles de ancho y alto (o al revés) tendríamos 8.750.000 píxeles en total, en total como solo hay 256 canales y lo son para el rojo, verde y azul, ni 8bits ni 16bits, nos valen para contener dicha cuenta, tendríamos que usar un array de 32 bits... Así es la tabla de conteno. En cambio la tabla de presencia basta que tenga como tipo de datos el más alto del valor que haya de contener, en este caso aún tratándose de colores, bastaría un array de bytes, porque los niveles solo van del 0 al 255. Luego es decisión de cada cual si aprovechas el mismo array para ambas tablas o no.

En el caso del sudoku, aunque lo has declarado integer y realmente nos basta con byte reutilizamos el array...

Para ver la diferencia entre ambas tablas, puedes imprimir el resultado de cada una al final de cada bucle. Verás que la tabla de conteo es equivalente a la tabla de presencia, la tabla de presencias, es también una tabla de ausencias, todos aquellos índices cuyo valor es 0, señala que no están ausentes. La tabla de ausencias que creamos luego es 'ordenada', y es básicamente mover al comienzo del array esos valores ausentes. Con el fin justamente de luego al usar una función random, elegir un índice al azar entre 0 el el último que porta un valor ausente. Al estar contiguos, eso es posible, si no habría que ver si el valor al azar entre el 0 y el 9, está ausente... pero si no lo está repetir todo el proceso se eterniza. Del modo en que procedemos se garantiza con una sola vez la elección de azar y una sola vez la
verificación (previa), sacar el siguiente número a consignar.

--------------------
P.d.:

En tu función de ausentes observo dos fallos:
Quito las etiquetas de code, para comentar encima con engrita.
Bueno al quirtar las etiquetas de code, como usas llaves con 'i', el codigo BBcode, lo interpreta como itálica, así que lo cambio, saco los comentarios y en su lugar dejo asteriscos

Código:
public static void TomarAusentes (){
        int numeros;  //no se usa...
        for (int i = 0; i < 10; i++) {  // **********01
            if (unificado[i] == 0) {
                ausentes[i] = i;  // **********02
            }
        }
    }

// **********01 Este bucle debe empezar en 1, no en 0. Los valores UTILES para el sudoku van del 1 al 9, el 0 no es un valor elegible, indica 'casilla vacía', 'casilla libre', 'casilla sin valor aún'

// **********02 NO: Este debe llevar su propio contador, no puede ser 'i'. Con cada aparición aumenta, si no, no estarían los valores contiguos...
// Imagina que te dicen aqui tienes una lista de alumnos. Todos los que tengan más de 18 años, los escribes en ESTA OTRA lista... acaso en esa nueva lista, no irían contiguos?. el primero hallado en la posición 0, el siguiente en la 1, el siguiente hallado en la 2, etc... sería absurdo que en esa nueva lista, aparezca un alumno en la posición 43, y en la nueva lista, tu lo consignes también en la posición 43... ¿Capisci, el significado de 'nueva lista' y 'valores contiguos'? . cuando se tenga esa lista de alumnos con más de 18 años quien la trate, la tratará contigua, imagina que entre ellos se va  ahacer un sorteo para ver una peli para mayor de 18 años, si en la lista hay inscritos 61 alumnos, se harían papeletas entre 1 y 61 (0 y 60 si lo consideramos técnicamente). Si la lista el último alumno se hubiera inscrito con su posición original pongamos 1563, sería complicado elegir al azar a un alumno, por número, se podría hacer por nombre, peor las matemáticas están para socorrernos, simplifiquemos cuando es posible. Entre 1 y 61 8ó 0 y 60), todos en una sala solitos, es más aislado que sortearlo entre los 1850 alumnos d ela escuela y luego preguntarle si tiene más de 18 años y si es que no, dejarle con un palmo de narices. Usando nombres, los que  son menores no entran en el sorteo, pero ven 'en directo' el sorteo saltando por encima de sus cabezas 'produciendo algo de envidia'  :laugh: :laugh: :laugh: :laugh:
Mejos con la lista aparte en otra función (una sala, se los llama ) y a puerta cerrada se hace el sorteo solo entre los implicados...

Bueno, cuando ya 'furrulen' estas dos funciones si tienes más dudas, pregunta.
Páginas: 1 ... 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ... 92
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines