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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26
211  Programación / Programación C/C++ / Re: es posible concatenar un array byte? en: 11 Febrero 2014, 02:36 am
Estimado, Deitel&Deitel, "Cómo programar en C/C++", segunda edición. en Español, 1995.

En el tema "Estructuras, uniones, manipulaciones de bits y enumeraciones", p. 407, reza:

Citar
"(...) También los programas de las secciones 10.9 y 10.10 fueron probados en una Macintosh de Apple usando Thisk C y una PC compatible, utilizando Borland C++. Ambos sistemas utilizan enteros de 16 bits (2 bytes). Dada la naturaleza de dependencia de la máquina de las manipulaciones a nivel de bits, estos programas pudieran no funcionar en su sistema"
Como vez, lo dicen Deitel&Deitel (dos profesores con décadas de experiencia enseñando C), y no yo. Por eso digo que yo no se ...

Por otra parte, ten cuidado x64 con que la suma aritmética no siempre es igual a la suma lógica. Los resultados no son iguales en caso de que se practique una suma binaria con acarreo. Por ejemplo, la suma aritmética de b'01' y b'01' será b'10' (2 en decimal). En cambio, la misma suma lógica produce b'01'. En nuestro caso, por la teoría subyacente de sistemas numéricos sabemos que debe ser la suma aritmética.

============
Por último, respecto a lo extraño de la sentencia:

Código
  1. word1 = (unsigned short) buffer[1] << 8 + buffer[0];

la acabo de probar en mi compilador (GNU gcc acorde con C99) y me dice que está bien, sólo recomienda revisar la prioridad de los operadores. Entonces, revisando más a fondo el asunto recorde que el operador de suma posee mayor prioridad que el de desplazamiento (sorry por el olvido  :-[), por lo que lo correcto sería en todo caso:

Código
  1. word1 = ((unsigned short) buffer[1] << 8) + buffer[0];

y similarmente con las demás.
212  Programación / Programación C/C++ / Re: Ayuda en C++ en: 10 Febrero 2014, 21:29 pm
Enhora buena, tengo tu error!!

Era fácil, recuerdas que Alumnos es un arreglo cuyo i-ésimo elemento es un objeto de la clase Alumno. Por tanto, por ejemplo en la instrucción:

Código
  1. Alumnos.SetId(i+1);

has de poner

Código
  1. Alumnos[i].SetId(i+1);

y así en otras similares. He arreglado todo tu código como se muestra al final, lo compilé y probé y me parece que funciona como se espera (no se, confírmame).

Otros detallitos, primero se recomienda que cuando insertes código uses el estilo C++ en el tipo de etiqueta GesHi, eso hará que tu código quede formateado al estilo C++ y sea más legible (de la misma forma que yo lo hago en este post).

Además, te faltó la cabecera, <stdlib.h> que contiene la macro EXIT_SUCCESS, que por cierto es usual poner dentro de una instrucción exit(), y no una return().
Por último, para hacer to programa independiente del sistema operativo (Windows o no Windows), cambia el system("PAUSE") por getchar(), para lo cual debes incluir la cabecera <stdio.h>

Aquí tu programa arreglado:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class Alumno
  8. {
  9. private:
  10. int id;
  11. float calificacion;
  12.  
  13. public:
  14. Alumno()
  15. {
  16. id=0;
  17. calificacion=0;
  18. }
  19.  
  20. void SetId(int idx)
  21. {
  22. id=idx;
  23. }
  24.  
  25. void SetCalificacion(float cal)
  26. {
  27. calificacion=cal;
  28. }
  29.  
  30. int GetId()
  31. {
  32. return id;
  33. }
  34.  
  35. float GetCalificacion()
  36. {
  37. return calificacion;
  38. }
  39.  
  40. };
  41.  
  42.  
  43. int main()
  44. {
  45.    int n, i;
  46.    float aux;
  47.    char c;
  48.    cout<<"PROMEDIO DE LOS ALUMNOS."<<endl<<endl;
  49.    cout<<"¿Cuántos alumnos son?: ";
  50.    cin>>n;
  51.    cout<<"Debe ingresar cada una de las calificaciones de los alumnos, el id se asignará en el orden es que se ingresan los datos."<<endl<<endl<<endl;
  52.  
  53.    Alumno Alumnos[n];
  54.  
  55.    for (i=0; i<n; i++)
  56.    {
  57.        cout<<"Ingrese la calificación del estudiante identificado con el id: "<<i+1<<": ";
  58.        cin>>aux;
  59.        Alumnos[i].SetId(i+1);       /* aquí acomodamos */
  60.        Alumnos[i].SetCalificacion(aux);      /* aquí también */
  61.    }
  62.  
  63.  
  64.    cout<<endl<<endl<<endl<<"Lista de alumnos con su respectivas notas: "<<endl;
  65.    aux=0;
  66.    for(i=0; i<n; i++)
  67.    {
  68.        /* ... y aquí */
  69.        cout<<"Id Alumno: "<<Alumnos[i].GetId()<<"    ->  Nota: "<<Alumnos[i].GetCalificacion()<<endl;
  70.        /* ... y aquí */
  71.        aux+=Alumnos[i].GetCalificacion();
  72.    }
  73.  
  74.    cout<<endl<<endl<<endl<<"El promedio de los alumnos es: "<<aux/n<<endl;
  75.  
  76.    cout<<endl<<endl<<endl;
  77.  
  78.    getchar();
  79.    exit(EXIT_SUCCESS);
  80. }
213  Programación / Programación C/C++ / Re: Duda calcular radio círculo en: 10 Febrero 2014, 21:00 pm
Está muy bien este trabajo, y como comentario quisiera señalar que ese algoritmo:

Código
  1. float raiz(float m)
  2. {
  3.    float i=0;
  4.    float x1,x2;
  5.    while( (i*i) <= m )
  6.            i+=0.1;
  7.    x1=i;
  8.    for(int j=0;j<10;j++)
  9.    {
  10.        x2=m;
  11.        x2/=x1;
  12.        x2+=x1;
  13.        x2/=2;
  14.        x1=x2;
  15.    }
  16.  
  17.    return x2;
  18. }

está basado creo que en el "método de Newton" para solución de ecuaciones no lineales, que en el caso de raíces cuadradas también se conoce como método Babilónico.

 :)
