Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kutcher

#11
Cita de: LauraD en  9 Septiembre 2014, 02:19 AM
pero en el momento en el que pase todo a orientada al momento de ejecutar me muestra errores..

La función Proceso la puedes simplificar bastante no hay necesidad de complicarse por algo tan simple :

Código (cpp) [Seleccionar]
void Decimal::Proceso(void)
{
    for(i = 0; num; i++)
    {
        res = num % 2;
        vec[i] = res;
        num = num / 2;
    }
}


Y con la función Imprimir de igual manera :

Código (cpp) [Seleccionar]
void Decimal::Imprimir(void)
{
    cout << "El numero " << num << " en binario es: ";
    for (j = i - 1; j >= 0; j--)
       cout << vec[j];
}


Saludos kutcher
#12
Cita de: Eternal Idol en  5 Septiembre 2014, 19:06 PM
No, como te decia esta en la sección de datos, es como una variable global. Si usaras un array de caracteres definido en la funcion entonces si seria una variable local, estaria en la pila y al salir de la funcion estaria fuera de su ambito.

Si efectivamente tiene ámbito global lo he comprobado con este código:

Código (cpp) [Seleccionar]
#include<stdio.h>

char *func2(int condicion)
{
    if ((unsigned) condicion >= 15)
        return 0;
    return "A\0B\0C\0D\0E\0";
}

int main(void)
{
    int i;
    char *p =  func2(0);

    for (i = 0; p[i] != '\0'; i += 2)
       printf("%c ", *(p + i));

    return 0;
}


Muchas gracias por toda la ayuda  ;-)

Saludos kutcher
#13
Cita de: Eternal Idol en  5 Septiembre 2014, 02:01 AM
Si, un conjunto de bytes, con el cero terminador es una cadena.

En un ejecutable hay secciones, por lo general .text para el codigo binario, .data para las variables globales (donde estaran estas cadenas) y .rdata para constantes.

Solo una ultima consulta mas; como ya sabemos func2 retorna una dirección de memoria que correspondería a una cadena local de func2 pero si al salir de tal función se perdería la referencia a ella

Saludos
#14
Cita de: Eternal Idol en  4 Septiembre 2014, 20:43 PM
Si claro, por eso su tipo de retorno es char *; si tambien, todos los bytes de esas cadenas estan en la sección de datos (tanto en func1 como en func2).

Ya entonces esto seria lo mas parecido a un array de caracteres aunque no la hayamos declarado como tal, en cuanto a tu comentario: los bytes de esas cadenas están en la sección de datos no comprendo como va esto..

Saludos
#15
Cita de: Eternal Idol en  4 Septiembre 2014, 20:19 PM
cadena_base es un puntero a char * que apunta en realidad a varias cadenas.

@Eternal Idol: Entonces tu dices que func2 retorna la dirección de la cadena solicitada :

Código (cpp) [Seleccionar]
"EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0"

Acaso este tipo de cadenas también poseen una dirección de almacenamiento
#16
Buenas, tengo las siguientes funciones:

Código (cpp) [Seleccionar]
char * func1(int condicion)
{
      switch(condicion)
     {
         case 0: return "EQ";
         case 1: return "NE";
         case 2: return "CS";
         case 3: return "CC";
         case 4: return "MI";
         case 5: return "PL";
         case 6: return "VS";
         case 7: return "VC";
         case 8: return "HI";
         case 9: return "LS";
         case 10: return "GE";
         case 11: return "LT";
         case 12: return "GT";
         case 13: return "LE";
         case 14: return "";
         default: return 0;
      }
}


Y

Código (cpp) [Seleccionar]
char * func2(int condicion)
{
    if ((unsigned) condicion >= 15)
return 0;
    return "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0" +
               3 * condicion;
}


Se que ambas son equivalentes pero lo que me cuesta entender es como la función     con tabla de búsqueda logra aislar la cadena requerida según la condición especificada, si alguien podría explicarme como sucede esto...

Saludos kutcher 
#17
Cita de: rir3760 en  3 Septiembre 2014, 19:29 PM
Como no publicas el programa completo te toca a ti verificar que funcione correctamente (ya nos avisas si hubo algún resbalón).

Hola rir3760 ahora si va bien en cuanto al código completo es el siguiente:

Código (cpp) [Seleccionar]
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

void bruteforce(int inc,int fin,char *rotation);

int main(void)
{
    int inc, fin;
    unsigned long t_start = 0, t_end = 0;
    char rotation[200] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                         "abcdefghijklmnopqrstuvwxyz"
                         "1234567890<>,?;.:/!з*╡∙%$г"
                         "ди+=})]р@ч^\\_`ш|-[({'#\"щ~&\0";

    printf("\n Comenzar de: ");
    scanf("%d", &inc);
    printf("\n Terminar en: ");
    scanf("%d", &fin);

    t_start = clock();
    bruteforce(inc, fin, rotation);
    t_end = clock();

    printf("Terminado en : %ld segundos.\n", (t_end - t_start)/1000);

    return 0;
}

void bruteforce(int inc, int fin, char *rotation)
{
    int i, j, len = strlen(rotation);
    long int r, end, c;
    char test[200];

    end = pow(len, inc);
    for(j = inc; j < fin + 1; j++)
    {
        for(r = 0; r != end; r++)
        {
            c = r;
            for(i = 0; i < j; i++)
            {
                test[i] = rotation[c % len];
                c = c / len;
            }
            puts(test);
        }
        end *= len;
    }
}


Solo le cambie lo del printf ya que considero que es mas lento que puts

Saludos kutcher
#18
Cita de: eferion en  3 Septiembre 2014, 08:16 AM
En cualquier caso yo creo que puedes optimizar la función "arrastrando" el valor de "end", de esta forma sólo llamas a pow una vez durante la ejecución de la función.

Hola eferion probé lo que indicaste pero no funciona y ademas provoca que entre en un ciclo infinito .. ahora tengo otra pow pero mas optimizada que creo es mas rápida según noto es este:

Código (cpp) [Seleccionar]
int ipow(int base, int exp)
{
    int result = 1;
    while(exp)
    {
        if(exp & 1)
           result *= base;
        exp >>= 1;
        base *= base;
    }
    return result;
}


Saludos kutcher
#19
Cita de: MCKSys Argentina en  2 Septiembre 2014, 22:41 PM
Revisa este post.

La verdad no entendí mucho, por otro lado hice una función pow que solo trabaja con enteros pensé que de esta manera podría ser mas rápida pero no:

Código (cpp) [Seleccionar]
int pow2(int x, int n)
{
    int p;
    for ( p = 1 ; n > 0 ; --n )
        p *= x;
    return p;
}


Saludos kutcher
#20
Buenas, tengo el siguiente algoritmo:

Código (cpp) [Seleccionar]
void bruteforce(int inc, int fin, char *rotation)
{
    int i = 0, j, len = strlen(rotation);
    long int r = 0, end, c;
    char test[200];
    for(j = inc; j < fin+1; j++)
    {
        r = 0;
        end = (long int)pow(len, j);
        while(r != end)
        {
            c = r;
            while(i < j)
            {
                test[i] = rotation[c % len];
                c = (long int)c / len;
                i++;
            }
            test[i] = '\0';
            puts(test);
            i = 0;
            r++;
        }
    }
}


Mi intención es evitar el uso de pow porque esta consume demasiado recursos, lo que busco es la forma de representarlo con solo operaciones aritméticas .... alguna idea

Saludos kutcher