Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: hxcbps en 22 Mayo 2013, 15:01 pm



Título: portafolium set my name for the example yes I from colombia
Publicado por: hxcbps en 22 Mayo 2013, 15:01 pm
yes I from colombia  set my name for the example portafolium


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 22 Mayo 2013, 15:59 pm

la matriz debe contener 100 numeros positivos entre 1 y 100 en donde no exista un numero repetido, y los numeros sean aleatorios se imagina que una pelota se deja caer en el fondo de una piscina y que cae en alguno de los cuadros de ese piso de la piscina, la pelota va rodando por cada uno de esos cuadros que previamente tienen valores aleatorios, pero la pelota va rodando de cuadro en cuadro evaluando si pasa de menor cuadro a mayor cuadro , el usuario va controlando el moviemiento de la pelota con enter, es decir la pelota evalua los cuadros alrededor de donde esta situada, y si al cuadro que se desplaza es mayor que que el anterior que estaba lo rellenara con un cero

¡Hola, otra vez!. Y te digo lo mismo que "allí":


* Hablando con propiedad, la matriz contiene los 100 primeros números naturales, ya que al no estar repetidos no hay más posibilidades !!!.

* ¿Los números están colocados en orden natural o de forma aleatoria?.

* ¿Dónde se supone que "cae" la pelotita?, es decir, desde que casilla empieza el "juego".

* ¿Hacia dónde debe dirigirse la pelotita,?. Se mueve sí, pero que el camino a seguir dependerá del punto final no definido en el enunciado.

* ¿Qué opciones de movimiento se le presuponen a la pelotita, todo pa´lante, derecha izquierda ......?

**** Vamos que veo un poco indefinido el enunciado y no es por no ayudar, pero con algo tan indefinido......Hay que ver la importancia de definir de manera precisa e inequívoca el enunciado de un problema !!!
?
* Yo de tí empezaría por crear una matriz de de 10x10,100, algo como

int numeros[10][10]

y luego la rellenas con los100 números pero claro, ¿cómo, seguidos, alternados, pares e impares, aleatoriamente ......?.......

* Resumiendo, aclárate mejor con el enunciado y luego cuelga el código que lleves hecho y seguro que habrá quien te pueda ayudar ya que no se hacen tareas desde cero.

Saluditos! ...... ...
(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)


Título: 566777
Publicado por: hxcbps en 23 Mayo 2013, 01:14 am
portafolium 123n

5668
124560


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 23 Mayo 2013, 12:10 pm
:-)

Vamos a ver si me aclaro con lo que has hecho.

* Declaras una función como bool y le pones dos retornos "seguidos". ¿No te das cuenta que al encontrar el primer return la función "devuelve" ese valor y retorna, como su nombre indica, a la función main y por lo tanto nunca pillará el segundo return?. Conclusión, te sobra un return.

* Pero ¿la función llenar realmente tiene que devolver algo?. Lo único que hace es rellenar la matriz y punto y pelota, no devuelve nada, por lo tanto dicha función deberías declararla como void en lugar de bool.

* Ahora viene lo mejor. Llenas la matriz con números aleatorios y para evitar que se repitan haces una cosa muy curiosa. Aplicas lo siguiente:

Código
  1. m[i][j]=
  2. rand() % 100 + 1;
  3. v[i][j]=m[i][j];
  4.  
  5. if(m[i][j]!=v[i][j])
  6.    m[i][j]=rand() % 100 + 1;

* Veamos, en una línea "igualas" v a m y en la siguiente, en el if, te planteas "si"  v es distinto a m hago tal cosa. ¿Pero como van a ser distintos si inmediatamente antes los has igualados?. Para que compruebes que nunca se entra en la condición del if te propongo que sustituyas el if que tienes por este otro:

Código
  1. if(m[i][j]!=v[i][j]){
  2.    cout<<" entro";
  3.    m[i][j]=rand() % 100 + 1;
  4.    }

ejecuta el programa y verás que nunca se imprime "entro", ¡porque nunca se va a cumplir la condición de que son distintos!, los habias igualado previamente.

* Consecuencia de ello es que estas rellenado la matriz "m" con números alatorios de 1 a 1000, y claro, existe la posibilidad de que se repitan, no hay ninguna restricción para que los aleatorios que se generen sean distintos, tan solo por la casualidad o azar puede hacer que los 100 números generados entre los 1000 sean distintos, pero tan sólo sería eso, una casualidad.

* Consecuencia de la consecuencia, además de generar los aleatorios has de "idear" un sistema que te permita no repetir en cada número nuevo que generas el que coincida con los generados anteriormente. Para esto hay varias soluciones, la más inmediata y lógica es ir comparando cada nuevo valor generado con los generados anteriormente. Te lo dejo para que lo intentes. A mí personalmente, en este caso, no me parece muy eficiente ya que al menos hay que hacer 540 comparaciones. Otro método más eficiente, ya que hace "0" comparaciones , aunque coma de entrada más memoria, es llenar un vector con los 1000 números,  y tomar los elementos de la matriz  de ese vector de forma aleatoria. Incluyendo en la cabecera del código las librerías "#include <vector> y #include <algorithm>  " todo esto lo haces incluyendo en tu función llenar lo siguiente:


Código
  1.    int i,j;
  2.    ................
  3.    vector<int> n;
  4.    for ( i=0; i<1000; ++i)n.push_back(i+1);
  5.    random_shuffle ( n.begin(), n.end() );
  6.    for(i=0;i<10;i++)
  7.        for(j=0;j<10;j++)
  8.            m[i][j]=n[(10*i)+(j+1)];
  9.  
  10.    }

* Lo cual nos lleva otra vez a la función llenar y mostrar , ¿para que le pasas como argumentos a i y j, que son variables que no tienen asignados ningunos valores y no "pintan" nada el pasarlos como argumentos?. Sencillamente quitalos y como te puse en el código anterior los declaras como int en la función llenar y mostrar y, de paso, quitalos también de la función main porque ahí, hasta ahora, no hacen nada.

Con lo que te he expuesto ya tienes creada la matriz de 10x10 con números del 1 al 1000 elegidos de forma aleatoria y sin repetir. Ahora te toca "mover pieza" a tí, es decir, intenta implementar la búsqueda del mínimo de la matriz, es muy fácil, una simple comparación con dos for usando tres variable que puedes llamar "minimo",imin,jmin  declaradas como int, al mismo tiempo que declaras a i y j en main si no te quieres complicar la vida, y  a partir de ahí ya te empiezas a plantear realmente el problema de cómo mover la pelotita. También puedes calcular esos valores minimos en la función llenar, pero entonces sí tendrías que pasr a la función llenar esas variables como argumentos y pasarlos por referencia, puesto que sus valores se modificarían de los declarados en la función main, que para no complicarte la vida los inicializas a cero. Pero tal como te veo de "verde", mejor lo haces en la función main. ;)

* Por cierto, no tienes bien aclarado cómo se mueve si la pelotita se encuentra en una casilla donde todas las adyacentes son menores, ¿qué hace en ese caso?. Explícalo mejor, no queda claro en el enunciado que has puesto.

Saluditos!. .....
(http://st.forocoches.com/foro/images/smilies/simba1.gif)

Reeditado.


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: rir3760 en 23 Mayo 2013, 16:53 pm
Si me permiten un comentario (aquí voy de criticon):
* Consecuencia de la consecuencia, además de generar los aleatorios has de "idear" un sistema que te permita no repetir en cada número nuevo que generas el que coincida con los generados anteriormente. [...]

Código
  1. int i, j;
  2.  
  3. // ...
  4.  
  5. vector<int> n;
  6. random_shuffle ( n.begin(), n.end() );
  7. for (i = 0; i < 1000; ++i)
  8.   n.push_back(i+1);
  9. for(i = 0; i < 10; i++)
  10.   for (j = 0; j < 10; j++)
  11.      m[i][j] = n[(10 * i) + (j + 1)];
  12. }

Primero se deben agregar con push_back y solo entonces revolver con random_shuffle. Mas o menos así:
Código
  1. int i, j;
  2.  
  3. // ...
  4.  
  5. vector<int> n;
  6. for (i = 0; i < 1000; ++i)
  7.   n.push_back(i + 1);
  8. random_shuffle(n.begin(), n.end());
  9.  
  10. for (i = 0; i < 10; i++)
  11.   for (j = 0; j < 10; j++)
  12.      m[i][j] = n[i * 10 + j];
  13. }

Un saludo


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 23 Mayo 2013, 18:45 pm
Código
  1. int i, j;
  2.  
  3. // ...
  4.  
  5. vector<int> n;
  6. for (i = 0; i < 1000; ++i)
  7.   n.push_back(i + 1);
  8. random_shuffle(n.begin(), n.end());
  9.  
  10. for (i = 0; i < 10; i++)
  11.   for (j = 0; j < 10; j++)
  12.      m[i][j] = n[i * 10 + j];
  13. }

Un saludo

Gracias por la observación, me disculpa un poco que estoy haciendo los códigos "a pelo", me crujió  CodeBlocks tras una dichosa actualización del WindowsUpdate.

Y para que esta aportación no se quede en unas meras disculpas, propongo el método alternativo de generar los números por comparación con los previamente introducidos, sería para sustituir por lo que hay "encima" de estas palabras:


Código
  1. ........................
  2. for( i = 0; i < 100; i++){
  3.        numeros[i]=rand() % 1000+1;
  4.        for( j = i-1; j >=0 ; j--){
  5.            if(numeros[i] == numeros[j]){
  6.                i--;
  7.                break;
  8.            }
  9.        }
  10.    }
  11.    cout<<endl;   cout<<endl;
  12.    for(i=0;i<10;i++){
  13.        for(j=0;j<10;j++){
  14.            p[i][j]=numeros[k++];
  15.            cout<<m[i][j]<<"  ";
  16.            }
  17.        cout<<endl;
  18.    }
  19.  

Aunque seguro que se puede mejorar, la verdad no me termina de convencer el for con el if y el i-- con break, pero funciona, digo simplemente que alguien más curtido en C/C++ seguramente lo podrá mejorar. Y yo estoy deseoso que sea así, ¿coges la indirecta amigo rir?

Saluditos!. .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: CCross en 23 Mayo 2013, 21:44 pm
Hey, que tal me estaba aburriendo y decidi a hacer este programita  ;D genera
numeros aleatorios y los guarda en una matriz y implemento una funcion que comprueba
si el numero es repetido. Creo que le puede servir a hxcbps ahora estoy trabajando
en la version de punteros jejep.

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. bool repite(int n, int _matriz[10][10])
  8. {
  9.    for(int i=0; i<10; i++)
  10.       for(int j=0; j<10; j++)
  11.        if(n == _matriz[i][j])return true;
  12.          return false;
  13. }
  14. int main()
  15. {
  16.    srand(time(NULL));
  17.    int matriz[10][10] = {0}, n;
  18.  
  19.    for(int i=0; i<10; i++)
  20.        for(int j=0; j<10; j++){
  21.            do
  22.               n = 1+ rand() % 100;
  23.            while(repite(n, matriz));
  24.               matriz[i][j] = n;
  25.               cout << matriz[i][j] << "  ";
  26.        }
  27.    cin.get();
  28.    return 0;
  29. }

Saludos.


Título: simul null d
Publicado por: hxcbps en 23 Mayo 2013, 22:11 pm
3453454
3455345






Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: mr.blood en 24 Mayo 2013, 08:35 am
Dejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. int main()
  7. {
  8. srand(time(NULL));
  9. int matriz[10][10], i, j, x, y;
  10.  
  11. memset(matriz, 0, sizeof(int)*100);
  12.  
  13. for(i=0;i<100;i++)
  14. {
  15. x=rand()%10;
  16. y=rand()%10;
  17. if(matriz[x][y]==0)
  18. {
  19. matriz[x][y]=i;
  20. }
  21. else
  22. {
  23. i--;
  24. continue;
  25. }
  26.  
  27. }
  28.  
  29. for(i=0;i<10;i++)
  30. {
  31. putchar('\n');
  32. for(j=0;j<10;j++)
  33. printf("%i\t", matriz[i][j]);
  34. }
  35.  
  36. return 0;
  37. }
  38.  

EDITO:
El tiempo baja de 0.007s a 0.003s (a veces es 0.004 y el máximo son 0.005 pero los habitual es 0.003) casi la mitad ;). Creo que aun se puede mejorar el código.

Añado otro código que hace que casi hasta el 80 se rellene del tirón, creo que puede hacerse sin tanto if, pero no tengo más tiempo hoy. Este código comprueba si las celdas cercanas están en 0 para no tener que repetir el ciclo tantas veces. Creo que aún se puede hacer en menos ciclos del for. Ahora usará unos 129.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. int main()
  7. {
  8. srand(time(NULL));
  9. int matriz[10][10], i, j, x, y;
  10.  
  11. memset(matriz, 0, sizeof(int)*100);
  12.  
  13. for(i=0;i<100;i++)
  14. {
  15. printf("%i\n", i);
  16. x=rand()%10;
  17. y=rand()%10;
  18. if(matriz[x][y]==0)
  19. {
  20. matriz[x][y]=i;
  21. }
  22. else
  23. {
  24. if(matriz[x][y+1]==0 && y+1<10)
  25. {
  26. matriz[x][y+1]=i;
  27. continue;
  28. }
  29. if(matriz[x][y-1]==0 && y-1>=0)
  30. {
  31. matriz[x][y-1]=i;
  32. continue;
  33. }
  34. if(matriz[x-1][y]==0 && x-1>=0)
  35. {
  36. matriz[x-1][y]=i;
  37. continue;
  38. }
  39. if(matriz[x-1][y-1]==0 && x-1>=0 && y-1>=0)
  40. {
  41. matriz[x-1][y-1]=i;
  42. continue;
  43. }
  44. if(matriz[x-1][y+1]==0 && x-1>=0 && y+1<10)
  45. {
  46. matriz[x-1][y+1]=i;
  47. continue;
  48. }
  49. if(matriz[x+1][y]==0 && x+1<10)
  50. {
  51. matriz[x+1][y]=i;
  52. continue;
  53. }
  54. if(matriz[x+1][y-1]==0 && x+1<10 && y-1>=0)
  55. {
  56. matriz[x+1][y-1]=i;
  57. continue;
  58. }
  59. if(matriz[x+1][y+1]==0 && x+1<10 && y+1<10)
  60. {
  61. matriz[x+1][y+1]=i;
  62. continue;
  63. }
  64. i--;
  65. continue;
  66. }
  67.  
  68. }
  69.  
  70. for(i=0;i<10;i++)
  71. {
  72. putchar('\n');
  73. for(j=0;j<10;j++)
  74. printf("%i\t", matriz[i][j]);
  75. }
  76.  
  77. return 0;
  78. }
  79.  

Sa1uDoS


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 24 Mayo 2013, 09:56 am
Dejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

...................................

Sa1uDoS

El problema es que los 100 números que necesita son entre 0 y 1000.

Lástima porque la idea era buena.
  
Lamentablemente no tengo compilador en este momento y no puedo comparar, pero creo que siguiendo lo que planteaste de obtener aleatorios de 0 a 100, aunque recuerda que en realidad era "entre" 0 y 10000, el siguiente código podría ser de eficiencia/velocidad semejante.:

Código
  1. #include <iostream>    
  2. #include <algorithm>    
  3. #include <vector>      
  4. #include <ctime>        
  5. #include <cstdlib>
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.    int i,j,k=0;
  11.    int m[10][10],numeros[100];
  12.    srand ( unsigned ( std::time(0) ) );
  13.    vector<int> n;
  14.    for ( i=0; i<100; ++i)n.push_back(i+1);
  15.    random_shuffle ( n.begin(), n.end() );
  16.    for(i=0;i<10;i++,k++) {
  17.        for(j=0;j<10;j++,k++){
  18.            m[i][j]=n[k];
  19.        cout<<m[i][j]<<"\t";
  20.        }
  21.        k--;
  22.        cout<<endl;
  23.    }  
  24.    system("pause") ;
  25.    return 0;
  26. }
  27.  


Aunque para realizar comparaciones de "potencia de cálculo" habría que suprimir la impresión de la matriz al completo y poner un sólo puts, o printf o cout que indique el final del proceso ya que si no el resultado de tiempos estará "muy" influenciado por la tarjeta gráfica, me refiero a la hora de comparar resultados entre distintas máquinas con procesador parecido.

Por aportar algo diferente pongo este código con un do-while  que, a diferencia del for, no tiene que restar (i--) por lo que se presupone algo mas eficiente.Es un decir porque cambia el i++ por una comparación.  Pero al hablar de eficiencia tendríamos que comparar con matrices muy superiores en dimensión para que fueran perceptibles esas diferencias. Pero bueno, como ejercicio no rstá mal lo que est´s dsliendo de este tema.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main()
  6. {
  7. srand(time(NULL));
  8. int matriz[10][10]={0}, i=0, j,x,y;
  9. do{
  10. x=rand()%10;
  11. y=rand()%10;
  12. if (matriz[x][y]==0){
  13.            matriz[x][y]=i;
  14.            i++;
  15.  
  16. }
  17.  
  18. }while (i<100);
  19.  
  20. for(i=0;i<10;i++)
  21. {
  22. putchar('\n');
  23. for(j=0;j<10;j++)
  24. printf("%i\t", matriz[i][j]);
  25. }
  26.    return 0;
  27. }
  28.  

Por otro lado sería interesante  comparar realizando el cálculo con varios hilos a ver la influencia del multiproceso/multiCPU, suponiendo que el compilador está preparado para hacer uso de los multinúcleos.

Y en el segundo código hay que empezar por el valor menor de los generados aleatoriamente, que habrá que saber cuál es, así como su posición inicial, para a partir de la misma empezar el movimiento. Eso daría como resultado sólo cuatro comparaciones en cada posición a realizar por comodidad con una función, ya que en cada movimiento hay que volver a comparar.

En definitiva, has  animado este post, aunque, repito, te salieras del guión.

Saluditos!. ... ..[/size]

(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/rey-leon-lion-king_zps1794c70a.jpg)

P.D: Esta noche cuelgo el código con los valores tomados de 1 a 1000 "sin hacer comparaciones".


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: mr.blood en 24 Mayo 2013, 10:37 am
Leí:
la matriz debe contener 100 numeros positivos entre 1 y 100
Pero no ví:
Construir un programa que genere una matriz 10x10 esta debe ingresar numeros entre 1 y 1000 positivos aleatoriamente sin repetir numero (hasta aqui ya construi el programa)dentro de la matriz la pelota debe recorrer la matriz de la siguiente forma:

El segundo código que planteas ronda los 0.012s (máximo los 0.015s). Si haces las pruebas en el mismo PC la gráfica será la misma para todos los códigos, para bien o para mal.

Quitando los cout y los printf mi código anda sobre los 0.002s y el tuyo sobre los 0.006s ;).

Esta tarde intentaré arreglarlo para que funcione con más cifras ;).

Sa1uDoS


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 24 Mayo 2013, 10:49 am

Leí:Pero no ví:
...................................................
Esta tarde intentaré arreglarlo para que funcione con más cifras ;).

Quedo a la espera de noticias, reconozco que para lo que querías, generar aleatorios entre 0 y 100 la idea es buena  ;-) ;-), pero al tener que elegir entre 0 y mil la cosa cambia. ¿Probastes el código como el tuyo pero con el do-while?. porque si comparastes con el post dode tomo los números de 0 a 1000 es lógico que el tiempo sea superior, ha de realizar comparaciones no siendo así en el que usa la clase vector. .....Esto de estar sin compilador un par de días me tiene hablado solo  :P

Saluditos!. .... ..


(http://www.t411.me/images/avatar/vanleeuw.gif)


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 25 Mayo 2013, 22:08 pm
.............................................................................................
Quitando los cout y los printf mi código anda sobre los 0.002s y el tuyo sobre los 0.006s ;).

Esta tarde intentaré arreglarlo para que funcione con más cifras;).


Tienes un "maquinón" para que te den esas cifras, o bien yo dejo de tener abiertas a la vez treinta páginas, mínimo, música y cuatro o cinco programas a la vez. ::)

Me picó la curiosidad e hice una comparativa de tiempos sin impresión, del puro y duro cálculo. Y estos son los resultados:

* Con tu código del if y matriz de 10x10 tomando sólo 100:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiempomatriz_if_zpsc0441bba.jpg)

* Con el do-while del mío:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiempomatriz_do_zpseb13d458.jpg)

* Con la función de CCross:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiempomatriz_F_zps0b108cbb.jpg)

* Con la función de CCross pero declarada como inline:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiempomatriz_inline_zpsa0843cb0.jpg)

* Con mi do-while pero tomando aleatorios entre 1000:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiempomatriz_zps2a97370f.jpg)


Aquí me paro para un pequeño comentario.

La verdad es que la igualdad entre tu if y mi do-while es un resultado esperado pero lo que me sorprendió fue que con la función de CCross se obtenga un valor similar, teniendo en cuenta que hace uso de una llamada a la función para cada uno de los 100 valores aleatorios que se necesitan, Y más aún que con la función inline se obtenga el mismo valor que ella, ya que se presupone que al declararla como tal sustituye, si el compilador lo considera, las llamadas a la función por código dando como resultado un .exe mayor a costa de ganar en velocidad. ¿Qué ha pasado para que los valores obtenidos con el código con función, tanto con inline como sin ella, salgan tan igualados a los presumiblemente "más eficientes" códigos del if y del do-while'?.

Creo que la respuesta está aquí:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tamantildeo_zps471075f8.jpg)

Se observa que los eficientes códigos if y do-while tienen tamaño considerablemente más pequeños que los códigos con función, es decir  "creo" que ha sustituido las llamadas a la función en el código "aún en el caso de no declararla como inline", con lo que compensa tamaño con velocidad !!!!.

Supongo que el aburrimiento y la curiosidad por saber qué pasa me han llevado a todo lo anterior.
:laugh:

Y para que no se diga, a continuación un ligero avance del problema que le propusieron a hxcbps y que ha originado todo este rollo. Pero antes "una imagen coloreada"de la salida del código que viene después:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/matriz1000_zps117fc8cb.jpg)

Código
  1. /*generar una matriz de 10x10 con números
  2. no repetidos entre 1 y 10000 indicando
  3. el minimo y .............*/
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <windows.h>
  9.  
  10. int color (int n);
  11.  
  12. int main()
  13. {
  14.        srand(time(NULL));
  15. int n,matriz[10][10]={0}, i=rand()%9+1, j=0, x, y,minimo=10001,i_min=0,j_min=0;
  16. /***************  CALCULO  ***********/
  17. do{
  18.  
  19. x=rand()%10;
  20. y=rand()%10;
  21. if(matriz[x][y]==0 ){
  22.            matriz[x][y]=i;
  23.            if (i<minimo)
  24.            {
  25.                minimo=i;
  26.                i_min=x;
  27.                j_min=y;
  28.            }
  29.          i+=rand()%18+1;
  30.            j++;
  31.        }
  32. }while (j<100);
  33. /***************  IMPRESION CON COLOR  ***********/
  34. for(i=0;i<10;i++)
  35. {
  36.        putchar('\n');
  37. for(j=0;j<10;j++)
  38.        {
  39.            if (i==i_min && j==j_min)
  40.                n=228;
  41.            else
  42.                n=113;
  43.            color (n);
  44.            printf(" %i ", matriz[i][j]);
  45.            color (7);
  46.            printf("\t");
  47.        }
  48. }
  49.    color (96);
  50.    printf("\n\nminimo = %d en la posicion ",minimo);
  51.    color (228);
  52.    printf(" (%d,%d) \n",i_min+1,j_min+1);
  53.    color (7);
  54.    return 0;
  55. }
  56. int color (int n)
  57. {
  58.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  59. }
  60.  

En este código "ya" se rellena la matriz de 10x10 con aleatorios entre 1 y 1000, así como se calcula el mínimo y su posición para que el amigo hxcbps pueda continuar con el resto de la tarea que me trae sin cuidado. En realidad lo que me ha resultado interesante es el cómo rellenar la dichosa matriz con números del 1 al 1000. Si alquien encuentra un método alternativo mejor, please comunicarlo pero tener en cuenta que lo he hecho sin realizar ninguna comparación.

Saluditos!. .... ..


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: mr.blood en 25 Mayo 2013, 23:19 pm
Maquinón? Uso archlinux con LXDE sobre un Acer TravelMate 291. (Pentium M a 1.4Ghz)

Las pruebas de tiempos se hacen siempre sin nada más ejecutándose ;).

Sa1uDoS


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 26 Mayo 2013, 00:51 am
Maquinón? Uso archlinux con LXDE sobre un Acer TravelMate 291. (Pentium M a 1.4Ghz)

Las pruebas de tiempos se hacen siempre sin nada más ejecutándose ;).

Sa1uDoS

 ;-) ;-) ;-)

Lo siento pero soy una persona altamente HiperActiva, si no estoy en diez cosas a la vez me aburroo ...... ;) ;) ;)

Por cierto, ¿te gusto la solución para elegir 100 entre 1000 aleatoriamente y sin comparar?
;)

Un fuerte Saludo! .... ..(http://st.forocoches.com/foro/images/smilies/dancer2.gif)


Título: dfgfdfggdf
Publicado por: hxcbps en 26 Mayo 2013, 01:59 am
fdgfgfgdfgdfg


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 26 Mayo 2013, 10:15 am

ammm hay otra cosa leosansan no se porque me jenerra error en la funcion color(n); me dice en mi compilador dev c++
42 C:\Users\BPS\Desktop\matriz1.cpp `color' undeclared (first use this function)

y el otro error es
56 C:\Users\BPS\Desktop\matriz1.cpp `int color(int)' used prior to declaration


Dichosa manía de usar Dev-C++,¡ pásate a Code::Blocks!.

El error es porque hay que incluir justo después de los include la declaración de la función, esta línea en concreto:


Código
  1. int color (int n);

Saluditos!. ... ..
(http://smilies-gifs.com/hola-adios/2hola-adios.gif)



Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: mr.blood en 26 Mayo 2013, 11:25 am
La idea es interesante, pero hay números que pueden salir repetidos. Donde haces i+=rand()%19; puede salir 0 i+=0 es i y se repetiría un número. Mi código no necesita IF's pero esos if le ahorran muchas iteraciones.

Acabo de reducir más el código. En tiempo van parecidos, tarda aprox. 1 s (a veces se va a 2 s) en llenar una matriz de 1000*1000.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #define MAX_X 10
  7.  
  8. #define MAX_Y 10
  9.  
  10. int main()
  11. {
  12. srand(time(NULL));
  13. int matriz[MAX_X][MAX_Y], i, j, x, y, k;
  14.  
  15. memset(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));
  16.  
  17. for(i=0;i<(MAX_X*MAX_Y);)
  18. {
  19. x=rand()%MAX_X;
  20. y=rand()%MAX_Y;
  21. if(matriz[x][y]==-1)
  22. {
  23. matriz[x][y]=i;
  24. i++;
  25. }
  26. else
  27. {
  28. for(k=-1;k<=1;k++)
  29. {
  30. for(j=-1;j<=1;j++)
  31. {
  32. if(matriz[x+k][y+j]==-1 && (x+k>=0 && x+k<MAX_X) && (y+j>=0 && y+j<MAX_Y))
  33. {
  34. matriz[x+k][y+j]=i;
  35. i++;
  36. }
  37. }
  38. }
  39. }
  40.  
  41. }
  42.  
  43. //~ for(i=0;i<MAX_X;i++)
  44. //~ {
  45. //~ putchar('\n');
  46. //~ for(j=0;j<MAX_Y;j++)
  47. //~ printf("%i\t", matriz[i][j]);
  48. //~ }
  49.  
  50. return 0;
  51. }
  52.  



EDITO:

Código:
[mrblood@ACER Codigos]$ time ./numeros

real 0m1.020s
user 0m0.987s
sys 0m0.010s
[mrblood@ACER Codigos]$ time ./numeros

real 0m0.996s
user 0m0.957s
sys 0m0.010s
[mrblood@ACER Codigos]$ time ./numeros

real 0m0.904s
user 0m0.877s
sys 0m0.003s
[mrblood@ACER Codigos]$ time ./numeros

real 0m0.892s
user 0m0.860s
sys 0m0.007s

Sa1uDoS


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 26 Mayo 2013, 12:12 pm
La idea es interesante, pero hay números que pueden salir repetidos. Donde haces i+=rand()%19; puede salir 0 i+=0 es i y se repetiría un número. Mi código no necesita IF's pero esos if le ahorran muchas iteraciones.

Gracias por la observación, se me fue ese gazapo que rectifico con

Código
  1. i+=rand()%18+1;

Me reconocerás que el trozo de mi código que hace el cálculo de los elementos de la matriz:

Código
  1. do{
  2.  
  3. x=rand()%10;
  4. y=rand()%10;
  5. if(matriz[x][y]==0 ){
  6.            matriz[x][y]=i;
  7.          i+=rand()%18+1;
  8.            j++;
  9.        }
  10. }while (j<100);

es cuando menos más "cortito" o fácil que el tuyo,al menos a simple vista y no entro ya en la eficiencia:

Código
  1. for(i=0;i<(MAX_X*MAX_Y);)
  2. {
  3. x=rand()%MAX_X;
  4. y=rand()%MAX_Y;
  5. if(matriz[x][y]==-1)
  6. {
  7. matriz[x][y]=i;
  8. i++;
  9. }
  10. else
  11. {
  12. for(k=-1;k<=1;k++)
  13. {
  14. for(j=-1;j<=1;j++)
  15. {
  16. if(matriz[x+k][y+j]==-1 && (x+k>=0 && x+k<MAX_X) && (y+j>=0 && y+j<MAX_Y))
  17. {
  18. matriz[x+k][y+j]=i;
  19. i++;
  20. }
  21. }
  22. }
  23. }
  24.  
  25. }
  26.  


así me aseguro siempre un incremento de al menos uno y me mantengo entre mil.


No me he fijado bien pero la salida del código que acabas de poner sólo da números entre 1 y 100 en lugar de entre 1 y 1000. Una salida de muestra del código que acabas de poner:

Código
  1. 77      78      74      35      75      65      50      44      60      85
  2.  
  3. 49      79      76      47      71      66      15      41      61      94
  4.  
  5. 80      81      5       45      43      46      62      63      64      88
  6.  
  7. 27      28      29      16      19      20      21      72      73      17
  8.  
  9. 30      6       7       8       22      0       23      83      33      84
  10.  
  11. 31      9       2       10      24      25      26      14      95      96
  12.  
  13. 42      11      12      13      39      40      52      4       34      18
  14.  
  15. 82      36      37      38      51      67      53      3       54      86
  16.  
  17. 98      97      89      32      70      68      55      56      1       87
  18.  
  19. 93      99      90      48      91      69      57      58      59      92
  20.  
  21. Process returned 0 (0x0)   execution time : 0.023 s
  22. Press any key to continue.

Por cierto, ya me dirás que "oscuros motivos"   ;)  te llevan a usar:

Código
  1. memset(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));
  2.  

para inicializar la matriz, en lugar de usar:

Código
  1. int n,matriz[10][10]={0};

Conste que todo esto lo he tomado como un simple ejercicio de ingenio, sin piques ni maldades de por medio. ;-) ;-) ;-)

¡Un fuerte saludo mr.blood! .... ...(http://smilies-gifs.com/hola-adios/2hola-adios.gif)


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: mr.blood en 26 Mayo 2013, 15:30 pm
leosansan planteamos distintos problemas, yo sigo con llenar una matriz con todos los números sin que se repitan.

El código puede resumirse en (dentro del for):
Código
  1. x=rand()%MAX_X;
  2. y=rand()%MAX_Y;
  3. if(matriz[x][y]==-1)
  4. {
  5. matriz[x][y]=i;
  6. i++;
  7. }
  8.  



Tu alternativa para llenar de 0 a 1000 una matriz de 10x10 es muy ingeniosa, como ya dije mi código no hace eso ;).

Tranquilo que no lo tomo a mal, creo que la competencia es lo que nos hace mejorar, si nos conformamos con lo que sabemos o somos, no llegaremos jamás a ser los primeros!.

Sa1uDoS


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: leosansan en 31 Mayo 2013, 09:52 am
error.

El que abrió el tema le cambio el nombre así que decidí continuar la tarea abriendo otro tema con el nombre inicial actualizado simulacion con matriz bidimensional de 10x10 II  (http://foro.elhacker.net/programacion_cc/simulacion_con_matriz_bidimensional_de_10x10_ii-t391362.0.htmll)

Saluditos!. ... ..

(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: portafolium set my name for the example yes I from colombia
Publicado por: rir3760 en 31 Mayo 2013, 18:14 pm
Y para que esta aportación no se quede en unas meras disculpas, propongo el método alternativo de generar los números por comparación con los previamente introducidos, sería para sustituir por lo que hay "encima" de estas palabras:

Código
  1. for( i = 0; i < 100; i++){
  2.   numeros[i]=rand() % 1000+1;
  3.   for( j = i-1; j >=0 ; j--){
  4.      if(numeros[i] == numeros[j]){
  5.         i--;
  6.         break;
  7.      }
  8.   }
  9. }

Aunque seguro que se puede mejorar, la verdad no me termina de convencer el for con el if y el i-- con break
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
Código
  1. #define NUM_ELEM  1000
  2.  
  3. /* ... */
  4.  
  5. int num[NUM_ELEM];
  6. int i;
  7. int j;
  8.  
  9. /* ... */
  10.  
  11. i = 0;
  12. while (i < NUM_ELEM){
  13.   num[i] = rand() % (NUM_ELEM + 1);
  14.  
  15.   for (j = 0; j < i && num[j] != num[i]; j++)
  16.      ;
  17.  
  18.   if (i == j)
  19.      i++;
  20. }

----

Dejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. int main()
  7. {
  8. srand(time(NULL));
  9. int matriz[10][10], i, j, x, y;
  10.  
  11. memset(matriz, 0, sizeof(int)*100);
  12.  
  13. for(i=0;i<100;i++)
  14. {
  15. x=rand()%10;
  16. y=rand()%10;
  17. if(matriz[x][y]==0)
  18. {
  19. matriz[x][y]=i;
  20. }
  21. else
  22. {
  23. i--;
  24. continue;
  25. }
El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

----

Lamentablemente no tengo compilador en este momento y no puedo comparar, pero creo que siguiendo lo que planteaste de obtener aleatorios de 0 a 100, aunque recuerda que en realidad era "entre" 0 y 10000, el siguiente código podría ser de eficiencia/velocidad semejante.:
Código
  1. // ...
  2.  
  3. for (i = 0; i < 10; i++, k++){
  4.   for (j = 0; j < 10; j++, k++){
  5.      m[i][j] = n[k];
  6.      cout << m[i][j] << "\t";
  7.   }
  8.  
  9.   k--;
  10.   cout << endl;
  11. }
No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:
Código
  1. // ...
  2.  
  3. for (i = 0; i < 10; i++){
  4.   for (j = 0; j < 10; j++){
  5.      m[i][j] = n[i * 10 + j];
  6.      cout << m[i][j] << "\t";
  7.   }
  8.  
  9.   cout << endl;
  10. }

Un saludo


Título: Re: simulacion con matriz bidimensional de 10x10
Publicado por: amchacon en 31 Mayo 2013, 20:29 pm
Me picó la curiosidad e hice una comparativa de tiempos sin impresión, del puro y duro cálculo. Y estos son los resultados:
Hay una cosa muy importante ahí: Las flags de optimización

Normalmente suele haber una buena diferencia de tiempos si le metes un -O, -O2. A veces también puede pasar que le metas -O3 y te tarde hasta más... Estuve haciendo pruebas con un programa de fuerza bruta y me di cuenta que el mejor flag es el -O2.

También miré los códigos ensambladores, el compilador hace mucha optimización por su cuenta y a veces diferentes códigos genera salidas idénticas:

Código
  1. while(true);

Se traduce:

Código
  1. L43:
  2. jmp L43

Ahora lo cambiamos a esto:

Código
  1. bool cosa = true;
  2.  
  3. while(cosa);

Se traduce:

Código
  1. L43:
  2. jmp L43

¿Irónico no?


Título: Re: portafolium set my name for the example yes I from colombia
Publicado por: leosansan en 1 Junio 2013, 23:18 pm
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
Código
  1. #define NUM_ELEM  1000
  2.  
  3. /* ... */
  4.  
  5. int num[NUM_ELEM];
  6. int i;
  7. int j;
  8.  
  9. /* ... */
  10.  
  11. i = 0;
  12. while (i < NUM_ELEM){
  13.   num[i] = rand() % (NUM_ELEM + 1);
  14.  
  15.   for (j = 0; j < i && num[j] != num[i]; j++)
  16.      ;
  17.  
  18.   if (i == j)
  19.      i++;
  20. }


Tengo que estar a la fuerza de acuerdo contigo, faltaría más. Pero en realidad estas haciendo lo mismo expresado de otra manera, sustituyes un for por un while y aprovechas el segundo for para meter en él la condición. Vamos, más cortito pero más de lo mismo.

El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

Sin duda vuelvo a estar de acuerdo contigo. Pero, cuando menos es curiosa/original la forma de obtener los elementos de la matriz sin repetir y aunque hace una comparación para ver si está o no repetido, sólo hace uso de un for y un else en lugar de mis dos for o tus dos bucles  while-for. Al César lo que es del César, me gustó la "elegancia/originalidad" de mr.blood de obtener los elmentos de la matriz, más inclusive que tu método. Claro que todo es cuestión de gustos.

No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:

Ya, se me escapó el detallit0 y mira que lo he aplicado ya varias veces. Son las miserias de contestar rapidito en el foro, me recuerda las partidas rápidas de ajedrez donde después de terminarlas te das cuenta de las tonterías que has cometido por culpa de ir contra reloj. Hago propósito de enmienda y tomarme más tiempo en contestar. Aunque pensándolo mejor, eso haría perder cierto encanto a la participación en el foro, al menos para mi punto de vista.

Como siempre, gracias por tus aportaciones/puntos de vista, siempre en la misma línea y me refiero al nivelazo que tienes /aportas al foro.

Un fuerte abrazo amigo rir, espero no te tomes a mal mis poquísimas y levísimas discrepancias.


(http://smilies-gifs.com/hola-adios/2hola-adios.gif)