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 - leosansan

#621
Cita de: BeFree en 19 Junio 2013, 19:33 PM
Hola, tengo que hacer un algoritmo que ordene N números naturales generados en forma aleatoria. Tiene que ejecutarse para 1000, 10000 y 100000. Escribí un código y al ejecutarlo lo hace sin problemas para 1000 y 10000, pero para 100000 no me muestra el resultado, y no puedo hallar el error.


Como indicó lapras, no hay error sino "lentitud" en el proceso, tanto de generación como en el de ordenación, más en este último.

Para que veas lo que pasa he incluido un par de printf y así compruebas que incluso en el caso de 100000 está el programa "trabajando". Te lo dejo con MAX=100 porque con los printf y la limpieza de pantalla, el proceso se ralentiza enormemente:


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

/*Declaración de variables globales*/
unsigned long int MAX=100;

/*Generar datos*/
void CagarDatos(unsigned long int v[], unsigned long int N)
{
   unsigned long int i,j;
   int duplicado;
   unsigned long int num;

   for(i=0; i<N; i++)
   {
      num=1+rand()%N;
      duplicado=0;
        printf("Generando: %d",i+1);
        system("cls");
       for(j=0; j<=i; j++)
      {
         if(num==v[j])
         {
            duplicado=1;
            break;
         }
      }
      if(duplicado==1)
         i--;
      else
         v[i]=num;
   }
}

/*Ordenar Datos de menor a mayor mediante método burbuja*/
void OrdenarDatos(unsigned long int v[], unsigned long int N)
{
   unsigned long int i,j;
   unsigned long int buffer;

   for(i=0; i<N-1; i++)
  {
     for(j=i+1; j<N; j++)
    {
        if(v[i]>v[j])
       {
          printf("Ordenando: %d",i+1);
          system("cls");
          buffer=v[j];
          v[j]=v[i];
          v[i]=buffer;
       }
    }
  }
}

/*Muestra los datos cargados*/
void MostrarDatos(unsigned long int v[], unsigned long int N)
{
   unsigned long int i;

   printf("\n============================================");
   printf("\nNúmeros cargados:\n ");
   for(i=0; i<N; i++)
     printf("-%ld", v);
}

/*Principal*/
int main()
{
   unsigned long int ordenar[MAX];
   time_t inicio, fin;

   srand(time(NULL));
   CagarDatos(ordenar, MAX);
   inicio=time(NULL);
   OrdenarDatos(ordenar, MAX);
   MostrarDatos(ordenar, MAX);

/*Finalización*/
   printf("\n============================================");
   printf("\nLa cantidad de datos ordenados es: %ld", MAX);
   fin=time(NULL);
   printf("\nEl programa ha tardado: %.f segundos", difftime(fin,inicio));
   printf("\n=========================================\n\n");
   return 0;
}


Saluditos!
   

#622
Como dice daryo y amchacon no furula. Lo intentaré mejorar. :silbar:
#623
Cita de: jorgesalazar90 en 18 Junio 2013, 23:39 PM
Lo que pasa es que no se utilizar métodos para poder realizar este código. Agradeceré su ayuda...

Un método que a mí no me gusta, aunque funciona en descomponer un numero en sus dígitos y elevarlos al cuadrado

Saluditos!
   

#624
Cita de: OmarHack en 20 Junio 2013, 02:45 AM
No sé que tengo que poner en el lugar de "existe".

Código (cpp) [Seleccionar]
if (programa.exe existe)
{
system ("start programa.exe");
}


Un saludo.

Muy sencillito:

Código (cpp) [Seleccionar]

   if ("programa.exe")
       system ("programa.exe");


Saluditos!
   

#625
Cita de: rir3760 en 20 Junio 2013, 02:13 AM
No es necesario utilizar la función strlen ya que basta con verificar si el carácter a procesar es el '\0' (ello indica el fin de la cadena)
.......................

 
Código (cpp) [Seleccionar]
 for (i = 0; str[i] != '\0'; i++)
     

Y tampoco hace falta explicitarlo, con esto es suficiente:


Código (cpp) [Seleccionar]
 for (i = 0; str[i]; i++)

Saluditos!
   
#626

No hay nada peor que un problema no bien definido. En principio, lo que originó este tema, sólo habla de identificadores pero deja abierta la puerta a interpretaciones y eso es no estar bien definido el problema.

Una opción sería incluir además de las primeras letras un símbolo para las que no aparecen e incluir asimismo las finales. Por ejemplo:


Código (cpp) [Seleccionar]

pincel ---->pin-el
cinco ---->ci--o
cinceles ---->cinc--es
pipa ---->pi-a
termometro ---->termo---ro


Pero para gustos colores, es el problema de un ejercicio no bien definido, insisto.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>

int main(){
    int i,j,longitud;
    char capitulo1[5][11] = {"pincel", "cinco", "cinceles", "pipa", "termometro"};
    char cap1[5][11]={0};
    for (i= 0; i<5; i++)
    {
        longitud=strlen(capitulo1[i]);
        for (j = 0;j<longitud/2; j++)
                cap1[i][j] = capitulo1[i][j];
        if (longitud<=5)
        {
            for (j = longitud/2;j<longitud-1; j++)
                cap1[i][j] = '-';
                cap1[i][longitud-1] =capitulo1[i][longitud-1] ;
        }
        else if (longitud>=6)
        {
            for (j = longitud/2;j<longitud-2; j++)
                cap1[i][j] = '-';
            cap1[i][longitud-2] =capitulo1[i][longitud-2] ;
            cap1[i][longitud-1] =capitulo1[i][longitud-1] ;
        }
        printf("%s ---->%s\n",capitulo1[i],cap1[i]);
    }
    return 0;
}


Saluditos!
   
#627
Programación C/C++ / Re: Problema con casting
19 Junio 2013, 16:53 PM
Cita de: Caster en 19 Junio 2013, 00:12 AM
El 2. soluciona todo, porque si como tu dices cambiamos el float por un int siempre saldrian par, lo declaro como float para que coja los decimales al dividirlo por 2.

No hombre, no. Tienes que declararlo entero ,como ya te explique en el post anterior. Al dividirlo entre 2., y de nuevo  hago hincapié en el punto decimal, automáticamente el código pasa ese valor a float, por lo que si introduces 13, 13/2. pasaría a ser 6.500000 y al compararlo con 13 de dará impar.

Una salida al código que te paso, otra vez, a continuación:


Código (cpp) [Seleccionar]


Introduzca el numero
(negativo para salir) :6

num / 2.=3.000000---->num/2=3
Es par

Introduzca el numero
(negativo para salir) :13

num / 2.=6.500000---->num/2=6
Es impar

Introduzca el numero
(negativo para salir) :9

num / 2.=4.500000---->num/2=4
Es impar

Introduzca el numero
(negativo para salir) :15

num / 2.=7.500000---->num/2=7
Es impar

Introduzca el numero
(negativo para salir) :14

num / 2.=7.000000---->num/2=7
Es par



Y dos cositas, observa que declaro num como int y la otra es que ejecutes el código que te pasamos para comprobar que funciona, no te conformes con mirarlo y sacar conclusiones que, como en este caso, te han llevado a error:


Código (cpp) [Seleccionar]
#include <stdio.h>
int main() {
    int num=0;
    while (num>=0)
    {
        printf("\nIntroduzca el numero \n(negativo para salir) :");
        scanf("%d", &num);
        printf("\nnum / 2.=%f---->num/2=%d",num / 2.,num/2\n);
        if (num / 2. == num/2)
           printf("\nEs par\n");
        else
           printf ("\nEs impar\n");
    }

    getchar();
    return 0;
}


Saluditos!
   
#628
Programación C/C++ / Re: Problema con casting
19 Junio 2013, 00:09 AM
Creo que el fallo inicial está en declarar num como float o double, ya que en ese caso el no ser par no implica que sea impar. Por ejemplo, 6.7 daría impar y sin embargo no es ni lo uno ni lo otro. Es más, el concepto de par e impar está reservado para números enteros, con lo que no cabe declarar num como float ni double.

