Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#3271
Cita de: Flamer en 16 Julio 2017, 20:43 PM
bueno gracias a los dos por quererme ayudar pero yo desde un principio conocía la respuesta, pero solo preguntaba por si se podía pero párese que les gusta escribir mucho y sin llegar a nada
Vaya... es que eres duro de mollera. Se te ha explicado de todas las maneras posibles y sigues sin entenderlo. Y eso de llegar a nada, lo siento, solucion se te ha dado, otra cosa es que tu desistas de usarlas...

Cita de: Flamer en 16 Julio 2017, 20:43 PM
pero solo bastaba con decir "no se puede por esto y esto", eso aclararía todo ahora yo les digo por que no se puede
Eso es lo que se ha dicho una y otra vez... y no que no se pueda si no que las soluciones no son eficaces.


Cita de: Flamer en 16 Julio 2017, 20:43 PM
primero la solución a este problema es crear una matriz escalonada cosa que ninguno de los dos menciono como el siguiente ejemplo:
FALSO. Ya te comenté eso, otra cosa es que en tu ignorancia no sepas verlo...
Cita de: NEBIRE en 16 Julio 2017, 01:49 AM
Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

Tu problema más elemental se traduce en que no aclaras (ni aún a estas alturas), para que rayos necesitas hacer eso, porque es fijo que hay una manera óptima de tratar los datos, pero tu te cierras en banda en querer usar un array mutidimensional porque sí, y solo si... (y además sin usar un bucle para volcarlo). Es como si alguien dice que quiere ir a la Luna, y contrata a una empresa aeroespacial, pero al final resulta que "quiere ir con su motocicleta y no admite ninguna otra cosa". Pues va a ser que así solo irás al pueblito de al lado o a otra ciudad... pero jamás a la Luna.

Si quieres y realmente lo necesitas, explica como tienes los datos en ¿el fichero?, y explica pará que vas a usarlos y por tanto qué datos son precisos y olvida la parte de cómo o de qué manera hay que tratarlo, eso ya se te aclara... deja abierto que te sugieran como tratar los datos, no te obceques en querer hacer algo de una manera específica. Es seguro que hay mucha maneras de hacerlo óptimo, pero 'usando tu moto, forzosamente', nadie se va a comprometer a que sea óptimo...
#3272
A ver, yo personalmente no critico a nadie... la idea de responder es ayudar...

Igual que señalo fallos en el código, señalo fallos en el programador. Pero porque a veces el fallo está en el código y a veces el fallo está en el programador.

Si Elektro te puso el código que cumple tus necesidades y tu luego copias y pegas y añades código superfluo, ahora demuestras que el fallo está en el programador, luego señalo el fallo encontrado...

Si el fallo está en el código, pués señalo por donde puedes avanzar, con código y más a menudo con pseudocódigo. y si el fallo está en el programador, también señalo como avanzar o como evitar o solucionar el tema. De hecho mi mensaje previo está repleto de instrucciones y alternativas, que puedes seguir...

Si tú solo crees que los fallos están el código y que tu no debes 'corregirte' entonces seguirás siempre en la 'oscuridad' sin aprender nada, si no tras tropecientos mil intentos...

No te lo tomes a mal, nadie está aquí para molestar, aprende y sigue adelante...
#3273
Cita de: Flamer en 16 Julio 2017, 02:38 AM
hola NEBIRE no me entendiste?
claro que te entendí... el código y explicaciones que pusiste (y que repito aquí debajo) son suficientemente claro:
Código (vbnet) [Seleccionar]

' tengo esta variable llamada cadena que es igual a
dim cadena as string = "0-1-2-3-4-5-6-7-8-9"
' y declaro una matriz de 1x10 así
dim matriz(1,9) as string

' quiero hacer split y que el resultado sea almacenado en la posicion 0 hasta 10 de la matriz sin hacer esto
dim vector() as string

vector=split(cadena,"-")
for x=0 to 9
  matriz(0,x)=vector(x)
next

' ... quiero guardar el vector en una fila de la matriz ... y quiero ahorrarme el ciclo


