diff --git a/test~coding~readingCppPrograms.fr/README.rst b/test~coding~readingCppPrograms.fr/README.rst
index b0f6fc20850a492e1979deaafb01ac04cced742e..a0476e66c45371100f597b1591c4805d452213ff 100644
--- a/test~coding~readingCppPrograms.fr/README.rst
+++ b/test~coding~readingCppPrograms.fr/README.rst
@@ -28,7 +28,7 @@ Ce module est d
 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
+Les programme du deuxiè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``
@@ -144,9 +144,9 @@ 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 
+ 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.
@@ -157,7 +157,7 @@ Pour installer des exercices OEF dans un module :
 
 %%%%%% Pour utiliser directement le module sur un serveur WIMS local,
 
-1- Mettre  le template à la bonne place, 
+1- Mettre  le template à la bonne place,
 en changeant le nom.
 
 2. Modifier intro.phtml
@@ -167,6 +167,6 @@ en changeant le nom.
 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). 
+   doit être répétée à chaque fois que les fichiers sources sont modifiés).
 
 
diff --git a/test~coding~readingCppPrograms.fr/data/struct_hard_1.cpp b/test~coding~readingCppPrograms.fr/data/struct_hard_1.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..711c15a3b60a195e4940a96200b21e2721fdcf25
--- /dev/null
+++ b/test~coding~readingCppPrograms.fr/data/struct_hard_1.cpp
@@ -0,0 +1,28 @@
+#include <iostream>
+
+using namespace std;
+
+struct obif {
+    int a;
+    int b;
+    int c;
+    int d;
+};
+
+obif step(obif m) {
+    obif nouveau;
+    nouveau.a = m.a*m.a + m.b*m.c;
+    nouveau.b = m.b * (m.a + m.d);
+    nouveau.c = m.c * (m.a + m.d);
+    nouveau.d = m.d*m.d + m.b*m.c;
+    return nouveau;
+}
+
+int main() {
+    obif truc = {1, 1, 1, 0};
+    for (int p = 3; p > -3; p = p-2) {
+        truc = step(truc);
+    }
+    cout << truc.b << endl;
+    return 0;
+}
diff --git a/test~coding~readingCppPrograms.fr/data/struct_hard_1_input.cpp b/test~coding~readingCppPrograms.fr/data/struct_hard_1_input.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..72f0c9ebe2e0041ac66e3b6b9b057014f5db94e1
--- /dev/null
+++ b/test~coding~readingCppPrograms.fr/data/struct_hard_1_input.cpp
@@ -0,0 +1,40 @@
+#include <iostream>
+
+using namespace std;
+
+struct cerise {
+    int queue;
+    int gauche;
+    int droite;
+};
+
+struct cerisier {
+    cerise cerise_gauche;
+    int top;
+    cerise cerise_droite;
+};
+
+void initialise_cerise(cerise &miam, int val) {
+    miam.queue = val;
+    miam.gauche = val - 1;
+    miam.droite = val + 1;
+}
+
+void initialise_cerisier(cerisier &tree, int val) {
+    tree.top = val;
+    initialise_cerise(tree.cerise_gauche, val - 2);
+    initialise_cerise(tree.cerise_droite, val + 2);
+}
+
+int somme_cerise(cerise miam) {
+    return miam.queue + miam.gauche + miam.droite;
+}
+
+int main() {
+    int n;
+    cerisier tree;
+    cin >> n;
+    initialise_cerisier(tree, n);
+    cout << tree.top + somme_cerise(tree.cerise_gauche) + somme_cerise(tree.cerise_droite) << endl;
+    return 0;
+}
diff --git a/test~coding~readingCppPrograms.fr/data/struct_hard_2.cpp b/test~coding~readingCppPrograms.fr/data/struct_hard_2.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0f56b38cdc44ad2aaf491db69f651cae7258ef4d
--- /dev/null
+++ b/test~coding~readingCppPrograms.fr/data/struct_hard_2.cpp
@@ -0,0 +1,33 @@
+#include <iostream>
+
+using namespace std;
+
+struct blob {
+    string nom;
+    int a;
+    int b;
+    int lg;
+    bool lock;
+};
+
+void swap(blob &x) {
+    char tmp;
+    tmp = x.nom[x.a];
+    x.nom[x.a] = x.nom[x.b];
+    x.nom[x.b] = tmp;
+    x.a = (x.a + x.b) % x.lg;
+    x.b = (x.a*x.b) % x.lg;
+    if (x.a == x.b)
+        x.lock = true;
+}
+
+int main() {
+    blob truc = {"info121rocks",
+        3,
+        5,
+        12,
+        false};
+    while (!truc.lock) swap(truc);
+    cout << truc.nom << endl;
+    return 0;
+}