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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: 1 ... 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [63] 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 ... 122
621  Programación / Programación C/C++ / Re: RETOS C++ en: 3 Octubre 2012, 15:05 pm
SUDOKU (No se el numero de reto...)

Ya esta.

Código
  1. /*
  2.  * Linea de comandos: Nombre programa fichero
  3.  *
  4.  * El fichero debe tener el siguiente formato:
  5.  *  - 9 filas con 9 numeros separados por espacios
  6.  *  - Los numeros que vengan dados en el sudoku se escribiran en la posicion que corresponde
  7.  *  - Las casillas vacias del sudoku se indicaran con ceros
  8.  *  - Todas las filas deben acabar en un salto de linea
  9.  *  - Cuanquier linea que siga a las 9 primeras sera ignorada.
  10.  *
  11.  *
  12.  * Salida: Muestra como mucho 2 soluciones (las suficientes para que el contenido del fichero no sea un sudoku correcto)
  13.  * y sino indica que no hay solucion.
  14.  *
  15.  */
  16.  
  17.  
  18. #include <iostream>
  19. #include <cstdio>
  20. #include <cstring>
  21.  
  22. using namespace std;
  23.  
  24. class Sudoku
  25. {
  26.    public:
  27.        Sudoku();
  28.  
  29.        bool cargar(char *nombrefichero);
  30.        bool solucionar();
  31.        bool solucion_unica();
  32.        inline bool esta_solucionado(){return solucionado;};
  33.  
  34.        friend ostream& operator <<(ostream &out,Sudoku &s);
  35.  
  36.    private:
  37.  
  38.        bool correcto(int fila, int columna, int valor);
  39.        bool resolver(int fila, int columna);
  40.        bool multiples_soluciones(int fila, int columna);
  41.  
  42.        int tabla[9][9];
  43.        bool solucionado;
  44. };
  45.  
  46. Sudoku::Sudoku()
  47. {
  48.    for(int i = 0 ; i < 81 ; i++)
  49.        tabla[i / 9][i % 9] = 0;
  50.  
  51.    solucionado = false;
  52. }
  53.  
  54. bool Sudoku::cargar(char *nombrefichero)
  55. {
  56.    int i;
  57.    char fila[19]; //los 9 numeros + 8 espacios + 1 salto de linea + '\0';
  58.    FILE *f;
  59.  
  60.    if(!(f = fopen(nombrefichero,"r")))
  61.        return false;
  62.  
  63.    for(i = 0 ; i < 9 ; i++)
  64.    {
  65.        fgets(fila,19,f);
  66.  
  67.        if(strlen(fila) < 18 || fila[strlen(fila) - 1] != '\n') //formato incorrecto
  68.        {
  69.            for(int j = 0 ; j < i ; i++) //anulamos la lectura que habia hasta el momento
  70.                memset(tabla[j] , 0 , 9 * sizeof(int));
  71.  
  72.            fclose(f);
  73.  
  74.            return false;
  75.        }
  76.  
  77.        for(int j = 0 ; j < 9 ; j++)
  78.        {
  79.            if(fila[2 * i] < '0' || fila[2 * i] > '9')//Si las posiciones pares no son un numero
  80.            {
  81.                for(int k = 0 ; k < i ; k++) //anulamos la lectura que habia hasta el momento
  82.                    memset(tabla[k],0,9*sizeof(int));
  83.  
  84.                fclose(f);
  85.  
  86.                return false;
  87.            }
  88.  
  89.            if(fila[2 * i + 1] != ' ' && fila[2 * i + 1] != '\n')//Si las posiciones impares no son ni espacio ni \n
  90.            {
  91.                for(int k = 0 ; k < i ; k++) //anulamos la lectura que habia hasta el momento
  92.                    memset(tabla[k],0,9*sizeof(int));
  93.  
  94.                fclose(f);
  95.  
  96.                return false;
  97.            }
  98.        }
  99.  
  100.        //traducimos la fila para el algoritmo
  101.        for(int j = 0 ; j < 9 ; j++)
  102.            tabla[i][j] = fila[2 * j] - '0';
  103.    }
  104.  
  105.    fclose(f);
  106.  
  107.    return true;
  108. }
  109.  
  110. bool Sudoku::solucionar()
  111. {
  112.    return resolver(0,0);
  113. }
  114.  
  115. bool Sudoku::solucion_unica()
  116. {
  117.    return !multiples_soluciones(0,0);
  118. }
  119.  
  120. bool Sudoku::correcto(int fila, int columna, int valor)
  121. {
  122.    for(int i = 0 ; i < 9 ; i++)
  123.    {
  124.        if(tabla[i][columna] == valor)
  125.            return false;
  126.  
  127.        if(tabla[fila][i] == valor)
  128.            return false;
  129.  
  130.        if(tabla[3 * (fila / 3) + i / 3][3 * (columna / 3) + i % 3] == valor)
  131.            return false;
  132.    }
  133.  
  134.    return true;
  135. }
  136.  
  137. bool Sudoku::resolver(int fila, int columna)
  138. {
  139.    if(fila == 9)
  140.    {
  141.        solucionado = true;
  142.        return true;
  143.    }
  144.  
  145.    if(tabla[fila][columna] != 0) //Si tenemos un numero original
  146.    {
  147.        if(resolver((9 * fila + columna + 1) / 9, (9 * fila + columna + 1) % 9)) //pasamos a resolver la siguiente posicion
  148.            return true;
  149.    }
  150.    else
  151.    {
  152.        //probamos cada uno de los numeros
  153.        for(int i = 1 ; i <= 9 ; i++)
  154.        {
  155.            if(correcto(fila,columna,i)) //Si es corrector en la posicion dada
  156.            {
  157.                tabla[fila][columna] = i; //Marcamos la casilla con el numero
  158.  
  159.                //Y pasamos a resolver la siguiente posicion
  160.                if(resolver((9 * fila + columna + 1) / 9, (9 * fila + columna + 1) % 9))
  161.                    return true;
  162.            }
  163.        }
  164.  
  165.        tabla[fila][columna] = 0; //Volvemos a dejar vacia la posicion actual
  166.    }
  167.  
  168.    return false;
  169. }
  170.  
  171. bool Sudoku::multiples_soluciones(int fila, int columna)
  172. {
  173.    if(fila == 9)
  174.    {
  175.        if(!solucionado)
  176.        {
  177.            cout << *this << endl;
  178.            solucionado = true;
  179.            return false;
  180.        }
  181.        cout << *this << endl;
  182.        return true;
  183.    }
  184.  
  185.    if(tabla[fila][columna] != 0) //Si tenemos un numero original
  186.    {
  187.        if(multiples_soluciones((9 * fila + columna + 1) / 9, (9 * fila + columna + 1) % 9)) //pasamos a resolver la siguiente posicion
  188.            return true;
  189.    }
  190.    else
  191.    {
  192.        //probamos cada uno de los numeros
  193.        for(int i = 1 ; i <= 9 ; i++)
  194.        {
  195.            if(correcto(fila,columna,i)) //Si es corrector en la posicion dada
  196.            {
  197.                tabla[fila][columna] = i; //Marcamos la casilla con el numero
  198.  
  199.                //Y pasamos a resolver la siguiente posicion
  200.                if(multiples_soluciones((9 * fila + columna + 1) / 9, (9 * fila + columna + 1) % 9))
  201.                    return true;
  202.            }
  203.        }
  204.  
  205.        tabla[fila][columna] = 0; //Volvemos a dejar vacia la posicion actual
  206.    }
  207.  
  208.    return false;
  209. }
  210.  
  211. ostream& operator <<(ostream &out,Sudoku &s)
  212. {
  213.    for(int i = 0 ; i < 9 ; i++)
  214.    {
  215.        if(!(i % 3))
  216.            out << endl;
  217.  
  218.        for(int j = 0 ; j < 9 ; j++)
  219.        {
  220.            if(!(j % 3))
  221.                out << ' ';
  222.  
  223.            out << s.tabla[i][j] << ' ';
  224.        }
  225.  
  226.        out << endl;
  227.    }
  228.  
  229.    return out;
  230. }
  231.  
  232. int main(int argc, char *argv[])
  233. {
  234.    Sudoku sudoku;
  235.  
  236.    if(argc != 2)
  237.    {
  238.        cout << argv[0] << " fichero";
  239.        return -1;
  240.    }
  241.  
  242.    if(!sudoku.cargar(argv[1]))
  243.    {
  244.        cout << "Error en carga de fichero." << endl;
  245.        return -1;
  246.    }
  247.  
  248.    if(sudoku.solucion_unica() && sudoku.esta_solucionado())
  249.    {
  250.        cout << "El sudoku tiene una unica solucion:" << endl;
  251.    }
  252.    else if(sudoku.esta_solucionado())
  253.        cout << "El fichero no contiene un sudoku correcto. Tiene mas de una solucion." << endl;
  254.    else
  255.        cout << "El sudoku no tiene solucion." << endl;
  256.  
  257.    return 0;
  258. }
  259.  