Es decir que habría que tratar la variable num como int, y así ver si es par y sino, impepinablemente es impar.

Y ahí entra en juego el posible tema del casting donde compararías num/2., y fíjate bien en el punto del 2 que transforma el int en float, con (int)(num/2.), o más simple, compararlo con (num/2) es decir sin el punto decimal porque ya sería entero.

Conclusión:


Código (cpp) [Seleccionar]

#include <stdio.h>
int main() {
    int num;
    printf("Introduzca el numero:\n");
    scanf("%d", &num);
    if ((num / 2.) == ((int)(num/2.)))
    /*o bien: if ((num / 2.) == num/2)*/
       printf("\nEs par\n");
    else
       printf ("\nEs impar\n");
    getchar();
    return 0;
}


Saluditos!
   
#629
La verdad es que, en principio y sólo en principio, el cifrado César es muy endeble ante un simple ataque por "fuerza bruta". Bastaría ir probando con un desplazamiento de 0 a 26 y ver cuando obtenemos "algo" razonable/entendible.

Como muestra esta imagen en que se observa el cifrado y el "ataque" para descifrarlo:



Cosa que consigo con este simple código:

Código (cpp) [Seleccionar]

#include <stdio.h>
int main (void)
{
   int i,n=0,k=0;
   char frase [256];

   while (1)
   {
       n=0;
       puts ("\nIntroduce una frase: ");
       fgets (frase,255,stdin);
       do
       {
           printf ("\nIndica el desplazamiento: ");
           scanf ("%d",&n);
           while (getchar()!='\n');
       }while (n<0 || n>25);

       for (i=0;frase[i];i++)
       {
           if ((frase [i]>('z'-n) && frase [i]<='z') || (frase [i]>('Z'-n) && frase [i]<='Z' ))
               frase [i]=frase [i]-26+n;
           else if (frase [i]>='a' && frase [i]<=('z'-n) || (frase [i]>='A' && frase [i]<=('Z'-n) ))
               frase [i]+=n;
       }
       printf("\nCodificada con desplazamiento %d \n",n);
       printf ("%s\n",frase);
       puts("\nY ahora descodificada: ");
       for (k=0;k<26;k++)
       {
           for (i=0;frase[i];i++)
           {
               if ((frase [i]<('a'+k) && frase [i]>=('a')) || (frase [i]<('A'+k) && frase [i]>=('A') ))
               frase [i] =frase [i]+26-k;
               else if ((frase [i]>=('a'+k) && frase [i]<=('z') )|| (frase [i]>=('A'+k) && frase [i]<=('Z') ))
                   frase [i]-=k;
           }
           printf ("%s\n\n",frase);
           system ("pause");
       }
   }
   return 0;
}


Pero, pero .... con una pequeña variante lo podríamos hacer "casi" indescifrable, según comenta la Wikipedia:

"El cifrado Vigenère usa el cifrado César con un
desplazamiento diferente en cada posición del texto;
el valor del desplazamiento se define usando una
palabra clave repetitiva. Si la palabra clave fuera
escogida al azar y tan larga como el mensaje
(para que no se repita), el sistema resultante sería,
en teoría, indescifrable."



No creo que sea para tanto, pero cualquiera le lleva la contraria a Wikipedia. Como ya comenté en otro post anterior, más información en Cifrado César cortesía de Wikipedia.

Por si acaso, yo lo he intentado usando un valor aleatorio como desplazamiento para cada letra, con lo que el ataque por fuerza bruta anterior no sirve de nada, tendría que ser algo más refinado y respaldado con "potencia".

Como muestra otra imagen:



Pueden observar que la letra "a", que en el cifrado normal sería siempre la misma letra desplazada,  ahora cambia debido a que he usado un array aleatorio para cifrar la frase y sin ese array se haría muy "cuesta arriba" el descifrado ya que incluso el análisis por frecuencia fallaría, por la aleatoriedad mencionada.

Y he aquí la pequeña, pero "potente", variación:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <ctype.h>
#include <time.h>
void cesar (char *cadena , int letra, int *key);
int main()
{
   int  i=0,des=0, letra=0;
   srand((unsigned) time(NULL));
   char cadena[0x100]={0};
   puts("Ingrese una cadena: ");
   gets (cadena);
   int key[strlen(cadena)],_key[strlen(cadena)];
    for (i = 0;cadena[i]; i++)
   {
       key[i] = rand() % 0x1A+1 ;
       _key[i] = -key[i];
   }
   cesar (cadena,0x61,key);
   printf("\nCifrado es: %s \n", cadena);
   cesar (cadena,0x7A,_key);
   printf("\nDecifrado es: %s \n", cadena);
   return 0;
}
void cesar (char cadena[] , int letra, int *des)
{
   int i,letra1=0;
   for(i = 0; cadena[i]; i++)
    {
       if ( cadena[i]==' ')
           continue;
       letra1=letra;
       if(isupper(cadena[i])!=0)
           letra1-=0x20;
       cadena[i] =((cadena[i]-letra1+des[i] )%0x1A)+letra1;
     }
}



Como veis he sustituido los números decimales por sus correspondientes hexadecimales, sólo por darle un aspecto más críptico al tema.

Y el código propuesto tiene un valor añadido y es que cada mensaje usa un array aleatorio diferente en cada caso, por lo que la "interseptación" de dos mensajes no ayudaría en nada a los desencriptadores.

¡Anímate!, e intenta el descifrado de:

Código (cpp) [Seleccionar]
Cifrado es: Uhmvhvcjsakoo Mqoug ctz Xwrvdm Gycgs

Saluditos!
   
#630
Cita de: cpu2 en 17 Junio 2013, 08:47 AM
Código demasiado largo y poco eficiente, para algo tan simple como el cifrado de César, y sin hablar del array.


Ya,ya, pero para mejor eficiencia ya están los dos posteados con anterioridad, el de CCross/cypscal/mío con una función y el uso de la librería ctype y el anterior mío sin más uso que el de el caracter ascii. Aún espero una propuesta "completa" por parte tuya, donde se pueda introducir la frase y el desplazamiento, no tan solo mover tres posiciones los caracteres sin tener en cuenta que si se llega al final se vuelve al comienzo del abecedario e incluir tanto minúsculas como mayúsculas e incluya sus printf y toda esa retaila.

De todas formas olvidas lo fundamental:

Cita de: leosansan en 13 Junio 2013, 16:48 PM

Creo que no has pillado la "intención" de la propuesta. Se trata de ver el "potencial" de los intervinientes en el foro y que en base a este tema hagan propuestas ingeniosasy/o "raritas" con la única finalidad de exprimir el ingenio, plasmar los conocimientos y ayudar/enseñar unos de otros.

Cita de: cpu2 en 17 Junio 2013, 08:47 AM

       printf("Ingrese una cadena: ");
       fgets (frase,255,stdin);
   
        puts("Ingrese desplazamiento: (1-25) ");
        scanf ("%d",&desplazamiento);


Podrías utilizar los parametros argv, te ahorras ese fgets y esa aberración llamada scanf.

Sí hombre, y volver cuarenta años atrás a programar tipo MS-DOS metiendo todo a mano y a base de comandos. No, lo siento, pero yo ya pasé esa época, tanto que por líneas de comandos no hagoun código ni de coñ*. Como ya he menciona en alguna ocasión, en mi caso al menos, un pasito atrás ni "pá" coger impulso.

Cita de: cpu2 en 17 Junio 2013, 08:47 AM
while (getchar()!='\n');

Venga hombre.


¿Alguna sugerencia diferente para limpiar el buffer?. No creo que seas de los que usan fflush (stdin). Reconozco humildemente que mis conocimientos en este mundillo del C/C++ son aún escasos, pero ¿alguna propuesta alternativa que nos ilumine a los neófitos?

Cita de: cpu2 en 17 Junio 2013, 08:47 AM
Un saludo.

Yo un "Saludito", como se dice por mi tierra. Lamento que hallas "agriado" un poco el tema con tu actitud ¿prepotente?, cuando mi única finalidad era que el personal que nos sigue se animase al "juego" de proponer alternativas al tema del cifrado César, como podría haber sido cualquier otro. Era sólo un reto que, por lo que veo y leo, tú te lo has tomado como algo personal, cosa que no entiendo. Y menos aún el que, repito/insisto no hallas hecho una propuesta alternativa en toda regla. Para criticar por criticar y deshagorte creo que existen otros foros más apropiados.



Cita de: cpu2 en 17 Junio 2013, 08:47 AM
P.D: Yo dejo el tema, desde mi punto de vista un desplazamiento de bits o un xor, es mucho mejor que el de César, yo no daría más importancia a esto de verdad.

Pues ya ves, esa es una sugerencia, que no aportación, que no caerá en saco roto, aunque intuyendo tu preparación habría esperado más de tí.

Como diría amchacon:

Cita de: amchacon en 17 Junio 2013, 11:37 AM
Perdiendo facilidad y sencillez...

Personalmente, si eres un poco peresozo y no quieres usar teclado. Simplemente pones esto al ejecutar el programa

programa < fichero.txt

Y en fichero pones todos los parámetros del teclado.
Es un método tan válido como cualquier otro para "limpiar" el buffer del teclado.
Bueno es curiosidad educativa :silbar:

En fin, que si se te hace muy largo el array del último post, y cuya única finalidad era la que era- releete el post para que lo entiendas bien- te dejo "otro" código con dos arrays, aunque más cortitos que el anterior , eso sí sin usar librerías, ni la operación módulo ni tan siquiera el código ascii, a"a pelo" vamos.....¡y que siga el juego! :

Código (cpp) [Seleccionar]
#include <stdio.h>
int main(void)
{
   char frase[256] = {0};
   int i=0,j=0,desplazamiento=0;
   char ABC[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
   char abc[] = {"abcdefghijklmnopqrstuvwxyz"};
   while(1)
   {
       printf("Ingrese una cadena: ");
       fgets (frase,255,stdin);
       do
       {
           puts("Ingrese desplazamiento: (1-25) ");
           scanf ("%d",&desplazamiento);
           while (getchar()!='\n');
       }while (desplazamiento<0 || desplazamiento>25);
       for(i = 0; frase[i]; i++)
       {
           for(j = 0; j<26; j++)
               {

                   if ( frase[i]==' ')
                       break;
                   if (frase[i]==abc[j] && j+ desplazamiento<26)
                   {
                       frase[i] =  abc[j+ desplazamiento];
                       break;
                   }
                   else if (frase[i]==abc[j] && j+ desplazamiento>=26)
                   {
                       frase[i] =  ABC[j+ desplazamiento-26];
                       break;
                   }
                   else if (frase[i]==ABC[j] && j+ desplazamiento<26)
                   {
                       frase[i] =  ABC[j+ desplazamiento];
                       break;
                   }
                   else if (frase[i]==ABC[j] && j+ desplazamiento>=26)
                       {
                           frase[i] =  abc[j+ desplazamiento-26];
                           break;
                   }
               }
       }
        printf("Cadena cifrada: %s\n\n", frase);
        for(i = 0; frase[i]; i++)
       {
           for(j = 0; j<26; j++)
               {

                   if ( frase[i]==' ')
                       break;
                   if (frase[i]==abc[j] && j- desplazamiento>=0)
                   {
                       frase[i] =  abc[j- desplazamiento];
                       break;
                   }
                   else if (frase[i]==abc[j] && j- desplazamiento<0)
                   {
                       frase[i] =  ABC[j-desplazamiento+26];
                       break;
                   }
                   else if (frase[i]==ABC[j] && j- desplazamiento>=0)
                   {
                       frase[i] =  ABC[j- desplazamiento];
                       break;
                   }
                   else if (frase[i]==ABC[j] && j- desplazamiento<=0)
                       {
                           frase[i] =  abc[j-desplazamiento+26];
                           break;
                   }
               }
       }
        printf("Cadena descifrada: %s\n\n", frase);
   }
   return 0;
}


Saluditos!