Quels sont les bons devoirs pour un cours d'introduction, pour atteindre les étudiants d'aujourd'hui? [fermé]


25

J'enseigne périodiquement une introduction au cours de programmation utilisant Java . Je veux donner à mes étudiants des devoirs passionnants auxquels ils peuvent se rapporter ou trouver intéressants . À tout le moins, je veux des affectations qui ont du sens et qui ont une cohésion interne (par exemple, certains très mauvais exercices de programmation semblent artificiels juste pour que vous deviez utiliser la construction de programmation la plus récente couverte).

Pour vous donner une idée de la portée, voici ce qui est couvert :

  • Les affectations doivent être en Java, l'utilisation d'une bibliothèque externe peut être effectuée, mais il faudrait que ce soit une API simple et non un framework complet
  • Variables, primitives et chaînes
  • Entrée et sortie de la console
  • if, for,while
  • Opérateurs arithmétiques et logiques
  • Graphiques simples avec dessin de lignes et de formes
  • Méthodes statiques
  • Tableaux unidimensionnels

Les étudiants n'entreront pas dans des sujets avancés (par exemple, pas de récursivité, pas d'accent sur l'héritage). Ainsi, je ne recherche pas de projets complexes: "Demandez-leur d'écrire un compilateur C. Je l'ai fait quand j'avais 5 ans et c'était la seule façon d'apprendre!"

Si vous avez des idées qui sont plus avancées que la portée, veuillez les publier sur la question «difficile» liée ci-dessous, et non celle-ci.

Au lieu de cela, ce que je recherche, ce sont des idées intéressantes qui peuvent être accomplies dans un programme court. Par exemple:

  • Les élèves peuvent écrire une version console du générateur "Star Wars Name" . C'est effectivement lire des cordes et utiliser substring, mais je pense que c'est amusant. Une variante similaire serait un programme " Mad Libs ". J'ai utilisé celui-ci il y a cinq ans, et il est peut-être déjà «périmé».

  • À l'aide de certains trigonomètres qui leur sont fournis, les élèves peuvent dessiner des polygones réguliers et créer des formes en spirale intéressantes.

  • Il n'est pas non plus exclu d'utiliser une classe d'animation simple avec la plupart du code qui leur est fourni. Et si vous connaissez un service Twitter ou Facebook accessible avec une simple API, je serais très intéressé de le savoir.

Veuillez noter que cette question est différente de la question «Questions Java difficiles pour les débutants ». Je ne cherche pas un défi en soi, juste intéressant. Je pense que si les étudiants travaillent sur quelque chose où ils peuvent facilement répondre "pourquoi quelqu'un voudrait-il jamais programmer cela?" alors ils apprendront mieux.

Même des problèmes simples comme le calcul de miles par gallon peuvent être bons. Bien que, s'il existe un moyen de le mettre à jour pour être plus pertinent, tant mieux. Si vous avez un exercice ailleurs (un livre ou un site Web), veuillez citer la source.

Pour vous aider à penser à la première année typique aujourd'hui, consultez la liste Beloit Mindset , pour de nombreux exemples qui vous feront sûrement vous sentir vieux.


Par curiosité, à quel niveau d'étudiants enseignez-vous que vous pensez que des sujets comme la récursivité et la conception orientée objet sont trop avancés? Ces sujets ont été traités en profondeur dans mon premier semestre, cours de programmation d'introduction. Je pense que vous ne rendez pas service à vos élèves si vous essayez de garder les cours trop simplistes.
Mayra

@ Mayra: Ceci est pour le cours d'introduction à la programmation, le premier cours pour les majors CS. Je recherche des problèmes passionnants à utiliser par les étudiants dans les 5 premières semaines (ou même le premier jour), et pas seulement à la fin. C'est un vrai défi de travailler dans ces conditions (et croyez-moi que certains problèmes sont hors de mon contrôle), c'est pourquoi je me tourne vers vous pour obtenir de l'aide.
Macneil

Réponses:


9

Compte tenu des contraintes, je suggère d'implémenter une version de Hangman. Cela permettrait aux étudiants de démontrer toutes les techniques que vous leur présentez, sans être trop complexes.