622  Programación / Programación C/C++ / Re: Duda con juego que genera numeros aleatorios en: 30 Septiembre 2012, 11:47 am
¡Buenas!

rand() te genera una sucesion de numeros pseudoaleatorios. Es decir, si la llamas sin haber llamado a srand() siempre te generara la misma secuencia de numeros.

srand() hace que esa secuencia empiece por otro numero de la sucesion. Por lo tanto, si a srand le pasas una constante, la secuencia de numeros que genera rand() sera distina (en principio) de la que genera sin haber llamado a srand, pero al haber inicializado srand la secuencia que generara rand a un valor constante (fijo), seguiran repitiendose los mismos valores en las mismas posiciones.

Para evitar que la sucesion de numeros aleatorios sea siempre la misma, puedes utilizar como semilla un valor mas o menos aleatorio, como por ejemplo el valor devuelto pot la funcion time (que se encuentra en time.h o ctime), con parametro NULL, que devuelve el numero de segundos que han pasado desde 1900 (o algun otro año, no lo se) hasta el momento en el que se ejecuta el programa. Asi, cada vez que ejecutes el programa este valor sera diferente, y por lo tanto la sucesion que generara rand() tambien sera distinta.

¡Saludos!
623  Programación / Programación C/C++ / Re: RETOS C++ en: 29 Septiembre 2012, 23:33 pm
12.
Código
  1. //linea de comandos nombreprograma numero
  2. //salida: un rombo de 2 * n - 1 lineas
  3.  
  4. #include <cstdio>
  5.  
  6. using namespace std;
  7.  
  8. unsigned int absoluto(int x)
  9. {
  10.    return (x < 0 ? -x : x);
  11. }
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15.    int n;
  16.  
  17.    if(argc != 2)
  18.    {
  19.        printf("%s numero\n",argv[0]);
  20.        return -1;
  21.    }
  22.  
  23.    for(int i = 0 ; argv[1][i] ; i++)
  24.        if(argv[1][i] < '0' || argv[1][i] > '9')
  25.        {
  26.            printf("%s numero\n",argv[0]);
  27.            return -1;
  28.        }
  29.  
  30.    sscanf(argv[1],"%d",&n);
  31.  
  32.    for(int i = 0 ; i < 2 * n - 1 ; i++)
  33.    {
  34.        printf("%*s",absoluto(n - (i + 1)) + 1, " ");
  35.  
  36.        for(int j = 0 ; j < 2 * (n - 1 - (absoluto(n - 1 - i))) + 1 ; j++)
  37.            printf("*");
  38.  
  39.        printf("\n");
  40.    }
  41.  
  42.    return 0;
  43. }
  44.  