Sin embargo, eres tú quien parece no haberme entendido...
Ningún lenguaje se dedica a crear funciones peregrinas para resolver un único caso que se va a usar 1 vez cada 5 años por parte de algún programador... máximo, cuando lo mismo puede hacerse con 3 líneas de código y para colmo a cambio de una complejidad extrema (sería preciso para que fuera útil del todo declarar que partes del array deberían mantenerse, lo que exigiría copias posteriores que lo harían lento).
Pero el principal problema por el que ningún lenguaje ha hecho ni hará jamás (salvo que lo formen chiflados), es crear una función cuyo resultado a priori se desconozca, y por tanto que deba crear y redimensionar un array y que en vez de ello, derive a un array administrado por 'el usuario', para volcar el contenido, pero antes redimensionarlo y J0D35L3 el contenido actual, o a cambio de una complejidad extrema donde declare que partes exigen ser mantenidas... y la función deba restaurar esas partes previas verificaciones de si el nuevo tamaño, lo va a permitir (ajustado a la perfeccción), si va a sobrtar contenido nuevo, o si se va a destruir contenido existente...

- Cuando vas a hacer Split, de entrada no sabes cuantas apariciones habrá, por eso en un primer momento han de contarse (si se quieren guardar en un array), para luego redimensionar el array a la cantidad encontrada y en otro paso volcar ahí los datos. Si en vez de un array se usara por ejemplo una lista enlazada, podría hacerse todo en un solo paso, pero la ventaja de los arrays recae en la contigüidad de sus elementos, y de ahí la facilidad de encontrar la dirección de memoria del elemento 'x'... y con ello la velocidad de acceso.

- Si tu tienes un array ya declarado con más de una dimensión, ese array ya está definido a tener 'x' dimensiones por 'y' elementos en cada dimensión (suponiendo uno de 2 dimensiones). Un Split, podría hacer una de dos cosas sobre un array así: Redimensionarlo de nuevo para que tenga el tamaño que encuentre el 'splitado', o bien usar el espacio actual que tenga el array no redimensionándolo en ningún caso y en tal situación que queden ocurrencias sin copia. ó indices sin una reocupación (con basura del contenido previo). ambas situaciones son una chapuza.... peroooooooooo... si ese es tu caso, YA te puse código para una función que hace eso, luego no vengas con que no te entendí.... prueba la función más arriba y dime si lo hace o no (que desde luego lo hace, porque la he probado).

- Pero el problema es que tu ya tienes ese array, en cambio Split, devuelve un array que Split crea. Split no admite (en ninguna sobrecarga) como parámetro de entrada un array tuyo donde volcar el contenido. Luego Split, no hace lo que tu pides (cierto es que no he probado aún VS-2017, pero dudo mucho que hagan eso ni ahora ni nunca. Es más si a alguien se le ocurriera tamaña patraña, creo que lo despidirían ese mismo día).

- Te decía también, que es posible tras obtener el array que devuelve split, volcar en contenido en tu array (sin usar un bucle), haciendo uso de Marshalling, para operar con punteros de dirección y hacer un: copyMemory(ptrDestino, ptrOrigen, NumBytesACopiar)...
...pero francamente el código necesario en NET para esto, es mucho más que las 3 PUT45 líneas sencillas de un bucle (en vb6 sería solo la línea de código de la llamada a la función, pero en NET al operar con memoria administrada se requiere más código aunque luego compilado no difiera mucho).

- Y en cuanto a la velocidad de copia, creo que estás subestimando los procesadores.... trata de hacer pruebas de velocidad de asignación entre bucles y demuéstrame que es lento, dime cuantos millones de índices por segundo es capaz de transferir tu equipo entre 2 arrays... sin conocer nada de tu equipo, apuesto que más de 20millones por segundo, así que tu aseveración de que 'es lento' es pueril e injustificada.

---------
p.d.: En programación se puede hacer cualquier cosa, pero eso no significa que sea admisible hacer cualquier cosa, hay aberraciones y esta que propones (por no usar un bucle) es una de ellas. Francamente eso dice muy poco a tu favor como programador...

