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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17
21  Programación / Programación C/C++ / Re: Descomponer numero en factores.. en: 13 Febrero 2013, 22:43 pm
Al colocar los paréntesis lo que haces es llamar al constructor por defecto. Es decir que si hay constructor predeterminado o definido por el usuario, vamos a poder inicializar la variable a la hora de declararla.

Citar
If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.
22  Programación / Java / Re: AYUDA porfavor con este problema en Java sobre Matriz en: 13 Febrero 2013, 22:02 pm
Tu firma me la recordaba cada clase mi profesor de prácticas de Sistemas Operativos xDD
23  Programación / Programación C/C++ / Re: Optimizacion de codigo en C. en: 10 Febrero 2013, 03:50 am
En general el código está bien. Las funciones no sobrepasan un Xterm (23 líneas).

¿Qué cosas modificaría? Pues generalizar ese problema para mostrar los factoriales de 0 a N con una constante:

Código
  1. /* Se despliegan los factoriales de los numeros del 0 al N, se utiliza la recursividad para calcularlos */
  2. #include <stdio.h>
  3.  
  4. #define N 15
  5.  
  6. /* Prototipo de funcion */
  7. long calculaFactorial( long numero );
  8. void muestraLlamadasRecursivas( long numero );
  9.  
  10. /* Inicia la ejecucion del programa */
  11. int main()
  12. {
  13.  
  14. int i; /* Contador */
  15.  
  16. printf( "\n\n***Este programa imprime los factoriales de los numeros del 0 al %d\n", N );
  17. printf( "y sus llamadas recursivas a la funcion que calcula los mismos.\n" );
  18. printf( "Este programa se crea con la finalidad de hacer que sea mas facil\n" );
  19. printf( "entender el tema de recursividad***\n\n" );
  20.  
  21. /* Repite N+1 veces; durante cada iteracion calcula el factorial de i y lo despliega en pantalla */
  22. for ( i = 0; i <= N; i++ )
  23. {
  24. printf( "%d! = %ld\n", i, calculaFactorial( i ) ); /* Imprimimos el valor del factorial */
  25. muestraLlamadasRecursivas( i ); /* Llamamos a la funcion que imprime las llamadas a funcion */
  26. }
  27.  
  28. return 0; /* Terminacion exitosa */
  29.  
  30. } /* Fin de main */
  31.  
  32. /* Definicion recursiva de la funcion factorial */
  33. long calculaFactorial( long numero )
  34. {
  35. /* Caso base */
  36. if ( numero <= 1 ) {
  37. return 1;
  38. } /* Fin de if */
  39. else { /* Paso recursivo o llamada recursiva */
  40. return ( numero * calculaFactorial( numero - 1 ) );
  41. } /* Fin de else */
  42. } /* Fin de la funcion factorial */
  43.  
  44. void muestraLlamadasRecursivas( long numero )
  45. {
  46. static int contadorEspacios = 1; /* es static para que el valor no se destruya entre las llamadas recursivas a funcion */
  47. int contador = contadorEspacios; /* Variable que determinara el numero de espacios a imprimir */
  48.  
  49. for ( contador; contador >= 1; contador-- ) { /* Imprimimos los espacios correspondientes */
  50. printf( " " );
  51. } /* Fin de for */
  52.  
  53. if ( numero <= 1 ) {
  54. printf( "1\n" );
  55. printf( "-------------------\n" );
  56. }
  57. else {
  58. printf( "%ld * factorial( %ld - 1 )\n", numero, numero ); /* Imprimimos la llamada recursiva */
  59. contadorEspacios++; /* Agregamos 1 a la variable de espacios */
  60. muestraLlamadasRecursivas( numero - 1 ); /* Llamamos recursivamente a la funcion */
  61. }
  62.  
  63. contadorEspacios = 1; /* Reestablecemos la variable a 1 para que no se vallan a imprimir los espacios ya calculados en el factorial anterior*/
  64. } /* Fin de funcion muestraLlamadasRecursivas */
  65.  
  66.  