PD: He corregido el de las fechas, que habia un gran error.

¡Saludos!

EI: juntando mensajes.

ami no me salta ningun error pero no me habre ningun archivo ya probe de crear un archivo con ese nombre y camiar el nombre pero no muestra el texto del documento

El problema dice leer el contenido de un archivo. No que haya que mostrarlo por pantalla.
624  Programación / Programación C/C++ / Re: RETOS C++ en: 29 Septiembre 2012, 22:03 pm
11. Lo he probado y me funciona. De todas formas no he probado todos los casos (es imposible, o me lo parece a mi). Si encontrais algun error en el codigo u os falla para alguna fecha avisad.

¡Saludos!

¡Ah! No he puesto muchos comentarios. Ahora repaso el codigo y añado los comentarios que crea que faltan para que el codigo sea claro o seguible.

¡Saludos!

Código
  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. #define bisiesto(X) (((!((X) % 4)) && ((X) % 100)) || ((!((X) % 100)) && (!((X) % 400))))
  5.  
  6. using namespace std;
  7.  
  8. class Fecha
  9. {
  10.    public:
  11.        Fecha();
  12.        Fecha(int dia, int mes, int año);
  13.        Fecha(const Fecha &original);
  14.  
  15.        bool set(int dia, int mes, int año);
  16.        bool setD(int dia);
  17.        bool setM(int mes);
  18.        bool setA(int año);
  19.  
  20.        int getD() const;
  21.        int getM() const;
  22.        int getA() const;
  23.  
  24.        //calcula la diferencia en dias entre la fehca mayo y la menor
  25.        friend unsigned long dif(Fecha &f1, Fecha &f2);
  26.  
  27.        //compara fechas -1 si la primera es menor 0 si son iguales y 1 si la segunda es mayor
  28.        friend int cmp(Fecha &f1, Fecha &f2);
  29.  
  30.    private:
  31.  
  32.        //calcula los dias hasta el año cero (si año < 0) o desde el año cero (si año >= 0)
  33.        long int dias() const;
  34.  
  35.        int dia;
  36.        int mes;
  37.        int año;
  38. };
  39.  
  40. Fecha::Fecha()
  41. {
  42.    //struct proporcionado por ctime para manejar fechas
  43.    struct tm *fecha;
  44.  
  45.    //tipo de dato definido en ctime para manejar fechas
  46.    time_t t;
  47.  
  48.    t = time(NULL);
  49.  
  50.    fecha = localtime(&t);
  51.  
  52.    dia = fecha->tm_mday;
  53.    mes = fecha->tm_mon + 1; //0 <= tm_mon <= 11
  54.    año = fecha->tm_year + 1900; //tm_year es medido desde 1900
  55. }
  56.  
  57. Fecha::Fecha(int d, int m, int a)
  58. {
  59.    int dias[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  60.  
  61.    año = a;
  62.  
  63.    if(m < 1 || m > 12)
  64.        m = 1;
  65.  
  66.    if(m == 2)
  67.    {
  68.        if(d > 29)
  69.            d = 1;
  70.        if(d == 29 && !bisiesto(año))
  71.            d = 1;
  72.    }
  73.    else
  74.        if(d > dias[m - 1])
  75.            d = 1;
  76.  
  77.    mes = m;
  78.    dia = d;
  79. }
  80.  
  81. Fecha::Fecha(const Fecha &original)
  82. {
  83.    this->dia = original.dia;
  84.    this->mes = original.mes;
  85.    this->año = original.año;
  86. }
  87.  
  88. bool Fecha::set(int d, int m, int a)
  89. {
  90.    //copia miembro a miembro (no hay problemas ya que no hay punteros)
  91.    *this = Fecha(d,m,a);
  92.  
  93.    return true;
  94. }
  95.  
  96. bool Fecha::setD(int d)
  97. {
  98.    int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  99.  
  100.    if(d < 1)
  101.        return false;
  102.  
  103.    if(mes == 2)
  104.    {
  105.        if(d > 29)
  106.            return false;
  107.  
  108.        if(d == 29 && !bisiesto(año))
  109.            return false;
  110.    }
  111.    else
  112.        if(d > diasmes[mes - 1])
  113.            return false;
  114.  
  115.    dia = d;
  116.  
  117.    return true;
  118. }
  119.  
  120. bool Fecha::setM(int m)
  121. {
  122.    int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  123.  
  124.    if(m < 1 || m > 12)
  125.        return false;
  126.  
  127.    if(m == 2)
  128.    {
  129.        if(dia > 29)
  130.            return false;
  131.  
  132.        if(dia == 29 && !bisiesto(año))
  133.            return false;
  134.    }
  135.    else
  136.        if(dia > diasmes[m - 1])
  137.            return false;
  138.  
  139.    mes = m;
  140.  
  141.    return true;
  142. }
  143.  
  144. bool Fecha::setA(int a)
  145. {
  146.    if(mes == 2 && dia == 29 && !bisiesto(a))
  147.        return false;
  148.  
  149.    año = a;
  150.  
  151.    return true;
  152. }
  153.  
  154. int Fecha::getD() const
  155. {
  156.    return dia;
  157. }
  158.  
  159. int Fecha::getM() const
  160. {
  161.    return mes;
  162. }
  163.  
  164. int Fecha::getA() const
  165. {
  166.    return año;
  167. }
  168.  
  169. unsigned long dif(Fecha &f1, Fecha &f2)
  170. {
  171.    //si la primera fecha es menor devolvemos la diferencia evaluada en orden inverso
  172.    if(cmp(f1,f2) < 0)
  173.        return dif(f2,f1);
  174.  
  175.    return f1.dias() - f2.dias();
  176. }
  177.  
  178. long int Fecha::dias() const
  179. {
  180.    int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  181.    unsigned long ndias = 0;
  182.  
  183.    //pasamos la fecha a dias desde el año cero o hasta el año cero:
  184.    ndias = 365 * año;
  185.  
  186.    for(int i = 0 ; i < mes ; i++)
  187.        ndias += diasmes[i];
  188.  
  189.    ndias += dia;
  190.  
  191.    //arreglamos los bisiestos:
  192.    if(año < 0)
  193.    {
  194.        if(mes > 2 || (mes == 2 && dia == 29))
  195.        {
  196.            for(int i = año + 1 ; i < 0 ; i++)
  197.                if(bisiesto(i))
  198.                    ndias++;
  199.        }
  200.        else
  201.        {
  202.            for(int i = año ; i < 0 ; i++)
  203.                if(bisiesto(i))
  204.                    ndias++;
  205.        }
  206.    }
  207.    else
  208.    {
  209.        if(mes > 2)
  210.        {
  211.            for(int i = año ; i >= 0 ; i--)
  212.                if(bisiesto(i))
  213.                    ndias++;
  214.        }
  215.        else
  216.        {
  217.            for(int i = año - 1 ; i >= 0 ; i--)
  218.                if(bisiesto(i))
  219.                    ndias++;
  220.        }
  221.    }
  222.  
  223.    return ndias;
  224. }
  225.  
  226. int cmp(Fecha &f1,Fecha &f2)
  227. {
  228.    if(f1.año < f2.año)
  229.        return -1;
  230.  
  231.    if(f1.año > f2.año)
  232.        return 1;
  233.  
  234.    if(f1.mes < f2.mes)
  235.        return -1;
  236.  
  237.    if(f1.mes > f2.mes)
  238.        return 1;
  239.  
  240.    if(f1.dia < f2.dia)
  241.        return -1;
  242.  
  243.    if(f1.dia > f2.dia)
  244.        return 1;
  245.  
  246.    return 0;
  247. }
  248.  
  249. void leer_datos_cumpleanios(Fecha &cumpleanios)
  250. {
  251.    int dia,mes,año;
  252.  
  253.    //ponemos el dia a uno para evitar errores estableciendo el mes
  254.    cumpleanios.setD(1);
  255.  
  256.    cout << "Introducir a" << (char)164 << "o de nacimiento: ";
  257.    cin >> año;
  258.  
  259.    //si el primer caracter no es numerico no se leeran datos y cin dara error
  260.    while(cin.fail())
  261.    {
  262.        //reseteamos los flags de cin
  263.        cin.clear();
  264.  
  265.        //y terminamos de leer los datos de la entrada
  266.        while(cin.get() != '\n');
  267.  
  268.        cout << "Introducir a" << (char)164 << "o de nacimiento: ";
  269.        cin >> año;
  270.    }
  271.  
  272.    //terminamos de leer los datos de la entrada
  273.    while(cin.get() != '\n');
  274.  
  275.    cumpleanios.setA(año);
  276.  
  277.    do{
  278.        cout << "Introducir mes de nacimiento (1 - 12): ";
  279.        cin >> mes;
  280.  
  281.        while(cin.fail())
  282.        {
  283.            cin.clear();
  284.  
  285.            while(cin.get() != '\n');
  286.  
  287.            cout << "Introducir mes de nacimiento (1 - 12): ";
  288.            cin >> mes;
  289.        }
  290.  
  291.        while(cin.get() != '\n');
  292.  
  293.    }while(!cumpleanios.setM(mes));
  294.  
  295.    do{
  296.        cout << "Introducir dia de nacimiento: ";
  297.        cin >> dia;
  298.  
  299.        while(cin.fail())
  300.        {
  301.            cin.clear();
  302.  
  303.            while(cin.get() != '\n');
  304.  
  305.            cout << "Introducir dia de nacimiento: ";
  306.            cin >> dia;
  307.        }
  308.  
  309.        while(cin.get() != '\n');
  310.  
  311.    }while(!cumpleanios.setD(dia));
  312. }
  313.  
  314. //se trata de ajustar los datos de la fecha de nacimiento al siguiente cumpleaños
  315. void ajustar_datos_cumpleanios(Fecha &cumpleanios)
  316. {
  317.    Fecha actual;
  318.  
  319.    //si el mes del cumpleaños es menor que el actual, hay que pasar al año siguiente
  320.    if(cumpleanios.getM() < actual.getM())
  321.    {
  322.        if(cumpleanios.getM() == 2 && cumpleanios.getD() == 29 && !bisiesto(actual.getA() + 1))
  323.        {
  324.            cumpleanios.set(1,3,actual.getA() + 1);
  325.        }
  326.        else
  327.        {
  328.            cumpleanios.setA(actual.getA() + 1);
  329.        }
  330.    }
  331.    if(cumpleanios.getM() == actual.getM())
  332.    {
  333.        //Si el mes del cumpleaños es el mismo que el actual y el dia es menor que el actual, hay que pasar al año siguiente
  334.        if(cumpleanios.getD() < actual.getD()) //no hay problemas con bisiestos
  335.            cumpleanios.setA(actual.getA() + 1);
  336.        else //en otro caso aun no se ha superado la fecha de cumpleaños en el año actual
  337.            cumpleanios.setA(actual.getA());
  338.  
  339.    }
  340.    else//en otro caso aun no se ha superado la fecha de cumpleaños en el año actual
  341.        cumpleanios.setA(actual.getA());
  342.  
  343. }
  344.  
  345. int main(int argc, char *argv[])
  346. {
  347.    int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  348.    Fecha actual,cumpleanios;
  349.    unsigned long diferencia;
  350.  
  351.    leer_datos_cumpleanios(cumpleanios);
  352.    ajustar_datos_cumpleanios(cumpleanios);
  353.  
  354.    diferencia = dif(actual,cumpleanios);
  355.  
  356.    cout << "Faltan " ;
  357.  
  358.    int contador = 0;
  359.  
  360.    //vamos contando los meses considerando que pasa un mes al pasar tantos dias como tenga el mes que consideramos
  361.    //ej: de enero a febrero 1 mes es que pasen 31 dias, de febrero a marzo 28 ...
  362.    for(int i = actual.getM() - 1 ; diferencia >= diasmes[i % 12] ; i++)
  363.    {
  364.        diferencia -= diasmes[i % 12];
  365.        contador++;
  366.    }
  367.  
  368.    cout << contador << " meses, " << (diferencia / 7) << " semanas y " << (diferencia % 7) \
  369.    << " dias para tu cumplea" << (char)164 << "os." << endl;
  370.  
  371.    cout << endl;
  372.    cout << "ACLARACION RECUENTO MESES:" << endl;
  373.    cout << "De enero a febrero un mes son 31 dias" << endl;
  374.    cout << "De febrero a marzo un mes son 28 dias" << endl;
  375.    cout << "De marzo a abril un mes son 31 dias" << endl;
  376.    cout << "De abril a mayo un mes son 30 dias" << endl;
  377.    cout << "..." << endl;
  378.  
  379.    return 0;
  380. }
  381.  
625  Programación / Programación C/C++ / Re: RETOS C++ en: 26 Septiembre 2012, 15:08 pm
1. b.
Código
  1. //Linea de comandos: nombre programa cadena.
  2. //Salida: Numero de caracteres.
  3.  
  4. #include <iostream>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.    if(argc != 2)
  12.    {
  13.        cerr << argv[0] << " cadena";
  14.        return -1;
  15.    }
  16.  
  17.    cout << string(argv[1]).length();
  18.  
  19.    return 0;
  20. }
  21.  

