lunes, 10 de noviembre de 2014

Links de importancia

Página principal de Scratch: http://scratch.mit.edu/
Descargar el programa: http://scratch.mit.edu/scratch2download/

Página donde encontraras tres libros con distinto grado de dificultad y video tutoriales en español.
http://www.learnscratch.org/resources

Guía para escribir documentos HTML
http://www.uv.es/jac/guia/indice.htm

Página de la Olimpiada Mexicana de Informática
http://www.olimpiadadeinformatica.org.mx/OMI/OMI/InfoGeneral/Convocatoria.aspx

Página de la delegación de Guanajuato
http://www.cimat.mx/oieg/orig/2014/alumnos/

Página de la plataforma OmegaUp
https://omegaup.com/

Página donde vienen las delegaciones de los estados
http://www.olimpiadadeinformatica.org.mx/OMI/OMI/Delegaciones.aspx

viernes, 7 de noviembre de 2014

Temario

El siguiente temario brinda un panorama de los temas que queremos ver, el tiempo que se invierta en cada tema dependerá de los avances de los alumnos.

Temario

  1. Algoritmo
  2. Scratch
    • Introducción e instalación
    • Interfaz, objetos, escenario
    • Bloques de eventos: Bandera verdeal presionar tecla _ y al clickear este objeto.
    • Bloques básicos
      • Posición  ~ Coordenadas 
      • Dirección ~ grados 
      • Números al azar
    • Selección en Scratch
      • Rebotar si toca un borde
      • Si-Entonces
      • Si-Entonces-Si no
    • Condiciones en Scratch
      • Condiciones ya definidas en Scratch
      • Bloques para construir tus propias condiciones
    • Repetición en Scratch
    • Variables en Scratch
      • Variables ya definidas en Scratch
      • Creación de variables y bloques para modificarlas
      • Operadores: unir, suma, resta, multiplicación, división, modulo, redondeo y funciones matemáticas.
      • Creación de listas y bloques para modificarlas
    • Comentando tus programas en Scratch
    • Uso del escenario para centralizar código.
    • Haciendo fallar los programas y corrigiendo las fallas.
    • Juegos: Sincronizando las instrucciones
      • Bloque: enviar mensaje
      • Bloque: enviar mensaje y esperar
      • Bloque: al recibir mensaje
      • Variables globales (para todos los personajes)
    • Clones, Más bloques y uso de la cámara.
  3. Más conceptos básicos
    • Fases para la creación de un programa
      • Definición del problema
      • Diseño del algoritmo
      • Codificación
      • Prueba y depuración
      • Documentación
      • Mantenimiento
    • Lenguajes de Programación
A partir de este punto nos guiaremos del temario empleado para la preparación de la Olimpiada Mexicana de Informática con algunas modificaciones.
  1. Karel
    • Introducción
    • Instrucciones de Karel 
      • mundo de Karel e instrucciones básicas
      • repetir, if, while
      • nuevas instrucciones y parámetros
    • Rutinas básicas
      • Caminar hasta una pared
      • Levantar los zumbadores de una pared
      • Escoger alguna dirección (norte, sur, este y oeste)
      • Brincar una barda
    • Ejemplos no recursivos
    • Recursividad
      • Fundamentos
      • Ejemplo: medir la distancia, ir por el periódico y regresar a su casa
      • Dos ejercicios
    • Parámetros en la recursividad
      • Fundamentos (si-es-cero, sucede y precede)
      • 1 ejemplo (multiplicar 2 números y dibujar un cuadrado)
      • Dos ejemplos recursivos con parámetros
    • Búsqueda de profundidad
      • Bases
      • 2 ejemplos (laberinto, aéreas, nacional 2006)
      • Tarea 2 problemas (tapizar un cuarto de zumbadores, bacterias infecciosas)
  2. Lenguaje C++
  3. Algoritmos

jueves, 6 de noviembre de 2014

Evaluaciones



Los estudiantes trabajan en equipos de máximo 3 estudiantes. Los ejercicios son enviados vía correo electrónico al profesor, el cual las descarga y evalúa en base a diferentes criterios tales como:
  1. Integridad 80%. ¿El programa funciona correctamente.? 
  2. Creatividad 15%. ¿Además del programa base tiene un escenario y una dinámica creativa agregada por el estudiante?   
  3. Claridad, sencillez y eficiencia 5%. ¿Las instrucciones son claras o hay muchas instrucciones innecesarias? 
 Algunas de las evaluaciones tardan en aparecer hasta que el profesor tiene tiempo de conectarse a internet, descargar los archivos y revisarlos, el cual no suele exceder de una semana. Sin embargo actualmente el blog está en desarrollo por lo que aun hay información incompleta.


Lista de programas
  1. Multiplicación
  2. Primos
  3. Pendiente
  4. Musical
  5. Parabólico
  6. Carreras
  7. Invasores
  8. Pacman

Resultados Grupo Talentos Primavera

Primer grado



Segundo grado



Tercer grado


Resultados Grupo Talentos Reforma

Primer grado



Segundo grado



Tercer grado

jueves, 30 de octubre de 2014

Descripción de los programas


Multiplicación

El programa toma dos números al azar, digamos X y Y. Calcula el resultado correcto =X*Y. Pregunta al jugador "Cuanto es X*Y?". Compara la respuesta del jugador con el resultado correcto. Sí el jugador respondió correctamente entonces se incrementa en uno el número de respuestas correctas. Si no se incrementa en 1 el numero de respuestas incorrectas. El proceso se repite hasta que se llega a 10 respuestas correctas, en tal caso el jugador gana, o bien hasta que se llega a 4 respuestas incorrectas, en tal caso el jugador pierde. Añade cosas creativas al juego, por ejemplo, un escenario y una reacción del personaje a una respuesta correcta o a una respuesta incorrecta en términos del escenario que hayas elegido.

Retos:
1. Incorporar también sumas, restas y divisiones entre los números X y Y. 
2. Incorporar dos jugadores y una dinámica para ganar o perder que los incluya.

Pendiente

Dados dos puntos (x1, y1) y (x2, y2) la pendiente se define como
\[pendiente=\frac{y_2-y_1}{x_2-x_1}.\]
Escribe un programa que pregunta cuatro valores de entrada x1, y1, x2, y2. Con el personaje de tu elección dibuja el segmento de línea que va desde (x1, y1) hasta (x2, y2), calcula y muestra la pendiente por 4 segundos. 
¿Cual es la pendiente de una línea vertical? Intenta con (50,0) (50,100). Utiliza el bloque "Si-Entonces-Si no" para considerar las líneas verticales y evitar que la pendiente mostrada sea "Infinita".

Primos

Escribe un programa que pregunta por un valor de entrada n. Determina si el numero es o no es primo. Si el numero no es primo entonces el programa muestra el texto "El numero no es primo" por 2 segundos. Si el numero es primo entonces el programa muestra el texto "El numero SI es primo" por dos segundos.
No olvides añadir algo creativo a tu programa, un escenario y una historia.
Tips
-Un número n es primo si es divisible por 1 y por si mismo, y no es divisible por números intermedios entre ellos. 
-Si n es divisible por m entonces el resultado de la división n/m da un numero entero y el residuo es cero. En Scratch en la categoría de operadores podemos encontrar la función Modulo  "_ mod _" el cual nos proporciona el residuo de la división entre dos números.
-Si n es divisible por m entonces ya sabemos que n no es primo, sin embargo para saber si es primo tenemos que hacer todas las verificaciones.

Retos:
1. Convertir el programa en un juego que pregunte por números primos consecutivos sin repetición.
2. Extender el programa para que cuando un número no sea primo calcule la descomposición en números primos de dicho número.

Musical

  1. Elegir el instrumento que se desea tocar.
  2. Asignar cada una de las 25 notas musicales que vienen en Scratch a una tecla del teclado de la computadora, para que al presionar esa tecla suene la nota asignada y se muestre el disfraz correspondiente.
  3. Dibujar un disfraz asociado a cada nota, tal como aparece cuando eliges la nota musical.
  4. Hacer que el personaje "baile" cada que tocas una nota.
Retos:  
1. Crear una variable asociada al numero de instrumento y dos teclas que al presionarlas cambie al siguiente instrumento o al anterior. Con esto logramos tener todos los instrumentos a la mano, solo con presionar una tecla :D
2. Agregar también los otros instrumentos que solo tienen un sonido al considerar teclas que no habían sido consideradas.

Parabólico

Piensa en un mariscal de campo que se ubica en una posición (x,y) y lanza un objeto con un angulo A de lanzamiento y una velocidad inicial $V_0$. El cambio de posición en el tiempo se calcula como:
\[dx=\cos{A}*V_0*t,\\
dy=\sin{A}*V_0*t - \frac{g*t^2}{2}.\]
El angulo A es medido en grados, donde 0 es la horizontal, 90 es hacia arriba y 45 es la mitad. Considerar que la gravedad vale 9.81. Cuando el disparo no se hace desde las coordenadas (0,0) sino desde otras coordenadas (x_ini, y_ini) entonces la posición en cada instante del tiempo es dado por la posición inicial mas el cambio en x y en y debido al disparo  (x_ini + dx, y_ini +dy).
  1. En el juego el jugador tiene que proporcionar el angulo y la velocidad. 
  2. El tiempo inicia en 0 justo cuando se realiza el disparo.
  3. La posición se calcula a cada instante del tiempo hasta que el objeto toque el borde del escenario.
  4. Usamos el lápiz para dibujar la trayectoria que sigue el objeto lanzado.
  5. Del lado derecho del escenario ponemos un objeto u objetos al cual le queremos pegar o llegar.
Tips
-Si el personaje no sigue una trayectoria parecida a una piedra cuando tu la arrojas, entonces algo esta mal programado.
-Se debe considerar que el escenario esta limitado por los bordes, por lo que se deben considerar velocidades entre 0 y 100, después de ese valor el lanzamiento puede verse "extraño" en el programa.
-Ser muy cuidadoso de como se realizan las operaciones con los bloques de "operadores". Las operaciones se deben separar con los bloques tal como se harían con paréntesis usando una calculadora. No es lo mismo (2*3)-1 que 2*(3-1).

Carreras

Se tratar de un juego de carreras, contra otro oponente tratando de completar el recorrido lo antes posible sin salirse del camino, porque de lo contrario deberemos volver a empezar.
  1. Lo primero que vas a hacer es dibujar el circuito. Lo lógico para que el juego sea parejo es que el circuito sea el mismo.
  2. Tendremos dos corredores, elijan los personajes de su agrado. El primero lo controlaremos con flecha derecha (para cambiar un poco de dirección hacia la derecha), flecha izquierda (para cambiar de dirección hacia la izquierda) y flecha arriba (para avanzar un número de pasos mientras esté presionada).
  3. Si se sale de la pista tendrá que comenzar de nuevo y el que llegue al final del circuito primero gana. 
  4. En el escenario dibujar dos disfraces, uno para cuando gana el primer corredor y el otro para cuando gana el segundo corredor.
El programa es una pequeña variante del ejercicio que viene en este link .

Reto: Agregar una variable correspondiente a la velocidad con la que se mueve el corredor. Para ello considerar que debe haber una velocidad máxima (por ejemplo 4) que puede alcanzar y una velocidad mínima (cero)

Invasores

Considérese el juego de invasores espaciales donde hay una pequeña nave que dispara balas o proyectiles a unos marcianos que se acercan a la nave.

  1. Dibujar el escenario adecuado, el personaje que disparará los proyectiles (defensor) y los personajes que hacen el papel de atacar (invasores).
  2. Programar que tipo de movimiento sigue el defensor. Usualmente se mueven de lado a lado del escenario, en la parte baja.
  3. Programar lo correspondiente a los proyectiles hay dos opciones: primera, los proyectiles son visibles en todo momento, y van pegados al defensor hasta que este los dispara; segundo, los proyectiles se "esconden" y aparecen hasta que se hace el disparo, entonces salen del defensor y se mueven hacia arriba.
  4. Programar lo correspondiente a los invasores. Estos se mueven todos igual, de lado a lado del escenario y poco a poco se acercan hacia la parte baja del mismo. Cuando una bala los toca, cambian de disfraz a una donde explotan y luego se "esconden".
  5. Hay una variable que me cuenta cuantos invasores han explotado. Si explotaron todos antes de tocar al defensor entonces el defensor salio victorioso. Si algún invasor logra tocar al defensor, el defensor pierde la batalla.

