Noticias:

A Cientoseis ya sólo le quedan 500 para funcionar bien.

Menú Principal

Curso de Programación Lúdica. Actualmente: Tetris funcionando

Iniciado por Bill, 13 de Mayo de 2009, 15:08

0 Miembros y 1 Visitante están viendo este tema.

Bill

6. De vectores, matrices y otros monstruos multidimensionales

Hemos visto que existen variables con diferentes tipos, al menos hemos visto numéricas (en este caso números reales), cadenas de caracteres (strings) y booleanas (lógicas que valen cierto o falso). Pues ahora vamos a ver los vectores.

Los vectores o arrays, aunque en sudamérica los llaman arreglos (arreglo el que le iba a hacer yo en la cara al traductor...), son en realidad listas ordenadas de cualquier cosa. En nuestro FreeDFD esto se hace usando un nombre de variable, como siempre, y una posición entre paréntesis. Por ejemplo:
lista(1) <- 3
lista(2) <- 7
lista(3) <- 12

Las ventajas que nos dan es que podemos usar grupos de valores y usarlos todos a la vez en bucles o con un índice, es decir, el índice que va entre paréntesis puede invocarse mediante una variable. Por ejemplo supongamos que tenemos una videoteca en nuestro salón con varios títulos, y queremos preguntar al usuario cuántas películas tiene y luego ir preguntándole los títulos de forma ordenada, para más tarde preguntarle por un número de película y decirle el título. La forma de hacerlo sería:
- Pedir la cantidad de películas (numPeliculas)
- Un bucle (variable i por ejemplo) desde 1 hasta la cantidad de películas pidiendo el título y almacenándolo en la posición actual del vector (peliculas(i)).
- Pedir el número de película que se quiere conocer (iPelicula)
- Si iPelicula es mayor que 0 (dado que el vector comienza en 1) e iPelicula es menor o igual que numPeliculas, entonces se muestra peliculas(iPelicula) en caso contrario se informa de que no existe ninguna con esa numeración.

El diagrama de flujo quedaría más o menos así:



Pero los vectores estos son maravillosos porque no están limitado a una sola dimensión. Es decir, supongamos que de las películas queremos tener también una referencia de localización, entonces alguien diría "ah, pues otro vector para las referencias". Pues no hace falta, porque los vectores pueden tener más de una dimensión. En este caso haría falta dos dimensiones, una nos diría el campo que queremos mirar y otra la película, es decir, si hay 5 películas en nuestra base de datos podríamos decir que:

peliculas(1,1) <- 'ID2038'
peliculas(1,2) <- 'Heat'
peliculas(2,1) <- 'ID2085'
peliculas(2,2) <- 'Una historia del Bronx'
peliculas(3,1) <- 'ID1039'
peliculas(3,2) <- 'Cristal Oscuro'
peliculas(4,1) <- 'ID1045'
peliculas(4,2) <- 'Dentro del laberinto'
peliculas(5,1) <- 'ID3017'
peliculas(5,2) <- 'El último mohicano'

Como veis, al vector se le pasan dos índices en lugar de uno. El primero es la posición de la película, el segundo es el campo que queremos consultar (1 para el localizador, 2 para el título).

No hay límite para las dimensiones que podéis especificar para un vector, así que podéis tener monstruos multidimensionales. En matemáticas, cuando son dos las dimensiones, se llama "Matriz" y son muy útiles e interesantes para multitud de cosas, entre ellas solucionar sistemas de ecuaciones lineales.

No voy a poner un ejercicio complicado de esto... bah venga, soy un mentiroso, sí lo voy a poner :)

Deberes:
- Hacer una aplicación que nos pida la cantidad de películas, y de cada una pida el identificador, título y temática (thriller, melodrama, infantil, anime...). Luego debe pedir un número de película y debe decir todos los datos conocidos de ella.

- Hacer una aplicación que pregunte un número y calcule todos los números primos existentes hasta ese número, conociendo únicamente que los números 2 y 3 son primos. Notas sobre este ejercicio:
+ Se considera que un número es primo cuando no es divisible entre ningún número primo, es decir, cuando el resto de dividir dicho número entre los primos menores que él jamás es 0. Para esto necesitáis el operador "MOD". Para saber si un número es divisible entre otro sería: "(numero MOD otroNumero) =0" (esto es cierto cuando numero es divisible entre otroNumero).
+ Seguramente necesitéis usar una variable booleana (yo la he llamado esPrimo) que nos indica si un número es primo o no (inicializada a .V.). Recordad que podéis usar operadores lógicos, el AND debería ser muy útil en este ejercicio.
+ Si no queréis usar una variable auxiliar para saber cuántas posiciones del vector lleváis (esto es, cuántos números primos lleváis calculados...) siempre podéis aprovecharos del propio vector y hacer que primos(0) en lugar de contener un número primo contenta la cantidad de términos del vector.

Suerte :)



El Brujo

Frena el carro nene que a este ritmo para finales de junio que acabo exámenes vas a haberte pulido el curso entero...
Oh, tengo Twitter...

Sorry but you are not allowed to view spoiler contents.

Bill

Cita de: Brujo en 04 de Junio de 2009, 13:10
Frena el carro nene que a este ritmo para finales de junio que acabo exámenes vas a haberte pulido el curso entero...

Estoy puliendo el primer libro, que es el teórico, para que cuando termines tus exámenes estemos ya programando en c# :P

Además, el curso es en diferido, cada uno que lo siga a su velocidad, estoy subiendo el ritmillo por los que ya saben algo de filosofía de programación.

Skiles

Cita de: Emilles en 04 de Junio de 2009, 14:03
Cita de: Brujo en 04 de Junio de 2009, 13:10
Frena el carro nene que a este ritmo para finales de junio que acabo exámenes vas a haberte pulido el curso entero...

Estoy puliendo el primer libro, que es el teórico, para que cuando termines tus exámenes estemos ya programando en c# :P

Además, el curso es en diferido, cada uno que lo siga a su velocidad, estoy subiendo el ritmillo por los que ya saben algo de filosofía de programación.

Yo me amputo, pero a mi velocidad, cuando termine los exámenes que me quedan ya me meteré más a fondo ;)

Maik

Cita de: Emilles en 04 de Junio de 2009, 14:03
Cita de: Brujo en 04 de Junio de 2009, 13:10
Frena el carro nene que a este ritmo para finales de junio que acabo exámenes vas a haberte pulido el curso entero...

Estoy puliendo el primer libro, que es el teórico, para que cuando termines tus exámenes estemos ya programando en c# :P

Además, el curso es en diferido, cada uno que lo siga a su velocidad, estoy subiendo el ritmillo por los que ya saben algo de filosofía de programación.

(seg)

Bill

#185
7. La vaquita hace "muuuuu", el patito hace "cua cua"

Esta lección es teórica totalmente, así que no habrá ejercicio final más allá de que cada uno se quede pensando. La pretensión de esta lección es ver cual es la filosofía de la OOP (Object Oriented Programming), y sus puntos fundamentales. Para ello hay que entender 4 conceptos básicos: abstracción, encapsulamiento, herencia y polimorfismo. Suena chungo de cojones, ¿eh? Pues poco a poco.

El primer término que se empleó fue el de abstracción. Antes de existir la programación orientada a objetos, existía la ténica llamada "TDA" (Tipo de Dato Abstracto). Esta técnica consistía en agrupar las cosas por afinidad y conseguir que el programador que las fuera a utilizar no tuviese que entender su funcionamiento interno. Por ejemplo, supongamos que estamos haciendo un programa que usa conjuntos de datos obtenidos en un laboratorio, y lo estamos haciendo dos personas. Una de las personas se encargará de definir los conjuntos, y la otra persona usará dichas definiciones para las labores que realmente necesita hacer el programa. Entonces el primero comienza a programar y decide definir los conjuntos con las siguientes reglas:
Citar- Un conjunto contiene elementos, así que voy a definir un tipo TElemento que será el adecuado para el laboratorio. Un TElemento será el tipo de variable para cualquier elemento que necesite usar.
- También definiré el tipo TConjunto, y usaré herramientas de programación de tal forma que un TConjunto sea una lista no necesariamente ordenada de variables de tipo TElemento.
- Necesitaré una función InicializarConjunto(conjunto) tal que inicializa el conjunto que le pase a conjunto vacío.
- Necesitaré una función EsConjuntoVacío(conjunto) que me indica si un conjunto está vacío
- Necesitaré una función AñadirElemento(conjunto, elemento) que añade un elemento a un conjunto (siempre y cuando el elemento no pertenezca ya al conjunto)
- Necesitaré una función QuitarElemento(conjunto, elemento) que quita un elemento de un conjunto (siempre y cuando el elemento pertenezca al conjunto)
- Necesitaré una función PerteneceElemento(conjunto, elemento) que me indica si un elemento pertenece a un conjunto
- Necesitaré una función Intersección(conjuntoA, conjuntoB) que me devuelve un tercer conjunto fruto de la intersección de dos conjuntos.
- Necesitaré una función Unión(conjuntoA, conjuntoB) que me devuelve un tercer conjunto fruto de la unión de dos conjuntos.
- Necesitaré una función Diferencia(conjuntoA, conjuntoB) que me devuelve un tercer conjunto fruto de la diferencia del conjuntoA con el conjuntoB.
- Necesitaré una función Cardinalidad(conjunto) que me devuelve la cantidad de elementos del conjunto.

Si el segundo programador conoce la existencia de estos tipos y estas funciones, no necesita saber para nada cómo funcionan los tipos o las funciones por dentro, o cómo está programado. Para ello en las unidades (cada uno de los ficheros dónde se programa...) hay dos secciónes: la sección de interfaz y la sección de implementación. La sección de interfaz es dónde se declara "mira tío, esta unidad te da para usar estos tipos, estas constantes, estas variables y estas funciones", la sección de implementación es la zona de la unidad que no es visible desde fuera, y que contiene la programación interna de ese TDA. ¿Necesita el segundo programador saber si conjunto es un vector, un yogur, una lista de objetos o un enano con buena memoria? ¿Necesita el segundo programador conocer cómo funciona por dentro la función de Intersección? La respuesta es no, no lo necesita. Eso es la abstracción, y base de los TDA.

Vayamos ahora con objetos. Hay quien dice que la programación orientada a objetos es lo mismo que el TDA, esos que lo dicen no tienen ni puta idea, y me quedo así de pancho afirmándolo. La filosofía del objeto es más compleja y completa.

Lo primero es entender la base, ¿qué se supone que es un objeto? Para ello tenéis que saber que existen dos conceptos básicos: clase e instancia. Clase es la definición básica de un objeto, e instancia es cada uno de los objetos "reales" que creamos a partir de esa definición. Por ejemplo, pensad en "Coche". El concepto "Coche" nos dice que debe tener unas 4 ruedas, motor, puertas, un cierto color, salpicadero... pero no me puedo montar en un concepto y conducirlo hasta murcia, para eso necesito un coche real, y este coche real es una instancia de la clase Coche.

De un objeto también hay que entender que contiene propiedades, métodos y eventos en su definición. Volviendo al coche, el color es una propiedad, su velocidad máxima también, dimensiones, tipo de ruedas... Es cada uno de los "adjetivos" o "calificativos" que se puedan aplicar al objeto. Métodos de un coche serían Acelerar(), Frenar(), CambiarDeMarcha(), es decir, cada una de las funciones que podemos aplicar sobre el coche para modificar su estado, o incluso sus propiedades (si el coche tiene una propiedad velocidadActual o revolucionesActuales, cambian según lo estamos usando). Por último evento es un informador de un suceso, por ejemplo cuando cambiamos la marcha se nos puede lanzar un evento "MarchaCambiada" informándonos de la nueva marcha, pero para entenderlo mejor los eventos no tienen por qué estar ligados a métodos, un coche nos puede lanzar un evento "GasolinaBaja", "RevisarAceite"... cualquier lucecita o indicador que podamos ver en el panel.

Visto esto, vayamos a entender herencia, encapsulación y polimorfismo.
- Herencia: Los objetos pueden descender unos de otros, y cada descendiente puede modificar o añadir propiedades, métodos o eventos de su padre. De esta forma Coche descenderá de Vehículo, y Vehículo no necesariamente tendrá CambiarDeMarcha(), dado que un patinete también es un vehículo. Los árboles de descendencia serán tan complicados o completos como queramos hacer, pensad en el árbol de los seres vivos si para cada tipo definiéramos una clase, comenzando por las autótrofas...

- Encapsulación: A veces lo confunden con la abstracción, pero técnicamente no es así. La encapsulación es la capacidad de hacer que ciertas propiedades, métodos o eventos no sean visibles para todo el mundo. De esta forma suele haber tres visibilidades básicas (pueden ser más): privada, protegida y pública. Privada significa que solamente la propia clase tiene acceso a esos datos, protegida significa que tiene acceso la clase y sus descendientes, pública significa que el acceso es público incluso para clases externas.

- Polimorfismo: Y aquí es dónde llegamos al título de la lección. Suponed la clase Animal, de la cual tenemos descendencias en plan Ave, Mamífero, Pez, Insecto... y ahí se va complicando la cosa hasta llegar a las clases de especies animales concretas, como la Vaca (que será un mamífero) hasta el Pato (que será un Ave). Suponed ahora que en la clase Animal hemos definido el método EmitirSonido(), es decir, un perro ladra, un gato maúlla. Ese EmitirSonido() hará cosas distintas dependiendo del descendiente de Animal que lo utilice. De hecho, el EmitirSonido() de Animal no hará nada, dado que no hay un sonido genérico para todos. Si tenemos un objeto de la clase Vaca, EmitirSonido() devolverá "muuuuuu", si tenemos un objeto de la clase Pato, EmitirSonido() devolverá "cuá cuá". Cada descendiente puede redefinir el funcionamiento interno de un miembro de su padre, incluso reaprovechando lo que estaba programado en el padre.


Pues ahí queda eso, pero a caminar se aprende poniéndose en pie y dando unos pasos... así que aquí doy por finalizado el primer bloque de aprender a pensar, dado que a partir de aquí se seguirá aprendiendo a ello, pero con el lenguaje de programación delante de las narices.

El siguiente libro ya será de C#, y comenzaremos explicando la instalación del Visual Studio. Los que sean piratones, que se pillen un Visual Studio 2008, los que no, que consigan el Visual Studio 2008 Express, que se baja de la propia web de microsoft.

Thylzos

Pues acabo de leerlo todo. No le tengo mucha esperanza a .net (lo reconozco, lo más que usé fue Visual Basic y poco más), pero por ahora pinta interesante. Atrasado, pero me apunto.

Gracias freyi *.*


Cita de: Gambit en 26 de Enero de 2010, 10:25
Follar cansa. Comprad una xbox 360, nunca le duele la cabeza, no discute, no hay que entenderla, la puedes compartir con tus amigos...

Maik

Cita de: Peluche en 10 de Junio de 2009, 11:27
Los que sean piratones, que se pillen un Visual Studio 2008, los que no, que consigan el Visual Studio 2008 Express, que se baja de la propia web de microsoft.

Yo me ocupo.

Bill

Cita de: Yarot en 11 de Junio de 2009, 18:06
Cita de: Peluche en 10 de Junio de 2009, 11:27
Los que sean piratones, que se pillen un Visual Studio 2008, los que no, que consigan el Visual Studio 2008 Express, que se baja de la propia web de microsoft.

Yo me ocupo.

Ok. Si tienes problemas para localizar la medicina avísame, que la tengo muy a mano ;)

Clave

a partir de el lunes sigo con el curso donde lo deje ^^
[spoiler=Citas][23:59:06] petyr dice: A mí el olor a porro me marea mucho[0:33:39] rayd dice: que yo tuve novia
Cita de: Ningüino Flarlarlar en 12 de Agosto de 2011, 12:08Felicidades, Logan. Ya no tendré que darme prisa para contestarte los sms.
Cita de: Rayd en 04 de Octubre de 2011, 16:00
Cita de: Clave en 04 de Octubre de 2011, 15:57
Cita de: ayrendor en 04 de Octubre de 2011, 15:51
Cita de: Clave en 04 de Octubre de 2011, 15:37
Cita de: ayrendor en 04 de Octubre de 2011, 15:29
¿Pero cuando se acaba el plazo para mandar? :facepalm:
Hay un mp para ti.
No lo hay.
Ahora si
Me lo has mandado a mi.

Últimos mensajes

Adivina la película de Orestes
[Ayer a las 23:41]


¿Cuándo moriremos? de NiemandNie
[Ayer a las 19:26]


El hilo con el increíble título mutante de Orestes
[05 de Mayo de 2024, 14:24]


Gran Guía de los Usuarios de 106 de Orestes
[30 de Abril de 2024, 15:15]


Felicidades de Paradox
[29 de Abril de 2024, 12:40]