214  Programación / Programación C/C++ / Re: Programa que identifique que tipo de dato se introduce C++ en: 10 Febrero 2014, 20:55 pm
Sólo para comentar, considérese que la propuesta:

Código
  1.    do {
  2.      puts("Introduzca un numero entero:");
  3.      scanf("%s", num);
  4.  
  5.      for (i = 0; isdigit(num[i]); i++)
  6.         ;
  7.    }while (num[i] != '\0');
  8.  
no admite números negativos. Los números "negativos" también son enteros. Y por cierto que isdigit requiere <ctype.h> !!!

Y un poco aparte del tema, moderador una pregunta, ¿Hay alguna manera que solicitar que mis mensajes no sea citados o mencionados por cierto usuario en particular? Porque en este foro hay gente que en vez de venir a aportar soluciones propias, se dedica a examinar y poner epítetos a los aportes de los demás.
215  Seguridad Informática / Análisis y Diseño de Malware / Re: Ejecución desde un byte array en: 9 Febrero 2014, 21:40 pm
Imagino que quieres crear un archivo ejecutable "al vuelo", es decir, que se ejecute pero sin volcar su contenido en disco.

¿Estás pensando en crear un código malicioso que se ejecute en un huésped sin dejar luego rastro alguno en él? Ah, jeje?

Bueno, no se tu intención ni me hago responsable por ello  ;), me limito a responder la pregunta.

Lo que se me ocurre en este caso es un script que dirija la salida del compilador a un fichero temporal, lo ejecute y luego lo borre. Si estás en Windows, un sencillo script de batch para ello podría ser

Código
  1. gcc -o tmp_2667ttte55e.exe fuente.c
  2. tmp_2667ttte55e.exe
  3. del tmp_2667ttte55e.exe

Lo que "tmp_2667ttte55e" es por poner un nombre extraño para pasar desapercibido (o al menos intentarlo). Ahora, lo del volcado (dump) del fichero en disco es competencia del Sistema Operativo, quizá y como es tan rápido ni siquiera lo pase de la memoria primaria (RAM) al disco.

No se cómo impedir el volcado, en Linux se puede montar un sistema de ficheros externo, y poner async en las opciones de montaje. En Windows ni idea, y con lo precario que es ese S.O. ni siquiera se si se puede.

