semana 11 ~ fin de la 2ª evaluación ~

Semana de exámenes y fin de la segunda evaluación.

Tendremos vacaciones hasta el 5 de abril lunes incluído.

semana 10 ~ arrays 2d, aplicaciones ~

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.

semana 9 ~ arrays de dos dimensiones ~

array 2D

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:

  • comprobar como se carga un array de dos dimensiones carga_array_2d
  • temperaturas por meses  (12 meses, todos de 31 días )temperaturas
  • temperatura por meses ( considerando que no todos los meses tienen 31 dias ) temperaturas2
  • contaminación ( 31 días, cada  día 5 puntos de control) contamina_1
  • aumentar el contraste de una fotografía fotografia
  • calcular la nota media de los que aprueban todas las asignaturas notas

Todo esto en una semana . . . . bueno  no,  los primeros los hicimos la semana pasada.

semana 8 ~ lotería primitiva ~

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

  •        generar apuesta
  •         comprobar apuesta

       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 7 ~ examen de arrays de una dimensión ~

semana de examenes . . .

aquí están los enunciados de los examenes

semana 6 ~ transición ~

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:

  • Cargar y mostrar un array
  • calcular la media de los elementos de un array
  • buscar el máximo, el mínimo
  • contar cuantos elementos cumplen una condición
  • buscar un elemento (variantes)
  • ordenar un array
  • búsqueda binaria
  • compactar , darle la vuelta, etc, etc.

Los arrays conviene dibujarlos .

semana 5 ~ búsqueda dicotómica y fractal ~

Para hacer una búsqueda de un dato en un array se puede hacer:

  • lineal ,  comparando de uno en uno el dato con cada celda del array
  • o si el array está ORDENADO  hacer una búsqueda dicotómica (también llamada binaria)

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.

fractal

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.)

semana 4 ~ ordenación de arrays ~

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.

  • Algoritmo de la burbuja : se basa en comparar celdas contiguas del array, si están “mal” se intercambian. Hay que hacer barridos hasta que no haya cambios.  El algoritmo aquí  >> orden_burbuja

 

  • Algoritmo de selección (búsqueda del mínimo): se basa en buscar el mínimo y llevarlo a la primera celda, después se vuelve a buscar el mínimo desde la celda 2  y se lleva a la segunda, así sucesivamente.  El algortimo aquí  >> orden_minimo

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 )

semana 3 ~ moviendo muchas pelotas ~

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.

semana 2 ~ manejo de arrays ~

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.

segunda evaluación ~ semana 1 ~ Arrays

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 :

  • cargar datos en un array
  • mostrar los datos de un array
  • calcular la media de un array
  • buscar el máximo y el mínimo, saber además en que celda están esos valores.
  • buscar un elemento, contar cuantos elementos cumplen una condición.
  • etc, etc.

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 :

  • ARRAY0  simplemente carga datos en un array y luego los muestra.
  • ARRAY_media calcula la media de los elementos de un array.

semana 12 ~ con exámenes ~

Semana de exámenes, antes de las vacaciones, y fin de la primera evaluación.

Resumen de la evaluación:

  • lógica de los programas (algoritmos),
  • estructuras básicas de programación:  condiciones – ifs -; bucles muchos bucles;  mézclese bien y tendrá un programa interesante.
  • algo de gráficos 

Enunciados de los exámenes:  algoritmos  , codificar