Periódicamente enseño un curso de introducción a la programación usando Java . Quiero dar a mis alumnos algunas tareas interesantes con las que puedan relacionarse o encontrar interesantes . Por lo menos, quiero tareas que tengan sentido y tengan una cohesión interna (por ejemplo, algunos ejercicios de programación muy malos parecen inventados solo para que tenga que usar la construcción de programación más reciente cubierta).
Para darle una idea del alcance, esto es lo que se está cubriendo :
- Las asignaciones deben estar en Java, se puede usar una biblioteca externa, pero debería ser una API simple y no un marco completo
- Variables, primitivas y cadenas
- Consola de entrada y salida
if
`for
`while
- Operadores aritméticos y lógicos.
- Gráficos simples con dibujo de líneas y formas.
- Métodos estáticos
- Matrices unidimensionales
Los estudiantes no entrarán en temas avanzados (por ejemplo, sin recursión, sin énfasis en la herencia). Por lo tanto, estoy no en busca de proyectos complejos: "Haga que escriban un compilador C lo hice cuando tenía 5 y que era la única manera que he aprendido."
Si tiene ideas que son más avanzadas que el alcance, publíquelas en la pregunta "Desafiante" vinculada a continuación, y no en esta.
En cambio, lo que estoy buscando son ideas interesantes que se puedan lograr en un programa corto. Por ejemplo:
Los estudiantes pueden escribir una versión de consola del generador "Star Wars Name" . Esto es efectivamente leer cadenas y usar
substring
, pero creo que es divertido. Una variación similar sería un programa " Mad Libs ". Utilicé este hace cinco años, y tal vez ya está "rancio".Usando algunos trigonométricos que se les proporcionan, los estudiantes pueden dibujar polígonos regulares y crear interesantes formas en espiral.
Tampoco está fuera de discusión usar una clase de animación simple con la mayor parte del código que se les proporciona. Y si conoces un servicio de Twitter o Facebook al que se pueda acceder con una API simple, estaría muy interesado en saberlo.
Tenga en cuenta que esta pregunta es diferente de la pregunta "Preguntas desafiantes de Java para principiantes ". No busco desafíos per se, solo interesantes. Creo que si los estudiantes trabajan en algo donde puedan responder fácilmente "¿por qué alguien querría programar eso?" entonces aprenderán mejor.
Incluso problemas simples como calcular millas por galón pueden ser buenos. Aunque, si hay una manera de actualizarlo para que sea más relevante, mucho mejor. Si tiene un ejercicio de otro lugar (un libro o un sitio web), cite la fuente.
Para ayudarlo a pensar en el estudiante de primer año típico de hoy, consulte la lista de mentalidad de Beloit , para ver muchos ejemplos que seguramente lo harán sentir viejo.
fuente
Respuestas:
Dadas las limitaciones, sugeriría implementar una versión de Hangman. Permitiría a los estudiantes demostrar todas las técnicas que les está presentando, sin ser demasiado complejo.
También se puede utilizar como un proyecto en desarrollo a medida que avanza el curso. por ejemplo, una vez que haya cubierto las cadenas y las variables, comienza como una versión de texto
p.ej
a continuación, introduzca bucles para eliminar el elemento de cortar y pegar del código a medida que las 10 conjeturas cuentan hacia atrás ... acumulando hasta tener gráficos de líneas y que la persona del palo sea colgada / guardada al final del curso de 5 semanas.
Como la mayoría de las personas que tienen experiencia en reclutar y entrevistar a programadores, realmente me da vergüenza que este nivel de matrícula sea necesario en la universidad, pero lamentablemente, probablemente seguirá siendo necesario hasta que las escuelas traten la programación como un tema serio a la par con matemáticas o ciencias
fuente
Parece que un juego de aventura de texto podría ser una tarea excelente en algún lugar a mediados del semestre. Tuve una clase que nos hizo jugar Colossal Cave Adventure y luego crear nuestro propio juego. Me enseñó muchas de las construcciones básicas desde el principio, y fue muy divertido hacer que todos se metieran en ello.
fuente
¿Qué tal usar un problema o dos de http://projecteuler.net/? Algunos de estos son bastante interesantes y uno podría ver el beneficio de escribir un programa para resolverlos. Son lo suficientemente pequeños como para que se puedan hacer varios como tareas. Otro que me gusta usar es encontrar $ 1.00 palabras. Cada letra en el abecedario vale su posición en centavos, es decir, a = 1, b = 2. ¿Cuántas palabras de $ 1.00 dólares puedes encontrar? Esto podría involucrar E / S de archivos (lectura en un diccionario), matrices, bucles, etc.
fuente
Implementa un juego de Monopoly. El monopolio tiene una secuencia obvia y se presta a la división en funciones con mucha facilidad. También solo requiere una matriz unidimensional y algunas clases básicas. La lógica es lo suficientemente simple como para que los estudiantes piensen más en "cómo" que en "qué", y da como resultado algo que se puede demostrar a los demás.
Dales un archivo encriptado que haya sido encriptado con alguna regla reversible y pídeles que escriban un decodificador (aunque sea bastante simple). Esto ofrece un incentivo adicional para resolverlo debido al misterio sobre el contenido del mensaje.
No sé por qué solo cubres matrices unidimensionales y no matrices (realmente no son tan diferentes), pero si estás dispuesto a incluir eso en el programa de Juego de vida de Jon Conway también es relativamente fácil y resulta en algo divertido.
Un juego como el ajedrez requiere algo de reflexión, pero aún está dentro de los límites de lo que un principiante puede hacer con una herencia mínima (las piezas específicas se heredan de una Pieza de clase general, y el tablero contiene objetos de tipo Pieza) y matrices 2D (puede elegir simplifíquelo al no requerir la implementación de cosas difíciles como la detección de stelmate o la incapacidad de enrocar si las piezas enemigas amenazan el camino del enroque).
fuente
Creamos bastantes proyectos con solo E / S, funciones y operadores condicionales en la escuela. Todo hecho antes de aprender sobre la programación orientada a objetos. Estos proyectos avanzaron lentamente para ser cada vez más difíciles. Basta decir que las 4 horas que tuvimos cada semana no fueron suficientes para el final del año.
Todos estos proyectos se realizaron solo con funciones y E / S:
Un juego que aprende. Toma una cantidad de palos, la PC toma una cantidad de palos. Repetir. El último que sostiene un palo pierde. Tuvimos que crear un programa simple de autoaprendizaje que mejoró después de cada juego. Buen ejemplo para aprender matrices 2D.
Un descifrador de códigos. Conoces el cifrado César, elige una letra y agrega el valor de la letra a cada letra de tu palabra. Por ejemplo, clave = 'a' y la palabra = "secreto". Esto se convertiría en "tfdsfq". Se puede hacer leyendo el archivo y luego creando una tabla de frecuencias para cada letra. También lees en una Biblia en inglés. Luego, simplemente puede ver que la letra más utilizada en el alfabeto inglés es una 'e' y resolverla. Reto agregado: use una tecla como 'ab', que fue nuestra tarea. Buen ejercicio para entender las E / S.
Un fabricante de códigos de barras. Este programa fue un ejercicio para llamar a una biblioteca externa. Obtuviste un código y tuviste que generar una imagen con el código de barras. Se usó una biblioteca externa para generar la imagen.
Un algoritmo genético para resolver el problema de los vendedores ambulantes. Este fue un proyecto más avanzado para 2 o 3 personas. Comienza con una ruta aleatoria y esta ruta mejora todo el tiempo hasta que tenga una "buena ruta". Bonificación: crea un mapa con la ruta.
Un programa de compresión de trabajo lzw . Este fue el proyecto final de 4 personas. Los parámetros fueron bastante simples. "Zip file.txt file.zip" o algo similar. Proyecto divertido pero entender el algoritmo lzw tomó un tiempo.
fuente
Una calculadora sería un buen proyecto para aprender operaciones aritméticas. Puede convertirlo en una simple aplicación de consola basada en menús o una GUI. Cuatro funciones (+, -, *, /) para comenzar, con puntos adicionales para cosas más complejas como la raíz cuadrada, etc.
Para el manejo de cadenas, sugeriría algunos problemas de validación. Me vienen a la mente las direcciones de correo electrónico: dejarlas sin marcar puede provocar agujeros de inyección SQL u otras cosas, y son relativamente fáciles de validar. Para agregar, tal vez tenga un programa que pueda tomar nombres, apellidos y apellidos, y juntarlos con espacios, y también tomar un nombre completo y analizarlo en cada componente. El primero se usa más que el segundo en la vida real, pero no he podido pensar en otro escenario de análisis que sea lo suficientemente simple.
Para demostrar métodos estáticos, puede asignar un problema de búsqueda de correo electrónico. Tenga un archivo de nombres y correos electrónicos, y el constructor estático podría poner los nombres / correos electrónicos en una lista, con un método estático para encontrar el correo electrónico para un nombre dado.
Espero que estos te den algunas ideas! Buena suerte con tu clase.
fuente
Una cosa muy interesante y genial para una tarea es escribir una implementación de Conway's Game of Life en 2D. Se asigna muy bien a estructuras de datos de matriz básicas, es divertido y bastante fácil de hacer, pero aún requiere algo de reflexión. Puede abrir algo de curiosidad y experimentación también (AI).
Los estudiantes avanzados pueden escribir una versión en 3D para obtener puntos extra.
fuente
Me gustaría iterar en un generador de números primos.
Asignaciones
fuente
Estoy usando la Biblioteca ACM para ayudar a los estudiantes de introducción a hacer gráficos y juegos simples. Hemos podido hacer juegos básicos basados en clics para dos jugadores con nada más que las habilidades que describiste. Esta semana están haciendo el juego Fox and Hounds .
He tratado de mantenerme alejado de la E / S de la consola el mayor tiempo posible. Es un concepto extraño para muchos estudiantes en estos días, ya que todos han crecido con GUI. Así que me concentro en MVC, obteniendo el modelo correcto y agregando la GUI solo después de que hayan probado su modelo. Las pruebas se realizan a través de pruebas unitarias automatizadas y Code Pad en BlueJ . No
public static void main()
es necesario, nunca.fuente
Enseñé introducción en el siglo pasado, y fue BÁSICO, pero como tú quería que los estudiantes emprendieran un proyecto divertido de su propia creación. Entonces sugerí un montón de posibilidades:
... o lo que los estudiantes pensaran. Ellos venían a mí y me decían "¿qué tal un programa para hacer XYZ?" y yo siempre decía "Genial", y luego los guiaba un poco para que no fuera demasiado complicado.
Por lo general, sus proyectos terminaron siendo unos cientos de líneas de código, y siempre lo disfrutaron.
PD: di esta tarea después de que los estudiantes eran competentes con las estructuras básicas de control, E / S, matrices y archivos secuenciales. Era un proyecto a término, una parte importante de su calificación, y tenía asignaciones de hitos intermedios, como un esquema a mitad de camino, por lo que no trataron de hacerlo todo al final y chocaron contra una pared. Quería incluirlos en esto lo más temprano posible en el semestre, cuando tenían suficientes habilidades para comenzar, generalmente alrededor de la semana 6 u 8.
fuente
Un maestro escribió un programa para el que tú escribiste módulos. Básicamente, era un juego y había que escribir un algo para resolverlo, todo estaba allí para que fuera gráfico y bonito y funcionara bien. Tal vez deberías escribir tu propio marco de juego y darles herramientas básicas que son versiones simplificadas de cosas geniales que pueden hacer más tarde fuera de la caja en la que las has puesto.
fuente
En mi curso de introducción, me quedaron tres proyectos
Escribe un programa para mostrar una pintura aleatoria de Mondrian
Escribe la primera parte de un juego BrickBreaker, haz que la pelota rebote dentro de un área determinada
Escribe un juego de aventura basado en texto
Desde mi clase de algoritmos
Implementar un triángulo de Serpinski
Estos cuatro proyectos me dieron una gran comprensión del procesamiento de cadenas, la aleatorización, los gráficos, la recursividad y la animación.
fuente
¿Están todos los estudiantes en la clase CS mayores? Mi conjetura no sería. Se me ocurrirían tareas que se adapten a los mayores en la clase.
Ejemplos:
Los estudiantes de arte podrían escribir un programa que tome las dimensiones de una pieza de lienzo y un marco para calcular la cantidad de lienzo que no estaría disponible para pintar (debido a envolver y engrapar el lienzo alrededor del marco).
Los estudiantes de Econ pueden calcular el interés compuesto en un artículo.
Los estudiantes de matemáticas podrían elegir problemas del Proyecto Euler.
fuente
En la escuela secundaria, tomé una clase de programación introductoria y usamos Karel J. Robot . Proporciona una interfaz gráfica de usuario para ver su robot, y tiene un conjunto muy básico de sensores y métodos de movimiento que debe extender para que haga cosas interesantes. Creo que es bueno porque los robots son fáciles de entender para las personas que aún no han comprendido la diferencia entre el software.
También hay Processing , que acabo de descubrir, que fue diseñado originalmente para enseñar programación, y también está en Java.
fuente
Voy a ser el disidente aquí. Creo que debería darles problemas de tipo de negocio válidos para resolver no playtoys. Si no son lo suficientemente serios como para estar interesados y motivados con el tipo de trabajo que realmente estarán haciendo como profesionales, prefiero que los rechacen en el curso de introducción. El trabajo real no se trata de hacer cosas geniales, se trata de satisfacer las necesidades del cliente. También he visto a muchas personas que no pueden dar el salto entre lo que aprenden en un juego y usar las mismas técnicas en la programación de negocios.
Cada desarrollador senior y gerente de contratación que conozco está disgustado con la calidad de los recién graduados. Intenta concentrarte en lo que necesitan para aprender a trabajar en el mundo real y olvídate de hacerlo divertido.
fuente
Una tarea para construir un widget tonto en sus teléfonos móviles. Algo que podrían mostrar a sus amigos. Tengo un teléfono AT&T súper económico y toma archivos jar de algún tipo.
fuente
Las tareas más importantes que he visto obligan a las personas a pensar en algo que de otro modo no habrían considerado. Algo completamente fuera del material del curso simple, algo que parece imposible. Algo que tiene múltiples soluciones válidas.
Algunos que me han impresionado:
Roshambo AIs (utilizado en el curso de IA en UOA). Una función simple que devuelve -1, 0, 1 para piedra, papel, tijera. Las IA se enfrentan entre sí y las estadísticas se recopilan mediante un programa de utilidad agregado. Esta tarea sorprende constantemente a las personas en cuántos enfoques son viables (y cuántos funcionan tan mal).
Problemas de clasificación simples con características imposibles. Ordenar un archivo de longitud infinita con memoria finita. Este problema sacudió mi base de pensar en algoritmos. Hay muchos problemas relacionados: promedios en ventanas sobre datos de longitud infinita, etc., cada uno obliga a una solución a algo aparentemente imposible.
Problemas de simulación que parecen triviales. Simulaciones de tráfico (vehículo, red), simulaciones de autos de carrera (izquierda, derecha, más rápido, más lento), simulaciones de supermercados.
Problemas de red (una gran debilidad en los graduados con los que he trabajado durante los últimos años). Problemas de red de pares con dispositivos portátiles, por ejemplo, demostrando la complejidad de los problemas de n-sync, actualizaciones de pares, confianza de pares, etc.
Pequeños idiomas (otra debilidad en graduados recientes). Desarrolle un poco de lenguaje para un juego simple de inteligencia artificial (damas, roshambo, tanques, CSS mojo, bots de Twitter). Pensar en los conceptos de diseño del lenguaje, interpretación y acciones es fundamental.
fuente