Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eferion

#851
Programación C/C++ / Re: Tabular salida en C
22 Octubre 2013, 11:43 AM
Cita de: rir3760 en 22 Octubre 2013, 02:44 AM
Solo un comentario: cuando se indica la anchura del campo la alineación predeterminada es a la derecha, "%-" se utiliza cuando se quiere una alineación a la izquierda.

Un saludo

Cierto. Un lapsus tonto.

Gracias por la corrección
#852
Programación C/C++ / Re: mciSendString
21 Octubre 2013, 22:23 PM
Cita de: samirllorente en 21 Octubre 2013, 16:03 PM
No me sale ningun msj de error ni nada, solo en el momento en q se ejecuta no sale ningun sonido :(

Con el código que has puesto es imposible que te enteres si se produce algún error.

La función mciSendString devuelve un identificador... es ESE identificador el que debes comprobar para saber si se está produciendo algún problema. En tu código estás desechando directamente ese valor.

Las llamadas a la API de windows no van a retornar mensajes por la consola... es responsabilidad del programador que hace uso de esas funciones el verificar que no se producen errores.
#853
Cita de: edr89 en 21 Octubre 2013, 18:46 PM
No se exactamente a que te refieres pero yo tampoco le veo gran uso a este código, nunca he trabajado con otras bases y en todo caso las direcciones de memoria estan en hexadecimal, que este programa no convierte El objetivo principal es implementar una lista ligada, el caso particular es convertir un numero de una base a otra.

El verdadero arte a la hora de diseñar aplicaciones no es que el código funcione como se espera de el... eso es como pedirle a un albañil que levante una pared... lo sabe hacer casi cualquiera. La gracia, y lo complicado, está en conseguir que ese algoritmo que diseñas pueda ser reutilizado y/o mejorado con un esfuerzo mínimo ( entiéndase que este esfuerzo dependerá de la complejidad intrínseca en el propio algoritmo ).

Si tu diseño acaba generando un código que solo es válido para la aplicación actual entonces podrías considerar que estás haciendo mal las cosas.

Ahora te parece que un algoritmo que sea capaz de convertir números entre diferentes bases es algo absurdo que solo te sirve para aprender... y puede que tengas razón... pero llegará un momento en el que el te encuentres en la necesidad de reutilizar código que ya has hecho en otro momento... si no has aprendido las habilidades necesarias para conseguir buen código reutilizable te tocará reescribir el código y/o sudar tinta para encontrar una solución factible.

Se que los profesores no le dan importancia a este aspecto, pero también es cierto que pocos profesores se han movido en el mundo real en el que la forma teórica e ideal de trabajar poco tiene que ver con lo que te vas a encontrar.

Cita de: edr89 en 21 Octubre 2013, 18:46 PM
Entonces la conversion debe estar fuera de main? imagino que la impresion de digitos tambien así la estructura de main puede cambiar dando el mismo resultado, o no?

Todo diseño que hagas debería tener como uno de sus fundamentos la reutilización del código. Si el núcleo de un algoritmo está ubicado en el main mal empezamos.

La representación de los datos, así como el proceso para que el usuario introduzca la información pedida, deberían estar también aislados del núcleo del algoritmo, de esa forma te va a resultar bastante más sencillo reutilizar el algoritmo y adaptarlo a diferentes situaciones.

Cita de: edr89 en 21 Octubre 2013, 18:46 PM
Te entiendo, trato de hacer las cosas lo mejor posible aunque el código refleje lo contrario para usuarios avanzados, en todo caso revela que el proceso de aprendizaje no ha concluido y falta mucho por aprender.

Tengo 30 años, llevo tocando código desde los 5. He programado en basic, pascal, visual basic, php, asp, asp.net, c#, c, c++, ActionScript, perl, bash, ... aún no pasa una semana sin que aprenda una cosa nueva o descubra una manera de mejorar algún aspecto de mi perfil.

Cita de: edr89 en 21 Octubre 2013, 18:46 PM
He abogado mucho por los temas de interfaz gráfica pero los profesores insisten que el verdadero poder lo tiene la consola y el GUI es solo la cara bonita del programa que carece de importancia para el curso.  :-\

Está claro que para aprender a programar, el entorno de consola te permite centrarte más en el objetivo de la aplicación. Desarrollar aplicaciones con interfaz gráfica al final te obligan a estar muy pendiente de los detalles de las ventanas... lo que resta recursos al fin último que es aprender a programar.

Lo que sucede es que los profesores normalmente dejan de lado el tema del diseño del software para permitir, por ejemplo, su reutilización... y eso es un problema.
#854
Lo que no puede ser es que alguien deje sus deberes para el último momento y luego venga con prisas.

Para empezar el pseudocódigo no deberías escribirlo a partir del código sino al revés.

Y, por supuesto, deberías esforzarte en que tu mensaje sea fácil de leer. Tu piensa que la gente que te vaya a ayudar lo hace por amor al arte... deberías tener algo de consideración hacia ellos ( nosotros en este caso ) y facilitarles la vida en la medida de lo posible.

Si te crees que plantando un tochopost se van a resolver todos tus problemas te estás equivocando de estrategia... sobretodo si tu trabajo tiene que estar terminado unas pocas horas después de pedir ayuda.
#855
Programación C/C++ / Re: mciSendString
21 Octubre 2013, 09:28 AM
entiendo que si no es capaz, por la razón que sea, de reproducir la canción, recibirás un mensaje de error.

Deberías plantearte recoger ese mensaje de error. Seguramente te ayude a dar con el problema.
#856
No se si te has dado cuenta que la usabilidad del código fuera de tu programa es 0.

El núcleo de tu código, es decir, el algoritmo de conversión, está incluido íntegramente en el main. Diseñar soluciones reutilizables implicaría al menos refactorizar ese código para que, por ejemplo para este caso concreto, se pudiese hacer la conversión con un main propio sin tener que "copiar y pegar".

Además, tu programa está limitado a un uso con consola de comandos... portarla para ser utilizada en una aplicación con interfaz gráfica requeriría otro esfuerzo adicional.

A mi, personalmente, me parece estupendo que se publiquen códigos como este, ya que los que están aprendiendo pueden ver códigos de gente más madura. Pero creo que si se hacen cosas así hay que hacerlo con un poco más de cariño.

Un código con casi la misma cantidad de comentarios que un programa desensamblado y que encima plantea una solución no reutilizable deja que desear. Vale que el algoritmo puede ser más o menos curioso e incluso hasta útil... pero no de la forma en la que está presentado.

#857
Programación C/C++ / Re: Tabular salida en C
21 Octubre 2013, 08:54 AM
Cita de: hervasiop12345 en 20 Octubre 2013, 22:20 PM
Hola a todos.

He implementado una orden para un intérprete de comandos que muestra los procesos en ejecución. La cuestión es que quiero que la salida aparezca tabulada pero no lo consigo, unas veces sale bien y otras mal. Primero imprimo las columnas y luego debajo ya mientras recorro la lista de procesos imprimo con la misma separación usando \t. ¿Alguna función en C para tabular salida? uso printf  pero nada.

Antes de imprimir hago fflush(stdout) para limpiar por si acaso pero no sirve de nada.

Gracias adelantadas. Un saludo

Entiendo que tu lo que persigues es algo tal que...


Id   Nombre   Edad
1   Maria      20
2   Sergio     28
3   Laura      26
4   Jose       45
5   Sonia       8


La forma correcta de formatear esta salida es configurar printf para que "reserve" un espacio mínimo para cada campo:


printf( "%02d", id );    // Dos caracteres para el id, relleno con ceros.
printf( " " );           // Espacio adicional
printf( "%8s", nombre ); // 8 caracteres para el nombre.
printf( " " );           // Espacio adicional
printf( "%-2d", edad );  // 2 caracteres para la edad, alineacion derecha.

#858
Programación C/C++ / Re: No se me abren ficheros
21 Octubre 2013, 08:47 AM
la gente de este foro podrá saber mucho o poco de c y c++... pero no son adivinos.

Sin código poco te vamos a poder decir.
#859
Tienes varias opciones:

* Crea un segundo archivo que contenga un índice. Este índice te debería indicar la posición en la que comienza cada registro y, adicionalmente, puede contener algún otro valor del registro que te permita acelerar las búsquedas ( por ejemplo el nombre si los registros almacenan datos de tus contactos. Esto te permite buscar en el índice por los nombres y localizar rápidamente la posición del registro que estás buscando ).

* Puedes poner antes de cada registro un campo que indique la longitud total de dicho registro... así si lo quieres saltar basta con que incrementes el puntero de lectura en X para acceder al siguiente campo de longitud.

* Puedes integrar el archivo del índice que te he comentado antes al final ( o al principio ) del archivo... entonces para hacer búsquedas puedes ir rápidamente a dicho índice para hacer la búsqueda.

* Puedes plantearte añadir un "padding" a cada registro para que todos acaben ocupando lo mismo... de esta forma los saltos serán siempre iguales.

Y seguro que a alguno más se le ocurren ideas nuevas.
#860
Vale, ahora estoy más tranquilo y creo que puedo darte una respuesta un poco más elaborada.

Vayamos por partes:

1. Clases de c++

Código (cpp) [Seleccionar]
Maleta *Mi_Maleta=new Maleta[10];

Estás usando c++. Salvo que sea una práctica de clase o que quieras practicar de forma intensiva con la memoria dinámica, te recomiendo usar la clase "vector", que es bastante más potente que los arreglos "a pelo" que estás intentando programar.

2. Clases de c++ ( 2ª parte )

Código (cpp) [Seleccionar]
struct Item{
       int Peso;
       int Volumen;
       string Nombre;
};


Estás usando c++, luego lo lógico y normal es que emplees "class" en vez de "struct". A grandes rasgos, la única diferencia entre ambos es que, por defecto, "class" tiene sus miembros privados mientras que "struct" los mantiene públicos. "class" es más natural en c++ y es altamente recomendado familiarizarse con su uso, ya que está tremendamente extendido.

Aprovechando tu paso a un c++ más normal, aprovecha para dejar las variables de las clases en la parte "private" de la clase y crea métodos que permitan acceder y modificar el valor de dichas variables. Este proceso se conoce como "encapsulación" y es uno de los pilares de la programación orientada a objetos. Familiarízate con ello.

La clase Item debería tener una declaración tal que:

Código (cpp) [Seleccionar]

class Item
{
  public:

       // Constructor por defecto. Para inicializar las variables de la clase.
       Item( );

       // Destructor. En tu caso no hace falta hacer deletes... pero conviene acostumbrarse a ponerlo.
       virtual ~Item( );

       int GetPeso( ) const;

       void SetPeso( int peso );

       int GetVolumen( ) const;

       void SetVolumen( int volumen );

       const string& GetNombre( ) const;

       void SetNombre( const string& nombre );
   
  private:

       int Peso;
       int Volumen;
       string Nombre;
};


La implementación te la dejo a tí. Es muy sencilla.

3. Constructores

Hay muchísima documentación en internet al respecto, te aconsejo buscar un poco e informarte.

Lo que deberías saber es que los constructores te permiten inicializar las variables de la clase con el objetivo de que dichas variables no tengan valores inválidos.

En el caso de la clase Maleta, el constructor podría, por su propia cuenta, crear el arreglo de Items de dicha maleta.

4. Arreglos

Código (cpp) [Seleccionar]
Maleta *Mi_Maleta=new Maleta[10];

La línea superior crea un arreglo de 10 punteros de tipo Maleta... pero no crea un solo objeto Maleta. Es necesario crear de forma individual los objetos Maleta y almacenar sus punteros en la posición que corresponda del arreglo de maletas. Con los items pasa exactamente lo mismo.

Aprovechando el punto 3, es decir, creando el arreglo de items en el constructor de la clase maleta, te olvidas de tener que crearlo explícitamente cada vez que crees un objeto maleta... aunque como te he comentado en el punto 1, la clase vector da mucha más flexibilidad que los arreglos puros.