Retos C/C++

Iniciado por [L]ord [R]NA, 19 Agosto 2010, 03:18 AM

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

Wazzp

El codigo que tengo es..

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;
    void datos(int &d,int &mcont,int &a,int &D,int &Mcont,int &A,int &t)
    {
    cout<<"Ingresa una fecha(DD/MM/AAAA. Debe ser la mas antigua!)"<<endl;
    cin>>d>>mcont>>a;
    cout<<"Ingresaste.."<<d<<"/"<<mcont<<"/"<<a<<endl;

    cout<<"Ingresa una segunda fecha. Debe ser la mas reciente."<<endl;
    cin>>D>>Mcont>>A;
    cout<<"Ingresaste.."<<D<<"/"<<Mcont<<"/"<<A<<endl;
    cout<< "Comparar..? 1=si 2=no-quiero cambiar las fechas 3=salir"
   <<endl;
   cin>>t;
    }

    void ABis(int a,int A,int m,int M)
    {
        if ( ( ( a % 4 == 0 ) && (a % 100 != 0 ) ) || ( (a % 400 ==0)))

            m=1;
             else
                m=2;

       if ( ( ( A % 4 == 0 ) &&( A % 100 != 0 ) ) || ( (A % 400 ==0) ) )

           M=1;
            else
                M=2;
    }

    void meses(int m,int mb,int Mb,int M,int mcont,int Mcont)
    {
        if ((mcont==1)||(mcont==3)||(mcont==5)||(mcont==7)||(mcont==8)||(mcont==10)||(mcont==12))
        {
             mb=31;
        }

            else if ((mcont==4)||(mcont==6)||(mcont==9)||(mcont==11))
            {
                mb=30;

        };
    if ((Mcont==1)||(Mcont==3)||(Mcont==5)||(Mcont==7)||(Mcont==8)||(Mcont==10)||(Mcont==12))
        {
            Mb=31;
        }
        else if ((Mcont==4)||(Mcont==6)||(Mcont==9)||(Mcont==11))
        {
            Mb=30;
        };
    if ((m==1)&&(mcont==2))
    {
        mb=29;
        }
        else if((m==2)&&(mcont==2))
        {
            mb=28;
        };

    }

    void calculo(int d,int m,int a,int X,int mcont,int mb,int Mb,int mb1,int A,int M,int Mcont,int R,int Y)
    //Calcularia la cantidad de dias hasta el fin del año
    {
       {
         while (mcont<=12)
         ABis(a,A,m,M);
       meses(m,mb,Mb,M,mcont,Mcont);
     X+=mb;
     mcont++;
     };
     {
          while (Mcont>=1)
          ABis(a,A,m,M);
       meses(m,mb,Mb,M,mcont,Mcont);
     Y+=Mb;
     Mcont--;
     };
     R=(X-Y);
     cout<<"La respuesta seria: "<<R<<" Dias."<<endl;
     }

   int main()
{
   int d=0,a=0,D=0,A=0,t=0;
   int mb=0;int Mb=0;int mcont=0;
   int X=0;int Mcont=0;
   int Y=0;int mb1=0;
   int R=0;int m=0;int M=0;
   datos(d,mcont,a,D,Mcont,A,t);


       switch(t)
       {
            case 1:
            calculo(d,m,a,X,mcont,mb,Mb,mb1,A,M,Mcont,R,Y);
            return 0;
            break;

            case 2:
            cout<<"Revisa las fechas.."<<endl;
            calculo(d,m,a,X,mcont,mb,Mb,mb1,A,M,Mcont,R,Y);
            return 0;
            break;

            default:
            return 0;
            break;
       };
    }


No entiendo porque no funciona!! El codigo compila sin warnings ni errores..

[L]ord [R]NA

Termina el plazo de los 3 dias sin respuesta definitiva... Quien pondra el nuevo reto?

