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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: 1 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ... 125
301  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 22 Julio 2014, 16:21 pm
no estás enviando nada bajo la variable "contenido"... ¿no será que te está creando el archivo pero lo deja vacío?
302  Programación / Programación C/C++ / Re: Mi programa que dibuja un cuadrado en: 22 Julio 2014, 11:13 am
Dado que el método imprime es privado, creo que sería más conveniente hacer una función en vez de una clase, ya que la clase se quedará en memoria sin hacer nada.

Si la idea es permitir la creación de una escena en la que se van insertando elementos, lo suyo sería que el método "imprime" sea propio del objeto... así cada objeto de la escena sabe cómo ha de pintarse... claro que en tal caso el método debería ser público y únicamente debería ser llamado por un objeto tipo "escena".

Lo que está claro es que no tiene ningún sentido que el método "imprime" sea privado... una clase que únicamente tiene un constructor y un destructor... salvo excepciones contadas, no sirve absolutamente para nada.
303  Programación / Programación C/C++ / Re: como regresar a la anterior forma en visual c++ en: 22 Julio 2014, 09:49 am
Nota incial: No estaría de más que usas comas, puntos, acentos y demás signos ortográficos.

Borland C++ Builder hace uso de la librería propia de Borland, llamada OWL, para representar entornos gráficos de usuario. Si pasas a usar Visual Studio entonces ésta librería ya no está disponible. No obstante, puedes crear entornos gráficos con otras tantas librerías similares:

  • MFC (Microsoft Foundation Class): Es la librería propia de Microsoft. Visual Studio la incorpora en su instalador.
  • API de Windows: Al final todas las librerías de entornos gráficos pasan por el mismo sitio... la API de Windows. Esta librería es de bajo nivel, lo que implica que te permite hacer de todo... el precio a pagar es que su programación es bastante engorrosa.
  • Qt: Inicialmente desarrollado por Trolltech, ha pertenecido a Nokia y actualmente es propiedad de Digia. Es una librería completísima con muchas opciones... y además multiplataforma.
  • wxWidgets: Otra librería multiplataforma. No puedo decir mucho de ella porque aún no he tenido que usarla, aunque nunca está de más saber que hay alternativas.
  • GTK - GTK+: Librería multiplataforma originaria de entornos linux. Es muy usada, sobretodo en Linux.
  • Otras alternativas que puedes encontrar buscando en Internet.

Un saludo.
304  Programación / Programación C/C++ / Re: Teoría + Problema Propuesto en: 22 Julio 2014, 09:39 am
Estás programando en C++... no uses includes de C (los que acaban en .h). La librería de C++ dispone de herramientas más que suficientes como para no tener que depender de la librería de C.

Por ejemplo, para manejar cadenas de caracteres en C++ lo suyo es usar la clase "string". Es mucho más segura y sencilla de manejar que los arreglos de C.

Otro ejemplo podría ser usar el contenedor "vector" en vez de memoria dinámica a pelo...

Además, tu código tiene algunos errores:

Código
  1. while(pal<c){
  2. cin.getline(p[pal], 12);
  3. strlwr(p[pal]);  //  pasa pal a minusculas para luego comparar con 'mar'
  4. pal++; // <<<<<<-------- AQUI!!!!!
  5. if(strcmp(menor,p[pal])>0){
  6. strcpy(menor,p[pal]);
  7. }
  8. }

Si incrementas "pal" antes de hacer la comparación... estás comparando menor con una cadena no definida!!!!

305  Programación / Programación C/C++ / Re: problema con el juego de undir la flota en: 22 Julio 2014, 09:18 am
Necesitas una estructura que te permita almacenar el estado y/o la posición de los barcos:

Código
  1. enum pos
  2. {
  3.  Ninguna,
  4.  Horizontal,
  5.  Vertical
  6. };
  7.  
  8. struct coord
  9. {
  10.  int x;
  11.  int y;
  12. };
  13.  
  14. struct barco
  15. {
  16.  int longitud;
  17.  struct coord coordenadas;
  18.  enum posicion pos;
  19.  int estado;
  20. };

Con esto ya puedes "modelar" cada uno de los barcos. Lo ideal sería tener una instrucción que permitiese crear los barcos. Algo del tipo:

Código
  1. struct barco NuevoBarco( int longitud )
  2. {
  3.  struct barco to_return;
  4.  to_return->longitud = longitud;
  5.  to_return->coordenadas.x = -1; // Para indicar que no esta posicionado
  6.  to_return->coordenadas.y = -1; // Para indicar que no esta posicionado
  7.  to_return->pos = Ninguna;
  8.  to_return->estado = longitud;
  9.  return to_return;
  10. }

En este caso, "estado" almacena la "vida" del barco... si la vida llega a 0, el barco se considera hundido.

Como puedes ver, no uso memoria dinámica para los barcos... no es necesaria.

Una vez tienes la flota creada, lo suyo es posicionarla. Por la cantidad de barcos que hay no se me ocurre una combinación (tampoco voy a buscarla) en la que no se puedan colocar todos los barcos... yo, en primer lugar, crearía los barcos del más grande al más pequeño y, después, intentaría posicionarlos en ese orden.

Una forma de posicionar los barcos pudiera ser: En un bucle, elegir al azar un par de coordenadas  (x,y) y una posición (vertical u horizontal), después compruebas si el barco "entra" en esa posición... y repites el bucle hasta dar con una posición "válida".

Ahora toca inicializar el tablero para borrar la partida anterior si la hubiese.

Una vez has realizado estos pasos el programa está listo para iniciar la partida.

Cada vez que introduces unas coordenadas de disparo puedes hacer los siguientes chequeos:

* Si es una casilla que ya ha sido atacada, se piden nuevas coordenadas
* Se recorre el array de barcos y se comprueba si algún barco se encuentra en la coordenada seleccionada... si es así, actualizas el estado del barco para anotar un "toque". Llegados a este punto, si la vida de 3 barcos es 0, el jugador gana la partida. Si no hay barcos en la coordenada marcada... indicas "agua".

A continuación el prototipo de una función que determine si un barco ha resultado "tocado".

Código
  1. int BarcoTocado( struct barco* barco, struct coord coordDisparo )
  2. {
  3.  if ( barco->pos == Horizontal )
  4.  {
  5.    struct coord coordBarco = barco->coord;
  6.    int i = barco->longitud;
  7.    while ( i > 0 )
  8.    {
  9.      if (coordBarco == coordDisparo )
  10.        return 1;
  11.  
  12.      coordBarco.x++;
  13.      i--;
  14.    }    
  15.  }
  16.  else
  17.  {
  18.    // ...
  19.  }
  20.  
  21.  return 0;
  22. }

Creo que con estas guías debería ser sencillo completar el programa.
306  Programación / Programación C/C++ / Re: Duda en operador ternario ?: en: 21 Julio 2014, 16:14 pm
... por tanto digamos que el true en C es el número 1 y el false el 0.

Pequeño inciso al respecto: false es 0, cualquier otro valor será identificado como true

Código
  1. int main( )
  2. {
  3.  if ( 0 )
  4.    printf( "Este mensaje no sale nunca\n" );
  5.  
  6.  if ( 5 )
  7.    printf( "Este, en cambio, sale siempre\n" );
  8.  
  9.  if ( -4 )
  10.    printf( "Este otro tambien sale siempre\n" );
  11. }
307  Programación / Programación C/C++ / Re: convertir una imagen bmp a png en: 21 Julio 2014, 09:53 am
Y qué clase estás usando para generar el bmp??
308  Programación / Programación C/C++ / Re: Duda en operador ternario ?: en: 21 Julio 2014, 08:11 am
"cuenta % 2" significa "cuenta MOD 2"... es decir, devuelve el módulo 2 del valor de "cuenta" o, dicho de otra forma, el resto de dividir "cuenta" entre 2. De esta forma sólo se pueden obtener dos resultados: 0 si "cuenta" es par y 1 si "cuenta" es impar.

Por tanto, si "cuenta" es par se imprime "+++++", mientras que si "cuenta" es impar, se imprime "****".
309  Programación / Programación C/C++ / Re: Variables Batch en C++ en: 18 Julio 2014, 16:49 pm
tu necesitas:

* putenv: en Linux
* _putenv: en Windows enlace

Al hacer "system" se abre y se cierra una conexión de consola, al cerrarse dicha sesión se pierden los valores temporales, por eso no te funciona.

310  Programación / Programación C/C++ / Re: Temporizadores en: 18 Julio 2014, 12:49 pm
No es un mecanismo excesivamente depurado pero sirve para la ocasión:

Lo primero que necesitamos es una clase que nos permita "controlar" la entrada del teclado.

Para nuestra desgracia, el estándar de C++ no ayuda, ya que los mecanismos de entrada no van a devolver ningún dato hasta que el usuario presione la tecla "enter". Por este motivo nos tenemos que pegar con mecanismos menos portables... para la ocasión he usado la tan odiada "conio". Si alguien se lo quiere currar más está en su perfecto derecho.

El método run de la clase es bastante simple... cuando se presiona una tecla, activa un flag que indica la intención del usuario de introducir un número... cuando se introduce un carácter se actualiza el número introducido (esta versión no admite backspace)... cuando se introduce un enter se almacena el número y se sale de la función.

Código
  1. class DataManager
  2. {
  3.  public:
  4.  
  5.    DataManager( ) = default;
  6.  
  7.    DataManager( const DataManager& ) = delete;
  8.  
  9.    ~DataManager( ) = default;
  10.  
  11.    void Run( )
  12.    {
  13.      int temp_number = 0;
  14.  
  15.      while ( true )
  16.      {
  17.        char c = getch( );
  18.        _withData = true;
  19.  
  20.        if ( c != '\n' && c != '\r' )
  21.        {
  22.          std::cout << c;
  23.          temp_number *= 10;
  24.          temp_number += c - '0';
  25.        }
  26.        else
  27.        {
  28.          std::cout << std::endl;
  29.          _number = temp_number;
  30.          break;
  31.        }
  32.      }
  33.    }
  34.  
  35.    bool WithData( ) const
  36.    { return _withData; }
  37.  
  38.    int Number( ) const
  39.    { return _number; }
  40.  
  41.    const DataManager& operator=( const DataManager& ) = delete;
  42.  
  43.  private:
  44.  
  45.    bool _withData = false;
  46.    int _number = 0;
  47. };

Después necesitamos una clase para llevar de forma sencilla el conteo del tiempo... algo del tipo:

Código
  1. class Timer
  2. {
  3.  public:
  4.    using milliseconds = std::chrono::milliseconds;
  5.  
  6.    Timer( )
  7.    {
  8.      Reset( );
  9.    }
  10.  
  11.    Timer( const Timer& ) = delete;
  12.  
  13.    ~Timer( ) = default;
  14.  
  15.    void Reset( )
  16.    {
  17.      _start = std::chrono::high_resolution_clock::now( );
  18.    }
  19.  
  20.    milliseconds Elapsed( ) const
  21.    {
  22.      return std::chrono::duration_cast< milliseconds >( std::chrono::high_resolution_clock::now( ) - _start );
  23.    }
  24.  
  25.    const Timer& operator=( const Timer& ) = delete;
  26.  
  27.  private:
  28.    std::chrono::high_resolution_clock::time_point _start;
  29. };

Cuando se crea la clase se registra el tiempo y llamando a "Elapsed" se devuelve el número de milisegundos desde ese instante. Reset vuelve a inicializar la clase.

Con estos ingredientes ya tenemos casi todo el trabajo echo... solo nos falta mezclarlos convenientemente en el main:

Código
  1. int main( )
  2. {
  3.  std::cout << "Introduce un numero." << std::endl;
  4.  std::cout << "Tienes 5 segundos para empezar" << std::endl;
  5.  
  6.  DataManager manager;
  7.  
  8.  std::thread thread{ [](DataManager* mgr){ mgr->Run( ); }, &manager };
  9.  
  10.  Timer timer;
  11.  while ( timer.Elapsed( ) < std::chrono::seconds{ 5 } )
  12.  {
  13.    if ( manager.WithData( ) )
  14.      break;
  15.  }
  16.  
  17.  if ( !manager.WithData( ) )
  18.    thread.detach( );
  19.  else
  20.    thread.join( );
  21.  
  22.  if ( manager.WithData( ) )
  23.    std::cout << "Has introducido el numero: " << manager.Number( ) << std::endl;
  24.  else
  25.    std::cout << "No has introducido ningun numero." << std::endl;
  26. }

Para controlar la entrada del teclado se crea un hilo. Después se inicializa el temporizador y se mantiene una espera activa de 5 segundos. La idea del temporizador en vez de un sleep es para que la aplicación pueda responder instantáneamente si el usuario introduce el número antes de 5 segundos.

Pasado el tiempo de espera activa se comprueba si el usuario ha hecho al menos el amago de introducir un número... si es así entonces espera pacientemente a que el usuario termine de introducir el número... en caso contrario finaliza el hilo y muestra el mensaje correspondiente.

Como he comentado antes, es algo muy mejorable. El ejemplo lo he realizado a petición de vangodp y sirve solo con fines ilustrativos.

PD.: utiliza funciones propias de C++11, ojo con los compiladores no compatibles.
Páginas: 1 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines