portafolium set my name for the example yes I from colombia

Iniciado por hxcbps, 22 Mayo 2013, 15:01 PM

0 Miembros y 3 Visitantes están viendo este tema.

mr.blood

Leí:
Cita de: hxcbps en 22 Mayo 2013, 15:01 PM
la matriz debe contener 100 numeros positivos entre 1 y 100
Pero no ví:
Cita de: hxcbps en 23 Mayo 2013, 01:14 AM
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

leosansan

#11
Cita de: mr.blood en 24 Mayo 2013, 10:37 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!. .... ..



leosansan

#12
Cita de: mr.blood en 24 Mayo 2013, 10:37 AM
.............................................................................................
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:



* Con el do-while del mío:



* Con la función de CCross:



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



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




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í:



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:



Código (cpp) [Seleccionar]

/*generar una matriz de 10x10 con números
no repetidos entre 1 y 10000 indicando
el minimo y .............*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int color (int n);

int main()
{
       srand(time(NULL));
int n,matriz[10][10]={0}, i=rand()%9+1, j=0, x, y,minimo=10001,i_min=0,j_min=0;
/***************  CALCULO  ***********/
do{

x=rand()%10;
y=rand()%10;
if(matriz[x][y]==0 ){
           matriz[x][y]=i;
           if (i<minimo)
           {
               minimo=i;
               i_min=x;
               j_min=y;
           }
         i+=rand()%18+1;
           j++;
       }
}while (j<100);
/***************  IMPRESION CON COLOR  ***********/
for(i=0;i<10;i++)
{
       putchar('\n');
for(j=0;j<10;j++)
       {
           if (i==i_min && j==j_min)
               n=228;
           else
               n=113;
           color (n);
           printf(" %i ", matriz[i][j]);
           color (7);
           printf("\t");
       }
}
   color (96);
   printf("\n\nminimo = %d en la posicion ",minimo);
   color (228);
   printf(" (%d,%d) \n",i_min+1,j_min+1);
   color (7);
   return 0;
}
int color (int n)
{
       SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
}


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!. .... ..



mr.blood

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

leosansan

Cita de: 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

;-) ;-) ;-)

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! .... ..

hxcbps

#15
fdgfgfgdfgdfg

leosansan

#16
Cita de: hxcbps en 26 Mayo 2013, 01:59 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 (cpp) [Seleccionar]
int color (int n);

Saluditos!. ... ..



mr.blood

#17
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.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_X 10

#define MAX_Y 10

int main()
{
srand(time(NULL));
int matriz[MAX_X][MAX_Y], i, j, x, y, k;

memset(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));

for(i=0;i<(MAX_X*MAX_Y);)
{
x=rand()%MAX_X;
y=rand()%MAX_Y;
if(matriz[x][y]==-1)
{
matriz[x][y]=i;
i++;
}
else
{
for(k=-1;k<=1;k++)
{
for(j=-1;j<=1;j++)
{
if(matriz[x+k][y+j]==-1 && (x+k>=0 && x+k<MAX_X) && (y+j>=0 && y+j<MAX_Y))
{
matriz[x+k][y+j]=i;
i++;
}
}
}
}

}

//~ for(i=0;i<MAX_X;i++)
//~ {
//~ putchar('\n');
//~ for(j=0;j<MAX_Y;j++)
//~ printf("%i\t", matriz[i][j]);
//~ }

return 0;
}





EDITO:

[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

leosansan

#18
Cita de: 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.

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

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
do{

x=rand()%10;
y=rand()%10;
if(matriz[x][y]==0 ){
           matriz[x][y]=i;
         i+=rand()%18+1;
           j++;
       }
}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 (cpp) [Seleccionar]
for(i=0;i<(MAX_X*MAX_Y);)
{
x=rand()%MAX_X;
y=rand()%MAX_Y;
if(matriz[x][y]==-1)
{
matriz[x][y]=i;
i++;
}
else
{
for(k=-1;k<=1;k++)
{
for(j=-1;j<=1;j++)
{
if(matriz[x+k][y+j]==-1 && (x+k>=0 && x+k<MAX_X) && (y+j>=0 && y+j<MAX_Y))
{
matriz[x+k][y+j]=i;
i++;
}
}
}
}

}


Cita de: mr.blood en 26 Mayo 2013, 11:25 AM

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 (cpp) [Seleccionar]

77      78      74      35      75      65      50      44      60      85

49      79      76      47      71      66      15      41      61      94

80      81      5       45      43      46      62      63      64      88

27      28      29      16      19      20      21      72      73      17

30      6       7       8       22      0       23      83      33      84

31      9       2       10      24      25      26      14      95      96

42      11      12      13      39      40      52      4       34      18

82      36      37      38      51      67      53      3       54      86

98      97      89      32      70      68      55      56      1       87

93      99      90      48      91      69      57      58      59      92

Process returned 0 (0x0)   execution time : 0.023 s
Press any key to continue.


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

Código (cpp) [Seleccionar]
memset(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));


para inicializar la matriz, en lugar de usar:

Código (cpp) [Seleccionar]
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! .... ...

mr.blood

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):

x=rand()%MAX_X;
y=rand()%MAX_Y;
if(matriz[x][y]==-1)
{
matriz[x][y]=i;
i++;
}





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