PiroskY

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main()
{
    short d1,m1,a1,d2,m2,a2,acu=0;
    cout << "Ingrese la primer fecha con el siguiente formato DD-MM-AAAA" << endl;
    cout << "Ingrese el dia" << endl;
    cin >> d1;
    cout << "Ingrese el mes" << endl;
    cin >> m1;
    cout << "Ingrese el año" << endl;
    cin >> a1;
    cout << "Ingrese la segunda fecha con el siguiente formato DD-MM-AAAA" << endl;
    cout << "Ingrese el dia" << endl;
    cin >> d2;
    cout << "Ingrese el mes" << endl;
    cin >> m2;
    cout << "Ingrese el año" << endl;
    cin >> a2;
    if (a2-a1 >=1) //dentro de este if voy a hacer la cuenta para los casos en que las dos fechas no pertenezcan al mismo año
    {
        switch (m1)
        {
            case 1:
            acu+=31-d1+334; //Le sumo la cantidad de dias que faltan para que termine el año
            break;
            case 2:
            acu+=28-d1+306;
            break;
            case 3:
            acu+=31-d1+275;
            break;
            case 4:
            acu+=30-d1+245;
            break;
            case 5:
            acu+=31-d1+214;
            break;
            case 6:
            acu+=30-d1+184;
            break;
            case 7:
            acu+=31-d1+153;
            break;
            case 8:
            acu+=31-d1+122;
            break;
            case 9:
            acu+=30-d1+92;
            break;
            case 10:
            acu+=31-d1+61;
            break;
            case 11:
            acu+=30-d1+31;
            break;
            case 12:
            acu+=31-d1;
            break;
        }
        if (a1%4 == 0 && m1 <= 2) //por si el año era biciesto
        {
            acu++;
        }
        for (int i=a1+1;i<a2;i++) //voy sumando todos los dias de año, hasta un año antes del de la segunda fecha
        {
            if (i%4 == 0)
            {
                acu+=366;
            }
            else
            {
                acu+=365;
            }
        }
        switch (m2) //le sumo los dias transcurridos del ultimo año
        {
            case 1:
            acu+=d2;
            break;
            case 2:
            acu+=31+d2;
            break;
            case 3:
            acu+=59+d2;
            break;
            case 4:
            acu+=90+d2;
            break;
            case 5:
            acu+=120+d2;
            break;
            case 6:
            acu+=151+d2;
            break;
            case 7:
            acu+=181+d2;
            break;
            case 8:
            acu+=212+d2;
            break;
            case 9:
            acu+=243+d2;
            break;
            case 10:
            acu+=273+d2;
            break;
            case 11:
            acu+=304+d2;
            break;
            case 12:
            acu+=334+d2;
            break;
        }
         if (a2%4 == 0 && (m2 <= 2 || (m2==2 && d2 == 29))) //por si el ultimo año era biciesto y la fecha era mayor o igual al 29 de febrero
        {
            acu++;
        }
    }
    if (a1==a2)
    {
        switch (m1) //Calculo cuantos dias pasaron desde que empezo el año hasta la primer fecha
        {
            case 1:
            acu=d1;
            break;
            case 2:
            acu=31+d1;
            break;
            case 3:
            acu=59+d1;
            break;
            case 4:
            acu=90+d1;
            break;
            case 5:
            acu=120+d1;
            break;
            case 6:
            acu=151+d1;
            break;
            case 7:
            acu=181+d1;
            break;
            case 8:
            acu=212+d1;
            break;
            case 9:
            acu=243+d1;
            break;
            case 10:
            acu=273+d1;
            break;
            case 11:
            acu=304+d1;
            break;
            case 12:
            acu=334+d1;
            break;
        }
        switch (m2) //Calculo cuantos dias pasaron desde que empezo el año hasta la segunda fecha, y a ese numero le resto el numero obtenido para la primer fecha
        {
            case 1:
            acu=d2-acu;
            break;
            case 2:
            acu=31+d2-acu;
            break;
            case 3:
            acu=59+d2-acu;
            break;
            case 4:
            acu=90+d2-acu;
            break;
            case 5:
            acu=120+d2-acu;
            break;
            case 6:
            acu=151+d2-acu;
            break;
            case 7:
            acu=181+d2-acu;
            break;
            case 8:
            acu=212+d2-acu;
            break;
            case 9:
            acu=243+d2-acu;
            break;
            case 10:
            acu=273+d2-acu;
            break;
            case 11:
            acu=304+d2-acu;
            break;
            case 12:
            acu=334+d2-acu;
            break;
        }
        if (a2%4 == 0 && (m1 <= 2 || (m1==2 && d1 == 29))) //por si el año es biciesto y la fecha es mayor o igual al 29 de febrero
        {
            acu++;
        }
    }
    cout <<"entre el "<<d1<<"/"<<m1<<"/"<<a1<<" y el "<<d2<<"/"<<m2<<"/"<<a2<<" pasaron "<<acu<<" dias."<< endl;
return 0;
}


no se con que dificultad vienen poniendo los retos, pero ya que nadie tira, pongo este, y si es facil bueno, el que lo haga que ponga otro mas complicado

Reto #23: Ingresar dos cadenas e informar si la segunda está contenida o no dentro de la primera.

Komodo

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

using namespace std;
int main ()
{
 char str[99];
 char str2[99];
 cout << "Introduce la primera cadena: ";
 fgets(str, 99, stdin);
 if (str[strlen(str)-1] == '\n'){
str[strlen(str)-1] = '\0';
 }
 cout << "\nIntroduce la segunda cadena: ";
 fgets(str2, 99, stdin);
 if (str2[strlen(str2)-1] == '\n'){
str2[strlen(str2)-1] = '\0';
 }
 if(strstr(str,str2)!=NULL){
     cout<<"Found match: "<<str2;
 }
 else{
  cout<<"Error";
 }

 return 0;
}


RETO: Crear un programa que haga por fuerzabruta una comprobación de una posible pass, la longitud se ha de determinar en el transcurso del programa.


ghastlyX

Si no recuerdo mal, la función strstr realiza la comprovación a lo bestia, es decir, si tenemos una string de n carácteres y queremos buscar en ella otra de m, para cada carácter de la primera mira si los m - 1 siguientes coinciden, quedando así un coste de O(nm).

Por si a alguien le interesa, existen algoritmos más eficientes para realizar esto, que consiguen costes de O(n + m), es decir, lineales sobre la longitud de las strings, como por ejemplo Knuth-Morris-Pratt.

Komodo

Bueno siempre me ha servido para estas pequeñas aplicaciones strstr tampoco creo que sea malo usar strstr, que hayan métodos mejores, pues sseguro..