Il peut également être utilisé comme projet en cours de développement au fur et à mesure de l'avancement du cours. par exemple, une fois que vous avez couvert les chaînes et les variables commence comme une version texte

par exemple

You have 10 guesses left.      * * * E * * T
What is your next guess?

puis introduisez des boucles pour supprimer l'élément couper-coller du code pendant le décompte des 10 suppositions ... jusqu'à ce que les graphiques en ligne et le bâton soient suspendus / enregistrés à la fin du cours de 5 semaines.

Comme la plupart des autres personnes qui ont de l'expérience dans le recrutement et l'interview de programmeurs, cela me fait vraiment grincer de dents que ce niveau de scolarité est nécessaire à l'université, mais hélas, il continuera probablement à être nécessaire jusqu'à ce que les écoles traitent la programmation comme un sujet sérieux au même titre que mathématiques ou sciences


Bonne idée! Je pense que je vais utiliser celui-ci. :-) BTW, que voulez-vous dire par "niveau de scolarité"? Comme dans les coûts?
Macneil

C'est plus un reproche concernant le manque de programmes de scolarité avant l'université. Imaginez arriver à l'Université pour faire de la chimie et passer le premier trimestre à parler des atomes, des molécules et des électrons. 3 ans, c'est trop court pour comprendre l'informatique.
Michael Shaw

J'aime vraiment cette idée, pas besoin de graphismes complexes, peut être fait assez bien sur une ligne de commande. C'est amusant et pas encore un autre solutionneur de problèmes mathématiques.
Joppe

7

Cela ressemble à un jeu d'aventure texte pourrait être une tâche formidable quelque part au milieu du semestre. J'ai eu un cours qui nous a fait jouer à Colossal Cave Adventure puis créer notre propre jeu. Cela m'a appris beaucoup de concepts de base dès le début, et c'était tellement amusant de faire en sorte que tout le monde s'y mette.


2
Cela semble amusant, mais gardez-le petit.

7

Que diriez-vous d'utiliser un problème ou deux sur http://projecteuler.net/ Certains d'entre eux sont assez intéressants et on pourrait voir l'avantage d'écrire un programme pour les résoudre. Ils sont suffisamment petits pour que plusieurs puissent être effectués en tant qu'affectations. Un autre que j'aime utiliser est de trouver des mots à 1,00 $. Chaque lettre de l'alaphabet vaut sa position en centimes, c'est-à-dire a = 1, b = 2. Combien de mots de 1,00 $ pouvez-vous trouver? Cela peut impliquer des entrées / sorties de fichiers (lecture dans un dictionnaire), des tableaux, des boucles, etc.


1
+1 pour Project Euler. Très sympa. Bien que certains des problèmes soient un peu trop avancés, nombreux sont ceux qui ne le sont pas.
Macneil

J'adore le projet Euler, mais je ne suis pas sûr que cela aurait été amusant si je devais faire les exercices à l'université.
Oliver Weiler

Non, tous ne seraient pas amusants, mais certains, je pense que nous sommes de bons choix
Gratzy

6
  • Implémentez un jeu Monopoly. Le monopole a une séquence évidente et se prête très facilement à la division en fonctions. Il ne nécessite également qu'un tableau unidimensionnel et quelques classes de base. La logique est suffisamment simple pour que les élèves réfléchissent davantage au «comment» que au «quoi», et cela se traduit par quelque chose qui peut être démontré aux autres.

  • Donnez-leur un fichier chiffré qui a été chiffré avec une règle réversible et demandez-leur d'écrire un décodeur (faites-le assez simple cependant). Cela donne une incitation supplémentaire à le résoudre en raison du mystère du contenu du message.

  • Je ne sais pas pourquoi vous ne couvrez que des tableaux unidimensionnels et non des matrices (ils ne sont vraiment pas si différents), mais si vous êtes prêt à inclure cela dans le jeu de la vie de Sylabus Jon Conway est également relativement facile et se traduit par quelque chose amusement.

  • Un jeu comme les échecs nécessite une certaine réflexion mais reste dans les limites de ce qu'un débutant peut faire avec un héritage minimal (des pièces spécifiques héritent d'une pièce de classe générale, et le tableau contient des objets de type pièce), et des tableaux 2D (vous pouvez choisir de simplifiez-le en n'exigeant pas de mettre en œuvre des éléments durs comme la détection des stelmates ou l'incapacité à roquer si des pièces ennemies menacent le chemin du roque).