En este caso no es recomendable usar recursividad porque derrochamos demasiada memoria con cada cambio de contexto, aunque está bien de forma didáctica (para comprender la recursividad y porque generalmente el código es mucho más inteligible).

Y si preguntas por reestructurar... dividiría el main en dos funciones: 1 para el título y otra para el proceso principal, aunque no es imprescindible.

Por último, tus comentarios están bien pero son excesivos. Para alguien al que le vas a explicar algo nuevo están bien pero pero hay que mantenerlos escuetos y tratar de no poner comentarios innecesarios.

En conclusión, es un código interesante para comprender como funciona la recursividad pero inviable en un código optimizado.

¡Enhorabuena!
24  Programación / Programación C/C++ / Re: Comparar arrays en C en: 8 Febrero 2013, 17:15 pm
Depende en qué manera desees comparar dos strings. En C existe la función strcmp(const char [], const char []) (de la librería string.h) que hace una comparación ASCII.

Según el criterio de comparación ASCII strcmp(s1,s2) devuelve:

salida = 0, si y sólo si, todos los caracteres de s1 son idénticos a los caracteres de s2. (Implícitamente se ve que la longitud de s1 es igual a la longitud de s2, pero la longitud no indica el orden de s1 respecto de s2).
salida > 0, si y sólo si, recorriendo los caracteres de s1 y s2 simultáneamente (de 0 a n-1) nos encontramos que s1_i > s2_i (comparando el nº ASCII) siempre y cuando no se cumpla que para cualquier s1_j < s2_j (j<i).
salida < 0, en otro caso. (si s1 es menor que s2)

Resumiendo: strcmp devuelve ->
 0 si s1 = s2
 1 si s1 > s2
-1 si s1 < s2

Piensa en cómo quieres comparar esos dos char arrays y luego diseña una función que lo haga.
25  Programación / Java / Re: Servidor y Cliente UDP - echo test en: 8 Febrero 2013, 14:03 pm
Me respondo a mí mismo por si a alguien más le ayuda.

Al construir el DatagramSocket del servidor debí haber especificado el puerto (que se pasa como primer y único argumento al servidor) en el constructor.
26  Programación / Java / Re: [Novato] Problema con do-while en codigo sencillo en: 7 Febrero 2013, 21:53 pm
No he leído el código en absoluto, simplemente he corregido un error de sintaxis que tú mismo sabías y deberías haber corregido :P

Procura identar el código y seguir un estilo al programar. La tarea de programar no trata sólo de escribir líneas de código.

¡Saludos! y si no te funciona trata de averiguar por qué y, lo más importante, trata de solventarlo por ti mismo ;)

Código
  1. package juegomoneda;
  2.  
  3. import java.util.Random;
  4. import java.util.Scanner;
  5.  
  6. public class LanzarMoneda {
  7.  
  8.    private int cara;
  9.    private int cruz;
  10.    Scanner t = new Scanner(System.in);
  11.  
  12.    public void jugar()
  13.    {
  14.        // creamos la variable que represente la primera decision(opc)
  15.        String opc;
  16.  
  17.        bienvenida(); // llamamos al metodo bienvenida para que de la bienvenida al usuario
  18.  
  19.        // pedimos que se elija una opcion
  20.        System.out.println("Eliga una opcion");
  21.        System.out.println("Escriba 'L' para lanzar la moneda o");
  22.        System.out.println("Escriba 'S' para salir");
  23.        opc = t.nextLine();
  24.  
  25.        // si la opcion elegida es 'Salir' imprimimos un mensaje de salida
  26.        if("S".equals(opc))
  27.        {
  28.            System.out.println("Ha decido salir");
  29.            System.out.println("No se inicio el juego");
  30.  
  31.            // si la opcion elegida es 'Lanzar' tiramos la moneda
  32.            if("L".equals(opc))
  33.            {
  34.                // llamamos al metodo tirar que devuelve true si cae cara o false si cae cruz
  35.                // almacenamos el resultado en la variable boolean resultado, si el valor devuelto
  36.                // es true, aumentamos cara en 1, y si es false aumentamos cruz en 1
  37.  
  38.                boolean resultado = tirar();
  39.                if(resultado == true)
  40.                cara++;
  41.                else
  42.                cruz++;
  43.  
  44.            }
  45.            segundoTiro();
  46.        }
  47.    }
  48.  
  49.    // metodo que da la bienvenida al juego
  50.  
  51.    public void bienvenida()
  52.    {
  53.        System.out.println("Bienvenido al juego 'Lanza la moneda'");
  54.    }
  55.  
  56.    // metodo tirar, tira una moneda, si cae cara devuelve true, si cae cruz devuelve false
  57.  
  58.    public boolean tirar()
  59.    {
  60.        Random generadorAleatorio = new Random();
  61.        int moneda = 1 + generadorAleatorio.nextInt(2);
  62.  
  63.        if(moneda == 1)
  64.        return true;
  65.        else
  66.        return false;
  67.    }
  68.  
  69.    public void segundoTiro()
  70.    {
  71.        String opc2;
  72.        boolean resultado;
  73.  
  74.        do {
  75.        // y preguntamos al usuario si quiere lanzarla nuevamente
  76.  
  77.        System.out.println("Desea Lanzar la moneda otra vez");
  78.        System.out.println("'Y' para si y 'N' para no");
  79.        opc2 = t.nextLine();
  80.  
  81.        if("Y".equals(opc2))
  82.        {
  83.            // Hacemos lo mismo, llamar al metodo tirar y aumentar si es cara o cruz
  84.            resultado = tirar();
  85.            if(resultado == true)
  86.            cara++;
  87.        }
  88.        else
  89.        {
  90.            cruz++;
  91.        }
  92.        } while("Y".equals(opc2)); // Se repite el lanzamiento mientras la opcion elegida sea //'Si, Lanzar'
  93.  
  94.        // Si despues del 1er tiro el usuario no quiere seguir jugando, imprimimos un //mensaje de salida
  95.        // e imprimimos los resultados del juego
  96.  
  97.        if("N".equals(opc2))
  98.        {
  99.            System.out.println("Ha decido salir");
  100.            System.out.println("Usted saco "+cara+ "caras y "+cruz+" cruces");
  101.        }
  102.    } // Esta llave debería indicar el fin del método segundoTiro
  103. } // Y esta el fin de la clase
27  Programación / Java / Servidor y Cliente UDP - echo test en: 6 Febrero 2013, 16:30 pm
Bueno, he codificado un cliente-servidor UDP pero mi servidor no logra recibir el paquete datagrama enviado por el cliente ._.

¿Alguna ayudita?

ClienteUDP,java
Código
  1. package proyecto.socketudp;
  2. import java.net.*;
  3. /** Ejemplo que implementa un cliente de eco usando UDP. */
  4. public class ClienteUDP {
  5. public static void main(String argv[]) {
  6. if (argv.length != 3) {
  7. System.err.println("Formato: ClienteUDP <maquina> <puerto> <mensaje>");
  8. System.exit(-1);
  9. }
  10. DatagramSocket sDatagram = null;
  11. try {
  12. // Creamos el socket no orientado a conexión
  13. // (en cualquier puerto libre)
  14. sDatagram = new DatagramSocket();
  15. // Establecemos un timeout de 30 segs
  16. sDatagram.setSoTimeout(30000);
  17. // Obtenemos la dirección IP del servidor
  18. // (recibida en el primer argumento por linea de comandos)
  19. InetAddress dirServidor = InetAddress.getByName(argv[0]);
  20. // Obtenemos el puerto del servidor
  21. // (recibido en el segundo argumento por linea de comandos)
  22. int puertoServidor = Integer.parseInt(argv[1]);
  23. // Obtenemos el mensaje
  24. // (tercer argumento de la linea de comandos)
  25. String mensaje = argv[2];
  26.  
  27. byte[] envInfo = new byte[1024];
  28.       envInfo = mensaje.getBytes();
  29. // Preparamos el datagrama que vamos a enviar y lo enviamos
  30. DatagramPacket envPaquete = new DatagramPacket(
  31. envInfo, envInfo.length,
  32. dirServidor, puertoServidor
  33. );
  34. // Enviamos el datagrama
  35. sDatagram.send(envPaquete);
  36. System.out.println(
  37. "CLIENTE: Enviando "
  38. + new String(envPaquete.getData()) + " a "
  39. + envPaquete.getAddress().toString() + ":"
  40. + envPaquete.getPort()
  41. );
  42.  
  43. // Preparamos el datagrama de recepción
  44. byte[] recInfo = new byte[1024];
  45. DatagramPacket recPaquete = new DatagramPacket(recInfo, recInfo.length);
  46. // Recibimos el mensaje
  47. sDatagram.receive(recPaquete);
  48. System.out.println(
  49. "CLIENTE: Recibido "
  50. + new String(recPaquete.getData(), 0, recPaquete.getLength())
  51. + " de " + recPaquete.getAddress().toString() + ":"
  52. + recPaquete.getPort()
  53. );
  54. } catch (SocketTimeoutException e) {
  55. System.err.println("30 segs sin recibir nada");
  56. } catch (Exception e) {
  57. System.err.println("Error: " + e.getMessage());
  58. } finally {
  59. // Cerramos el socket para liberar la conexión
  60. sDatagram.close();
  61. }
  62. }
  63. }

ServidorUDP.java
Código
  1. package proyecto.socketudp;
  2.  
  3. import java.net.*;
  4. /** Ejemplo que implementa un servidor de eco usando UDP. */
  5. public class ServidorUDP {
  6.    public static void main(String argv[]) throws SocketException {
  7.        if (argv.length != 1) {
  8.            System.err.println("Formato: ServidorUDP <puerto>");
  9.            System.exit(-1);
  10.        }
  11.        try {
  12.            // Creamos el socket datagrama
  13.            DatagramSocket sDatagram = new DatagramSocket(Integer.parseInt(arv[0]));
  14.            // Establecemos un timeout de 30 segs
  15.            sDatagram.setSoTimeout(30000);
  16.            byte array[] = new byte[1024];
  17.            DatagramPacket dgramRec, dgramEnv = null;
  18.            while (true) {
  19.                // Preparamos un datagrama para recepción
  20.                dgramRec = new DatagramPacket(array, array.length);
  21.  
  22.                // Recibimos el mensaje
  23.                sDatagram.receive(dgramRec);
  24.  
  25.                // Recabamos informacion
  26.                String mensaje = new String(dgramRec.getData());
  27.                InetAddress dirCliente = dgramRec.getAddress();
  28.                int puertoCliente = dgramRec.getPort();
  29.  
  30.                System.out.println(
  31.                    "SERVIDOR: Recibido "
  32.                    + new String(dgramRec.getData(), 0, dgramRec.getLength())
  33.                    + " de " + dirCliente.toString() + ":"
  34.                    + puertoCliente
  35.                );
  36.  
  37.                // Preparamos el datagrama que vamos a enviar
  38.                dgramEnv = new DatagramPacket(
  39.                    mensaje.getBytes(), mensaje.getBytes().length,
  40.                    dirCliente, puertoCliente
  41.                );
  42.  
  43.                // Enviamos el mensaje
  44.                sDatagram.send(dgramEnv);
  45.                System.out.println(
  46.                    "SERVIDOR: Enviando"
  47.                    + new String(dgramEnv.getData(), 0, dgramEnv.getLength())
  48.                    + " de " + dgramEnv.getAddress().toString() + ":"
  49.                    + dgramEnv.getPort()
  50.                );
  51.            }
  52.        } catch (SocketTimeoutException e) {
  53.            System.err.println("30 segs sin recibir nada");
  54.        } catch (Exception e) {
  55.            System.err.println("Error: " + e.getMessage());
  56.        }
  57.    }
  58. }
28  Programación / Programación C/C++ / Re: Como declarar un char[] en: 21 Enero 2013, 01:42 am
char ** linea: equivalente a un array de strings pero de forma dinámica

Lo único que tienes que hacer es alocar memoria mientres necesites hacerlo o, por el contrario, eliminarla cuando no la necesites.

El coste espacial es mayor / elemento almacenado que de manera estática pero te evitas estimar un tamaño, aunque sabiendo que es de un GB y sabiendo el tamaño de línea...

Haz pruebas con algún archivo pequeñito y según los resultados que obtengas aplícalo al de 1GB.
29  Programación / Programación C/C++ / Re: [Ayuda] Programa con Punteros en C en: 20 Enero 2013, 02:01 am
jack09, perdón por no leer el código pero estoy vago xD. Por otra parte la función buscar es una locura.

Ten en cuenta la siguiente frase: "Si algo es difícil es que está mal". Aunque parezca una tontería a mí me ayuda bastante xD.

Lo necesario para este ejercicio es conocer las coordenadas de 2 y 3. Luego podemos tener:

Código
  1. typedef struct {
  2. x,y:unsigned int; // matriz
  3. } Punto;
  4.  

Y tener p2 y p3 de tipo Punto. Buscar significa recorrer la matriz y si encontramos a 2, guardar las coordenadas en p2 y, por el contrario, si encontramos a 3, guardamos las coordenadas en p3:

// No es necesario pasar el tamaño de la segunda dimensión porque se infiere por el tipo int y la longitud de la dimensión 1.

Código
  1. void buscar (int m[3][], Punto *p2, *p3) {
  2.  
  3. int i,j;
  4.  
  5. for (i = 0; i < 3; i++)
  6. for (j = 0; j < 3; j++)
  7. if (m[i][j] == 2) {
  8. p2->x = i;
  9. p2->y = j;
  10. } else if (m[i][j] == 3) {
  11. p3->x = i;
  12. p3->y = j;
  13. }
  14. }
  15.  

Luego, para llegar de 3 a 2 simplemente hay que desplazar p3 hasta p2 teniendo en cuenta las filas y las columnas y que nos acercamos a p2 hasta encontrarnos con él. La primera componente de la matriz identifica a las filas de las mismas y la segunda a las columnas.

No he leído el código de leosansan pero creo que está bien.

¡Suerte!
30  Programación / Programación C/C++ / Re: [Ayuda] Punteros y Arrays en C en: 16 Enero 2013, 15:07 pm
Código
  1. int m[3][3] = {0, 2, 0, 0, 0, 0, 0, 0, 3};

Eso es una matriz unidimensional (aunque los arrays n-dimensionales se almacenen por filas) y no entiendo bien tu pregunta...

Simplemente sigue la aritmética de punteros como haces con los arrays unidimensionales.

Y en tu ejemplo recorres la matriz y cuando encuentras esos valores, asignas sus direcciones a los punteros.

Para recorrer una matriz bidimensional con un puntero...

Código
  1. int main () {
  2. int m[3][3] = { {0, 2, 0},
  3.                        {0, 0, 0},
  4.                        {0, 0, 3}};
  5. int *p;
  6. int i, j;
  7.  
  8. for(i=0; i<3; i++) {
  9.    p = m[i];
  10. for(j=0; j<3; j++){
  11. printf("%d", p[j]);
  12. }
  13. printf("\n");
  14. }
  15.  
  16. return 0;
  17.  
  18. }
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines