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

#821
Cita de: vangodp en 30 Enero 2014, 15:10 PM
¿¿Puedes dar un ejemplo??Muy interesante el tema.  :huh:
¿Alguna lectura recomendada?

;D

Deberías empezar por mirar algo de teoría de grafos... así te va a resultar más sencillo comprender e implementar este tipo de algoritmos.

En cuanto a bibliografía... busca en google, aunque ya te digo yo que los mejores portales son los de habla inglesa.
#822
estás usando C++... no te has planteado la posibilidad de crear un ecosistema de objetos que te facilite el trabajo??

No se, quizás una clase "Laberinto" que almacene la información relativa al laberinto, una clase "Jugador" que represente al insensato que pretenda salir del laberinto...

Además estaría bien usar la clase string para manejar las cadenas de texto y cosas asi.

Otras consideraciones:

* una función de más de 4 argumentos debería ser evitada.
* una función que recibe un argumento de nombre "a" no dice, con perdón, una *****, usa nombres que identifiquen la función de la variable. Es más productivo y además gratis.
* no se si eres consciente de que la función "crear_mundo" elimina el laberinto.
* C++ permite usar contenedores que gestionan bastante bien la memoria... lo mismo te interesa usarlos para almacenar cosas como la matriz del laberinto.

Y luego, en cuanto a cómo moverte... pues no se, necesitas un sistema de coordenadas ( X,Y por ejemplo ) que localice la posición del jugador. Incrementando o decrementando dichos valores consigues que el jugador se mueva... no te olvides de chequear los movimientos para evitar que el jugador atraviese paredes!!!
#823
Si sacas a relucir la magia de C++ verás que hay una solución que es realmente sencilla.

C++ tiene varios tipos de contenedores: vector, map, multimap... cada uno tiene sus propias características, por lo que elegir el correcto en cada situación puede ahorrarnos bastante trabajo.

Uno de estos contenedores es set. set es como vector, con las siguientes peculiaridades:

* los elementos se almacenan ordenados
* no admite duplicados

Dicho esto, saber cuantos elementos diferentes tienes en la lista es tan "sencillo" como recorrer la lista e ir añadiendo los nombres de las materias en el set. Al finalizar, el método count te dirá cuantas materias diferentes hay en tu lista.

Para recorrer la lista se pueden dar dos casos ( y no concretas cual es el tuyo ):

* La lista es plana, tiene un inicio y un final.
* La lista es circular, por lo que no hay un item->left que sea nulo

Si la lista es plana tienes que posicionarte en el primer elemento de la lista y empezar a recorrer los elementos desde ese punto hasta que encuentres un item->left que sea nulo.

Si la lista es circular, tendrás que ir comparando cada puntero "left" con el que hayas tomado como referencia ( desde el que empiezas )... cuando sean iguales es que has recorrido toda la lista.
#824

CODOP *x; // => char ***; // en verdad es necesario esto ??
char **p;
x = (CODOP*)malloc(sizeof(CODOP));

// un puntero doble es como una matriz, necesita dos inicializaciones
// primero una para las filas y luego hay que inicializar cada columna por separado
// aqui solo estas inicializando las filas
p = (char**)malloc(MAX*sizeof(char*));

// esto podria funcionar en c++... en c hay que usar strcpy
// en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
p[0] = "anita";
p[1] = "lava";
p[2] = "la";
p[3] = "tina";


Por cierto, no veo un solo free que libere la memoria...
#825
Un código de este calibre suele ser dificilmente optimizable... no se por qué la gente tiende tanto a preocuparse por la optimización cuando está aprendiendo. Creo sinceramente que es mucho más importante centrarse en hacer las cosas bien que en optimizar código.

Una vez que ya has adquirido una base sólida puedes plantearte nuevos retos, como conseguir que el código fluya más rápido... pero es mejor acotar los frentes abiertos, sobretodo al principio... si no es fácil que los problemas te desborden.

Revisando un poco tu código yo te daría los siguientes consejos para mejorar su diseño. De ti depende aplicarlos o no.

Un saludo. ( va por adelantado para no guarrear lo que viene a continuación )

1. Separar conceptos

Quizás sería más conveniente tener una instancia de "Persona" por cada registro en vez de una sola instancia de "Persona" para gestionar los 50 registros.

Código (cpp) [Seleccionar]

class Persona
{
  public:
    string nombre;
    string apellido;
    int cedula;
    int telefono;
};

class ListaPersonas
{
 public:
   void registrar();
   void mostrar();

 private:

   std::vector<Persona> personas;
};


El uso de la clase es más natural e intuitivo, ya que cada instancia de "Persona" te proporciona la información de un único registro.

2. Separación de responsabilidades

En tu código, el método "registrar" se encarga de pedir al usuario los datos y de crear la entrada correspondiente... eso son dos responsabilidades en la misma función... malo.

Lo normal es que a registrar se le pase o bien una instancia de "Persona" para que la añada a la lista, o bien que reciba directamente los parámetros nombre, apellido, cedula y teléfono. Luego, obviamente, necesitas en otro sitio una función que se encargue de pedirle al usuario los datos.

Separar este código en dos capas te aporta independencia y aislamiento, y eso mejora mucho la usabilidad del código. Un ejemplo de ello es que podrías cambiar la consola por una ventana gráfica y la función "registra" no sufriría ningún cambio.

3. Si se usa POO, se usa con todas las consecuencias

La clase "Persona" proporciona acceso directo a todas sus variables miembros... malo.

Una de las principales características de la POO es que proporciona mecanismos para controlar el acceso a los miembros de una clase... aprovéchalo. Se que es algo más de código el tener que crear un getter y un setter para cada variable... pero es un hábito muy sano... si luego resulta que un setter hay que modificarlo para añadir ciertas comprobaciones, el código que acceda a ese setter no se va a enterar... mientras que si permites un acceso directo y luego tienes que cambiarlo por un setter te toca modificar todas las llamadas una a una.

Por definición, todas las variables miembro de una clase deberían ser privadas ( o protegidas, según el caso ), nunca públicas... eso rompe el principio de encapsulación.

4. Aprovecha los tipos de c++

C++ dispone del tipo bool para operaciones booleanas... usar un bool para evaluar un si/no es mucho más claro que tener usar un int a la usanza de c:

Código (cpp) [Seleccionar]

void Persona::mostrar()
{
 bool encontrado = false;
 int ci;

 cout<<"\ningrese su cedula para mostrar sus datos:"<<endl;
 cin>>ci;
 for (int i=0;i<51;i++)
 {
   if (ci==cedula[i])
   {
     cout<<"nombre: "<<nombre[i]<<endl;
     cout<<"apellido: "<<apellido[i]<<endl;
     cout<<"cedula: "<<cedula[i]<<endl;
     cout<<"telefono: "<<telefono[i]<<endl;
     encontrado = true;
     break;
   }
 }

 if ( !encontrado )
 {
   cout<<"No se encuentra nadie registrado con esta cedula"<<endl;
 }

 system("pause");
 system("cls");
}


5. No uses system

system no es portable, es lento y escapa al control de tu programa ( no puedes depurar lo que sucede dentro de esa llamada ). Acostúmbrate a usar otras alternativas, como crearte una función propia que haga exactamente lo mismo.

6. En C++ procura no usar includes de C

Como he comentado más arriba, si usas C++, procura usarlo con todas las consecuencias. Además dispone de una librería muy completa que te hace no depender de las librerías de C.

Entiendo que el código C es compatible con el código C++... pero usar C++ puro sin características de C acaba proporcionando un código más claro y te permitirá conocer C++ en mayor profundidad, lo que te permite sacarle más provecho... Además te ayuda a superar varios vicios adquiridos al aprender C ( yo he pasado por ello ).
#826
El que quiere aprender a programar en c++ no empieza con tareas de este tipo.

La impresión que da es que simplemente quieres salir del paso porque esto te urge y después si te he visto no me acuerdo.

El hecho de que no te hay acontestado nadie en casi un día entero no es porque no haya gente en el foro, sino porque piensan más o menos lo mismo que yo.
#827
.NET (C#, VB.NET, ASP) / Re: DUDA CODIGO C#
30 Octubre 2013, 17:35 PM
Más bien, primero consigue que funcione y luego piensa en optimizar.

Y para conseguir que funcione, lo primordial es entenderlo.
#828
.NET (C#, VB.NET, ASP) / Re: DUDA CODIGO C#
30 Octubre 2013, 15:24 PM
Deberías al menos quitar los comentarios que estén demás... hay líneas que son absurdas y otras que no queda claro si son necesarias para el código o no.

Y ya que lo haces aprovecha para poner el código entre etiquetas (code=cpp) y (/code) sustituyendo paréntesis por corchetes.
#829
matriz[i][j]=0+rand()%(16-1);

¿Y ese cero? hasta donde yo llego, 0+X = X

printf("\t%d",matriz[i][j])

TODAS las instrucciones de c++ han de terminar con un punto y coma. Tú no lo has puesto, luego no mientas y digas que el código no funciona... simplemente no compila.

Y como bonus finales te diré que lo lógico es que primero rellenes la matriz y luego pidas al usuario que ingrese fila y columna para consultar la matriz... lo que estás haciendo ahora es machacar la posición de la matriz que quieres consultar.
#830
.NET (C#, VB.NET, ASP) / Re: DUDA CODIGO C#
30 Octubre 2013, 14:44 PM
1. Lo lógico es que pongas un título de mensaje acorde a tu pregunta. Para empezar C# es un lenguaje y C++, que es el que estás poniendo aquí, otro distinto.

2. El código deberías ponerlo con las etiquetas de código correspndiente ( mira el combobox que dice "GeSHi" )

3. No se hacen tareas.

4. ¿He dicho que no se hacen tareas?

5. La clase vector de c++ no está limitada a 4, se pueden añadir bastantes elementos más.

6. El código que has puesto y tu pregunta me dan a entender que no lo has hecho tú. Intenta adaptar tú el código y comenta aquí tus dudas. Te lo comento porque, no se si lo sabes, no se hacen tareas.