+1 pour la suggestion de jeu Monopoly. Quant aux tableaux 2D, je suis absolument d'accord qu'ils peuvent conduire à des affectations très intéressantes. Cependant, il y a des contraintes qui font que les tableaux 2D ne sont pas viables (par exemple, le manuel est déjà corrigé, et un milliard d'autres problèmes politiques du corps professoral avec lesquels je ne vous ennuierai pas, et je ne vous ennuierai pas avec mon opinion personnelle sur ces derniers questions hors de mon contrôle).
Macneil

Ah, nous avons dû créer un jeu de monopole à l'école. Et un disjoncteur de cryptage.
Carra

+1 pour Monopoly. Une fois que les élèves l'ont codé, demandez-leur de générer les probabilités d'atterrir sur les différentes propriétés. Cette connaissance aide vraiment stratégiquement.
joshdick

4

Nous avons créé pas mal de projets avec juste des E / S, des fonctions et des opérateurs conditionnels à l'école. Tout est fait avant d'apprendre la programmation orientée objet. Ces projets avancent lentement pour être de plus en plus difficiles. Autant dire que les 4 heures que nous avions chaque semaine n'étaient pas suffisantes vers la fin de l'année.

Tous ces projets ont été réalisés avec juste des fonctions et des E / S:

  • Un jeu qui apprend. Vous prenez un certain nombre de bâtons, le PC prend un certain nombre de bâtons. Répéter. Le dernier qui tient un bâton perd. Nous avons dû créer un programme d'auto-apprentissage simple qui s'est amélioré après chaque match. Bon exemple pour apprendre les tableaux 2D.

  • Un disjoncteur de code. Vous connaissez le cryptage César, choisissez une lettre et ajoutez la valeur de la lettre à chaque lettre de votre mot. Par exemple, key = 'a' et le mot = "secret". Cela deviendrait "tfdsfq". Cela peut être fait en lisant le fichier puis en créant un tableau de fréquence pour chaque lettre. Vous lisez également dans une Bible en anglais. Ensuite, vous pouvez simplement voir que la lettre la plus utilisée dans l'alphabet anglais est un «e» et le résoudre. Défi supplémentaire: utilisez une clé comme 'ab' qui était notre mission. Bon exercice pour comprendre les E / S.

  • Un fabricant de codes à barres. Ce programme était un exercice pour appeler une bibliothèque externe. Vous avez obtenu un code et avez dû générer une image avec le code à barres. Une bibliothèque externe a été utilisée pour générer l'image.

  • Un algorithme génétique pour résoudre le problème des vendeurs ambulants. C'était un projet plus avancé pour 2 ou 3 personnes. Vous commencez avec un itinéraire aléatoire et cet itinéraire s'améliore tout le temps jusqu'à ce que vous ayez un «bon itinéraire». Bonus: créez une carte avec l'itinéraire.

  • Un programme de compression lzw fonctionnel . C'était le dernier projet de 4 personnes. Les paramètres étaient assez simples. "Zip file.txt file.zip" ou quelque chose de similaire. Projet amusant mais la compréhension de l'algorithme lzw a pris du temps.


Très intéressant ... Dans quelle école es-tu allé? Etait-ce tout au cours de votre première année?
Macneil

C'était un cours pour réchauffer les gens pour la spécialisation en génie informatique. Vous pouvez toujours changer de spécialisation après cette année. Les étudiants connaissaient les boucles de base, certaines entrées / sorties à l'écran / fichiers et les fonctions.
Carra

3

Une calculatrice serait un bon projet pour apprendre les opérations arithmétiques. Vous pouvez en faire une simple application console basée sur un menu ou une interface graphique. Quatre fonctions (+, -, *, /) pour commencer, avec des points supplémentaires pour des choses plus complexes comme la racine carrée, etc.

Pour la gestion des chaînes, je suggère quelques problèmes de validation. Les adresses e-mail me viennent à l'esprit - les laisser incontrôlées peut entraîner des trous d'injection SQL ou d'autres choses, et elles sont relativement simples à valider. Pour l'ajout, peut-être avoir un programme qui peut prendre les noms, prénoms et noms de famille et les enchaîner avec des espaces, et aussi prendre un nom complet et l'analyser dans chaque composant. Le premier est utilisé plus que le second dans la vie réelle, mais je n'ai pas pu penser à un autre scénario d'analyse qui serait assez simple.

Pour illustrer les méthodes statiques, vous pouvez attribuer un problème de recherche d'e-mails. Avoir un fichier de noms et de courriels, et le constructeur statique pourrait mettre les noms / courriels dans une liste, avec une méthode statique pour trouver le courriel pour un nom donné.

J'espère que cela vous donnera quelques idées! Bonne chance avec ta classe.


1
+1 Merci! C'est exactement le genre de réponse que je recherche.
Macneil

Les jeux sont plus amusants que les calculatrices.

3

Une chose très intéressante et cool pour une mission est d'écrire une implémentation de Game of Life de Conway en 2D. Il correspond très bien aux structures de données de base du tableau, c'est amusant et assez facile à faire, mais nécessite encore une certaine réflexion. Cela peut également ouvrir la curiosité et l'expérimentation (AI).

Les étudiants avancés peuvent écrire une version en 3D pour des points supplémentaires.


3

Je voudrais répéter sur un générateur de nombres premiers.

Affectations

  1. Imprimer les nombres premiers de 1 à 100.
  2. Imprimer les nombres premiers de input1 à input2.
  3. Enregistrez et imprimez les données de performances de première génération.
  4. Représentez graphiquement les données de performance de la génération principale.
  5. Itérer sur l'optimisation de l'algorithme du générateur de nombres premiers.

2

J'utilise la bibliothèque ACM pour aider les élèves d'introduction à créer des graphiques et des jeux simples. Nous avons pu faire des jeux de base à deux joueurs basés sur les clics avec rien de plus que les compétences que vous avez décrites. Cette semaine, ils jouent au jeu Fox and Hounds .

J'ai essayé de rester loin des E / S de la console aussi longtemps que possible. C'est un concept étranger pour de nombreux étudiants de nos jours, car ils ont tous grandi avec des interfaces graphiques. Je me concentre donc sur MVC, obtenant le modèle correct et ajoutant l'interface graphique uniquement après avoir testé leur modèle. Les tests sont effectués via des tests unitaires automatisés et le pavé de code dans BlueJ . Non public static void main(), jamais.


intéressant. Peut-être écririez-vous vos expériences dans un article ou une entrée de blog?

2

J'ai enseigné l'intro au siècle dernier, et c'était BASIC, mais comme vous, je voulais que les étudiants se lancent dans un projet amusant de leur propre initiative. J'ai donc suggéré un tas de possibilités:

  • Jeu d'aventure simple, comme Wumpus
  • Simulation sportive (texte uniquement, graphisme pour les ambitieux) pour le baseball ou autre
  • La science, comme simuler l'évolution génétique
  • Sport / science, comme la course de voiliers
  • Les finances, comme avoir sa propre banque pour les membres de votre ménage, ou les investissements
  • Musique ou jeux graphiques simples

... ou ce que les élèves ont pensé. Ils venaient me voir et me disaient "que dirais-tu d'un programme pour faire du XYZ?" et je dirais toujours "Génial", puis peut-être les guider un peu pour ne pas compliquer les choses.

Habituellement, leurs projets se résumaient à quelques centaines de lignes de code, et ils l'ont toujours apprécié.

PS J'ai donné cette tâche après que les étudiants étaient compétents avec les structures de contrôle de base, les E / S, les tableaux et les fichiers séquentiels. C'était un projet à terme, une partie importante de leur grade, et j'avais des affectations intermédiaires, comme un aperçu à mi-chemin, donc ils n'ont pas essayé de tout faire à la fin et de heurter un mur. Je voulais les faire participer le plus tôt possible au semestre, quand ils avaient suffisamment de compétences pour commencer, généralement vers la semaine 6 ou 8.


1

J'ai demandé à un enseignant d'écrire un programme pour lequel vous avez écrit des modules. En gros, c'était un jeu et il fallait écrire un algo pour le résoudre, tout était là pour le rendre graphique et joli et bien fonctionner. Vous devriez peut-être écrire votre propre cadre de jeu et leur donner des outils de base qui sont des versions simplifiées de choses intéressantes qu'ils peuvent faire plus tard en dehors de la boîte dans laquelle vous les avez placés.


1

Dans mon cours d'introduction, trois projets m'ont frappé

Écrivez un programme pour afficher un aléatoire peinture Mondrian
Écrire la première partie d'un jeu BrickBreaker, faire rebondir la balle dans une zone définie
Écrire un jeu d'aventure basé sur du texte

De ma classe d'algorithmes
Implémenter un triangle de Serpinski

Ces quatre projets m'ont permis de bien comprendre le traitement des chaînes, la randomisation, les graphiques, la récursivité et l'animation.


1

Est-ce que tous les élèves de la classe CS sont majeurs? Je suppose que non. Je proposerais des affectations qui sont adaptées aux majors de la classe.

Exemples:

  • Les étudiants en art pourraient écrire un programme qui prend les dimensions d'un morceau de toile et un cadre pour calculer la quantité de toile ne serait pas disponible pour la peinture (en raison de l'emballage et de l'agrafage de la toile autour du cadre).

  • Les étudiants Econ pouvaient calculer l'intérêt composé sur un article.

  • Les étudiants en mathématiques pouvaient choisir des problèmes dans Project Euler.


1
La classe est pour les majors et les non-majors. Beaucoup sont en biologie.
Macneil

Intéressant. Idée: trouvez une image d'organismes unicellulaires qui nagent dans l'eau. Convertissez l'image en noir et blanc. Écrivez un programme pour compter le nombre d'organismes dans l'eau. Cela soulèvera toutes sortes de sujets de discussion intéressants: détection des bords, différenciation entre l'eau et le non-eau, élimination des poussières, etc.
Barry Brown

bien pour la bio, la chose évidente qui vient à l'esprit est les automates cellulaires. Vous pouvez prendre un butin sur bioquest.org pour obtenir quelques idées.
Kavet Kerek

1

Au lycée, j'ai suivi un cours de programmation d'introduction et nous avons utilisé Karel J. Robot . Il fournit une interface pour visualiser votre robot et dispose d'un ensemble très basique de capteurs et de méthodes de mouvement que vous devez étendre pour lui permettre de faire des choses intéressantes. Je pense que c'est bien parce que les robots sont faciles à comprendre pour les personnes qui n'ont pas encore compris la différence entre les logiciels.

Il y a aussi Processing , que je viens de découvrir, qui a été initialement conçu pour enseigner la programmation, et c'est aussi en java.


0

Je vais être le dissident ici. Je pense que vous devriez leur donner des problèmes de type entreprise valides pour résoudre pas des jouets. S'ils ne sont pas suffisamment sérieux pour être intéressés et motivés par le genre de travail qu'ils feront en tant que professionnel, je préfère que vous les abandonniez dans le cours d'introduction. Le vrai travail ne consiste pas à faire des trucs sympas, il s'agit de répondre aux besoins du client. J'ai également vu beaucoup de gens qui ne peuvent pas faire le saut entre ce qu'ils apprennent dans un jeu et l'utilisation des mêmes techniques dans la programmation d'entreprise.

Chaque développeur principal et gestionnaire d'embauche que je connais est dégoûté de la qualité des récents diplômés. Essayez de vous concentrer sur ce dont ils ont besoin pour apprendre à travailler dans le monde réel et oubliez de le rendre amusant.


Je pense que de nombreux étudiants trouveraient un problème commercial intéressant. Si vous pouvez suggérer quelque chose de concret et améliorer votre réponse, ce serait utile. Je cherche des détails.
Macneil

1
Cela devrait être un problème qu'ils ne peuvent pas résoudre (facilement) sur leur calculatrice TI-83. Pourtant, un autre calculateur d'impôt ne suffira pas.
Barry Brown

1
Ces étudiants sont nouveaux dans la programmation et doivent suivre leurs étapes dans ce cours. Le rendre ennuyeux n'est peut-être pas le moyen le plus efficace de leur apprendre à programmer et nous devrions regarder les meilleurs enseignants au lieu de simplement leur faire réciter la spécification Java de bout en bout.

1
Non. Ces projets devraient avant tout être amusants. Les projets amusants peuvent être difficiles. En fait, la plupart de mes projets favoris sont plus difficiles que la programmation quotidienne que je fais au travail.
Carra

2
Je vois votre argument, mais je ne suis respectueusement pas d'accord, au moins en partie, et au moins pour un cours d'introduction. Il existe de nombreuses voies de programmation, et je pense qu'un cours comme celui-ci devrait couvrir différentes choses que les programmes peuvent faire. Montrer aux élèves que les ordinateurs ne sont bons que pour les problèmes que nous jugeons "nécessaires aux affaires" ne fait pas un programmeur créatif, car cela limite leur état d'esprit. Je pense qu'un cours bien conçu inciterait les étudiants à résoudre des problèmes du monde réel, en plus de montrer les choses amusantes que les ordinateurs peuvent faire, comme la programmation d'un jeu
Nick Donohue

0

Une mission pour construire un widget stupide sur leurs téléphones mobiles. Quelque chose qu'ils pourraient montrer à leurs amis. J'ai un téléphone AT&T très bon marché et il prend des fichiers jar en quelque sorte.


0

Les tâches les plus importantes que j'ai vues obligent les gens à réfléchir à quelque chose qu'ils n'auraient pas envisagé autrement. Quelque chose de complètement en dehors du matériel de cours simple, quelque chose qui semble impossible. Quelque chose qui a plusieurs solutions valides.

Quelques-uns qui m'ont impressionné:

  1. IA Roshambo (utilisées dans le cours d'IA à l'UOA). Une fonction simple qui renvoie -1, 0, 1 pour la roche, le papier, les ciseaux. Les IA sont opposées les unes aux autres et les statistiques sont collectées par un programme utilitaire agrégé. Cette mission surprend constamment les gens par le nombre d'approches viables (et par celles qui fonctionnent si mal).

  2. Problèmes de tri simples avec des caractéristiques impossibles. Triez un fichier de longueur infinie avec une mémoire finie. Ce problème a ébranlé ma base de pensée dans les algorithmes. Il existe de nombreux problèmes connexes: des moyennes fenêtrées sur des données de longueur infinie, etc., chacune force une solution à quelque chose d'apparemment impossible.

  3. Problèmes de simulation qui semblent triviaux. Simulations de circulation (véhicule, réseau), simulations de voitures de course (gauche, droite, plus rapide, plus lente), simulations d'épicerie.

  4. Problèmes de réseautage (une grande faiblesse chez les diplômés avec qui j'ai travaillé ces dernières années). Problèmes de mise en réseau des pairs avec les ordinateurs de poche, par exemple, prouvant la complexité des problèmes de n-sync, des mises à jour des pairs, de la confiance des pairs, etc.

  5. Peu de langues (autre faiblesse des récents diplômés). Développer un petit langage pour une IA de jeu simple (dames, roshambo, tanks, CSS mojo, bots Twitter). La réflexion sur les concepts de conception, d'interprétation et d'actions langagières est fondamentale.


Les IA de papier, de roche, de ciseaux apprennent-elles le résultat ou voient-elles l'histoire?
Macneil

Oui, les historiques sont disponibles via des tableaux dans l'exemple C (mais cela s'appliquerait également à Java, Ruby, etc.). Consultez la page originale du concours: webdocs.cs.ualberta.ca/~darse/rsbpc.html
Bruce Alderson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.