Reto: Ahora el reto es programar que los invasores también pueden disparar, pero con menor frecuencia a la que puede disparar el defensor.

Pacman



viernes, 24 de octubre de 2014

Materiales del curso


Para maestros: Los siguientes materiales nos pueden ayudar en nuestras labores docentes cuando usamos Scratch.

Para alumnos: Las presentaciones que hemos usado en clases vienen en los enlaces que se mencionan más abajo. Si se les complica mucho alguno de los programas que hacemos en clase pueden utilizar las guías de ejercicios para practicar y mejorar su habilidades.

Scratch


En este link podemos encontrar videos y material para descargar (presentaciones y ejercicios), que forman parte del curso Learning How to Program with Scrath preparado por  el Dr. Joe Hummel que nos pueden ayudar a darle al alumno los elementos "teóricos" de un tema particular. Las presentaciones y los videos están en inglés, pero son una excelente guía ya que vienen organizadas por temas y los ejercicios van incrementando el grado de complejidad.

En este link podemos encontrar Guías de Ejercicios en videos o archivos para descargar en pdf preparados por  Sergio Palay, quien es docente de informática en Educación Secundaria desde el año 2001 y que ha participado en diferentes eventos tales como Scratch Day, Expo Aprende, Sembrando Experiencias, etc.

Karel


Utilizaremos materiales proporcionados por las diversas delegaciones estatales de informática de nuestro país (México).

Manuales Introductorios:

  1. Manual de Introducción a Karel: Es el manual más básico para principiantes, que explica la instalación, el entorno, los menús, comandos del lenguaje y resolución de problemas básicos.

Manuales básicos:

  1. Manual Básico de Karel: En este manual se tratan temas básicos del lenguaje de Karel, comandos, decisiones, repeticiones y declaración de nuevas instrucciones. Proporcionado por la delegación de Jalisco.
  2. Manual basico: Un tutorial bastante sencillo que puedes usar para iniciar. Proporcionado por la delegación de Guanajuato.

Manuales medio:

  1. Presentación Karel Nivel Medio: Es la presentación utilizada durante el taller medio de Karel de diciembre de 2008.
  2. Pasos para resolver un problema de Karel: En este manual se encuentran descritos los pasos necesarios para resolver eficientemente un problema de karel.
  3. Manual de recursión en Karel: Manual hecho por Luis Vargas, donde se tratan los temas avanzados de karel. Recursión y uso de variables, recomendado para personas que dominan ya los temas básicos.
  4. Tunning Karel: ¿ Cansado de ver a Karel siempre igual ?,  dale una manita de gato con este tutorial que elaboró Hugo Dueñas de la Escuela Politécnica.

martes, 21 de octubre de 2014

Características deseables de los programas


Al finalizar el curso, los estudiantes pueden leer la siguiente lista de caracteristicas y reflexionar sobre cuales de ellas han puesto en práctica en los programas que desarrollaron. Algunas las entenderan, otras no, pero saber cuales son puede ser de gran ayuda en su futuro...

Por J. F. Díaz (jfdiaz98@hotmail.com)
Lic. en Ciencias de la Computación

La siguiente es una lista de 9 importantes características de los programas bien escritos. Deben observarse en todas las fases de desarrollo de los programas, independiente del lenguaje utilizado. Estas características hacen de un puñado de código un mejor programa y deben tenerse siempre presentes:

1. Integridad Se refiere a la exactitud de los cálculos y a la confiabilidad de los resultados. Los programas deben ser lo más exactos posible. Ningún programa tendrá aceptación si los cálculos que efectúa y los resultados que produce no son correctos. Una conversión de tipos inadvertida, el redondeo o truncamiento desafortunado de valiosos decimales, la no validación de los datos de entrada o la no verificación de los resultados calculados pueden hacer que un programa pierda credibilidad, utilidad y méritos. Esta característica es absolutamente necesaria en cualquier programa.

2. Claridad Esto hace referencia a la facilidad de lectura del programa, con particular énfasis en la lógica subyacente. Si un programa está escrito en forma clara será posible para otro programador comprenderlo sin mucho esfuerzo. También hará posible al autor original comprender su propio programa después de haberlo dejado durante algún tiempo. Uno de los objetivos al escribir programas debe ser desarrollar programas claros y de fácil lectura a través de un enfoque estructurado, ordenado y disciplinado.
Se enfatiza aquí el espaciado, la indentación y la elección de identificadores adecuados para el programa (nombres de variables, constantes, subprogramas y estructuras de datos). Es mejor invertir algo de tiempo y esfuerzo en elegir nombres autodescriptivos y escribir código claro que romperse luego la cabeza tratando de comprender un código apretado y confuso.

3. Sencillez La claridad y exactitud de un programa se suelen ver favorecidas con hacer las cosas de forma tan sencilla como sea posible. De hecho puede ser deseable sacrificar cierta cantidad de eficiencia computacional con miras a no complicar la estructura y el código del programa.
Este objetivo de sencillez puede alcanzarse si no se incluye en el programa código "sucio", algoritmos "astutos" o trucos de programación que compliquen la lógica del programa, que sean redundantes o definitivamente no sirvan para nada, como las de maquillaje excesivo de la interfaz o en las salidas de datos.

4. Eficiencia Esto está relacionado con la velocidad de ejecución y la utilización eficiente de la memoria, o sea, con la búsqueda del punto óptimo de la relación Tiempo/Espacio. Este es uno de los objetivos importantes, aunque no se debe conseguir a expensas de la pérdida de la claridad y la sencillez. Muchos programas complicados conducen a un enfrentamiento de estas características. En estos casos es necesario recurrir a la experiencia y al sentido común.
Al programar deben utilizarse las instrucciones más adecuadas, las estructuras de datos más apropiadas y los métodos de solución más rápidos y directos. Se incluye en este punto la optimización de código (reducción del número de variables y eliminación de sentencias redundantes) y la compactación y simplificación de código sin olvidar la claridad y la sencillez.

5. Modularidad Los programas pueden dividirse en pequeñas subtareas, cada una de las cuales se encargue de tareas específicas. Es buena práctica de programación implementar cada una de estas subtareas como una rutina separada, ya sea un subprograma, un módulo o un programa completo que sea llamado por otra rutina que integre a todas las partes.
El diseño modular de los programas ayuda a mejorar el desarrollo, la corrección, la sencillez y la claridad de los programas. Esta característica se relaciona estrechamente con técnicas de programación tales como el diseño Top-Down (descendente) y Down-Top (ascendente).

6. Generalidad Normalmente deseamos que los programas sean lo más general posible, dentro de unos límites razonables, lo cual reducirá las revisiones y ajustes de mantenimiento de rutina a los mismos. Por ejemplo, el uso de constantes, la lectura de valores de teclado, la validación de los datos, el uso de tipos de datos amplios y adecuados y todas las consideraciones que dicte el sentido común son algunas de las cosas que hacen a los programas más generales. Como norma se puede conseguir con muy poco esfuerzo adicional una cantidad considerable de generalidad incluyendo alguna o todas estas sugerencias.

7. Flexibilidad Los programas deben poderse adaptar a nuevas necesidades con tan sólo ligeros cambios. Esto implica diseñar los programas de una forma clara y limpia, imprimirle generalidad, utilizar funciones de bibliotecas, usar constantes e identificadores correctos y una lógica sencilla a lo largo de todo el programa.

8. Presentación Se refiere a la implementación de interfaces de usuario sencillas, claras y fáciles de utilizar para hacer más entendibles, amenos y amistosos los programas. Esto se ve estrechamente vinculado con la interactividad entre el usuario y las pantallas de captura o salida de datos.

9. Documentación Aunque se mencione como última "característica deseable" debe hacerse a la par de todo el desarrollo del programa y actualizarse con cada cambio que se realice al código. La documentación debe ser descriptiva, concisa, clara y oportuna, de tal forma que permita la rápida comprensión del código. Invertir tiempo y esfuerzo en documentar los programas resulta de gran beneficio para el propio programador y para otros, sobretodo en las fases de Prueba y Mantenimiento del Ciclo de Desarrollo de los Programas.