Para finalizar, el mismo script pero en bash (Linux) sería

Código
  1. gcc -o tmp_2667ttte55e fuente.c
  2. ./tmp_2667ttte55e
  3. rm tmp_2667ttte55e

donde no hace falta ".exe" final (viva UNIX  :laugh:).

Espero te de al menos una idea.
216  Programación / Programación C/C++ / Re: curses.h en: 9 Febrero 2014, 18:35 pm
Hey dh4m13l !!!!, si no me equivoco la biblioteca <curses> es el equivalente de la biblioteca <conio> para Linux.

Me explico mejor, <conio> es una biblioteca propietaria de Borland de funciones de E/S interactivas para sistemas basados en DOS, como Windows. Su mejor equivalente actual en Linux sería <ncurses>, desarrollada por el MIT. Leí que también  existen otras como <Uconio>.

En conclusión, si estás en Windows debes usar <conio.h> y quizás <dos.h>, no <conio>.

Ahora, dato000 me gustaría saber por qué repudias a <curses>, ¿qué problema ta ha traído? Sólo por curiosidad ....
217  Programación / Programación C/C++ / Re: Programacion c++ menu de opciones ¡AYUDA! en: 9 Febrero 2014, 18:30 pm
vaio3099, .... Bienvenido al mundo de C  ;-)

Pero ve que tienes que aplicarte y hacer la tarea ¿eh?, ahora como debes estar un poco perdido en esto, te digo que una estructura típica de un menú de opciones es más o menos como:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. /* rutina para la opción 1 */
  7. double f1( double x, double y);
  8.  
  9. /* rutina para la opción 2 */
  10. double f2( double x, double y, double z);
  11.  
  12. /* rutina para la opción 3 */
  13. double f3( double x, double y, double z);
  14.  
  15. int main( ) {
  16.  
  17. int option;
  18. double x, y, z;
  19.  
  20. /* Menu de opciones */
  21. option = 0;
  22. while ( option != 4 ) {
  23. printf( "\nHola usuario \n"
  24. "==========================\n\n"
  25. "  [1] bla, bla, bla\n"
  26. "  [2] bla, bla, bla\n"
  27. "  [3] bla, bla, bla\n"
  28. "  [4] Salir\n\n"
  29. "Elija una opcion: " );
  30. scanf( "%d", &option );
  31. printf( "\n" );
  32.  
  33. switch ( option) {
  34. case 1:
  35. printf( "Intro valor 1: ");
  36. scanf( "%lf", &x );
  37. printf( "Intro valor 2: ");
  38. scanf( "%lf", &y );
  39. f1( x, y );
  40. break;
  41. case 2:
  42. printf( "Intro valor 1: ");
  43. scanf( "%lf", &x );
  44. printf( "Intro valor 2: ");
  45. scanf( "%lf", &y );
  46. printf( "Intro valor 3: ");
  47. scanf( "%lf", &z );
  48. f2( x, y, z );
  49. break;
  50. case 3:
  51. printf( "Intro valor 1: ");
  52. scanf( "%lf", &x );
  53. printf( "Intro valor 2: ");
  54. scanf( "%lf", &y );
  55. printf( "Intro valor 3: ");
  56. scanf( "%lf", &z );
  57. f3( x, y, z );
  58. break;
  59. case 4:
  60. break;
  61. default:
  62. break;
  63. }
  64. }
  65. }
  66.  
  67. double f1( double x, double y ) {
  68.  
  69. return 0;
  70. }
  71.  
  72. double f2( double x, double y, double z ) {
  73.  
  74. return 0;
  75. }
  76.  
  77. double f3( double x, double y, double z ) {
  78.  
  79. return 0;
  80. }

En el menú, en los "bla, bla, bla" obviamente vas a colocar el texto de las opciones 1, 2 y 3  (ponlos a tu gusto). Por otra parte, ahora debes hacer el código de las funciones f1, f2, f3 que se encargan de las rutinas para cada una de esas opciones.

El funcionamiento del menú en sí es el siguiente: Se cuenta con una variable de control option la cual indica qué opción eligió el usuario. El menú se vuelve a mostrar tras haber elegido cada opción, de manera indefinida hasta que se elige la opción 4 (salir). Para está el cilo "while" que ves allí.

