Module WIMS: Compr�hension de programmes C++
============================================

Pr�sentation
------------

Ce module pr�sente � l'�tudiant des programmes qu'il doit lire et
comprendre, afin de deviner quelle en sera la sortie, ou bien l'entr�e
appropri�e pour obtenir 42. Les programmes sont tir�s al�atoirement
d'une collection de programmes group�s par th�mes. Pour rajouter un
nouveau programme il suffit de l'ajouter dans le r�pertoire
idoine. Voir ci-dessous.

Pour l'instant, la collection est constitu�e d'exercices de C++,
donn�s dans le cadre des cours d'introduction � l'informatique `Info
111 <Nicolas.Thiery.name>`_ et Info 121 de la licence MPI de
l'Universit� Paris Sud, mais l'infrastructure est con�ue pour �tre
�tendue � d'autres th�mes et g�n�ralisable � d'autres langages de
programmation.

Ce module est d�velopp� collaborativement sur:
    `<https://gitlri.lri.fr/nthiery/wims-info/tree/master/test~coding~readingCppPrograms.fr>`_


�tendre le module avec de nouveaux programmes
---------------------------------------------

Le r�pertoire `<data/>`_ contient des programmes C++, qui peuvent �tre de deux types.
Pour les programmes du premier type, l'utilisateur doit deviner la sortie du programme.
Ces programmes sont nomm�s sous la forme ``<theme>_<nom>.cpp``.
Les programme du decui�me type doivent lire un entier entre
0 et 99 sur l'entr�e standard, et l'utilisateur doit deviner lequel
donne 42; pour l'instant cet entier doit �tre unique.
Ces programmes sont nomm�s ``<theme>_<nom>_input.cpp``
Pour les deux types de programme, le th�me peut �tre constitu� d'un th�me principal et de sous-th�mes, s�par�s par des ``_`` (p. ex. ``loop_for``, ``loop_while``).
Les noms de fichiers ne doivent contenir que des caract�res alphanum�riques et le caract�re ``_``.

En vue d'obtenir un peu de variabilit� les programmes sont transform�s
avant affichage et compilation, de la mani�re suivante:

- Remplacement de I1, I2, I3, I4 par i,j,k,n respectivement (ou une
  permutation de ces derniers);

- Remplacement de D1, D2, D3 par x,y,z respectivement (ou une
  permutation de ces derniers);

- Remplacement de F1 par f.

Ces remplacements sont fait de mani�re purement textuelle. Ainsi,
�AI1� sera remplac� par, par exemple, �Ai�.

Dans la version actuelle, le remplacement est fait statiquement avant
le chargement du module dans WIMS (�diter la premi�re ligne du
Makefile pour changer/compl�ter la liste des remplacements). � terme
ce remplacement sera fait dynamiquement par WIMS, avec une permutation
diff�rente � chaque ex�cution de l'exercice.

.. TODO:: Am�liorer l'ent�te du Makefile pour que ne soient remplac�s que les mots complets.

L'infrastructure du module est implant�e dans
`<./src/cpp/read_program.cpp>`_.

.. WARNING::

    Dans l'�tat actuel de l'exercice, l'utilisateur ne peut pas
    rentrer de r�ponse vide. Il faut donc que tous les programmes du
    premier type affiche au moins un caract�re. �viter les caract�res
    unicode compliqu�s aussi :-)

Cr�ation automatique des exercices de type OEF
----------------------------------------------

L'ent�te du fichier `src/cpp/read_program.cpp` permet de d�finir les exercices de type OEF qui vont �tre construits automatiquement par WIMS lors de l'import du module (voir section suivante).
L'ent�te doit �tre de la forme ``target=<cible1> <cible2> <cible3> ...``.
WIMS cr�e un exercice OEF par cible sous la forme d'un fichier `src/<cible>.oef`.
Lors de chaque ex�cution de l'exercice OEF `<cible>.oef`, un programme est choisi al�atoirement parmi tous les programmes de `data/static` dont le nom commence par ``<cible>``.
Il est ainsi possible de d�finir un exercice OEF prenant en compte tous les programmes ayant un certain th�me, ou un certain th�me et sous-th�me, ou simplement un seul exercice (dans ce dernier cas, la cible doit �tre le nom du programme complet, sans l'extension ``.cpp``).

Pour chaque cible, le fichier `src/cpp/read_program.cpp` doit contenir les d�finitions suivantes:

``#if defined TARGET_<cible>
#define TARGET <cible>
#define TARGET_FR <Titre de l'exercice>
#endif``

Importer ou mettre � jour le module sur WIMS
--------------------------------------------

Lancer `make archive` dans ce r�pertoire. Cela cr�� une archive:

    /tmp/modtool-test~coding~readingCppPrograms.fr.tgz

Charger l'archive dans son compte modtools sur WIMS avec:

    wims.u-psud.fr -> serveur de l'universit� -> Accueil WIMS -> modtools -> login -> Restauration

Documentation g�n�rique des modules WIMS
========================================

Pour installer des exercices OEF dans un module :

 1. Cr�er un module de type OEF

 2. Pour chaque exercice, cr�er dans le module un nouveau fichier 
    d'extension oef dans le r�pertoire src/ (exemple : src/euclide.oef). 
    Une zone de  texte appara�t ; y �crire (ou coller) le texte source 
    de l'exercice. Enregistrer les changements.

 3. Tester le module.

 4. Modifier � son go�t intro.phtml et endhook.phtml,
     et tester � nouveau.


%%%%%% Pour utiliser directement le module sur un serveur WIMS local,

1- Mettre  le template � la bonne place, 
en changeant le nom.

2. Modifier intro.phtml

3. Modifier le fichier INDEX.

4. Installer les fichiers sources.

5. Ex�cuter le script $wims_home/other/bin/src2def. (Cette �tape
   doit �tre r�p�t�e � chaque fois que les fichiers sources sont modifi�s).