Tsanummy
kotoamatsukami

PROGRAMACIÓN DISCUSS! [¿En qué estás trabajando?]

Buenas, abro este post para que todos los que estén aprendiendo programación, trabajando en programación o simplemente programando por hobby pueda venir aquí a comentar, buscar ideas, preguntar dudas, compartir información y/o códigos.

Para compartir códigos:
Pastebin si queréis sólo enseñar

Piratepad si queréis que cualquiera pueda tocar vuestro código (Podéis deshacer las ediciones y cada persona tiene un color distinto asi que no es un desastre si editan 2 a la vez)

Para mantenerte informado de este post haz click en Seguir ----------------------------------------------->




Normas del post (De momento, si hay problemas se pueden añadir más):


  • Permitidas TODAS las personas que estén interesadas, cuyo nivel vaya del 0 absoluto hasta la mayor de las maestrías esto implica las siguientes dos normas:

  • Obligatorio preguntar dudas!!!! Aunque te parezca una estupidez, si no te sale es que no es tan facil, preguntalo! Nadie se va a reír de ti por ser novato.

  • Prohibido de manera MUY concienzuda el reirse de alguien por ser novato, dar una solución inadecuada a propósito, mofarse del trabajo de otros, en definitiva: aquí no cabe ningún tipo de actitud negativa. Si eres el puto amo de la programación y no quieres enseñarnos ninguno de tus trabajos, sólo entras para reirte de los demás sobras, no entres ya.

  • Se permite hablar de cualquier lenguaje, pero si vienes aquí con un lenguaje del que nadie sabe nada no esperes que te responda nadie, lógicamente.

  • Prohibido publicar códigos y proyectos de otras personas que estén protegidos por derechos de autor, si publicáis algo tiene que ser vuestro trabajo o en su defecto cumplir los requisitos de la licencia que tenga el código.




Sé que este post se va a usar para dos cosas: Preguntar dudas de gente muy novata que está empezando y también para publicar proyectos de gente más avanzada que necesita ayudas para avanzar, ideas o betatests. Respetemos las conversaciones e intentemos no molestarnos entre nosotros discutiendo aquí, no es difícil.

Otra cosa os voy a pedir: Si entra un novato para preguntar como se hace algo NO SE LO DEIS HECHO EL CÓDIGO, enseñarle a hacerlo o decirle los trozos más complicados, o enseñarles el lugar de la API donde se explica como se usa según qué función, etc.. Esto no es un post para hacerle los deberes a los demás, no, es un post para compartir ideas entre colegas programadores. Si alguno necesita el código desesperadamente se puede hacer una excepción y hacerle carrito, pero este no es el objetivo del post.


Saludos

- - -
瞬身のシスイ

Theck
Jumptard!
@Suyoth La idea de la orientación al objeto es que pienses en modelar el problema de una forma más parecida a la realidad.

Yo imagino las clases como si fueran los planos, las instrucciones de Ikea, de las cosas que el programa va a mover, y los objetos, son los muebles resultantes de ese plano, todos iguales.

Imaginemos un programa que va a gestionar un parking, seguro que para ti es fácil pensar en un parking como un almacén de coches, así pues, identificamos ya dos posibles clases, la clase parking y la clase coche.

Las clases tienen propiedades y métodos. Las propiedades son los datos que definen la clase, y los métodos son por regla general funciones que cambian las propiedades de la clase.

En el caso anterior seguramente un parking necesitará una dirección postal para saber donde está (un String mismo), pero las propiedades pueden ser clases, sin ir más lejos, un parking tendrá un array de plazas de parking, hemos identificado una nueva clase.

Una plaza tiene un número, y podríamos añadirle un piso para saber donde se encuentra. Además, necesitará guardar un coche.

De un coche por su parte necesitaremos al menos la matrícula para identificarlo del resto, y podríamos añadir color, marca y modelo.

A partir de aquí hemos de empezar a añadir funcionalidad. A mi esta es la parte que más me cuesta, decidir quien es el "responsable" de implementar un método, pues antes o después, tendrás relaciones entre estas clases, pero empecemos por lo simple.

Una vez el coche ha entrado y sabemos cual es con el sensor que lee la matrícula este llega a una plaza e imaginemos que tenemos la capacidad de saber donde aparca con un sensor en la misma, por lo que tenemos un hecho que modifica el estado de nuestros objetos. Para ser exactos, un coche ocupa una plaza.

En este caso, como el objeto modificado es claramente la plaza, haremos un método en la clase plaza que sea aparcarCoche, que recibirá un coche, y que lo que hará es que a su propia propiedad coche le asignará dicho coche, de modo que ya sabemos que ese coche ocupa esa plaza.

Cómo te decía podríamos pensar que es el coche quien aparca, pero te puede servir de pista lo comentado antes, el método debe, siempre que sea posible, modificar a su clase. Cómo aquí es la plaza la que modifica su campo coche, el método es suyo.

Esto no será la mejor explicación, pero puede ayudarte al menos a crear el UML inicial.