Desde el momento en que se deba realojar memoria para copiar datos y deba modificarse una infinidad y la complejidad lo haga costoso, será relativamente más sencillo proveer una array adicional que se crea en el momento preciso y se destruye cuando ya no se requiera, y se deje el resto 'en paz'.... en general esta ecuación suele ser casi siempre cierta: Mayor sencillez = mayor velocidad.

En fin si no entiendes todo esto que te digo, es que tu madurez como programador aún está muy verde...
#3274
Una de las primeras pelis, de ese tipo fue la de Superman III (1983), donde el actor Richard Prior, encarnaba al hacker malandrín que hacía de las suyas para sacarse un dinerito... y eso que al inicio era un prongadillo en la programación...  :laugh: :laugh: :laugh:

[youtube=640,360]https://www.youtube.com/watch?v=iLw9OBV7HYA[/youtube]

p.d.: No es ni de lejos, la mejor actuación como hacker, pero si que influenció a muchísima gente para meterse en el mundillo de la informática e hizo soñar a otra mucha, con lo que se podía lograr hacer con un ordenador...
#3275
array Modas() =  Funcion ContarPresencias(array Numeros() )
   array x(0 a numeros.MaxValue)  // esto es, exige previamente o bien conocer a priori el valor mayor del array o recorrerlo en un bucle para localizarlo.

   // Contar la presencia de cada valor en el array.
   Bucle para k desde 0 a Numeros.Length-1
        x(numeros(k)) += 1
   Fin Bucle

   // Buscar la moda o modas que pudiera haber...
   Bucle para k desde 0 a x.Length -1
       Si x(k) > n luego
           n = x(k)
           Modas=1
       O si x(k) = n luego
           Modas +=1
       Fin Si
   Fin bucle

   Redimensionar Array m(0 a Modas -1)
   k=0
   Hacer Mientras (modas > 0)
       Si n= x(k) luego
           Modas -=1   //hacemos una cuenta regresiva, para ser más óptimos, nos da igual en que orden aparezcan las modas, ¿no?
           m(Modas) = k            
       Fin si
       k +=1
   Repetir

   Devolver m //el array....
Fin Funcion

La llamada a esta función con el array de valores: 1, 2, 2, 3, 3, 4, 4 devolvería un array con 3 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2

Nota sin embargo que esta solución al usar parcialmente el algoritmo counting, tiene algunas serias limitaciones:
--- solo vale para números, no para cadenas.
--- solo vale para enteros, no para decimales (no es dle todo cierto, pero sería costoso multiplicar todos los números para convertirlos en enteros)
--- si el valor mayor del array es gigante, será costoso en memoria, ya se necesita memoria auxilair del array de contar presencia de cada valor desde 0 hasta el mayor valor hallado en el array. por ejemplo si tienes un array de 5 elementos y sus valores son estos: 5,6,76543210,16,84, exige crear un array de 76543211 elementos...
--- si hay valores negativos, es costoso, exige buscar el valor menor, sumar ese valor a todos, para hacer el menor igual a 0, y al final restar ese valor al consignar los valores en el array 'm'...


Ahora bien, si es algo simple como el ejemplo que has puesto cumple perfectamente tus necesidades...

-----------------------------------------
p.d.: modificado, para indicar la salida que daría la función con tus datos de ejemplo como entrada. OJO: Solo indica los valores de moda, no la frecunecia alcanzada en la moda. Si fuere preciso esto, podría devolverse dicho valor en un índice más (el último en el array)... y los cambios al código serían estos:
Citar Redimensionar Array m(0 a Modas -1)
Redimensionar Array m(0 a Modas)

y...
 
Citar k = 0
  Hacer Mientras (modas > 0)

  k = 0
  m(Modas) =n
  Hacer Mientras (modas > 0)
y finalmente la salida sería entonces:
  array con 4 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2 y la cuenta de moda: m(3) = 3
#3276
No sé yo si entiendes la idea de 'bucle'.

La solución, pasa sí o sí, por hacer bucles. Otra cosa es que el bucle lo realices tú explícitamente o delegues en algún método interno.

