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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  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 ... 26
81  Programación / Programación C/C++ / Re: Problema Matriz dinámica en: 22 Mayo 2014, 03:57 am
Yo preguntaría, ¿qué es "centinela2"? ¿cuál es su valor?
82  Programación / Programación C/C++ / Re: Ayuda para crear tabla de conversión de decimales en: 22 Mayo 2014, 03:43 am
Aquí hay una propuesta que imprime una tabla con los valores en binario de todos los números desde 1 hasta 256:
Código
  1. #include <stdio.h>
  2.  
  3. /* conversor de decimal a binario */
  4. int main() {
  5.  
  6.   int i, numero;
  7.   int base;
  8.  
  9.   printf("decimal\tbinario\n"
  10.          "------------------------\n");
  11.   for ( i = 1; i <= 256; i++ ) {
  12.  
  13.      numero = i;
  14.      printf( "%d\t", numero );
  15.      base = 2;
  16.      while(numero >= 1) {
  17.  
  18.         printf("%d ", numero%base);
  19.         numero/=base;
  20.      }
  21.      printf("\n");
  22.   }
  23. }

Ten en cuenta que el número binario aparece invertido, no se si sea un problema para tí. Si es así, avisa para decirte cómo podrías corregirlo.

Ahora, una propuesta que imprime en binario, octal y hexadecimal.Sólo tienes que cambiar el valor de la variable base, y en el caso de hex, debes imprimir letras cuando corresponda a digitos entre 10 y 15:
Código
  1. #include <stdio.h>
  2.  
  3. /* conversor de decimal a binario */
  4. int main() {
  5.  
  6.   int i, numero, resto;
  7.   int base;
  8.  
  9.   printf("decimal\tbinario\toctal\thex\n"
  10.          "------------------------\n");
  11.   for ( i = 1; i <= 256; i++ ) {
  12.  
  13.      numero = i;
  14.      printf( "%d\t", numero );
  15.  
  16.      /* binario */
  17.      base = 2;
  18.      while(numero >= 1) {
  19.  
  20.         printf("%d", numero%base);
  21.         numero/=base;
  22.      }
  23.  
  24.      /* octal */
  25.      printf("   ");
  26.      base = 8;
  27.      numero = i; /* rescatamos el valor de numero */
  28.      while(numero >= 1) {
  29.  
  30.         printf("%d", numero%base);
  31.         numero/=base;
  32.      }
  33.  
  34.      /* hexadecimal */
  35.      printf("   ");
  36.      base = 16;
  37.      numero = i; /* rescatamos el valor de numero */
  38.      while(numero >= 1) {
  39.  
  40.         resto = numero % base;
  41.         if ( resto < 10 )
  42.            printf("%d", numero%base);
  43.         else
  44.            printf("%c", 'A' + resto - 10 );
  45.         numero/=base;
  46.      }
  47.  
  48.      printf("\n");
  49.   }
  50. }

Aquí la salida con los primeros 20 números, y como puedes ver la tabla sale un poco desordenada. Se requiere hacer más código si quieres embellecerla, jeje

decimal   binario   octal    hex
------------------------
1   1   1   1
2   01   2   2
3   11   3   3
4   001   4   4
5   101   5   5
6   011   6   6
7   111   7   7
8   0001   01   8
9   1001   11   9
10   0101   21   A
11   1101   31   B
12   0011   41   C
13   1011   51   D
14   0111   61   E
15   1111   71   F
16   00001   02   01
17   10001   12   11
18   01001   22   21
19   11001   32   31
20   00101   42   41
83  Programación / Programación C/C++ / Re: pasar de decimal a cualquier base menor de 10 en: 22 Mayo 2014, 03:10 am
Juanma, trataré de explicarte con paciencia, ya que estás comprendo que estás empezando. Necesitas la función atoi() de la biblioteca <cstdlib> para poder convertir un argumento de tipo cadena en un número entero equivalente. Pues, las operaciones aritméticas sólo tienen sentido entre argumentos que sean numéricos. Por ejemplo en el código original tenías:
Código
  1. cociente=cociente/base;
donde 'cociente' y 'base' son tipos string. Pero no puedes dividir dos string (!), en todo caso dividir los números representados por dichos strings, que es lo que hace atoi(): recibe una cadena y devuelve un número equivalente, e.g., el valor devuelto por la sentencia

atoi( "123" )

es el número 123, de tipo int.

A continuación voy a proponer, a modo de complemento con leosansan, una versión que da el resultado en forma de cadena y no como número decimal (lo hacemos de esta manera justo por las razones que tú expones al principio, evitar limitaciones en cuánto al número de dígitos en la salida).

Código
  1. #include <iostream>
  2. #include <array>
  3. #include <cstdlib>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. void Conversor( int numero, int base )
  9. {
  10.   int digito, i, N = 0;
  11.   string resultado = "";
  12.   char c;
  13.  
  14.   /* calcular la mayor potencia de la base que no supera al numero */
  15.   while ( numero >= 1 ) {
  16.      digito = numero % base;
  17.      numero = numero / base;
  18.      /* añadimos el digito, convertido a un char, al resultado */
  19.      c = digito + '0';
  20.      resultado = resultado + c;
  21.      N++;
  22.   }
  23.   /* ahora imprimimos la cadena en reversa */
  24.   for ( i = N - 1; i >= 0; i-- )
  25.      cout << resultado[i];
  26.   cout << endl;
  27. }
  28.  
  29. int main()
  30. {
  31.   string str_numero, str_base;
  32.   int numero, base;
  33.  
  34.   cout<<"Escribe el numero que quieres convertir (num/base): ";
  35.   getline(cin, str_numero,'/');
  36.   numero = atoi( str_numero.c_str() ); /* <-- ver aquí, convertimos el string en un entero */
  37.   getline(cin, str_base,'\n');
  38.   base = atoi( str_base.c_str() ); /* <-- ver aquí, convertimos el string en un entero */
  39.  
  40.   if( base <= 10 )
  41.      Conversor( numero, base );
  42.   else
  43.      cout<<"Error no es una base menor de 10";
  44.  
  45.   return 0;
  46. }

Ten en cuenta que el algoritmo de conversión que hemos usado (tanto leosansan como tú y yo) convierten el número calculando desde el dígito menos significativo hasta el más significativo, por eso la cadena debe imprimirse "al revés".

Espero te ayude.

---------------------------------------------------------------------------------------
P.D. En mi ignorancia, no conozco una función de biblioteca de C++ que imprima directamente cadenas en reversa, si alguien la sabe que me lo diga xD
84  Programación / Programación C/C++ / Re: pasar de decimal a cualquier base menor de 10 en: 2 Abril 2014, 21:47 pm
Sólo como un aporte, tomando el código de ivance y modificándolo para trabajar con arreglos creo que se ahorra un poco de cálculo ya que no será necesario encadenar un while dentro del for. La desventaja es que debemos crear dinámicamente un arreglo con una longitud igual a la cantidad esperada de cifras del número:
Código
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.   unsigned numero=0, base=0, cociente=0, contador=1;
  9.   cout<<"Escribe el numero que quieres convertir: ";
  10.   cin>>numero;
  11.   cout<<"La base a la que quieres pasarlo: ";
  12.   cin>>base;
  13.   cociente=numero;
  14.  
  15.   /* cantidad de cifras en la base especificada */
  16.   int n = 1;
  17.   while ( cociente >= base ) {
  18.      cociente/=base;
  19.      ++n;
  20.   }
  21.   /* reservar arreglo de n cifras */
  22.   unsigned *cifras = new unsigned[n];
  23.   if ( cifras == NULL ) return -1;
  24.  
  25.   for (int i = 0; i < n; i++) {
  26.      cifras[n - i - 1] = numero % base;
  27.      numero /= base;
  28.   }
  29.   for (int i = 0; i < n; i++)
  30.      cout << cifras[i];
  31.   cout << endl;
  32.  
  33.   delete cifras;
  34.   return 0;
  35. }
85  Programación / Programación C/C++ / Re: Entrada de datos con fgets() en: 2 Abril 2014, 20:57 pm
No es que la cadena posea dos '\0', pues sólo el primero cuenta. Para poner un ejemplo imagínate que tienes:

'h' 'o' 'l' 'a' '\0' '\0' '\0' '\0' '\0'

entonces el primer '\0' encontrado marca el fin de la cadena, que es "hola" y su longitud es 4.

En el ejemplo que dices, si conviertes

'h' 'o' 'l' 'a' '\n' '\0'

en

'h' 'o' 'l' 'a' '\0' '\0'

entonces haces una cadena "más corta", y pasa de tener 5 caracteres a tener 4.

==========================
EDITO

Sólo por comentar, aunque no se si me estoy extendiendo en el tema. El código que propones se puede optimizar eliminando la sobrecarga por llamar dos veces a la función strlen() (aunque un usuario me dijo que los compiladores modernos saben cómo evitar este problema). Una manera es por supuesto depositar el valor de la longitud de la cadena en una variable intermedia:
Código
  1. int len = strlen(cadena);
  2. if(cadena[len-1] == '\n'{
  3.   cadena[len-1] = '\0'
  4. }
O incluso otra forma "autoconstruida", donde no se llama a ninguna función de biblioteca:
Código
  1. for ( i = 0; cadena[i] != '\0'; i++ )
  2.   if ( cadena[i] == '\n' ) cadena[i] = '\0';
o:
Código
  1. char c;
  2. int i = 0;
  3. while ( (c = cadena[i]) != '\n' && c != '\0' )
  4.   i++;
  5. if ( c == '\n' ) cadena[i] = '\0';
  6.  
86  Programación / Programación C/C++ / Re: bucle con char en: 2 Abril 2014, 01:25 am
Hay otra forma sutil, aunque elegante de hacerlo. Poniendo la cadena vacía como indicador para el fin del programa (en lugar de la cadena "fin").

Me explico, por ejemplo si usamos en C la función gets(), (ojo peligro, cuidado con desbordamiento de buffer) y al pedir la cadena presionas Enter, pues se recibe la cadena vacía, y finalizas el programa:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void) {
  6.  
  7.   char buffer[100];
  8.  
  9.   gets( buffer );
  10.   while ( *buffer != '\0' ) {
  11.      printf("Usted escribio: %s\n", buffer);
  12.      gets( buffer );
  13.   }
  14.  
  15.   return 0;
  16. }

Otra forma sería usando la secuencia de fin de archivo EOF para terminar el programa, aunque es algo más complicado, mejor para ti el primer método.

¿Alguien ofrece solución equivalente en C++?
87  Programación / Programación C/C++ / Re: Problema con ciclos (ejercicio de pi) en: 2 Abril 2014, 00:58 am
La diferencia es de un ciclo de procesador (una operación aritmética elemental) por cada repetición del "for". Eso en el último ejemplo con mil millones de repeticiones en el "for" ha debido producir una diferencia cercana a 1 segundo, que no ha sido así. Y he ahí la incógnita  :huh:, jaja.

Pero cuidado que si queremos adentrarnos en este mundo debemos sacar con exactitud las cuentas. Tengo en mente (no se si bien recuerdo) que la frecuencia de reloj de procesador no es exactamente igual a la frecuencia de las instrucciones de máquina, dependiendo del procesador una instrucción de máquina puede demorar 4 ciclos de reloj, en otros puede demorar 12 ciclos. O sea, que el procesador de 1.5Ghz en realidad computa menos de 1500 millones de operaciones por segundo. Claro, están las arquitecturas de doble núcleo que corren en paralelo, etc. En realidad, es algo difícil predecir cuánto demorará la ejecución de un programa en una máquina determinada, sólo podemos decir que son "muchos" millones por segundo  ;D
88  Programación / Programación C/C++ / Re: RAPTOR en: 30 Marzo 2014, 18:52 pm
Pero ojo, floor() devolverá valor del cociente entero pero considerado como un double (2.0, no 2). Para tenerlo entero, si es tu propósito, debes hacer cast explícito:
(int) floor(5 / 2)
89  Programación / Programación C/C++ / Re: Problema con ciclos (ejercicio de pi) en: 30 Marzo 2014, 18:49 pm
Vaya, ustedes sí que tienen ocio de ponerse a medir el tiempo con cada uno de los algoritmos, jaja!

Bueno, yo uso la filosofía del mínimo recurso, me parece lo más lógico declarar n como entero, pues la función que realiza es la de un entero. Tengan en cuenta que comparar dos float es más complicado, a nivel de máquina, que comparar dos enteros. Los float llevan mantisa y exponente, y supongo que nivel de bits primero se comparan los exponentes, y si son iguales se pasa a las mantisas. En cambio en los enteros se comparan todos sus bits de una vez y punto.

A pesar de ello yo hubiera supuesto que el manejo de leosansan, de sumar dos al contador n+=2 sería más eficiente que calcular 2*n+1 (suma y multiplicación incluida). Pero el ensayo demostró que fueron equivalentes, jeje, no se por qué.

Por otra parte, es cierto que resumir el código fuente no necesariamente reduce el tiempo de ejecución. Para lo segundo hay que ponerse a pensar en lo que traduce el compilador, y por ende la manera como se ejecuta el código a nivel de la máquina (los tipos de datos involucrados, etc). Es un punto que precisamente yo venía sosteniendo desde otro post.

Por supuesto, estas son cosas para entretenernos los usuarios más avanzados, no son cosas para considerar aún por la autora del tema quién está apenas comenzando a programar (algún día lo hará), jeje.

Saludos a todos  :D

90  Programación / Programación C/C++ / Re: Promoción de los parámetros numéricos pasados a función ? en: 30 Marzo 2014, 18:24 pm
Gracias, un saludo.
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 ... 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines