Autor
|
Tema: portafolium set my name for the example yes I from colombia (Leído 11,744 veces)
|
mr.blood
Desconectado
Mensajes: 150
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
|
|
« Última modificación: 24 Mayo 2013, 15:37 pm por leosansan »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
............................................................................................. 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. 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:/*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!. .... ..
|
|
« Última modificación: 27 Mayo 2013, 20:54 pm por leosansan »
|
En línea
|
|
|
|
mr.blood
Desconectado
Mensajes: 150
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
|
|
|
En línea
|
|
|
|
hxcbps
Desconectado
Mensajes: 4
|
|
dfgfdfggdf
« Respuesta #15 en: 26 Mayo 2013, 01:59 am » |
|
fdgfgfgdfgdfg
|
|
« Última modificación: 30 Mayo 2013, 19:41 pm por hxcbps »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:int color (int n);
Saluditos!. ... ..
|
|
« Última modificación: 1 Junio 2013, 22:51 pm por leosansan »
|
En línea
|
|
|
|
mr.blood
Desconectado
Mensajes: 150
|
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() { 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);) { 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
|
|
« Última modificación: 26 Mayo 2013, 11:28 am por mr.blood »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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 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: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: 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++; } } } } }
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: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:
memset(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));
para inicializar la matriz, en lugar de usar:
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! .... ...
|
|
« Última modificación: 26 Mayo 2013, 20:17 pm por leosansan »
|
En línea
|
|
|
|
mr.blood
Desconectado
Mensajes: 150
|
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): 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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Oferta de trabajo (Colombia)
Diseño Gráfico
|
[.:: NauJFracT ::.]
|
2
|
2,167
|
25 Agosto 2006, 07:16 am
por [.:: NauJFracT ::.]
|
|
|
Para Colombia
Dudas Generales
|
Delt_hack
|
2
|
3,220
|
13 Agosto 2010, 17:01 pm
por Delt_hack
|
|
|
BD de Colombia con http://emailpremiumcolombia.wix.com/masivo ES UNA ESTAFA
Bases de Datos
|
Graphixx
|
2
|
2,777
|
1 Noviembre 2013, 08:11 am
por #!drvy
|
|
|
trabajar colombia
Foro Libre
|
blackboss2016
|
4
|
2,188
|
20 Abril 2016, 00:06 am
por blackboss2016
|
|
|
Los internautas reaccionan al ‘No’ del plebiscito por la paz en Colombia
Noticias
|
wolfbcn
|
0
|
1,302
|
3 Octubre 2016, 02:13 am
por wolfbcn
|
|