Semana de exámenes y fin de la segunda evaluación.
Tendremos vacaciones hasta el 5 de abril lunes incluído.
Semana de exámenes y fin de la segunda evaluación.
Tendremos vacaciones hasta el 5 de abril lunes incluído.
Ejercicios con arrays de dos dimensiones:
- elecciones (municipales, autonómicas, generales): calcular cuantos diputados obtienen los partidos en una provincia, a partir del número de votos obtenidos.
- logística : varios almacenes y un sistema centralizado de envío de mercancías, se intenta enviar la mercancía desde el almacén más cercano.
Vamos con los arrays de dos dimensiones, también llamados matrices y a veces también tablas.
Un array de dos dimensiones es una forma de organizar los datos en filas y columnas, todo ese conjunto tendrá un nombre común. Para acceder a un dato hay que utilizar dos índices [fila] [col].
Lo más importante para manejar arrays de dos dimensiones es mantener la coherencia entre la declaración del array y el acceso a los datos. Es decir, si declaramos un array de 5 x 10 el primer índice solo puede llegar hasta 5 y el segundo hasta 10; sí existe el elemento [1][ 10] pero no el [10] [1].
Cuando tengamos que desarrrollar un algoritmo es muy útil dibujar el array y comprender bien como están situados los datos. A los índices le podemos poner el nombre que mejor explique lo que maneja. Así un array que tenga datos de 12 meses y 31 días , podemos llamar a los índices mes, dia. Esto lo vemos con los ejercicios que van más adelante.
Internamente el ordenador no dibuja el array, el dibujo es para nosotros, para que nos aclaremos.
Ejercicios:
Todo esto en una semana . . . . bueno no, los primeros los hicimos la semana pasada.
Vamos a ver la potencia de calculo, sobre todo por velocidad, de los ordenadores.
Escribimos un programa que procesa una apuesta de lotería primitiva (una apuesta son 6 números del 1 al 49 que no se repiten). Para procesar una apuesta se guardan los números de la apuesta en un array A de 6 elementos. Tendremos también la combinación ganadora anotada en otro array G. Se trata de contar cuantos aciertos tiene A.
Cuando se resuelve para una apuesta se puede aplicar el algoritmo a n apuestas.
Podemos escribir un programa que básicamente será
Inicio
hacer
muchas veces
mostrar resultados generales
Fin
Para que el programa sea más real, vamos a tener las apuestas grabadas en un fichero y el programa debe procesar el fichero. Dejo aquí en BOX varios ficheros de apuestas, uno pequeño de 20 apuestas, otro de 50.000 y otro de 1 millón de apuestas. dejo también un programa en C que se encarga de leer las apuestas de una en una, ese programa sirve de base y hay que completarlo: leer y procesar. Tenéis que escribir la parte de procesar la apuesta.
Procesar 1 millón de apuestas puede llevar un buen rato, así que primero hacer pruebas con los ficheros pequeños y cuando el programa funcione se procesará el millón de apuestas.
En realidad, con un pc moderno, un millón de apuestas se procesa en muy poco tiempo -menos de 1 minuto- pero si el programa va visualizando los resultados de cada proceso sí irá lento. Es decir, lo que retrasa es la salida por pantalla. Pero un programa que no informa de lo que hace puede ser un poco intrigante (o frustrante si no funciona bien y no acaba nunca), así que conviene que vaya informando, por ejemplo cada 1000 apuestas procesadas, que el programa avanza.
Como wordpress no permite alojar ficheros de código, dejo el programa y los datos en un servicio de compartir documentos: BOX ( así también vais conociendo estos servicios).
semana de examenes . . .
aquí están los enunciados de los examenes
Esta semana practicamente no tuvimos clase, por los días de carnaval. La próxima semana tendremos examen sobre arrays de una dimensión y después ya empezamos con arrays de 2 y 3 dimensiones.
Resumen rápido antes de examen:
Los arrays conviene dibujarlos .
Para hacer una búsqueda de un dato en un array se puede hacer:
la búsqueda dicotómica es muy eficiente, encuentra un dato con un máximo de log 2 N comparaciones. (N es el tamaño del array)
Es decir que si el array es de 1000 elementos, con 10 comparaciones encuentra el dato (o bien se da cuenta de que no está). Si el array fuera de 1.000.000 de celdas, con 20 comparaciones encontraría el dato.
busqueda_binaria.doc (se puede mejorar, pero más que nada busco claridad antes que eficacia )
Ejercicio de aplicación de la búsqueda >> ej_busqueda
Un ejercicio diferente: generar un fractal por agregación de partículas.
Se trata de un algoritmo muy sencillo: tenemos una partícula en un punto de la pantalla (en el centro, p.e.). soltamos otra partícula por la pantalla y la movemos aleatoriamente, cuando esté cerca de la partícula inicial se queda pegada y ahora ya tenemos dos partículas. Soltamos otra y la movemos, cuando toque a alguna de las que ya están fijas, se queda pegada. Hacemos esto para muchas partículas. Al principio el sistema irá lento, ya que para que se encuentre con una partícula no va a ser fácil, así que sería bueno poner un área pequeña donde se van a soltar y a mover las primeras (100 ?) partículas, si en su movimiento se salen de esa área, simplemente generamos otra nueva.
El algoritmo puede ser el siguiente (aunque se necesitan ajustes posteriores) >> fractal
Existen muchas páginas web sobre fractales, una que describe este método y de la que obtuve la imagen superior es esta o esta otra en español http://www.dmae.upm.es/cursofractales/capitulo8/4.html.
(hace un tiempo -creo que fue en mayo de 2008- en el suplemento de informática de El Pais, ciberpais, publicaron una noticia sobre este tipo de fractales. Era sobre un grupo de estudiantes americanos que habían creado unas joyas a partir de estas estructuras fractales. Salían unas cuántas fotos y tenían su atractivo. Por más que las busqué en internet no he podido encontrar ni el artículo ni las imágenes de las joyas. Sí encontré otras imágenes de fractales utilizados como joyas, pero son los “típicos fractales” simétricos y que no tienen nada que ver con esas imágenes que no encuentro. Si alguien tiene ganas de buscarlas pues que envíe la referencia.)
Plan para febrero: carnavales y examen.
Carnavales días 15, 16 y 17 no habrá clases.
Examen de arrays: días 23 (teoría ) y 24 (práctico).
Vamos a ver un par de algoritmos para ordenar arrays.
Los algoritmos de ordenación son un capítulo muy estudiado en programación, ordenar datos es una tarea que siempre aparece cuando se trabaja con muchos datos. Existen medidas de la eficacia de un algoritmo, sería el número de comparaciones e intercambios que tiene que hacer el algoritmo para completar el trabajo. Pero claro, también depende del estado inicial de los datos en el array: hay casos más favorables para un algoritmo y casos más desfavorables.
En la siguiente página ( genial !! ) se pueden ver diferentes algoritmos y como trabajan en diferentes situaciones. También se puede ver el código y algunas características de cada uno.
http://www.sorting-algorithms.com/
( si os parece un poco liado verlos todos a la vez, podéis aquí http://people.cs.ubc.ca/~harrison/Java/ShakerSortAlgorithm.java.html ver los algoritmos de uno en uno )
Empezamos la semana con el ejercicio de mover varias pelotas, además comprobamos si hay choques entre ellas.
Es un ejercicio que combina muchas cosas a la vez de las que estamos tratando (varios arrays, bucles anidados, etc), así que necesita un poco más de atención y tiempo de estudio.
Dejo aquí el algoritmo por si alguien se pierde, que pueda releerlo con calma.
Vemos también un par de algoritmos para eliminar elementos repetidos en un array que no está ordenado. Aquí están.
Por último hicimos un ejercicio para programar un sistema de reserva de entradas para un concierto. Enunciado
Se trata de tener un programa que permita reservas entradas dando un dni y solicitando un máximo de 10 entradas por persona. El número de entradas disponible inicialmente es de 1000.
Aquí el algoritmo de las reservas.
Como siempre, hay que probar las cosas con una escala pequeña, que podamos seguir a mano, en este caso haremos pruebas para un aforo de 10 entradas y un máximo por persona de 4 entradas.
Como véis los programas se van complicando y empezamos a hacer cosas que pueden tener una aplicación real. Cada vez es más importante tener claro el algoritmo y ser ordenado al codificar.
Seguimos con ejercicios de arrays de una dimensión.
Tenemos en un array -pongamos de 100 elementos- los dni de diferentes personas que se inscribieron en una oferta.
Escribir un programa que permita introducir un dni y nos diga en que puesto está en el array. Si no está debe indicarlo.
Deho aquí el algoritmo : Búsqueda de un dni en un array no ordenado
Uno fácil: tenemos en un array T [31] los datos de los coches que pasaron por una carretera a lo largo de un mes. En la celda T[i] está el número de coches que pasaron el día i.
Escribir un algoritmo, y después un programa, para mostrar: los días de tráfico intenso (se supone que hay tráfico intenso si supera en más de un 20% la media diaria).
Y para darle un poco de color y vistosidad volvemos al ejercicio de mover una pelota por pantalla, pero en este caso en vez de una pelota tendremos n pelotas.
Para manejar las n pelotas debemos guardar las coordenadas de cada pelota en un array X [N], otro array para las Y, otro para las Dx y otro para las DY.
La solución, en la nota de la semana siguiente.
ARRAYS.
Empezamos a trabajar con variables compuestas, que admiten más de un dato.
Los arrays pueden lineales, de una sola dimensión y también se llaman vectores; de dos dimensiones y también se les llama tablas; de tres dimensiones, y en algunos lenguajes n-dimensionales. Un array implica una organización en los datos.
Un array es como una variable simple pero tiene celdas numeradas correlativamente, en C las celdas se numeran empezando en 0 (cero) , cosa que siempre produce algunos errores, ya que las personas numeramos empezando en 1.
Las operaciones básicas con arrays de una dimensión son :
Para los ejercicios de clase utilizaremos frecuentemente datos ficticios, cargaremos los arrays con datos inventados utilizando valores aleatorios.
Conviene siempre en los ejercicios con arrays hacer pruebas con arrays pequeños, por ejemplo de 4 celdas, y cuando esté comprobado su funcionamiento extender el problema a un número mayor de datos.
Dejo aquí, dos programas :
Semana de exámenes, antes de las vacaciones, y fin de la primera evaluación.
Resumen de la evaluación:
Enunciados de los exámenes: algoritmos , codificar