Split, no entrega el contenido donde tu desees, si no en la posición de memoria de un array. Si quieres que Split, entregue el resultado en otro lado, tienes que manejar el puntero del array. Básicamente falsificando la dirección del array 'vector', para hacerle creer que su dirección es en realidad la dirección del índice en Matriz(0,0). Ahora bien, esto supone un problema irresoluble aquí... ya que Split, redimensiona automáticamente el array, pero al pasarle una dirección de array falsa, la estructura (SafeArray) del array (Matriz), no va a coincidir en nada con el de 'Vector', por lo que en algún punto va a cantar un error...

No hay buenas noticias para ti, que conste que en VB no existe solución a lo que tu esperas (ni en ningún lenguaje), porque exige sí o sí, redimensionar siempre el array en el que se vuelca, y si el array ya está redimensionado hacerlo de nuevo, sin duda borraría el contenido previo, pero puedes enfangarte y hacer algo...

Lo mejor es que ya que se requiere usar bucles (sí o sí), implementes tu propia función Split ... (aquí simplificada en parámetros)

Código (vbnet) [Seleccionar]

''' <summary>
''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en un array.
''' </summary>
''' <param name="Texto">El Texto origen del procesado</param>
''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
''' <returns>Un array con los resultados hallados.</returns>
''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
Public Function Split(ByRef Texto As String, Optional ByRef Delimitador As String = " ") As String()
       Dim cd() As String
       Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32

       ' Buscar cuantas coincidencias se localizan...
       While (k < Texto.Length)
           If Texto.Chars(k) = Delimitador Then
               ct1 += 1
           End If
           k += 1
       End While
               
       ReDim cd(0 To ct1)

       ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
       If (ct1 > 0) Then ' número de subdivisiones, si no se encontró, no recorremos de nuevo el texto...
           k = 0
           While (k < Texto.Length)
               If Texto.Chars(k) = Delimitador Then
                   cd(ct2) = Texto.Substring(n, k - n)
                   ct2 += 1 : n = k + 1
               End If
               k += 1
           End While
       End If
       ' queda la subcadena final, puede ser el texto original si no se encontró nada.
       cd(ct2) = Texto.Substring(n, k - n)

       Return cd
End Function


Bien, ahora que hay una función que opera conforme a como se espera (esto es casi igual que hace el Split de VB, digo casi, porque el delimitador aquí debe ser un solo carácter, queda a tu esfuerzo hacer los cambios necesarios que requieras), ahora puedes añadir una sobrecarga con la modificación que tu pedías...
...y hay un pero, bastante gordo... y es que tu array ya debe estar redimensionado y debe poder albergar todos los hallazgos que se encuentren, o generará error... obviamente esto conlleva a preguntar qué necesidad hay de hacer realmente esto, que no va a quedar en condiciones (no deja de ser un poco chapuza), y hace cuestionar lo más importante: ¿Para qué es necesario hacer esto?... porque seguramente existe una alternativa mucho más óptima y razonable, con la que no es posible contar al ignorar el propósito de para qué lo necesitas...

Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

...de todos modos, ya que he perdido el tiempo en ello, lo pongo... aquí el código de la modificación... pero fíjate en las 2 importantes limitaciones de esta 'solución': No puedes redimensionar el array, y el número de elementos de la dimensión final, debe poder alojar todos los hallazgos, o bien añadir un parámetro adicional (como tiene VB), para señalar cuántos elementos desean consignarse en el array (en VB un valor de -1, indica que todos los que haya)... nuevamente queda a tu esfuerzo cualquier cambio que necesites...

Código (vbnet) [Seleccionar]

''' <summary>
   ''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en la dimensión de un array YA ESTABLECIDO.
   ''' </summary>
   ''' <param name="Bolsa">Un array ya dimensionado a un tamaño útil.</param>
   ''' <param name="Dimension">El índice la dimensión donde se van a alojar.</param>
   ''' <param name="Texto">El Texto origen del procesado</param>
   ''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
   ''' <returns>El número de delimitadores hallados</returns>
   ''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
   Public Function Split(ByRef Bolsa(,) As String, ByVal Dimension As Integer, ByRef Texto As String, Optional ByRef Delimitador As String = " ") As Integer        
       Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32, d As Integer

       ' Buscar cuantas coincidencias se localizan...
       While (k < Texto.Length)
           If Texto.Chars(k) = Delimitador Then
               ct1 += 1
           End If
           k += 1
       End While

       ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
       If (ct1 > 0) Then ' si no se encontró, no recorremos de nuevo el texto...
           k = 0
           While (k < Texto.Length)
               If Texto.Chars(k) = Delimitador Then
                   Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)
                   ct2 += 1 : n = k + 1
               End If
               k += 1
           End While
       End If
       ' queda la subcadena final, puede ser el texto original si no se encontró nada.
       Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)

       Return ct2
End Function


Puede sprobar ambas funciones, por ejemplo con esto:
Código (vbnet) [Seleccionar]

       Dim s As String = "0-1---2-3-4-5-6-7-8-9-"  
       ' otros textos de prueba:"0-1-2-3-4-5-6-7-8-9", "0123456789"
       Dim cd() As String, sd(,) As String
       Dim n As Integer

       cd = Strings.Split(s, "-") ' el split de VB, para tras su ejecución y verifica si éste resultado coincide con el que devuelve la función cuyo código se ha creado...
       cd = Me.Split(s, "-")

       ReDim sd(0 To 2, 0 To 16)
       n = Me.Split(sd, 1, s, "-")
       n= n ' pon aquí un punto de parada (tecla F9) , y ejecuta hasta aquí, luego posa el ratón sobre 'sd' y baja a la flechita para ver el contenido del array con el intellisense


Y bueno, si nos cuentas para que los quieres se puede analizar una solución más óptima y acorde...

Incluso usando la función Split de VB, una vez obtenido el array podrías copiar el contenido (sin un bucle), nuevamente mediante el uso de punteros a memoria... la función de las API CopyMemory, vale perfectamente para ello, pero con Marshalling (bajo NET), evitarás la problemática de las API con la memoria administrada y no administrada....

p.d.: después de todo lo dicho, espero que reconsideres la opción de usar el bucle para asignarlo en tu array, aunque sea usando copymemory si no quieres usar un bucle (internamente en ensamblador, así se hará. Te guste o no, el bucle es inevitable).
#3277
Sin intención de crear polémica (quizás algo difícil), creo que las empresas consideran no solo el factor 'conocimientos', si no otros factores no menos importantes laboralmente hablando.

Al ser mujer, los días de baja por problemas de salud con los hijos es algo que se asume que va a suceder, entonces evitar mujeres en cierto rango de edad, claramente rebajan la posibilidad de esas ausencias laborales.

La mayor parte de mujeres presenta cambios de todo tipo cuanto les llega la regla, probablemente la media de días con 'dificultades o cambios de carácter' sean 3 días cada mes... se achaca que en esos días rinden menos y están más irritables. Datos ciertos o no, a nadie le gusta tener que lidiar con el mal humor de la gente 'por que sí', sin venir a cuento (aunque haya un motivo, uno se pregunta: ¿y por qué debo yo cargar con tu malhumor?).

Para mi el aspecto más fundamental en detrimento de las mujeres (solo cuando optan a altos cargos), no son ninguno de esos, si no la prácticamente nula adaptación de las mujeres para llegar a un estado laboro-emocional agradable. Cuando he tenido mujeres como cargo superior, siempre han sido ásperas, tajantes, sin ningún tipo de concesión, ni consideración, no existe con ellas la posibilidad de entenderse en el punto medio, son inflexibles, lo que provoca a menudo la espantada de buenos trabajadores. También defienden a capa y espada su posición con más ahínco que cualquier hombre incluso si para ello tiene que mentir o falsificar.... entiéndase 'hechar las culpas (de las que ellas y solo ellas son responsables) a los demás, y absorber como propios los méritos de los que están bajo ellas'. Aunque esto es algo que también hacen algunos hombres, en mi vida laboral he visto que ocurre con una notable frecuencia mayor en las mujeres.
Por ello no me dule nada decir que prefiero no tener ninguna mujer como jefe (directo) y si es así, me pienso si aceptar el trabajo o no. A veces te tienta probar, porque 'no todo el mundo es igual', para ver como con el tiempo, en efecto era igual... en resumen las 'mujeres jefe', son tigresas.... 'sacan las uñas' sin razón y sin venir a cuento y no dudan en 'morder' al que sea, cuando lo necesiten.

Fuera de esto, lo demás me importa poco o nada... en conocimientos, no veo que deba existir diferencias entre hombre y mujeres, pero si veo injusto que si hay 1.000.000 de hombres con un título x y solo 1.000 mujeres con el mismo título x, no entiendo que deba haber 50/50 de altos jefes mujeres y hombres. Es ridículo y supone favoritismo sexual discriminatorio contra el hombre. Creo que a igualdad de niveles de conocimientos, el procentaje de la cúpula debería ser aproximadamente un reflejo del porcentaje de los aspirantes... si hay 10 veces mas aspirantes de mujeres a enfermertas, pues habrá 10 veces más enfermeras que enfermeros trabajando en los hospitales, y lo msimo si hay 100 veces más hombres técnicos en informártica especializados en x, habrá 100 veces más profesionales trabajando en ese campo que sean chicos que chicas.

Aún así, lo de los currículum vitae, ciegos los veo, bien... aunque para ser más exactos, los currículum, los veo una estafa inútil.
Un currículum, solo habla de tu pasado, jamás de tu presente, ni mucho menos de tu futuro. Si vas a contratar a alguien, ¿de qué te vale a ti, lo que alguien hizo hace 10 años?... ¿de qué te vale lo que 'x' hizo el año pasado en 'y' empresa?. A ti te vale lo que haga ahora en tu empresa y nada más...
Una persona pudo ser un poco inútil 15-20 años atrás, porque estaba en una adolescencia tardía, y ahora estar centrado plenamente. Un currículum, nunca refleja quién eres, ni siquiera qué hiciste, a lo sumo, para qué te contrataron...
Es frecuente que te contraten para algo y al final asumas muchos mas roles de aquellos para los que te contrataron, pero que no se reflejen en tu contrato.
Para colmo hay gente con muchos conocimientos y experiencia, pero que no puede constar en su currículum, porque no han tenido un contrato por ello... esto es algo frecuente en gente que trabaja por horas o muy pequeños contratos, incluso en gente que hace cosas 'ilegales' y que por razones obvias no va a poner en su currículum...¿quién sería tan torpe de poner en su currículum, que entró a los servidores de tales o cuales empresas, y entregar así el currículum para optar a un puesto de seguridad de una empresa???.

Por último, desde que se hicieron populares los 'responsables de recursos humanos', los currículums, más que servir para contratar a alguien sirven para descartar...
Yo he escuchado la vivencia de unas 3 personas que optaron a trabajar en 'Mercadona', el proceso de selección que hacen resulta absurdo, incomprensible, sin lógica alguna... a lo más que llego es que eligen por las razones que les dé la gana y todo el proceso es solo autobombo, para que surja la leyenda de que 'son muy exigentes'... algo absurdo. yo soy de la opinión de que todo el mundo vale para camarero, vendedor de supermercado, mozo de almacén, basurero, pintor de brocha gorda, etc, etc, etc... y en esos casos pedir currículum o cosas tan absurdas como 'se valorará conocimientos de inglés' (para un puesto de basurero), es que se les ha ido de las manos...

Los currículum, solo deberían ser exigibles para cargos altos en las empresas, donde el conocimiento se les supone y la capacidad deben demostrarla.

La ley establece un período de pruebas de 15 días, durante el cual, tanto el trabajador como la empresa, puede renegar del contrato sin ninguna obligación extra y esto debería ser suficiente para valorasr si un trabajador vale o no para el puesto... lo que si debería hacer el gobierno es flexibilizar que durante ese período, los costes de alta y baja del trabajador (en caso de no resultar finalmente apto), así como el coste a la seguridad social, en esos casos fuera mucho menor...
...porque eso es lo que escuece a muchas empresas y quieren asegurarse antes de dar de alta a nadie que es apto para el puesto, cuando es algo previsto en los contratos ese período de pruebas de 15 días. Las empresas quieren hacer esa evaluación a un coste nulo y al final ni la evaluación es correcta, ni el ahorro es asumible, porque los de 'recursos humanos', al final están en plantilla con un coste fijo (asumible solo para medianas y grandes empresas).
#3278
A menudo cuando tenemos una tabla restringida a x caracteres, es mucho mejor generar un array justo con esos caracteres

// el array de letras, sería así:
ArrayL(0) = 65  //----> "A"
ArrayL(1)= 66  // ----> "B"
...
ArrayL(25)= 90 // ----> "Z"

// el array de números, sería así:
ArrayN(0) = 48  // ----> "0"
ArrayN(0) = 49  // ----> "1"
...
ArrayN(9)= 57 // ----> "9"


Ahora solo tiene que elegir un valor entre 0 y 25 para las letras, y entre 0 y 9 para los números. Cada array contiene el valor numérico en la tabla ASCII para cada carácter.

Finalmente haz dos bucles, uno para elegir la letra al azar para los 3 primeros caracteres, y otro para elegir los números en las 2 posiciones finales:
Bucle para Letra de 0 a 2
   Palabra(Letra) = ArrayL(Azar(0,25))
Fin Bucle

Bucle para Numero de 3 a 4
    Palabra(Numero) = ArrayN(Azar(0,9))
Fin Bucle

Mostrar Palabra
#3279
Cita de: TickTack en 15 Julio 2017, 12:42 PM
Bueno a tu codigo le agregue esto y te queria mostrarlo:
....
Al probar el programa pasa esto: Elijo dos canciones. Cuando le doy Ok al FileDialog, en el listBox me sale primero las rutas de esas dos canciones, luego los nombres, y luego otra vez las rutas.
....
Esperaba que solo salieran los nombres.
A Elektro, le ha faltado responderte a esto...
Tu licencia al añadir código, demuestra que no entiendes lo que lees, ni lo que hace el código...

Esto:
listBox1.Items.AddRange(ofd.FileNames);
             
Viene a ser equivalente a esto:                
foreach (string s in ofd.FileNames)
    {
     listBox1.Items.Add(s);
     }

Pero en una sola línea de código... Add, añade UN SOLO ítem cada vez, Addrange, añade TODOS LOS items de una vez, de una colección.
Y en resumen estás repitiendo la misma operación, dos veces, luego es normal que te salga repetido... Esto te ocurre porque no entiendes el código que te ha puesto, pero no solo no lo entiendes al leerlo, es que ni has buscado info si desconoces los métodos, ni tan siquiera has probado su código 'suelto' sin ningún añadido, para al menos '...ver que hace...', y si no lo logras deducir, ampliar luego la información...

----------------------
Por otro lado, también está mal que haces eso fuera de la comprobación del "showdialog = OK", es decir tu te empeñas en añadir ítems incluso si el usuario canceló ... entonces para que hacer una comprobación, y si no es ok, podría dar error al tratar de acceder a una carpeta para la que se ha cancelado comprobaciones internas....


Cita de: TickTack en 15 Julio 2017, 12:42 PM
Yo lo que queria hacer era recoger las rutas y los nombres con el OpenFileDialog. Y cada vez que le doy al boton abrir, que esas canciones junto con sus rutas se amonten al final de la lista del listBox.
Aquí elektro, ha tirado por el atajo, mostrándote opciones para cada caso.
Yo te pregunto, es realmente necesario recoger las rutas de cada fichero?. No, no respondas, ya te respondo yo: Sólo si los ficheros a añadir al listbox, puedne proceder de diferentes carpetas de origen, si todas proceden de la misma y única carpeta, basta asociar una variable con el listbox,
listbox Mp3FilesLsbox <---- tu listbox, podría llamarse así, en vez de un genérico listbox1.
//aunque suele acosejarse poner el nombre del objeto delante, a veces si hay más objetos relacioneados entre sí, conviene ponerlo al final, y así todos los que están relacionados comiencen por las mismas letras (el intellisense, los mostrará todos juntos, mucho más cómodo, claro y rápido que todos separados)
string Mp3Folder <---- y la carpeta común a todos esos ficheros del listbox, podría llamarse así.
//la ruta completa sería entonces una concatenación de mp3folder + mp3fileslsbox.item(k) ----> teniendo en cuenta que la ruta de la carpeta ya acabe en  "\"


Si tu listbox, ha de acoger ficheros de diferentes carpetas, entonces si resulta necesario mantener la carpeta asociada con cada fichero individual. Todavía queda la pregunta... ¿y es necesario presentarla en ese caso al usuario?. Seguramente sí, si dos ficheros pueden tener el mismo nombre, por que si no, no sabría a cuál se refiere. Incluso así, se podría añadir bajo (o encima) del listbox una caja de texto, tal que cuando el usuario pulse un ítem (el cual muestre el fichero), dicha caja se actualice con la ruta de dicho fichero. Es una alternativa más que Elektro no te ha señalado. Sin embargo, al contener dos datos para un solo elemento, necesitas un contenedor interno de más de un elemento... desde un array con dos dimensiones a un diccionario, tabla hash, pasando por un array con una dimensión pero alojando en cada elemento una estructura, por ejemplo:
Structure FullPathMp3
    String File             <------- nombre del fichero
    String Folder         <------- Carpeta
    //Buleno Selected  <------- en multiselección, está seleccionado?
    //Entero IndexRepro  <----- Si el orden de reproducción no es el que aparece en el listbox
end Structure

Array of FullPathMp3 Mp3Files

En definitiva internamente necesitas algún tipo de colección, incluso una clase específica, que sería lo más coherente, que al tiempo alojara métodos adecuados a la finalidad perseguida.

Nota que es preciso entender, diferenciar y separar la organización interna de los datos de la organización mostrada al usuario (grásfica), una no tiene que ser un reflejo exacto de la otra. Internamente puedes tener un array de estructuras con dos ítems (nombre y carpeta) y gráficamente puedes tener un grid de dos columnas, o un listbox y debajo una caja de texto, como ya te comentaba con anterioridad.

antes de iniciar un proyecto, uno debe hacer un boceto a lápiz de como quiere que reflejar la interfaz al usuario (más oomenos, luego puede sufrir algún cambio), pero eso te ayuda a saber que tipo de objetos vas a anecesitar para implementarlo... ir haciendo las cosas sobre la marcha, es tropezar en muchos problemas, y esto solo es asequible cuando lleves muchos años programando, hasta entonces siempre haz un boceto a lápiz... ubica los controles que ha de tener el usuario, define el menú, etc... es el punto de partida adecuado...

Cita de: TickTack en 15 Julio 2017, 12:42 PM
Voy en mal camino?
Creo que ya tienes respondido esto... pero especifico...

Es mal camino, si vas decidiendo cosas sobre la marcha, es mal camino, si ignoras el código que te dan, tu lo copias, lo pegas y luego debajo pegas lo tuyo previo, sin siquiera pararte a pensar qué hace ese código que te dieron, es mal camino, si no te has planteado previamente si es necesario que el usuario tenga vista del nombre del fichero sólo o si también de la ruta y en ese caso, si es necesario para cada fichero o solo para el actualmente seleccionado, si el usuario puede cargar ficheros al listbox de diferentes carpetas, osi tras elegir cargar de una carpeta se borra previamente el contenido del listbox... es mal camino, si no haces previamente un boceto 8como mínimo), para poder seguir un orden y tener claro qué ha de hacer y qué vas a necesitar, etc...
#3280
No entiendo eso de que 'no vale para barcos de gran tonelaje'....

Que so sepa durante siglos (de hecho hasta la invención de la máquina a vapor), la única manera en que han funcionado los barcos, TODOS, de gran tonelaje y ligeros, ha sido con el viento o los remos (o mixto). es decir energía 100% 'renovable'... siglos, milenios... así que bajemos el listón de lo que "no vale", cuando ya ha funcionado en el pasado.

Y todavía con las máquinas a vapor han seguido conviviendo, incluso hasta nuestros días, aunque hoy ya solo sean una minoría...