- - -
Mis proyectos: http://www.zehngames.com | http://www.rapidoyfacil.es

Suyoth
Best Yasuo Abadiño.
#523 Está bastante bien explicado :D muchas gracias ;)
#517 No te lo tomes a mal, yo hace años pensaba lo mismo de los leguanjes estructurados pero, "Programar orientado a objetos es un paradigma, es decir, una forma de diseñar código. Hay lenguajes como C++ o Java que están diseñados para este paradigma, pero no se programa orientado a objetos meramente por utilizar a uno de estos lenguajes.
En cambio, se puede aplicar el paradigma de orientado a objetos a lenguajes de programación no diseñados para esto, aunque será lógicamente con complicaciones."

Todo esto lo he sacado de esta fuente http://trucosinformaticos.wordpress.com/2010/12/12/programacion-orientado-a-objetos-en-c/

Te confirmo que si que se puede programar en c con el paradigma del poo, llevo más de 3 años haciendolo y me imagino que alguien preguntará por que usar c en lugar de un lenguaje diseñado para tal fin, pues en el entorno industrial muchas veces se requiere trabajar con la memoria de bajo nivel y la potencia de respuesta/calculo es mucho mayor en c que en casi cualquier lenguaje orientado a objetos.
Hydn
xPeke fanboy
#525 Tio pero esto ya esta inventado, se llama C++. Puedes usar las estructuras de OOP de C++ y hacer cosas de bajo nivel cuando lo requieras. Y cualquier código que compilara en C compilará en C++ así que no tienes excusa.

- - -
F.J. Haydn

PagaFanta
Se aprende de la vida en soledad
Buenas, quisiera saber a modo de experiencia personal, si alguno ha trabajado o conoce de alguien que haya trabajado en accenture(coritel sino) de barcelona.

Si es asi, agradeceria MP para preguntar unas dudillas.

- - -
Si la verdad está ahí, sin duda está escondida.

Theck
Jumptard!
El que era mi jefe estuvo trabajando un tiempo, pero ahora mismo no tengo contacto con él, pero vamos , es una cárnica xD

- - -
Mis proyectos: http://www.zehngames.com | http://www.rapidoyfacil.es

#527 Mi hermano trabajó en Accenture Madrid y fue un auténtico desastre en cuanto a proyectos/responsabilidades, de sueldo estaba bastante bien.

En cuanto a Coritel tengo entendido que es un picadero de programadores XD
accenture huele a burdel. Na es broma, no sé lo que es xd

LLevo medio año en una empresa de programador mientras termino la ingeniería. Hacemos software de escritorio orientado a la gestión completa de circuitos de carreras. Por curiosidad, hay alguien que haya programado con el framework de .NET ?

- - -
"Cuando te empiezan a salir haters, significa que algo estás haciendo bien"

#530 Si son aplicaciones en C# de escritorio yo lo he usado muchísimo. Si es con .Net orientado a web no lo he usado en mi vida XD
Dsrmaniaco
The Fucker
Pues vereis acabo de retomar mi proyecto de navidad del juego de la vida y la verdad es que creo que lo que tengo hecho esta bien, pero sin embargo, la matriz resultante no es la que quiero que salga. Yo creo que el problema esta en el subalgoritmo de ProximaGeneracion, pero no se donde.
Aquí os lo dejo por si alguien me pudiera ayudar(Es c++):

- - -
Twitter: @Dsrmaniaco

Hydn
xPeke fanboy
1º Usa vectors, no arrays puros.
2º La matriz(que deberia ser un vector de vectores no un array de arrays, pero vale para los dos casos) no se inicializa a 0 por arte de magia. Un array o vector sin inicializar tiee comportamiento indefinido, puede haber zeros o cualquier otra mierda que estubiera antes en la parte de la memoria que ahora tiene tu array.

Si compilas con -Wall (deberias) te saltará el warning.

- - -
F.J. Haydn

Dsrmaniaco
The Fucker
#533
1º Soy nuevo en esto, así que yo solo sé lo que me han enseñado, no tengo ni idea de lo que dices de los vectores, a mi me han enseñado con arrays.
2º Ya le he puesto lo de iniciar la matriz, pero no me soluciona nada (aun así gracias porque se me había olvidado).
Y lo de compilar con -wall ni idea, yo uso el programa que usamos en clase(Codeblocks).
Ya os digo soy nuevo en esto no controlo muy bien lo que hago.

- - -
Twitter: @Dsrmaniaco

Hydn
xPeke fanboy
Questiones de estilo:

- Intenta dar a las variables nombres coherentes y que den informacion sobre el uso o informacion que contiene la misma. 'n', 'm', 'x', y 'y' son aceptables en este caso, pero las demas no dan informacion (r = CuentaVecinos() ? pq r?) y muchas te las podrias ahorrar directamente (j, u, v para iteraciones no anidadas? porque no reusas i?).

- Indenta tu código adecuadametne SIEMPRE (los tabuladores!!!!). Es imposible programar bien si ni tu mismo entiendes lo que escribes. C++ no obliga a formatear bien el codigo, pero es casi mandatorio que lo hagas. Ya no solo para que lo lean los demas, es que ni tu mismo lo puedes entender.

- Esto es C++, no C. Aparte de usar la STL (vectores y demas, luego te lo explico despues de comer) las variables puedes declararlas dentro de su scope, no hace falta declararlas todas al principio. Ejemplo

int i;
for (i = 0; i < n; ++i) {

}

Puedes escribirlo

for (int i = 0; i < n; ++i) {

}

y hay mas casos, dentro de los ifs y whiles por ejemplo.
No solo se puede sino que se DEBE. Porque es mas facil de leer y mas facil de programar si lo haces.




No tengo tiempo de mirarlo detenidamente, luego te escribo una version bien hecha (a mi modo de ver) con vectores y comentarios y tal, PERO un fallo que hay seguro es que vas contando vecinos Y cambiando LA MISMA matriz. O cuentas los vecinos de cada casilla primero y te los guardas en otra matriz y luego cambias todo de golpe o tienes dos matrices y cuentas los de una y guardas los cambios en la otra y luego viceversa.

Otra cosa es que en ningun lugar checkeas si te sales del rango de la matriz. Ahora mismo tu funcion CuentaVecinos() si le dices que mire la posicion a[0][0], te va a mirar casillas de fuera de la matriz como a[-1][-1], a[0][-1], a[-1][0]. Similarmente para todas las casillas del borde. Esto es un comportamiento indefinido como una catedral, tanto puede pasar que te lea valores random de lo que sea que este en esta parte de la memoria (que puede estar usando incluso otro programa) como que pete todo.

Lo mismo pasa si por ejemplo digo que la matriz sea de dimensiones 5, 5. Tu prorama me deja poner un bicho en la posicion 6 6, o -1 -1, y puedes estar escribiendo en memoria de fuera de tu array, que vete a saber que hay ahí o que programa la esta usando.

- - -
F.J. Haydn

Hydn
xPeke fanboy
Aquí tienes el código mas o menos limpio, ahora edito y pongo una versión comentada:

Game of Life


Aquí esta la versión comentada, si tienes alguna duda, pregunta.

Game of Life (commented)



Me lo he currado bastante asi que espero que te sirva y aprendas xD

- - -
F.J. Haydn

Dsrmaniaco
The Fucker
#535 #536 Muchas gracias, ya me ha quedado todo más claro, sin embargo, al no haber dado vectores quizá me digan que lo he copiado o algo, así que tengo tu programa hecho por vectores y el mio ya modificado y funcionando (el problema era el programa de comprobar vecinos y lo de las casillas que estaban fuera de la matriz , cogiendo el tuyo me funciona 100%). Lo que no entiendo es que si existe una función vector que hace exactamente lo mismo que los arrays incluso mejor(ya que puedes poner sus dimensiones con parámetros), ¿porque nos enseñan solamente la función array y no la otra?. Otra cosa que no puedes hacer es nombrar un subalgoritmo como tipo array, o si se puede, no me han enseñado.
Cuando declaras un tipo de variable con typedef(en mi caso era typedef Tmatriz[100][100]).Tampoco puedes usarlo para designar un subalgoritmo. En resumen que yo a los arrays estos solo les veo desventajas.
Me he leido todo lo que has explicado y la verdad es que me ha quedado bastante claro y todo está hecho con sentido. Y sí hemos dado lo de párametros por valor y por referencia(&). Lo que pasa es que son un poco puñeteros.
En serio muchas gracias, pero tengo una última duda XD. Esta es ya más general, no centrada en el programa este.
Te la dejo aqui.

- - -
Twitter: @Dsrmaniaco

asf
#537 Los arrays son un puntero al primer elemento del array.

mi_array; // es lo mismo que
&mi_array[0];

Por lo tanto en tu código sobra el '&'

void iniciarmatriz(Tmatriz a)
void Subalgoritmo1(Tmatriz V)
void Subalgoritmo2(Tmatriz V)

Digamos que un array siempre se pasa por referencia.
Theck
Jumptard!
Lo voy a poner aquí por que está relacionado con el desarrollo de videojuegos. Esta tarde en Barcelona se celebra el 1er ZehnWorking, un evento periódico en que viene alguien a dar una charla/taller, estudios presentan sus proyectos, y acabamos con un poco de networking para conocernos.

Los que estéis por Barcelona estáis invitados a venir, los que no y tengan curiosidad por verme el jeto, la idea es hacer streaming en directo en el canal de ZehnGames ( https://www.youtube.com/user/ZehngamesTV )

Nos vemos!

- - -
Mis proyectos: http://www.zehngames.com | http://www.rapidoyfacil.es

thedrdvd
THE DR.DVD
#539 Lástima que no pueda ir finalmente... Espero que hagáis más de estos, porque me interesaría ir en alguna ocasión. :)
Para poder participar debes iniciar sesión, si todavia no tienes una cuenta regístrate.