10.
Código
  1. // Llinea de comandos: programa cadena
  2. // Salida: La cadena invertida
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.    if(argc != 2)
  11.    {
  12.        cerr << argv[0] << " cadena" << endl;
  13.        return -1;
  14.    }
  15.  
  16.    if(!(*argv[1]))
  17.        return 0;
  18.  
  19.    argv[1]++;
  20.  
  21.    main(argc,argv);
  22.  
  23.    cout << *(--argv[1]);
  24.  
  25.    return 0;
  26. }
  27.  
626  Programación / Programación C/C++ / Re: RETOS C++ en: 24 Septiembre 2012, 21:44 pm
¡Buenas!

¿En el de las espirales que hay que hacer? ¿Calcular el numero de espirales? ¿Dibujarlas? Si es lo ultimo, ¿Que criterio hay que seguir para dibujarlas? ¿Cuantas hay que dibujar? ¿Una? ¿Todas las que se pueda?

¡Saludos!
627  Programación / Programación C/C++ / Re: RETOS C++ en: 21 Septiembre 2012, 17:59 pm
8.

El crackeador de MD5. Compilado utilizando g++ funciona (probad con cadenas cortas y con minusculas). Supongo que podria fallar con otros compiladores o versiones de g++ distintas de la que tengo, a fin de cuentas no deja de ser un popurri de unos cuantos codigos que tenia hechos anteriormente. Mi version de g++ considera unsigned long de 32 bits y unsigned long long de 64. Tampoco se si funcionara en todos los casos, lo que si puedo asegurar es que con cadenas cortas y de minusculas funciona...

Código
  1. /*
  2.  * Linea de comandos:
  3.  *      nombreprograma hash
  4.  * Salida: Cadena cuyo hash MD5 es el que se ha recibido
  5.  *
  6.  *
  7.  * Dada una cadena MD5 devuelve una cadena de digitos hexadecimales de 32 bytes
  8.  *
  9.  *
  10.  * Considerando como conjunto de salida las cadenas de digitos hexadecimales de 32 bytes,
  11.  * MD5 sera por lo tanto suprayectiva y tendra que existir al menos una cadena de 32 bytes
  12.  * hexadecimales cuya imagen sea el valor que recibimos como parametro.
  13.  *
  14.  */
  15.  
  16. #include <cstdio>
  17. #include <cstdlib>
  18. #include <cstring>
  19. #include <string>
  20. #include <iostream>
  21.  
  22. using namespace std;
  23.  
  24. #ifndef ULL_MAX
  25.    #define ULL_MAX 0xFFFFFFFFFFFFFFFFULL
  26. #endif
  27. /*
  28.  *
  29.  * Calcula el MD5 del input y devuelve una cadena dinamica que lo contiene.
  30.  *
  31.  */
  32.  
  33. char* md5(char *input, unsigned long  long len);
  34.  
  35. /* Ajusta la cadena a una longitud multiplo de 512 - 64 bits y añade la longitud en 64 bits */
  36. unsigned long long md5_ajustar_datos(char **datos, unsigned long  long len);
  37.  
  38. unsigned long md5_extraer_submensaje(char *m , unsigned long sub , unsigned long bloque);
  39.  
  40. unsigned long md5FF(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t);
  41. unsigned long md5GG(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t);
  42. unsigned long md5HH(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t);
  43. unsigned long md5II(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t);
  44.  
  45. #define MD5_LONGITUD 32
  46.  
  47. #define md5_extraer_submensaje(m , sub , bloque) (((unsigned long*)(m))[(bloque) * 16 + (sub)])
  48.  
  49. #define md5F(X,Y,Z)(((X) & (Y)) | ((~(X)) & (Z)))
  50. #define md5G(X,Y,Z)(((X) & (Z)) | ((Y) & (~(Z))))
  51. #define md5H(X,Y,Z)((X) ^ (Y) ^ (Z))
  52. #define md5I(X,Y,Z)((Y) ^ ((X) | (~(Z))))
  53.  
  54. char* md5(char *input, unsigned long long len)
  55. {
  56.    unsigned long reg[4], aux_reg[4], bloque = 0, i, j;
  57.    unsigned long long longitud;
  58.    char *aux;
  59.  
  60.    if(!(aux = (char*) malloc(len * sizeof(char))))
  61.        return NULL;
  62.  
  63.    memmove(aux , input , len * sizeof(char));
  64.  
  65.    if(!(longitud = md5_ajustar_datos(&aux , len)))
  66.    {
  67.        free(aux);
  68.        return NULL;
  69.    }
  70.  
  71.    reg[0] = 0x67452301UL;
  72.    reg[1] = 0xEFCDAB89UL;
  73.    reg[2] = 0x98BADCFEUL;
  74.    reg[3] = 0x10325476UL;
  75.  
  76.    /* mientras haya bloques de 64 bytes (512 bits) */
  77.    while(longitud)
  78.    {
  79.        for(i = 0 ; i < 4 ; i++)
  80.            aux_reg[i] = reg[i];
  81.  
  82.        md5FF( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,0,bloque) ,7LU ,3614090360LU);
  83.        md5FF( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,1,bloque) ,12LU ,3905402710LU);
  84.        md5FF( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,2,bloque) ,17LU ,606105819LU);
  85.        md5FF( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,3,bloque) ,22LU ,3250441966LU);
  86.        md5FF( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,4,bloque) ,7LU ,4118548399LU);
  87.        md5FF( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,5,bloque) ,12LU ,1200080426LU);
  88.        md5FF( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,6,bloque) ,17LU ,2821735955LU);
  89.        md5FF( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,7,bloque) ,22LU ,4249261313LU);
  90.        md5FF( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,8,bloque) ,7LU ,1770035416LU);
  91.        md5FF( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,9,bloque) ,12LU ,2336552879LU);
  92.        md5FF( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,10,bloque) ,17LU ,4294925233LU);
  93.        md5FF( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,11,bloque) ,22LU ,2304563134LU);
  94.        md5FF( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,12,bloque) ,7LU ,1804603682LU);
  95.        md5FF( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,13,bloque) ,12LU ,4254626195LU);
  96.        md5FF( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,14,bloque) ,17LU ,2792965006LU);
  97.        md5FF( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,15,bloque) ,22LU ,1236535329LU);
  98.  
  99.        md5GG( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,1,bloque) ,5LU ,4129170786LU);
  100.        md5GG( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,6,bloque) ,9LU ,3225465664LU);
  101.        md5GG( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,11,bloque) ,14LU ,643717713LU);
  102.        md5GG( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,0,bloque) ,20LU ,3921069994LU);
  103.        md5GG( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,5,bloque) ,5LU ,3593408605LU);
  104.        md5GG( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,10,bloque) ,9LU ,38016083LU);
  105.        md5GG( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,15,bloque) ,14LU ,3634488961LU);
  106.        md5GG( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,4,bloque) ,20LU ,3889429448LU);
  107.        md5GG( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,9,bloque) ,5LU ,568446438LU);
  108.        md5GG( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,14,bloque) ,9LU ,3275163606LU);
  109.        md5GG( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,3,bloque) ,14LU ,4107603335LU);
  110.        md5GG( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,8,bloque) ,20LU ,1163531501LU);
  111.        md5GG( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,13,bloque) ,5LU ,2850285829LU);
  112.        md5GG( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,2,bloque) ,9LU ,4243563512LU);
  113.        md5GG( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,7,bloque) ,14LU ,1735328473LU);
  114.        md5GG( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,12,bloque) ,20LU ,2368359562LU);
  115.  
  116.        md5HH( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,5,bloque) ,4LU ,4294588738LU);
  117.        md5HH( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,8,bloque) ,11LU ,2272392833LU);
  118.        md5HH( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,11,bloque) ,16LU ,1839030562LU);
  119.        md5HH( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,14,bloque) ,23LU ,4259657740LU);
  120.        md5HH( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,1,bloque) ,4LU ,2763975236LU);
  121.        md5HH( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,4,bloque) ,11LU ,1272893353LU);
  122.        md5HH( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,7,bloque) ,16LU ,4139469664LU);
  123.        md5HH( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,10,bloque) ,23LU ,3200236656LU);
  124.        md5HH( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,13,bloque) ,4LU ,681279174LU);
  125.        md5HH( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,0,bloque) ,11LU ,3936430074LU);
  126.        md5HH( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,3,bloque) ,16LU ,3572445317LU);
  127.        md5HH( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,6,bloque) ,23LU ,76029189LU);
  128.        md5HH( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,9,bloque) ,4LU ,3654602809LU);
  129.        md5HH( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,12,bloque) ,11LU ,3873151461LU);
  130.        md5HH( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,15,bloque) ,16LU ,530742520LU);
  131.        md5HH( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,2,bloque) ,23LU ,3299628645LU);
  132.  
  133.        md5II( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,0,bloque) ,6LU ,4096336452LU);
  134.        md5II( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,7,bloque) ,10LU ,1126891415LU);
  135.        md5II( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,14,bloque) ,15LU ,2878612391LU);
  136.        md5II( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,5,bloque) ,21LU ,4237533241LU);
  137.        md5II( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,12,bloque) ,6LU ,1700485571LU);
  138.        md5II( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,3,bloque) ,10LU ,2399980690LU);
  139.        md5II( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,10,bloque) ,15LU ,4293915773LU);
  140.        md5II( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,1,bloque) ,21LU ,2240044497LU);
  141.        md5II( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,8,bloque) ,6LU ,1873313359LU);
  142.        md5II( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,15,bloque) ,10LU ,4264355552LU);
  143.        md5II( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,6,bloque) ,15LU ,2734768916LU);
  144.        md5II( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,13,bloque) ,21LU ,1309151649LU);
  145.        md5II( &aux_reg[0], aux_reg[1], aux_reg[2], aux_reg[3], md5_extraer_submensaje(aux,4,bloque) ,6LU ,4149444226LU);
  146.        md5II( &aux_reg[3], aux_reg[0], aux_reg[1], aux_reg[2], md5_extraer_submensaje(aux,11,bloque) ,10LU ,3174756917LU);
  147.        md5II( &aux_reg[2], aux_reg[3], aux_reg[0], aux_reg[1], md5_extraer_submensaje(aux,2,bloque) ,15LU ,718787259LU);
  148.        md5II( &aux_reg[1], aux_reg[2], aux_reg[3], aux_reg[0], md5_extraer_submensaje(aux,9,bloque) ,21LU ,3951481745LU);
  149.  
  150.  
  151.        for(i = 0 ; i < 4 ; i++)
  152.            reg[i] += aux_reg[i];
  153.  
  154.        bloque++;
  155.        longitud -= 64; /* descontamos un bloque de 64 bytes, 512 bits */
  156.    }
  157.  
  158.    free(aux);
  159.  
  160.    if(!(aux = (char*) malloc(33 * sizeof(char))))
  161.        return NULL;
  162.  
  163.    aux[0] = '\0';
  164.  
  165.    for(i = 0 ; i < 4 ; i++)
  166.        for(j = 0 ; j < 4 ; j++)
  167.            sprintf(aux,"%s%02X",aux,(unsigned char)((char*)&(reg[i]))[j]);
  168.  
  169.    return aux;
  170. }
  171.  
  172. unsigned long long md5_ajustar_datos(char **datos, unsigned long long len)
  173. {
  174.    unsigned long long new_len;
  175.    char *aux;
  176.    int c = 0;
  177.  
  178.    /* si longitud en bits es mayor que ULL_MAX */
  179.    if(len > ULL_MAX / 8)
  180.        return 0; /* devolvemos falso */
  181.  
  182.    if(64 - (len % 64) > 8)
  183.    {
  184.        if(ULL_MAX - (64 - (len % 64)) >= len)
  185.            new_len = len + (64 - (len % 64));
  186.        else
  187.            return 0;
  188.    }
  189.    else
  190.    {
  191.        if(ULL_MAX - 64 - (64 - (len % 64)) >= len)
  192.            new_len = len + 64 + (64 - (len % 64));
  193.        else
  194.            return 0;
  195.    }
  196.  
  197.    if(!(aux = (char*) realloc(*datos , new_len * sizeof(char))))
  198.        return 0;
  199.  
  200.    (*datos) = aux;
  201.  
  202.    c = 1 << 7;
  203.  
  204.    memset((*datos) + len , c , sizeof(char));
  205.    memset((*datos) + len + 1 , 0 , (new_len - len - 1) * sizeof(char));
  206.  
  207.    /* pasamos la longitud de bytes a bits */
  208.    len *= 8;
  209.  
  210.    memcpy((*datos) + new_len - 8 , &len , 8 * sizeof(char));
  211.  
  212.    return new_len;
  213. }
  214.  
  215. unsigned long md5FF(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t)
  216. {
  217.    unsigned long aux;
  218.  
  219.    aux = (*a + md5F(b, c, d) + m + t);
  220.  
  221.    *a = b + ((aux << s) | (aux >> (32 - s)));
  222.  
  223.    return *a;
  224. }
  225.  
  226. unsigned long md5GG(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t)
  227. {
  228.    unsigned long aux;
  229.  
  230.    aux = (*a + md5G(b, c, d) + m + t);
  231.  
  232.    *a = b + ((aux << s) | (aux >> (32 - s)));
  233.  
  234.    return *a;
  235. }
  236.  
  237. unsigned long md5HH(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t)
  238. {
  239.    unsigned long aux;
  240.  
  241.    aux = (*a + md5H(b, c, d) + m + t);
  242.  
  243.    *a = b + ((aux << s) | (aux >> (32 - s)));
  244.  
  245.    return *a;
  246. }
  247.  
  248. unsigned long md5II(unsigned long *a,unsigned long b,unsigned long c,unsigned long d,unsigned long m,unsigned long s,unsigned long t)
  249. {
  250.    unsigned long aux;
  251.  
  252.    aux = (*a + md5I(b, c, d) + m + t);
  253.  
  254.    *a = b + ((aux << s) | (aux >> (32 - s)));
  255.  
  256.    return *a;
  257. }
  258.  
  259.  
  260. int MD5_bruteforce(string MD5,unsigned long longitud)
  261. {
  262.    static string cadena;
  263.    static unsigned long posicion = 0;
  264.    static char* alfabeto = "abcdefghijklmnopqrstuvwxyz"; //con este alfabeto abarcamos el espacio imagen en menos iteraciones
  265.  
  266.    if(posicion == longitud)
  267.    {
  268.        //si hemos llegado a la ultima posicion almacenamos la variacion
  269.        if(string(md5((char*)cadena.c_str(), cadena.length())) == MD5)
  270.        {
  271.            cout << cadena;
  272.            return 1;
  273.        }
  274.  
  275.        return 0;
  276.    }
  277.  
  278.    //si es la primera llamada damos la longitud deseada a la cadena
  279.    if(posicion == 0)
  280.        cadena.resize(longitud);
  281.  
  282.    //para cada uno de los caracteres del alfabeto
  283.    for(int i = 0 ; alfabeto[i] ; i++)
  284.    {
  285.        cadena[posicion] = alfabeto[i]; //asignamos a la posicion correspondiente el caracter del alfabeto.
  286.  
  287.        //avanzamos una posicion
  288.        posicion++;
  289.  
  290.        //y calculamos el siguiente caracter
  291.        if(MD5_bruteforce(MD5,longitud))
  292.        {
  293.            posicion = 0;
  294.            cadena.resize(0);
  295.            return 1;
  296.        }
  297.  
  298.        //volvemos a la posicion original
  299.        posicion--;
  300.    }
  301.  
  302.    //posicion termina a cero para la siguiente llamada
  303.    if(!posicion)
  304.        cadena.resize(0);
  305.  
  306.    return 0;
  307. }
  308.  
  309. int main(int argc, char *argv[])
  310. {
  311.    string MD5;
  312.  
  313.    if(argc != 2)
  314.    {
  315.        cout << argv[0] << " MD5_hash" << endl;
  316.        return -1;
  317.    }
  318.  
  319.    if(strlen(argv[1]) != 32)
  320.    {
  321.        cout << argv[0] << " MD5_hash" << endl;
  322.        return -1;
  323.    }
  324.  
  325.    for(int i = 0 ; i < 32 ; i++)
  326.    {
  327.        argv[1][i] = toupper(argv[1][i]);
  328.  
  329.        if(!((argv[1][i] >= '0' && argv[1][i] <= '9') || (argv[1][i]>= 'A' && argv[1][i]<='Z')))
  330.        {
  331.            cout << argv[0] << " MD5_hash" << endl;
  332.            return -1;
  333.        }
  334.    }
  335.  
  336.    MD5 = argv[1];
  337.  
  338.  
  339.    if(string(md5("",0)) != MD5)
  340.    {
  341.        for(int i = 1 ; i < 32 ; i++)
  342.            if(MD5_bruteforce(MD5,i))
  343.                break;
  344.    }
  345.    else
  346.        cout <<"Cadena vacia" << endl;
  347.  
  348.    return 0;
  349. }
  350.  
628  Programación / Programación C/C++ / Re: RETOS C++ en: 21 Septiembre 2012, 17:04 pm
¡Buenas!

¿A que te refieres con un crackeador de MD5? ¿A redibir como argumento un hash y generar una cadena que de el mismo hash?
629  Programación / Programación C/C++ / Re: RETOS C++ en: 21 Septiembre 2012, 16:48 pm
¡Buenas!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.    FILE *f;
  7.    char *contenido;
  8.    unsigned long longitud;
  9.  
  10.    f=fopen("algunfichero","rb");
  11.  
  12.    fseek(f,0,SEEK_END);
  13.  
  14.    if(!(contenido = (char*) malloc(longitud = ftell(f))))
  15.        return -1;
  16.  
  17.    fseek(f,0,SEEK_SET);
  18.  
  19.    fread(contenido,longitud,1,f);
  20.  
  21.    fclose(f);
  22.  
  23.    free(contenido);
  24.  
  25.    return 0;
  26. }
  27.  

Prueba ahora, que en C++ me parece que no se puede asignar un punter void a un puntero no void. Obliga a hacer el cast.

¡Saludos!
630  Foros Generales / Noticias / Re: La corrupción salpica a Wikipedia en: 21 Septiembre 2012, 16:37 pm
¿Qué corrupción y que *****?

Dan un producto gratuito, no venden datos a terceros y no ponen publicidad. De algún lado tienen que pagar todo el servicio de calidad que nos ofrecen gratis.

Sin duda la cosa es quejarse, pero bien que los periodistas hacen copy&paste.

+1
Páginas: 1 ... 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [63] 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 ... 122
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines