Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: sleepy.lito en 20 Noviembre 2018, 21:50 pm



Título: Matriz aleatoria
Publicado por: sleepy.lito en 20 Noviembre 2018, 21:50 pm
Estimados tengo una duda de como poder hacer para asignar una valor obtenido a una matriz y que los números que vayan generándose contiguamente se asignen en la siguiente casilla y así sucesivamente hasta completar la matriz de 6x4, debo recalcar que no puedo usar la sentencia for.
Esto es lo que llevo hasta el momento pero estoy complicado con ese tema.

Código
  1. #include<stdio.h>
  2. #include<time.h>
  3. int main () {
  4. int cont, primo, n, numero, x, y, c;
  5. int matriz [6][4];
  6. cont=0;
  7. while (cont<=24) {
  8. n=1;
  9. x,y,c=0;
  10. srand (time(NULL));
  11. while (x<6) {
  12. while (y<4) {
  13. numero = 1 + rand () % ((81+1)-2);
  14. while (n<=numero) {
  15. if (numero%n==0) {
  16. n++;
  17. c++;
  18. }
  19. }
  20. if (c==2) {
  21. cont++;
  22. }
  23. }
  24. }
  25. }
  26. }

Espero atentamente su respuesta.

Es en #c

MOD: Etiquetas GeSHi. No hacer doble post. Usa el botón modificar.


Título: Re: Matriz aleatoria
Publicado por: K-YreX en 20 Noviembre 2018, 23:14 pm
No entiendo muy bien tu pregunta, si pudieras ser más claro con el objetivo del programa (con un ejemplo).
De todos modos si no puedes usar un <for> pero sí puedes usar un <while>... Aquí tienes como se transforma un <for> en un <while>:silbar::
Código
  1. // BUCLE FOR
  2. for(int i = 0; i < n; i++){
  3. // cuerpo del for
  4. }
  5.  
  6. // BUCLE WHILE
  7. int i = 0;
  8. while (i < n){
  9. // cuerpo del while
  10. i++;
  11. }


Título: Re: Matriz aleatoria
Publicado por: Serapis en 21 Noviembre 2018, 01:29 am
Código
  1. #include<stdio.h>
  2. #include<time.h>
  3. int main () {
  4. int cont, primo, n, numero, x, y, c;
  5. int matriz [6][4];
  6. cont=0;
  7. while (cont<=24) {
  8. n=1;
  9. x,y,c=0;
  10. srand (time(NULL));
  11. while (x<6) {
  12. while (y<4) {
  13. numero = 1 + rand () % ((81+1)-2);
  14. while (n<=numero) {
  15. if (numero%n==0) {
  16. n++;
  17. c++;
  18. }
  19. }
  20. if (c==2) {
  21. cont++;
  22. }
  23. }
  24. }
  25. }
  26. }

No sé que sentido tiene no poder usar un bucle for si puedes usar un bucle while... quiero decir que un bucle es un bucle, entonce que más da, toda vez que un bucle de un tipo es fácilmente convertible en otro...
Otra cosa es que no se te permita usar bucles (ni for, ni while), en cuyo caso la opción es hacerlo de modo recursivo, en vez de iterativo.

En tu código veo 3 bucles... (solo considero los bucles de control). Uno que pretende contar hasta 24... pero si luego tienes uno que cuenta hasta 6 y otro que cuenta hasta 4, esos equivalen al otro (6*4=24), luego o el externo es inecesario, o los dos internos sobran.

Otra parte 'rara', es que dices que "...Los números que vayan generándose contiguamente se asignen en la siguiente casilla y así sucesivamente hasta completar la matriz de 6x4...", no sé bien como interpretarlo.
Si es de modo estricto, entiendo que en el ciclo 1 obtienes un valor que se pone en la segunda casilla del array?. Si es así, tienes el problema que cuando llegues al ciclo 24, no podrás ponerlo en la casilla 25 (pués no existe) y  a su vez, la casilla 0 queda desierta... (pués su rellenado exigiría un 'ciclo -1', o bien calcularlo previo a entrar a los bucles)...

Pese a las lagunas... el cascarón de tu problema podría ser algo así (si no he fallado en exceso al intentar entenderte):

Código:
Hacer mientras filas < 6
    Hacer mientras columnas < 4
        x= generarNumero  // generar número podría ser una función que realice cálculos, o lo que sea y que devuelve un número.
                                    // Si es algo sencillo, es preferible resolverlo in situ.
        matriz(filas,  columnas) = x  // Asignar el valor al array, pero en la casilla actual
        
        columnas + =1
    Fin mientras

    filas +=1
fin mientras


Título: Re: Matriz aleatoria
Publicado por: sleepy.lito en 21 Noviembre 2018, 01:38 am
No entiendo muy bien tu pregunta, si pudieras ser más claro con el objetivo del programa (con un ejemplo).
De todos modos si no puedes usar un <for> pero sí puedes usar un <while>... Aquí tienes como se transforma un <for> en un <while>:silbar::
Código
  1. // BUCLE FOR
  2. for(int i = 0; i < n; i++){
  3. // cuerpo del for
  4. }
  5.  
  6. // BUCLE WHILE
  7. int i = 0;
  8. while (i < n){
  9. // cuerpo del while
  10. i++;
  11. }





El objetivo del programa es generar una matriz de 6x4 con los primeros 24 numeros primos y que estos sean aleatorios.


Título: Re: Matriz aleatoria
Publicado por: K-YreX en 21 Noviembre 2018, 01:44 am
El objetivo del programa es generar una matriz de 6x4 con los primeros 24 numeros primos y que estos sean aleatorios.
Los 24 primeros números primos son estos: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89. Es decir, que no entiendo lo de "que estos sean aleatorios". Te refieres a tener esos 24 números y meterlos en la matriz desordenados?   


Título: Re: Matriz aleatoria
Publicado por: MAFUS en 21 Noviembre 2018, 01:51 am
¿Esto no debería estar en C/C++?


Título: Re: Matriz aleatoria
Publicado por: sleepy.lito en 21 Noviembre 2018, 01:54 am
No sé que sentido tiene no poder usar un bucle for si puedes usar un bucle while... quiero decir que un bucle es un bucle, entonce que más da, toda vez que un bucle de un tipo es fácilmente convertible en otro...
Otra cosa es que no se te permita usar bucles (ni for, ni while), en cuyo caso la opción es hacerlo de modo recursivo, en vez de iterativo.

En tu código veo 3 bucles... (solo considero los bucles de control). Uno que pretende contar hasta 24... pero si luego tienes uno que cuenta hasta 6 y otro que cuenta hasta 4, esos equivalen al otro (6*4=24), luego o el externo es inecesario, o los dos internos sobran.

Otra parte 'rara', es que dices que "...Los números que vayan generándose contiguamente se asignen en la siguiente casilla y así sucesivamente hasta completar la matriz de 6x4...", no sé bien como interpretarlo.
Si es de modo estricto, entiendo que en el ciclo 1 obtienes un valor que se pone en la segunda casilla del array?. Si es así, tienes el problema que cuando llegues al ciclo 24, no podrás ponerlo en la casilla 25 (pués no existe) y  a su vez, la casilla 0 queda desierta... (pués su rellenado exigiría un 'ciclo -1', o bien calcularlo previo a entrar a los bucles)...

Pese a las lagunas... el cascarón de tu problema podría ser algo así (si no he fallado en exceso al intentar entenderte):

Código:
Hacer mientras filas < 6
    Hacer mientras columnas < 4
        x= generarNumero  // generar número podría ser una función que realice cálculos, o lo que sea y que devuelve un número.
                                    // Si es algo sencillo, es preferible resolverlo in situ.
        matriz(filas,  columnas) = x  // Asignar el valor al array, pero en la casilla actual
        
        columnas + =1
    Fin mientras

    filas +=1
fin mientras

Disculpa la mala explicación del problema, la verdad es que es muy poco lo que me explicaron en clases de como realizar matrices y de programación en general, todo lo que e aprendido a sido en base a libros en su mayoría por lo que me cuesta bastante este tema, tu respuesta me sirvió bastante y te lo agradezco mucho. La idea de este programa es generar una matriz de 6x4 de forma aleatoria con los primeros 24 números primos, lo que quería era que me aclararan un poco la estructura para poder rellenar la matriz,  la idea del primer bucle es para que contar la cantidad de primos el cual quiero que se incremente cada vez que se ingrese un numero primo sin que se repita en la matriz, pero eso todavía no lo hago ya que estaba atascado con ese tema. Seguiré avanzando en el programa.

Muchas gracias saludos.


Título: Re: Matriz aleatoria
Publicado por: Serapis en 21 Noviembre 2018, 02:00 am
1º Creas un array con los primeros 24 números primos. Esto es trivial, debes ser capaz de hacerlo por tí mismo sin ayuda.
2º Crear una función de barajado. Aquí el algoritmo de Fisher-Yates-Dusternfeld
Código:
// el array primos se pasa por referencia
funcion Barajar(array de enteros primos() )
     entero i, j, k

     bucle para k desde 23 hasta 1 cuenta regresiva
         j= aleantorio(entre 0 y k)
         i =primos(k)
         primos(k) = primos(j)
         primos(j) = i
     fin bucle
fin funcion

3º Basta un solo bucle, recorrido hacia arriba, asignando los valores primos barajados. Como el array lo tienes con dos dmensiones desdoblamos el valor de k, o bien usa dos bucles y en cada iteracción interna aumenta 'k'.
Código:
hacer mientras k< 24
    x= (k and 3)
    y= (k\6)
    matriz(y,x)= primos(k)
    k +=1
fin mientras

Resumiendo tu código sería:
1º Generar array de primos
2º Barajar los primos.
3º Asignarlos valores primos barajados al array bidimensional (si bastara un array unidimensional, el array primos una vez barajado se podría devolver, haciendo innecesario el punto 3º.

p.d.:
La parte que podría resultarte compleja es la 2ª. Así que t ela explico... toda la vida se le ha llamado el 'algoritmo del sombrero'...
Metes 24 papelitos (con tus números primos), en un sombrero, se barajan... mueven... y se saca uno... sea cual sea, se le ubica en la posición última... el sombrero ahora solo tiene 23 papelitos con primos distintos... se saca otro, sea cual sea se uybica fuera en la posición 22... y se sigue hasta que solo queda 1 papelito, que se saca y se pone en la posición 0...
Al llevarlo al terreno de la programación, reusamos el mismo array, para los que se sacan... por eso al azar, lo que elegimos es una posición y tomamos el que se saca de esa posición para intercambiarlo con el que está en la última posición disponible del array, y ahora se considera que la dispoinibilidad del array es uno menos, ahora se elige al azar uno entre el 0 y el 22, porque la posición 23 ya quedó desierta, al depositar allí el que acaba de salir... al final solo quedan 2, el que se saque se intercambia con el dela psoición 1 y el que queda ocuparñá la posición 0...

Si te cuesta enrtenderlo, llévalo a la práctica, corta papelitos y ponles números ordenados, los barajas y procedes manualmente... eso te ayudará a terminar de entenderlo.


Título: Re: Matriz aleatoria
Publicado por: sleepy.lito en 21 Noviembre 2018, 02:02 am
Los 24 primeros números primos son estos: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89. Es decir, que no entiendo lo de "que estos sean aleatorios". Te refieres a tener esos 24 números y meterlos en la matriz desordenados?   

Este es el enunciado del ejercicio:

 El Banco requiere que los
alumnos de Ingeniería Civil realicen la implementación de la ICCard en una matriz de 6x4, que contenga los 24
primeros números primos menores que 100 y que están dispuestos en orden aleatorio.

Es mejor ingresar los numeros y meterlos en forma aleatoria en vez de generarlos aleatoriamente y comprobarlos para luego ingresarlos?
 


Título: Re: Matriz aleatoria
Publicado por: K-YreX en 21 Noviembre 2018, 02:04 am
Resumiendo tu código sería:
1º Generar array de primos
2º Barajar los primos.
3º Asignarlos valores primos barajados al array bidimensional (si bastara un array unidimensional, el array primos una vez barajado se podría devolver, haciendo innecesario el punto 3º.
Yo había pensado generar el array de primos y en lugar de barajar el array y después asignarlo a cada posición de la matriz, asignar a cada posición de la matriz una posición aleatoria del array de primos (entre 0 y 23) y así no desordenas el array de primos.


Título: Re: Matriz aleatoria
Publicado por: Serapis en 21 Noviembre 2018, 02:12 am
Yo había pensado generar el array de primos y en lugar de barajar el array y después asignarlo a cada posición de la matriz, asignar a cada posición de la matriz una posición aleatoria del array de primos (entre 0 y 23) y así no desordenas el array de primos.
No tiene importancia... la próxima vez, que barajes te llega el array tal como quedó desordenado la vez previa, se vuelve a barajar... nunca se precisan en su orden estricto, luego carece de importancia. La ventaja es que de este modo te basta un único array, no dos.