Te puse los prototipos de las funciones f1, f2, f3 más o menos como me imagino que deben ser para tu propósito, asimismo me tomé la libertad de incluir las cabeceras <string.h> y <math.h> ya que muy probablemente usarás funciones de esas bibliotecas.

Ahora a echar mano al resto, y .... bienvenido al mundo de C
218  Programación / Programación C/C++ / Re: Qt o wxWidget en: 9 Febrero 2014, 18:28 pm
Si es multiplataforma, o sea, si debe correr en Windows y en Linux tendrás que crear funciones que proporcionen una interfaz "transparente" al usuario sobre el tipo de plataforma. O sea, unas funciones cuyo prototipo sea igual en ambos casos.

Pero estas funciones llamarán "por debajo" a otras funciones que sí serán exclusivas de un sistema o de otro. Aquí, deberás disponer de ficheros de cabecera adaptados a un tipo o a otro. Al momento de compilar, deberán declarase ciertas macros que le dirán al compilador cuál fichero de cabecera usar. Algo como:

Código
  1. #ifdef _LINUX_
  2.    #include <linux_graphics.h>
  3. #endif
  4. #ifdef _WIN_
  5.    #include <win_graphics.h>
  6. #endif

y debes especificar la macro _LINUX_ o _WIN_ al momento de compilar. Para Windows:

Código:
g++ -o mi_ejecutable fuente1.cpp fuente2.cpp fuente3.cpp -D_WIN_

y para Linux:

Código:
g++ -o mi_ejecutable fuente1.cpp fuente2.cpp fuente3.cpp -D_LINUX_

Bueno, esta es una idea general de cómo puedes hacerlo portable (y una idea realista, porque así es como he visto que trabajan las distribuciones verdaderas). Pero obviamente aún falta mucho trabajo por hacer.
219  Programación / Programación C/C++ / Re: Programa que identifique que tipo de dato se introduce C++ en: 9 Febrero 2014, 18:22 pm
Interesante la solución de minari!!!

Como lo que se introduce es una cadena, un programa personalizado podría decidir si se intentó introducir un short, int, long, float, etc. Al estilo quizá de VisualBasic.

Aunque yo sólo añadiría que en el código se usan algunas características C++ no indispensables, uno podría intentar ---como ejercicio---, traducir todo a C puro. Porque si no es esencial usar clases, ¿por qué C++ u no C?

De hecho, leí una vez que supuestamente el código compilado "tipo C" se ejecuta más rápida y eficientemente que el código compilado como "tipo C++". ¿Qué saben de esto?
220  Programación / Programación C/C++ / Re: es posible concatenar un array byte? en: 9 Febrero 2014, 18:12 pm
x64Core, es cierto lo que dices, la rotación es más rápida.

El código podría entonces quedar así, para concatenar 2 bytes en un entero de 16bits:

Código:
unsigned short word1;
 
word1 = (unsigned short) buffer[1] << 8 + buffer[0];

Para concatenar 4 bytes bajo la forma de un entero de 32 bits, sería:

Código:
unsigned long int dword1;
char buffer[4];
 
/* luego convertimos */
dword1 = (unsigned long )buffer[3] << 24 + (unsigned long )buffer[2] << 16 + (unsigned long )buffer[1] << 8 + buffer[0];

Pero yo no sabría garantizar de forma absoluta la infalibilidad de este código. Lei en un libro que las operaciones a nivel de bits son "altamente dependientes de máquina", por lo que pudieran tener un comportamiento indeseado dependiendo de la arquitectura.

Como dijo otro usuario, en algunos sistemas el byte bajo es el menos significativo, mientras en otros sistemas es el más significativo, por eso cuando hablamos de "desplazamiento de bits hacia la izquierda", ¿desplaza al byte más alto o al más bajo?

Pero suponemos que al hacer el cast explícito (unsigned sort), ---el cual es indispensable en cualquier caso---, el compilador entiende que la variable en cuestión ocupa dos bytes de memoria y debe hacer el desplazamiento de bits hacia el byte más significativo, sea que este ocupe la posición más baja o más alta de memoria, dependiendo de la máquina donde esté implementado el programa. Y similarmente con el caso de los enteros de 32 bits.

Pero es una suposición mía, no lo puedo asegurar al 100%. Por ello propuse la solución basada en multiplicación, que creí más segura.
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines