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 ... 125
11  Programación / Programación C/C++ / Re: [APORTE] Programa para una tienda en: 27 Abril 2015, 09:05 am
Buenos días.

Si me aceptas la crítica:

1. La lógica de tu "programa" no debería residir en un constructor. Eso es, por decirlo de forma suave, una aberración. Es mucho mejor tener un método público en "programa" para realizar esta tarea.

2. Separas interfaz de implementación... pero ya está. Creo que el ejemplo sería más útil si separases además la lógica de presentación de la lógica de negocio.

3. Llamar al constructor de la clase desde un miembro sin crear una instancia nueva es otra aberración consecuencia directa de lo comentado en el punto 1. Otro motivo más para cambiar eso.

4. Si una función miembro de una clase no modifica el estado del objeto lo suyo es que sea etiquetada como "const". Si además resulta que dicha función no accede al estado del objeto (las variables miembro de la clase), lo lógico es que dicha función fuese etiquetada como "static". Por cierto, no puedes usar "static" y "const" a la vez en la misma función miembro (básicamente porque una función static no puede acceder, y por tanto modificar, a nada que no sea estático... de hecho en esta función no existirá el puntero implícito "this").

Te animo a seguir mejorando el ejemplo ;)

Un saludo
12  Programación / Programación C/C++ / Re: Ayuda con c++ vectores en: 23 Abril 2015, 09:06 am
Lo primero. El código tiene que ir "decorado" con la etiqueta del lenguaje correspondiente. Básicamente para que sea legible y porque lo dicen las normas. Puedes encontrar estas etiquetas en el desplegable que dice "GeSHi" en el editor de mensajes.

C++, como has visto, es un lenguaje en el que se pueden usar objetos. Además, el lenguaje dispone de una librería estándar que, si bien no te va a permitir realizar una aplicación gráfica, dispone al menos de una serie de clases muy útiles para tus programas. Los contenedores son un ejemplo de estas clases. Un contenedor te permite almacenar un número indeterminado de elementos. Esto último supone una gran ventaja sobre los arreglos típicos de C (int numeros[30] no puede almacenar más de 30 números).

Lo que te piden es que almacenes los datos en contenedores en vez de usar un archivo.
13  Programación / Programación C/C++ / Re: Perdido y desesperado con este código en: 22 Abril 2015, 08:46 am
1. Variables no inicializadas

Código
  1. if (comprobar_repetir_vector(num_random, clave)==1)

Código
  1. int comprobar_repetir_vector(int numero, int *vector )
  2. {
  3. int x;
  4. for(x=0; x<27;x++)
  5.  {
  6. if(numero==vector[x])
  7. return 1;
  8. }
  9. return 0;
  10. }
  11.  

Si te das cuenta, no estás dando a "clave" unos valores iniciales... simplemente le asignas un valor y después verificas que dicho valor no esté repetido. ¿Problemas? Varios:

  • "clave" tendrá inicialmente valores aleatorios. Si uno de estos valores coincide con el que intentas ingresar el algoritmo dará este nuevo valor como no válido.
  • No tiene sentido que para cada valor que intentas añadir a "clave" compruebes sus 27 posiciones... lo suyo sería comprobar desde 0 hasta N-1, siendo N el índice del número actual. De esta forma únicamente comparas el número actual con los ya insertados en el arreglo. Corrigiendo este punto podrías olvidarte del problema del punto anterior
  • No es buena idea tener el "27" a pelo en el código. ¿Qué sucede si luego tienes que crear una clave de 40 elementos? Te toca editar ese número en varias partes del código... es bastante recomendable tener estos valores en un #define para evitar errores

2. Cuidado con los decimales

Cuando trabajes con números decimales (float, double, ... ) tienes que tener muy en cuenta que NUNCA debes hacer una comparación directa, tipo "if( float == float )". ¿Por qué? Bueno, pues porque un número en coma flotante nunca va a ser 100% preciso. Los números en coma flotante tienen una serie de dígitos significativos, mientras que el resto pueden ser considerados "basura". Si tu fuerzas a una comparación exacta, esa basura va a hacer que la comparación sea bastante inestable. La forma de comparar si un número decimal es igual a otro pasa por asumir que dos números son iguales si el resto entre ellos es menor a X. Ejemplo:

Código
  1. int main( )
  2. {
  3.  // Un float nunca es preciso 100%.
  4.  // Esta inicialización intenta reflejar esta situación
  5.  float a = 5.0001, b;
  6.  for( b=1.0; b < 10.0; b+=1.0 )
  7.  {
  8.    if( a == b )
  9.    {
  10.      printf( "Bucle 1 OK!!!\n" );
  11.      break;
  12.    }
  13.  }
  14.  
  15.  for( b=1.0; b < 10.0; b+=1.0 )
  16.  {
  17.    if( fabs( a - b ) < 0.001 )
  18.    {
  19.      printf( "Bucle 2 OK!!!\n" );
  20.      break;
  21.    }
  22.  }
  23. }

¿Dónde realizas este tipo de comprobaciones? Por ejemplo en la función "suma", que se llama desde "arrancar_motor"... esa es, al menos, una de las razones por las que el código "tarda mucho".

Un saludo
14  Programación / Programación C/C++ / Re: numero perfecto en: 21 Abril 2015, 17:22 pm
Aparte de lo comentado, dos cositas más:

  • El código lo tienes que decorar eligiendo el lenguaje correspondiente en el desplegable que dice "GeSHi". Te crea dos etiquetas, una de apertura y otra de cierre... el código lo pegas dentro.
  • Editar un mensaje tiene sentido cuando nadie te ha respondido aún... si ya tienes respuesta, casi mejor añadir una respuesta al hilo para que éste tenga cierta coherencia.

Un saludo.
15  Programación / Programación C/C++ / Re: [?] Qt vs wxWidgets en: 21 Abril 2015, 13:30 pm
wxWidgets está centrado únicamente en el desarrollo de interfaces gráficas, mientras que Qt es un framework completo con miles de utilidades:

  • Interfaz gráfica
  • Gestión de impresoras
  • Sockets
  • Bases de datos
  • Interacción con opengl
  • ...

Bien es cierto que dominar todo este chiringuito no es algo que se vaya a conseguir en dos días... pero la verdad es que Qt te ofrece unas librerías muy cuidadas y potentes. Podría decirse que Qt es una especie de C++ orientado hacia Java y .Net.

Si bien crear un proyecto de Qt con QtCreator es de las cosas más sencillas del mundo, configurar otro IDE para que compile satisfactoriamente un proyecto de Qt puede ser un tanto desalentador. Aun así, yo creo que merece la pena probarlo.
16  Programación / Programación C/C++ / Re: numero perfecto en: 16 Abril 2015, 08:55 am
Pues mira que bien, ya tienes trabajo para casa, y además parece interesante.

¿pensabas que te íbamos a dar la solución así por las buenas?

A ver, una cosa es ayudar y otra hacer un trabajo a medida... ahora, si quieres presupuesto para hacerte la tarea seguro que más de uno te pasa un precio.

Un saludo
17  Programación / Programación C/C++ / Re: Type FILE en: 14 Abril 2015, 15:13 pm
Deberías buscar un manual de C por Internet.

Una cosa es tener dudas sobre cómo funciona un código y otra es preguntar cosas tan básicas que cualquier manual de C te sabe explicar.
18  Programación / Programación C/C++ / Re: Type FILE en: 14 Abril 2015, 12:17 pm
Cuando abres un archivo, puedes usar, por ejemplo fopen... si echas un vistazo a la documentación de esta función verás que tienes que indicar la ruta del archivo a abrir además de las restricciones con las que abres el fichero (solo lectura, crear si no existe, etc).

Y esto, básicamente, creo que responde a tus dudas:

* ¿Dónde se encuentran? Donde tú hayas indicado. Si has indicado una ruta relativa tendrás que mirar cual es el directorio de trabajo y empezar a trazar la ruta relativa a partir de ahí.
* ¿Hay que crearlos para que se sobreescriban? No necesariamente... una de las opciones a la hora de abrirlo es que se borre su contenido.
* ¿Dónde los guardo? Donde te de la gana. Sin embargo, recuerda que determinadas rutas pueden tener restricciones de acceso, como determinadas carpetas del sistema. Los únicos requisitos son tener espacio en el disco y permisos de escritura en la carpeta destino y al fichero en el caso de modificaciones.

Un saludo.
19  Programación / Programación C/C++ / Re: listas enlazadas simples en: 14 Abril 2015, 07:52 am
Las GeSHi te explico: Habrás notado que, al escribir un mensaje, tienes una serie de botones encima del TextBox para, por ejemplo, poner el texto en negrita, cursiva o subrayado, elegir la alineación del texto, etc... uno de esos controles es un ComboBox con el texto GeSHi. Si despliegas esa lista verás que aparece el nombre de varios lenguajes de programación... elijes el que corresponda y te añadirá un par de etiquetas (una de apertura y otra de cierre) a tu mensaje... pon el código entre medias y listo. También funciona si pones el código, lo seleccionas y luego elijes el idioma en el desplegable.

Para borrar un elemento de una lista tienes 3 posibilidades:

1. El elemento a borrar es el primero. Tienes que hacer que el puntero de inicio de la lista pase al siguiente elemento:
A -> B -> C -> NULL ==> B -> C -> NULL

2. El elemento a borrar es el último. Simplemente pones a NULL el puntero "sig" del penúltimo elemento:
A -> B -> C -> NULL ==> A -> B -> NULL

3. El elemento está en el medio de la lista. En este caso tienes que hacer que el puntero "sig" del elemento anterior apunte al elemento que sigue al actual:
A -> B -> C -> NULL ==> A -> C -> NULL

En cualquiera de los tres casos no te olvides de liberar la memoria del elemento recién liberado.

Para liberar la memoria reservada por un malloc (o calloc o realloc) tienes que usar la función free:

Código
  1. // Reserva de memoria
  2. int* ptr = (int*)malloc( 100 *sizeof( int ) );
  3.  
  4. // Se libera la memoria. Vuelve a estar disponible
  5. free( ptr );

Un saludo
20  Programación / Programación C/C++ / Re: listas enlazadas simples en: 13 Abril 2015, 17:13 pm
Línea 33: scanf ( "n%c", &item ); <<-- debería ser \n

Línea 136: currentPtr = currentPtr->NextPtr; <-- esa 'n' debería ir en minúsculas

Código
  1.  instruccions();
  2.  scanf ( "%d", &choice );
  3.  
  4.  while ( choice != 3 )
  5.  {
  6.    // ...
  7.  
  8.    printf ( "?" );
  9.    scanf( "%d", &choice );
  10.  }
  11.  

Por qué actualizar "choice" en dos sitios diferentes??

si usas "do-while" en vez de "while" puedes eliminar uno de los usos... además, sería recomendable poner las instrucciones siempre salvo que pretendas que el usuario se las apunte nada más arrancar el programa:

Código
  1.  do
  2.  {
  3.    instruccions();
  4.    scanf ( "\n%d", &choice );
  5.  
  6.    // ...
  7.  } while ( choice != 3 );
  8.  

Claro, ahora tienes que añadir al "switch" un "case 3" para evitar mostrar las instrucciones al salir:

Código
  1.      case 3:
  2.        break;
  3.  
  4.      default:         //si la opcion es invalida le vuelve a preguntar
  5.        printf ( "invalid choice \n" );
  6.        //instruccions(); <<-- Esto también sobra ya
  7.        break;
  8.  

Luego, no se si te has dado cuenta, pero los elementos los estás insertando al inicio de la lista... no al final, no se si esa parte la tienes que programar así, aunque me da que no.

y bueno, luego te toca arreglar algun detalle relacionado con la forma de presentar los mensajes... pero eso ya corre de tu cuenta.

Ah bueno, sí, se me olvidaba jejeje. No estás liberando la memoria reservada por la lista una vez finalizas el programa... deberías plantearte corregir eso también.

Un saludo
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines