elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 122
101  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 21:10 pm
El caso, es que cada vez que coges un elemento, se reduce el próximo número máximo del rand() en 1. Si un elemento que escoges, ya ha sido cogido, se va al siguiente, así hasta que no haya sido cogido...
¿Comor?

¿Y si cojo un elemento del principio? ¿No puede adceder a los finales?

Quiero ver una implementación ^^
102  Programación / Programación C/C++ / Re: Problema con remove_if en: 8 Abril 2014, 21:09 pm
Pues revisalo porque he vuelto a copypastear tu código y me lo hace bien :huh:

De hecho, incluso lo he hecho con strings y he comparado salidas. Son identicas:
Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cctype>
  5. #include <string>
  6. using namespace std;
  7.  
  8. class EsBlanco
  9. {
  10. public:
  11.    bool operator() (const char& c) const
  12.    {
  13.        return std::isspace(c);
  14.    }
  15. };
  16.  
  17. int main()
  18. {
  19.    string s = "4539 4512 0398 7356";
  20.    string b = s;
  21.  
  22.    char *letras = new char [s.length() + 1];
  23.    strcpy (letras, s.c_str());
  24.  
  25.    char * inicio = letras;
  26.    char * fin = letras + s.length();
  27.  
  28.    fin = std::remove_if(inicio,fin,EsBlanco()); // metodo por char*
  29.    b = string(s.begin(),std::remove_if(s.begin(),s.end(),EsBlanco())); // metodo por strings
  30.  
  31.    *fin = 0; // caracter nulo
  32.  
  33.    string a = inicio;
  34.  
  35.    if (a == b) cout<<"Funciono!"<<endl;
  36.    else cout<<"No funciono! :("<<endl;
  37.  
  38.    cout<<b<<endl;
  39.    for (char * p = inicio; p != fin; ++p)
  40.        cout  << *p;
  41.    return 0;
  42. }

Ambos metodos me generan la misma salida. No consigo generar tu error...
103  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 20:45 pm
Creo que es obvio que se hace en un array temporal >.>
¿Y después lo vuelves a copiar en el array original? :huh:
104  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 20:41 pm
Para barajar, yo lo que hago es ir cogiendo elementos, e ir colocándolos en un array en posiciones aleatorias.

O lo que es lo mismo, ir cogiendo elementos aleatorios, e ir introduciéndolos en el array.
Así para barajar en un tiempo finito.
Pero estás duplicando el array así... Para eso intercambias y ya esta.

Creo que últimamente menospreciamos la potencia de proceso de nuestros PC.

Como media a mi me tarda menos de 0.020s.

Ya hace un tiempo hubo una discusión acerca de cuánto tiempo se emplearía en rellenar, con el mismo método, una matriz 10x10 con números del 1 al 1000 y andaba por los 0.012s y acabó en este otro tema.

Salu2!.

Por supuesto, pero siempre se busca la máxima eficiencia.

Suponte un servidor de poker con millones de usuarios, dado que tienes que hacer millones de mezclas conviene perder el menor tiempo posible.

Y confiar en el "azar" no suele ser muy buena práctica. Es una buena costumbre garantizar que el algoritmo termine en tiempo finito incluso en el peor caso posible, nos ayudará a evitarnos algunos errores "oscuros".

Como curiosidad de algoritmos basados en el azar, tenemos un algoritmo de ordenación que usa una técnica similar: El bogosort (o stupidsort). Que viene a ser el siguiente:

Dado un conjunto de números desordenados:
     1º Comprobar que esten ordenados, si lo estan termina.
     2º Mezclar los numeros aleatoriamente.

Y aquí una implementación de este algoritmo en C++:

Código
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include <iterator>
  5. using namespace std;
  6.  
  7. void bogo_sort(vector<int>&);
  8.  
  9. int main()
  10. {
  11.    vector<int> Numeros;
  12.    srand(time(NULL));
  13.    int N;
  14.  
  15.    cout<<"Introduzca numero de elementos a ordenar: ";
  16.    cin>>N;
  17.  
  18.    Numeros.resize(N);
  19.  
  20.    for (int i = 0; i < 10;i++) // 10 intentos
  21.    {
  22.        generate(Numeros.begin(),Numeros.end(),rand); // relleno el vector de numeros aleatorios
  23.  
  24.          // Muestra los numeros generados por pantalla:
  25. //        copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
  26.  
  27.        time_t inicio = clock();
  28.  
  29.        bogo_sort(Numeros);
  30.  
  31.        time_t fin = clock();
  32.  
  33.        cout<<(double)(fin-inicio)/(CLOCKS_PER_SEC)<<"s en ordenar "<<N<<" elementos"<<endl;
  34.  
  35.        // muestra los numeros ordenados por pantalla
  36. //        copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
  37.  
  38.       // cout<<endl;
  39.    }
  40.    return 0;
  41. }
  42.  
  43. bool enOrden(vector<int> &x) {return adjacent_find(x.begin(), x.end(), greater<int>()) == x.end();}
  44.  
  45. void bogo_sort(vector<int> &Numeros)
  46. {
  47.    while (!enOrden(Numeros))
  48.    {
  49.        random_shuffle(Numeros.begin(),Numeros.end());
  50.    }
  51. }
  52.  

Dile que genere 10 elementos. A mí los tiempos me salen muy dispares (desde 0,063 hasta 5 segundos). Eso en rangos pequeños, cuanto mayor sea el rango, mayor será la dispersión.

En resumen, trabajar basado en la suerte nos da unos programas muy impredecibles y inestables. A mí personalmente no me gusta nada ;D
105  Programación / Programación C/C++ / Re: Problema con remove_if en: 8 Abril 2014, 18:34 pm
No hace falta crear una clase para eso. Puedes hacerlo en una función directamente (Y para un char no hace falta una referencia):
Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cctype>
  5. #include <string>
  6. using namespace std;
  7.  
  8. bool EsBlanco(const char c)
  9. {
  10.    return std::isspace(c);
  11. }
  12.  
  13. int main()
  14. {
  15.    string s = "4539 4512 0398 7356";
  16.    char *letras = new char [s.length() + 1];
  17.    strcpy (letras, s.c_str());
  18.  
  19.    char * inicio = letras;
  20.    char * fin = letras + s.length();
  21.  
  22.    fin = std::remove_if(inicio,fin,EsBlanco);
  23.  
  24.    for (char * p = inicio; p != fin; ++p)
  25.        cout  << *p;
  26.    return 0;
  27. }
  28.  

En cuanto al error, a mí me imprime el resultado correcto :huh:

De todas formas no entiendo porque usas char*. Con lo facil que sería hacerlo en el mismo string:
Código
  1. string s = "4539 4512 0398 7356";
  2. remove_if(s.begin(),s.end(),EsBlanco);
  3.  
  4. cout<<s<<endl;
106  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 18:20 pm
Tienes razón Rir, que fallo más tonto :-X

De todas formas, no me gusta ese modo de barajar como ya dije. Me parece mas natural de este modo:

1º Te generas el mazo ordenado.
2º Coges dos elementos al azar y los intercambias
3º Repites el paso 2 tantas veces como creas necesario. Para un mazo tienes de sobra con 1000 iteraciones.

De hecho en C++ (que no C) puedes hacer los dos ultimos pasos en un sola función:
http://www.cplusplus.com/reference/algorithm/random_shuffle/
107  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 16:02 pm
Esa funcion da problemas, es muy probable que el mazo generado tenga 2 cartas identicas.

Lo ideal esque generes el mazo ordenado y luego hagas intercambios aleatorios.

En cuanto a la pregunta, el primer corchete es opcional. Puedes ponerlo o no, el segundo corchete es necesario para que el compilador traduzca los dos [][] en uno solo.
108  Programación / Programación C/C++ / Re: [c]Duda con return en funcion en: 8 Abril 2014, 01:02 am
Pues porque en el primer caso, el retorno que has puesto en primo no tiene sentido. Además tampoco lo compruebas ni nada.

Lo ideal esque devuelvas un 1 si es primo y 0 si no lo es. Después lo compruebas con un if y listo:
Código
  1. for(x = 1; x <= 100; x++)
  2.    if (primo(x)) printf("%d\n",x);

Por cierto sobre los numeros primos:
http://foro.elhacker.net/programacion_cc/codigo_para_calcular_los_numeros_primos-t405451.0.html
109  Programación / Programación C/C++ / Re: [C++] Problema con exit(0) en: 7 Abril 2014, 18:41 pm
Eso es porque lo estas probando desde el codeblocks.

Prueba a ejecutar el exe directamente.
110  Programación / Programación C/C++ / Re: Arreglos Ayudaaa! en: 7 Abril 2014, 12:49 pm
Código
  1.  int a[n];
  2.  
  3.      printf("\n");
  4.  
  5.           for(i=0; i<n; i++){
  6.               a=(rand()%(max-min)+min+1);
Aclarate, a es una variable o un arreglo? :huh:

Sobre los numeros primos:
http://foro.elhacker.net/programacion_cc/codigo_para_calcular_los_numeros_primos-t405451.0.html
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 122
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines