{
  "chapter": {
    "id": "python-entrees-sorties",
    "level": "snt",
    "theme": "Programmation",
    "title": "3. Entrées et sorties",
    "description": "Afficher avec print : plusieurs valeurs, texte et variables, ordre des\naffichages ; saisir avec input, qui renvoie toujours une chaîne, et\nconvertir la saisie ; lire les messages d'erreur les plus courants.",
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "print",
        "affichage"
      ],
      "title": "Afficher plusieurs valeurs",
      "statement": "```python\nlargeur = 640\nhauteur = 480\nprint(largeur, hauteur)\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`640 480`",
          "correct": true,
          "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par une espace.\n"
        },
        {
          "text": "`640480`",
          "correct": false,
          "feedback": "Erreur : la virgule entre les arguments fait insérer une espace\nentre les valeurs.\n"
        },
        {
          "text": "`640, 480`",
          "correct": false,
          "feedback": "Erreur : la virgule sépare les arguments de `print`, elle n'est\npas affichée.\n"
        },
        {
          "text": "`largeur hauteur`",
          "correct": false,
          "feedback": "Erreur : `print` affiche les valeurs des variables, pas leurs\nnoms.\n"
        }
      ],
      "explanation": "`print` accepte plusieurs arguments séparés par des virgules et les\naffiche sur une même ligne, séparés par une espace. C'est la façon la\nplus simple de mêler texte et nombres.",
      "variants": [
        {
          "statement": "```python\nlargeur = 640\nhauteur = 480\nprint(largeur, hauteur)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`640 480`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par une espace.\n"
            },
            {
              "text": "`640480`",
              "correct": false,
              "feedback": "Erreur : la virgule entre les arguments fait insérer une espace\nentre les valeurs.\n"
            },
            {
              "text": "`640, 480`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments de `print`, elle n'est\npas affichée.\n"
            },
            {
              "text": "`largeur hauteur`",
              "correct": false,
              "feedback": "Erreur : `print` affiche les valeurs des variables, pas leurs\nnoms.\n"
            }
          ],
          "explanation": "`print` accepte plusieurs arguments séparés par des virgules et les\naffiche sur une même ligne, séparés par une espace. C'est la façon la\nplus simple de mêler texte et nombres."
        },
        {
          "statement": "```python\nlargeur = 1920\nhauteur = 1080\nprint(largeur, hauteur)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`1920 1080`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par une espace.\n"
            },
            {
              "text": "`19201080`",
              "correct": false,
              "feedback": "Erreur : la virgule entre les arguments fait insérer une espace\nentre les valeurs.\n"
            },
            {
              "text": "`1920, 1080`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments de `print`, elle n'est\npas affichée.\n"
            },
            {
              "text": "`largeur hauteur`",
              "correct": false,
              "feedback": "Erreur : `print` affiche les valeurs des variables, pas leurs\nnoms.\n"
            }
          ],
          "explanation": "`print` accepte plusieurs arguments séparés par des virgules et les\naffiche sur une même ligne, séparés par une espace. C'est la façon la\nplus simple de mêler texte et nombres."
        },
        {
          "statement": "```python\nlargeur = 800\nhauteur = 600\nprint(largeur, hauteur)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`800 600`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par une espace.\n"
            },
            {
              "text": "`800600`",
              "correct": false,
              "feedback": "Erreur : la virgule entre les arguments fait insérer une espace\nentre les valeurs.\n"
            },
            {
              "text": "`800, 600`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments de `print`, elle n'est\npas affichée.\n"
            },
            {
              "text": "`largeur hauteur`",
              "correct": false,
              "feedback": "Erreur : `print` affiche les valeurs des variables, pas leurs\nnoms.\n"
            }
          ],
          "explanation": "`print` accepte plusieurs arguments séparés par des virgules et les\naffiche sur une même ligne, séparés par une espace. C'est la façon la\nplus simple de mêler texte et nombres."
        }
      ]
    },
    {
      "id": "q02",
      "difficulty": 1,
      "skills": [
        "print",
        "chaine"
      ],
      "title": "Texte et variable",
      "statement": "```python\nnom = \"Lina\"\nprint(\"Bonjour\", nom)\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`Bonjour Lina`",
          "correct": true,
          "feedback": "Bonne réponse : le texte entre guillemets est affiché tel quel,\npuis la valeur de `nom`, avec une espace entre les deux.\n"
        },
        {
          "text": "`Bonjour nom`",
          "correct": false,
          "feedback": "Erreur : sans guillemets, `nom` désigne la variable, dont\n`print` affiche la valeur.\n"
        },
        {
          "text": "`BonjourLina`",
          "correct": false,
          "feedback": "Erreur : deux arguments séparés par une virgule sont affichés\navec une espace entre eux.\n"
        },
        {
          "text": "`\"Bonjour\", \"Lina\"`",
          "correct": false,
          "feedback": "Erreur : les guillemets délimitent la chaîne dans le programme,\nils ne sont pas affichés.\n"
        }
      ],
      "explanation": "Entre guillemets, un texte est affiché tel quel ; sans guillemets, un\nnom désigne une variable dont on affiche la valeur. Les guillemets\neux-mêmes n'apparaissent jamais."
    },
    {
      "id": "q03",
      "difficulty": 1,
      "skills": [
        "input",
        "saisie",
        "types"
      ],
      "title": "Le type d'une saisie",
      "statement": "```python\nreponse = input(\"Combien de photos ? \")\nprint(type(reponse))\n```\n\nL'utilisateur tape 12 puis Entrée. Qu'affiche la deuxième ligne ?",
      "options": [
        {
          "text": "`<class 'str'>`",
          "correct": true,
          "feedback": "Bonne réponse : `input` renvoie toujours une chaîne, ici `\"12\"`,\nmême si l'utilisateur a tapé des chiffres.\n"
        },
        {
          "text": "`<class 'int'>`",
          "correct": false,
          "feedback": "Erreur : `input` ne devine pas que le texte représente un\nnombre. Il renvoie la chaîne `\"12\"`.\n"
        },
        {
          "text": "`12`",
          "correct": false,
          "feedback": "Erreur : `type` affiche le type de la valeur, pas la valeur.\n"
        },
        {
          "text": "`<class 'float'>`",
          "correct": false,
          "feedback": "Erreur : aucune conversion n'a lieu, la saisie reste une chaîne.\n"
        }
      ],
      "explanation": "Quoi que tape l'utilisateur, `input` renvoie une chaîne de\ncaractères. Pour obtenir un nombre, il faut convertir la saisie avec\n`int` ou `float`."
    },
    {
      "id": "q04",
      "difficulty": 2,
      "skills": [
        "input",
        "conversion",
        "erreur"
      ],
      "title": "Une multiplication surprenante",
      "statement": "```python\nn = input(\"Nombre de copies : \")\nprint(n * 2)\n```\n\nL'utilisateur tape 4. Qu'affiche le programme ?",
      "options": [
        {
          "text": "`44`",
          "correct": true,
          "feedback": "Bonne réponse : `n` est la chaîne `\"4\"`, et une chaîne\nmultipliée par 2 est répétée 2 fois.\n"
        },
        {
          "text": "`8`",
          "correct": false,
          "feedback": "Erreur : 8 exigerait un entier. Sans conversion, `n` est la\nchaîne `\"4\"`, qui est répétée.\n"
        },
        {
          "text": "Une erreur, on ne multiplie pas une chaîne",
          "correct": false,
          "feedback": "Erreur : une chaîne multipliée par un entier est répétée, sans\nerreur. C'est un piège classique.\n"
        },
        {
          "text": "`4 4`",
          "correct": false,
          "feedback": "Erreur : la répétition colle les copies sans espace.\n"
        }
      ],
      "explanation": "Comme `input` renvoie une chaîne, `n * 2` répète le texte au lieu de\nmultiplier le nombre. Il fallait écrire `n = int(input(...))`.",
      "variants": [
        {
          "statement": "```python\nn = input(\"Nombre de copies : \")\nprint(n * 2)\n```\n\nL'utilisateur tape 4. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`44`",
              "correct": true,
              "feedback": "Bonne réponse : `n` est la chaîne `\"4\"`, et une chaîne\nmultipliée par 2 est répétée 2 fois.\n"
            },
            {
              "text": "`8`",
              "correct": false,
              "feedback": "Erreur : 8 exigerait un entier. Sans conversion, `n` est la\nchaîne `\"4\"`, qui est répétée.\n"
            },
            {
              "text": "Une erreur, on ne multiplie pas une chaîne",
              "correct": false,
              "feedback": "Erreur : une chaîne multipliée par un entier est répétée, sans\nerreur. C'est un piège classique.\n"
            },
            {
              "text": "`4 4`",
              "correct": false,
              "feedback": "Erreur : la répétition colle les copies sans espace.\n"
            }
          ],
          "explanation": "Comme `input` renvoie une chaîne, `n * 2` répète le texte au lieu de\nmultiplier le nombre. Il fallait écrire `n = int(input(...))`."
        },
        {
          "statement": "```python\nn = input(\"Nombre de copies : \")\nprint(n * 3)\n```\n\nL'utilisateur tape 7. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`777`",
              "correct": true,
              "feedback": "Bonne réponse : `n` est la chaîne `\"7\"`, et une chaîne\nmultipliée par 3 est répétée 3 fois.\n"
            },
            {
              "text": "`21`",
              "correct": false,
              "feedback": "Erreur : 21 exigerait un entier. Sans conversion, `n` est la\nchaîne `\"7\"`, qui est répétée.\n"
            },
            {
              "text": "Une erreur, on ne multiplie pas une chaîne",
              "correct": false,
              "feedback": "Erreur : une chaîne multipliée par un entier est répétée, sans\nerreur. C'est un piège classique.\n"
            },
            {
              "text": "`7 7 7`",
              "correct": false,
              "feedback": "Erreur : la répétition colle les copies sans espace.\n"
            }
          ],
          "explanation": "Comme `input` renvoie une chaîne, `n * 3` répète le texte au lieu de\nmultiplier le nombre. Il fallait écrire `n = int(input(...))`."
        },
        {
          "statement": "```python\nn = input(\"Nombre de copies : \")\nprint(n * 2)\n```\n\nL'utilisateur tape 25. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`2525`",
              "correct": true,
              "feedback": "Bonne réponse : `n` est la chaîne `\"25\"`, et une chaîne\nmultipliée par 2 est répétée 2 fois.\n"
            },
            {
              "text": "`50`",
              "correct": false,
              "feedback": "Erreur : 50 exigerait un entier. Sans conversion, `n` est la\nchaîne `\"25\"`, qui est répétée.\n"
            },
            {
              "text": "Une erreur, on ne multiplie pas une chaîne",
              "correct": false,
              "feedback": "Erreur : une chaîne multipliée par un entier est répétée, sans\nerreur. C'est un piège classique.\n"
            },
            {
              "text": "`25 25`",
              "correct": false,
              "feedback": "Erreur : la répétition colle les copies sans espace.\n"
            }
          ],
          "explanation": "Comme `input` renvoie une chaîne, `n * 2` répète le texte au lieu de\nmultiplier le nombre. Il fallait écrire `n = int(input(...))`."
        }
      ]
    },
    {
      "id": "q05",
      "difficulty": 2,
      "skills": [
        "input",
        "conversion"
      ],
      "title": "Convertir la saisie",
      "statement": "On veut que `n` soit un entier utilisable dans un calcul. Quelle\nligne est correcte ?",
      "options": [
        {
          "text": "`n = int(input(\"Nombre : \"))`",
          "correct": true,
          "feedback": "Bonne réponse : `input` lit la chaîne, puis `int` la convertit\nen entier.\n"
        },
        {
          "text": "`n = input(int(\"Nombre : \"))`",
          "correct": false,
          "feedback": "Erreur : `int(\"Nombre : \")` tente de convertir le texte de la\nquestion en nombre, ce qui échoue.\n"
        },
        {
          "text": "`n = input(\"Nombre : \") + 0`",
          "correct": false,
          "feedback": "Erreur : ajouter 0 à une chaîne provoque une erreur. Il faut\nconvertir avec `int`.\n"
        },
        {
          "text": "`n = int(\"Nombre : \")`",
          "correct": false,
          "feedback": "Erreur : rien n'est saisi, et la conversion du texte échoue.\n"
        }
      ],
      "explanation": "L'ordre est toujours le même : `input` d'abord, pour lire la chaîne,\npuis `int` ou `float` autour, pour la convertir. La question posée\nreste l'argument de `input`."
    },
    {
      "id": "q06",
      "difficulty": 2,
      "skills": [
        "input",
        "conversion",
        "erreur"
      ],
      "title": "Une saisie qui n'est pas un nombre",
      "statement": "```python\nage = int(input(\"Âge : \"))\n```\n\nL'utilisateur tape `quinze`. Que se passe-t-il ?",
      "options": [
        {
          "text": "`age` vaut 15, Python reconnaît le mot",
          "correct": false,
          "feedback": "Erreur : `int` ne lit que des chiffres. Il ne connaît pas les\nnombres écrits en lettres.\n"
        },
        {
          "text": "Python signale une erreur, `int` ne convertit pas `quinze`",
          "correct": true,
          "feedback": "Bonne réponse : le message est `ValueError`. La conversion ne\nréussit que si la chaîne représente un entier.\n"
        },
        {
          "text": "`age` vaut 0, valeur par défaut en cas d'échec",
          "correct": false,
          "feedback": "Erreur : une conversion impossible arrête le programme, elle ne\nrenvoie pas 0.\n"
        },
        {
          "text": "`age` vaut la chaîne `quinze`, sans conversion",
          "correct": false,
          "feedback": "Erreur : `int` ne renvoie jamais une chaîne. Il échoue et le\nprogramme s'arrête.\n"
        }
      ],
      "explanation": "`int` convertit une chaîne seulement si elle représente un entier.\nSinon, une erreur `ValueError` arrête le programme : un programme\nsérieux doit prévoir une saisie inattendue."
    },
    {
      "id": "q07",
      "difficulty": 1,
      "skills": [
        "print",
        "chaine"
      ],
      "title": "Avec ou sans guillemets",
      "statement": "```python\nville = \"Lyon\"\nprint(\"ville\")\nprint(ville)\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`ville` puis `Lyon`",
          "correct": true,
          "feedback": "Bonne réponse : entre guillemets, `ville` est un texte affiché\ntel quel ; sans guillemets, c'est la variable, qui vaut `Lyon`.\n"
        },
        {
          "text": "`Lyon` puis `Lyon`",
          "correct": false,
          "feedback": "Erreur : le premier `print` reçoit une chaîne, pas la variable.\n"
        },
        {
          "text": "`ville` puis `ville`",
          "correct": false,
          "feedback": "Erreur : le second `print` affiche la valeur de la variable.\n"
        },
        {
          "text": "`Lyon` puis `ville`",
          "correct": false,
          "feedback": "Erreur : c'est l'inverse, les guillemets sont sur la première\nligne.\n"
        }
      ],
      "explanation": "Les guillemets font toute la différence : `\"ville\"` est un texte,\n`ville` est une variable. Confondre les deux est une erreur\nfréquente au début."
    },
    {
      "id": "q08",
      "difficulty": 2,
      "skills": [
        "print",
        "conversion",
        "concatenation"
      ],
      "title": "Construire un message",
      "statement": "```python\nnb = 3\nprint(\"Il reste \" + str(nb) + \" places\")\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`Il reste 3 places`",
          "correct": true,
          "feedback": "Bonne réponse : `str(nb)` donne `\"3\"`, et les trois chaînes sont\ncollées bout à bout, avec les espaces prévues dans les textes.\n"
        },
        {
          "text": "`Il reste nb places`",
          "correct": false,
          "feedback": "Erreur : `nb` sans guillemets désigne la valeur 3, convertie en\nchaîne.\n"
        },
        {
          "text": "Une erreur, on ne colle pas un nombre à un texte",
          "correct": false,
          "feedback": "Erreur : c'est précisément le rôle de `str(nb)`, qui transforme\nle nombre en chaîne avant la concaténation.\n"
        },
        {
          "text": "`Il reste 3places`",
          "correct": false,
          "feedback": "Erreur : l'espace avant `places` fait partie de la chaîne\n`\" places\"`.\n"
        }
      ],
      "explanation": "Pour insérer un nombre dans un message par concaténation, on le\nconvertit avec `str` et on n'oublie pas les espaces dans les textes.\n`print(\"Il reste\", nb, \"places\")` donnerait le même affichage.",
      "variants": [
        {
          "statement": "```python\nnb = 3\nprint(\"Il reste \" + str(nb) + \" places\")\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Il reste 3 places`",
              "correct": true,
              "feedback": "Bonne réponse : `str(nb)` donne `\"3\"`, et les trois chaînes sont\ncollées bout à bout, avec les espaces prévues dans les textes.\n"
            },
            {
              "text": "`Il reste nb places`",
              "correct": false,
              "feedback": "Erreur : `nb` sans guillemets désigne la valeur 3, convertie en\nchaîne.\n"
            },
            {
              "text": "Une erreur, on ne colle pas un nombre à un texte",
              "correct": false,
              "feedback": "Erreur : c'est précisément le rôle de `str(nb)`, qui transforme\nle nombre en chaîne avant la concaténation.\n"
            },
            {
              "text": "`Il reste 3places`",
              "correct": false,
              "feedback": "Erreur : l'espace avant `places` fait partie de la chaîne\n`\" places\"`.\n"
            }
          ],
          "explanation": "Pour insérer un nombre dans un message par concaténation, on le\nconvertit avec `str` et on n'oublie pas les espaces dans les textes.\n`print(\"Il reste\", nb, \"places\")` donnerait le même affichage."
        },
        {
          "statement": "```python\nnb = 12\nprint(\"Il reste \" + str(nb) + \" places\")\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Il reste 12 places`",
              "correct": true,
              "feedback": "Bonne réponse : `str(nb)` donne `\"12\"`, et les trois chaînes sont\ncollées bout à bout, avec les espaces prévues dans les textes.\n"
            },
            {
              "text": "`Il reste nb places`",
              "correct": false,
              "feedback": "Erreur : `nb` sans guillemets désigne la valeur 12, convertie en\nchaîne.\n"
            },
            {
              "text": "Une erreur, on ne colle pas un nombre à un texte",
              "correct": false,
              "feedback": "Erreur : c'est précisément le rôle de `str(nb)`, qui transforme\nle nombre en chaîne avant la concaténation.\n"
            },
            {
              "text": "`Il reste 12places`",
              "correct": false,
              "feedback": "Erreur : l'espace avant `places` fait partie de la chaîne\n`\" places\"`.\n"
            }
          ],
          "explanation": "Pour insérer un nombre dans un message par concaténation, on le\nconvertit avec `str` et on n'oublie pas les espaces dans les textes.\n`print(\"Il reste\", nb, \"places\")` donnerait le même affichage."
        },
        {
          "statement": "```python\nnb = 7\nprint(\"Il reste \" + str(nb) + \" places\")\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Il reste 7 places`",
              "correct": true,
              "feedback": "Bonne réponse : `str(nb)` donne `\"7\"`, et les trois chaînes sont\ncollées bout à bout, avec les espaces prévues dans les textes.\n"
            },
            {
              "text": "`Il reste nb places`",
              "correct": false,
              "feedback": "Erreur : `nb` sans guillemets désigne la valeur 7, convertie en\nchaîne.\n"
            },
            {
              "text": "Une erreur, on ne colle pas un nombre à un texte",
              "correct": false,
              "feedback": "Erreur : c'est précisément le rôle de `str(nb)`, qui transforme\nle nombre en chaîne avant la concaténation.\n"
            },
            {
              "text": "`Il reste 7places`",
              "correct": false,
              "feedback": "Erreur : l'espace avant `places` fait partie de la chaîne\n`\" places\"`.\n"
            }
          ],
          "explanation": "Pour insérer un nombre dans un message par concaténation, on le\nconvertit avec `str` et on n'oublie pas les espaces dans les textes.\n`print(\"Il reste\", nb, \"places\")` donnerait le même affichage."
        }
      ]
    },
    {
      "id": "q09",
      "difficulty": 2,
      "skills": [
        "print",
        "affichage"
      ],
      "title": "Deux print, deux lignes",
      "statement": "```python\nprint(\"Pile\")\nprint(\"Face\")\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`Pile` sur une ligne, `Face` sur la suivante",
          "correct": true,
          "feedback": "Bonne réponse : chaque appel de `print` termine sa ligne. Deux\nappels donnent deux lignes.\n"
        },
        {
          "text": "`Pile Face` sur une seule ligne",
          "correct": false,
          "feedback": "Erreur : ce serait `print(\"Pile\", \"Face\")`. Deux appels séparés\nproduisent deux lignes.\n"
        },
        {
          "text": "`PileFace`, collés",
          "correct": false,
          "feedback": "Erreur : un `print` revient à la ligne après son affichage.\n"
        },
        {
          "text": "Seulement `Face`, le premier affichage est écrasé",
          "correct": false,
          "feedback": "Erreur : un affichage n'efface pas le précédent, les lignes se\nsuivent.\n"
        }
      ],
      "explanation": "Chaque `print` écrit une ligne complète et passe à la suivante. Pour\nafficher plusieurs valeurs sur une même ligne, on les passe au même\n`print`."
    },
    {
      "id": "q10",
      "difficulty": 2,
      "skills": [
        "input",
        "print",
        "sequence"
      ],
      "title": "L'ordre des affichages",
      "statement": "```python\nprint(\"Début\")\nn = int(input(\"Valeur : \"))\nprint(n + 1)\nprint(\"Fin\")\n```\n\nL'utilisateur tape 9. Qu'affiche le programme, dans l'ordre ?",
      "options": [
        {
          "text": "`Début`, `10`, `Fin`",
          "correct": true,
          "feedback": "Bonne réponse : les lignes s'exécutent dans l'ordre, et `n + 1`\nvaut 10.\n"
        },
        {
          "text": "`Début`, `9`, `Fin`",
          "correct": false,
          "feedback": "Erreur : le programme affiche `n + 1`, pas `n`.\n"
        },
        {
          "text": "`10`, `Début`, `Fin`",
          "correct": false,
          "feedback": "Erreur : `Début` est affiché avant la saisie, donc avant le\ncalcul.\n"
        },
        {
          "text": "`Début`, `Fin`, `10`",
          "correct": false,
          "feedback": "Erreur : les affichages suivent l'ordre des lignes du programme.\n"
        }
      ],
      "explanation": "Le programme attend la saisie au moment où il rencontre `input`, puis\ncontinue. Les affichages apparaissent dans l'ordre des instructions.",
      "variants": [
        {
          "statement": "```python\nprint(\"Début\")\nn = int(input(\"Valeur : \"))\nprint(n + 1)\nprint(\"Fin\")\n```\n\nL'utilisateur tape 9. Qu'affiche le programme, dans l'ordre ?",
          "options": [
            {
              "text": "`Début`, `10`, `Fin`",
              "correct": true,
              "feedback": "Bonne réponse : les lignes s'exécutent dans l'ordre, et `n + 1`\nvaut 10.\n"
            },
            {
              "text": "`Début`, `9`, `Fin`",
              "correct": false,
              "feedback": "Erreur : le programme affiche `n + 1`, pas `n`.\n"
            },
            {
              "text": "`10`, `Début`, `Fin`",
              "correct": false,
              "feedback": "Erreur : `Début` est affiché avant la saisie, donc avant le\ncalcul.\n"
            },
            {
              "text": "`Début`, `Fin`, `10`",
              "correct": false,
              "feedback": "Erreur : les affichages suivent l'ordre des lignes du programme.\n"
            }
          ],
          "explanation": "Le programme attend la saisie au moment où il rencontre `input`, puis\ncontinue. Les affichages apparaissent dans l'ordre des instructions."
        },
        {
          "statement": "```python\nprint(\"Début\")\nn = int(input(\"Valeur : \"))\nprint(n + 1)\nprint(\"Fin\")\n```\n\nL'utilisateur tape 24. Qu'affiche le programme, dans l'ordre ?",
          "options": [
            {
              "text": "`Début`, `25`, `Fin`",
              "correct": true,
              "feedback": "Bonne réponse : les lignes s'exécutent dans l'ordre, et `n + 1`\nvaut 25.\n"
            },
            {
              "text": "`Début`, `24`, `Fin`",
              "correct": false,
              "feedback": "Erreur : le programme affiche `n + 1`, pas `n`.\n"
            },
            {
              "text": "`25`, `Début`, `Fin`",
              "correct": false,
              "feedback": "Erreur : `Début` est affiché avant la saisie, donc avant le\ncalcul.\n"
            },
            {
              "text": "`Début`, `Fin`, `25`",
              "correct": false,
              "feedback": "Erreur : les affichages suivent l'ordre des lignes du programme.\n"
            }
          ],
          "explanation": "Le programme attend la saisie au moment où il rencontre `input`, puis\ncontinue. Les affichages apparaissent dans l'ordre des instructions."
        },
        {
          "statement": "```python\nprint(\"Début\")\nn = int(input(\"Valeur : \"))\nprint(n + 1)\nprint(\"Fin\")\n```\n\nL'utilisateur tape 41. Qu'affiche le programme, dans l'ordre ?",
          "options": [
            {
              "text": "`Début`, `42`, `Fin`",
              "correct": true,
              "feedback": "Bonne réponse : les lignes s'exécutent dans l'ordre, et `n + 1`\nvaut 42.\n"
            },
            {
              "text": "`Début`, `41`, `Fin`",
              "correct": false,
              "feedback": "Erreur : le programme affiche `n + 1`, pas `n`.\n"
            },
            {
              "text": "`42`, `Début`, `Fin`",
              "correct": false,
              "feedback": "Erreur : `Début` est affiché avant la saisie, donc avant le\ncalcul.\n"
            },
            {
              "text": "`Début`, `Fin`, `42`",
              "correct": false,
              "feedback": "Erreur : les affichages suivent l'ordre des lignes du programme.\n"
            }
          ],
          "explanation": "Le programme attend la saisie au moment où il rencontre `input`, puis\ncontinue. Les affichages apparaissent dans l'ordre des instructions."
        }
      ]
    },
    {
      "id": "q11",
      "difficulty": 3,
      "skills": [
        "input",
        "conversion",
        "flottant"
      ],
      "title": "Une saisie décimale",
      "statement": "```python\nt = float(input(\"Température : \"))\nprint(t + 1)\n```\n\nL'utilisateur tape 19.5. Qu'affiche le programme ?",
      "options": [
        {
          "text": "`20.5`",
          "correct": true,
          "feedback": "Bonne réponse : `float` convertit `\"19.5\"` en nombre à virgule,\nauquel on ajoute 1.\n"
        },
        {
          "text": "`19.51`",
          "correct": false,
          "feedback": "Erreur : ce serait une concaténation de chaînes. La conversion\nen `float` permet une vraie addition.\n"
        },
        {
          "text": "Une erreur, `float` ne lit pas un point",
          "correct": false,
          "feedback": "Erreur : le point est justement le séparateur décimal attendu\npar `float`.\n"
        },
        {
          "text": "`20`",
          "correct": false,
          "feedback": "Erreur : le résultat garde ses décimales, 19.5 plus 1 fait 20.5.\n"
        }
      ],
      "explanation": "Pour une saisie décimale, on convertit avec `float`, et le point est\nle séparateur décimal. `int` échouerait sur `\"19.5\"`.",
      "variants": [
        {
          "statement": "```python\nt = float(input(\"Température : \"))\nprint(t + 1)\n```\n\nL'utilisateur tape 19.5. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`20.5`",
              "correct": true,
              "feedback": "Bonne réponse : `float` convertit `\"19.5\"` en nombre à virgule,\nauquel on ajoute 1.\n"
            },
            {
              "text": "`19.51`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation de chaînes. La conversion\nen `float` permet une vraie addition.\n"
            },
            {
              "text": "Une erreur, `float` ne lit pas un point",
              "correct": false,
              "feedback": "Erreur : le point est justement le séparateur décimal attendu\npar `float`.\n"
            },
            {
              "text": "`20`",
              "correct": false,
              "feedback": "Erreur : le résultat garde ses décimales, 19.5 plus 1 fait 20.5.\n"
            }
          ],
          "explanation": "Pour une saisie décimale, on convertit avec `float`, et le point est\nle séparateur décimal. `int` échouerait sur `\"19.5\"`."
        },
        {
          "statement": "```python\nt = float(input(\"Température : \"))\nprint(t + 1)\n```\n\nL'utilisateur tape 3.25. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`4.25`",
              "correct": true,
              "feedback": "Bonne réponse : `float` convertit `\"3.25\"` en nombre à virgule,\nauquel on ajoute 1.\n"
            },
            {
              "text": "`3.251`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation de chaînes. La conversion\nen `float` permet une vraie addition.\n"
            },
            {
              "text": "Une erreur, `float` ne lit pas un point",
              "correct": false,
              "feedback": "Erreur : le point est justement le séparateur décimal attendu\npar `float`.\n"
            },
            {
              "text": "`4`",
              "correct": false,
              "feedback": "Erreur : le résultat garde ses décimales, 3.25 plus 1 fait 4.25.\n"
            }
          ],
          "explanation": "Pour une saisie décimale, on convertit avec `float`, et le point est\nle séparateur décimal. `int` échouerait sur `\"3.25\"`."
        },
        {
          "statement": "```python\nt = float(input(\"Température : \"))\nprint(t + 1)\n```\n\nL'utilisateur tape 27.5. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`28.5`",
              "correct": true,
              "feedback": "Bonne réponse : `float` convertit `\"27.5\"` en nombre à virgule,\nauquel on ajoute 1.\n"
            },
            {
              "text": "`27.51`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation de chaînes. La conversion\nen `float` permet une vraie addition.\n"
            },
            {
              "text": "Une erreur, `float` ne lit pas un point",
              "correct": false,
              "feedback": "Erreur : le point est justement le séparateur décimal attendu\npar `float`.\n"
            },
            {
              "text": "`28`",
              "correct": false,
              "feedback": "Erreur : le résultat garde ses décimales, 27.5 plus 1 fait 28.5.\n"
            }
          ],
          "explanation": "Pour une saisie décimale, on convertit avec `float`, et le point est\nle séparateur décimal. `int` échouerait sur `\"27.5\"`."
        }
      ]
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "erreur"
      ],
      "title": "Lire un message d'erreur",
      "statement": "Un programme s'arrête avec le message :\n\n```\nNameError: name 'prix' is not defined\n```\n\nQue signifie-t-il ?",
      "options": [
        {
          "text": "La variable `prix` est utilisée avant d'avoir reçu une valeur",
          "correct": true,
          "feedback": "Bonne réponse : `NameError` signale un nom inconnu. Soit\nl'affectation manque, soit le nom est mal orthographié.\n"
        },
        {
          "text": "Le mot `prix` est interdit en Python",
          "correct": false,
          "feedback": "Erreur : `prix` est un nom valide. Le message dit qu'il n'a pas\nde valeur.\n"
        },
        {
          "text": "La valeur de `prix` n'est pas un nombre",
          "correct": false,
          "feedback": "Erreur : un problème de type donnerait `TypeError` ou\n`ValueError`. Ici, la variable n'existe pas.\n"
        },
        {
          "text": "Le programme n'a pas trouvé le fichier `prix`",
          "correct": false,
          "feedback": "Erreur : le message parle d'un nom de variable, pas d'un\nfichier.\n"
        }
      ],
      "explanation": "Le type de l'erreur renseigne sur la cause : `NameError` pour un nom\ninconnu, `TypeError` pour des types incompatibles, `ValueError` pour\nune conversion impossible. Lire le message est la première étape du\ndébogage."
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "erreur"
      ],
      "title": "Un autre message d'erreur",
      "statement": "Un programme s'arrête avec le message :\n\n```\nTypeError: can only concatenate str (not \"int\") to str\n```\n\nQuelle instruction a pu le provoquer ?",
      "options": [
        {
          "text": "Un `+` entre une chaîne et un entier",
          "correct": true,
          "feedback": "Bonne réponse : Python explique qu'il ne peut coller à une\nchaîne qu'une autre chaîne, pas un entier.\n"
        },
        {
          "text": "Une division par zéro",
          "correct": false,
          "feedback": "Erreur : une division par zéro donne `ZeroDivisionError`.\n"
        },
        {
          "text": "Une variable jamais définie",
          "correct": false,
          "feedback": "Erreur : ce cas donne `NameError`.\n"
        },
        {
          "text": "Une parenthèse manquante",
          "correct": false,
          "feedback": "Erreur : une parenthèse manquante donne `SyntaxError`, avant\nmême l'exécution.\n"
        }
      ],
      "explanation": "Le message cite les deux types en conflit, `str` et `int`, et\nl'opération, la concaténation. La correction consiste à convertir\nl'entier avec `str`."
    },
    {
      "id": "q14",
      "difficulty": 3,
      "skills": [
        "erreur",
        "print"
      ],
      "title": "Une parenthèse oubliée",
      "statement": "```python\nprint(\"Résultat :\", 4 * 5\n```\n\nQue se passe-t-il ?",
      "options": [
        {
          "text": "Python affiche `Résultat : 20`, la parenthèse est facultative",
          "correct": false,
          "feedback": "Erreur : toute parenthèse ouverte doit être fermée. Python ne\ndevine pas où elle manque.\n"
        },
        {
          "text": "Python signale une erreur de syntaxe, la parenthèse n'est pas fermée",
          "correct": true,
          "feedback": "Bonne réponse : c'est une `SyntaxError`, détectée avant\nl'exécution. Rien n'est affiché.\n"
        },
        {
          "text": "Python affiche `Résultat : 4 * 5` sans calculer",
          "correct": false,
          "feedback": "Erreur : le programme n'est même pas exécuté, faute d'une\nsyntaxe correcte.\n"
        },
        {
          "text": "Python affiche `Résultat :` puis s'arrête au calcul",
          "correct": false,
          "feedback": "Erreur : une erreur de syntaxe empêche tout affichage.\n"
        }
      ],
      "explanation": "Une erreur de syntaxe est détectée avant l'exécution : le programme\nne démarre pas. Parenthèses, guillemets et deux-points oubliés en\nsont les causes les plus fréquentes."
    },
    {
      "id": "q15",
      "difficulty": 1,
      "skills": [
        "print",
        "calcul"
      ],
      "title": "Afficher un calcul",
      "statement": "```python\nprint(7 * 6)\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`42`",
          "correct": true,
          "feedback": "Bonne réponse : sans guillemets, `7 * 6` est un calcul, et\n`print` affiche son résultat.\n"
        },
        {
          "text": "`7 * 6`",
          "correct": false,
          "feedback": "Erreur : ce serait l'affichage de la chaîne `\"7 * 6\"`, avec\nguillemets.\n"
        },
        {
          "text": "`76`",
          "correct": false,
          "feedback": "Erreur : `*` multiplie deux nombres, il ne colle pas des\nchiffres.\n"
        },
        {
          "text": "`\"42\"`",
          "correct": false,
          "feedback": "Erreur : `print` n'ajoute jamais de guillemets autour d'un\nnombre.\n"
        }
      ],
      "explanation": "`print` évalue d'abord ce qu'on lui donne : un calcul est effectué,\net seul son résultat est affiché.",
      "variants": [
        {
          "statement": "```python\nprint(7 * 6)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`42`",
              "correct": true,
              "feedback": "Bonne réponse : sans guillemets, `7 * 6` est un calcul, et\n`print` affiche son résultat.\n"
            },
            {
              "text": "`7 * 6`",
              "correct": false,
              "feedback": "Erreur : ce serait l'affichage de la chaîne `\"7 * 6\"`, avec\nguillemets.\n"
            },
            {
              "text": "`76`",
              "correct": false,
              "feedback": "Erreur : `*` multiplie deux nombres, il ne colle pas des\nchiffres.\n"
            },
            {
              "text": "`\"42\"`",
              "correct": false,
              "feedback": "Erreur : `print` n'ajoute jamais de guillemets autour d'un\nnombre.\n"
            }
          ],
          "explanation": "`print` évalue d'abord ce qu'on lui donne : un calcul est effectué,\net seul son résultat est affiché."
        },
        {
          "statement": "```python\nprint(8 * 9)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`72`",
              "correct": true,
              "feedback": "Bonne réponse : sans guillemets, `8 * 9` est un calcul, et\n`print` affiche son résultat.\n"
            },
            {
              "text": "`8 * 9`",
              "correct": false,
              "feedback": "Erreur : ce serait l'affichage de la chaîne `\"8 * 9\"`, avec\nguillemets.\n"
            },
            {
              "text": "`89`",
              "correct": false,
              "feedback": "Erreur : `*` multiplie deux nombres, il ne colle pas des\nchiffres.\n"
            },
            {
              "text": "`\"72\"`",
              "correct": false,
              "feedback": "Erreur : `print` n'ajoute jamais de guillemets autour d'un\nnombre.\n"
            }
          ],
          "explanation": "`print` évalue d'abord ce qu'on lui donne : un calcul est effectué,\net seul son résultat est affiché."
        },
        {
          "statement": "```python\nprint(12 * 5)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`60`",
              "correct": true,
              "feedback": "Bonne réponse : sans guillemets, `12 * 5` est un calcul, et\n`print` affiche son résultat.\n"
            },
            {
              "text": "`12 * 5`",
              "correct": false,
              "feedback": "Erreur : ce serait l'affichage de la chaîne `\"12 * 5\"`, avec\nguillemets.\n"
            },
            {
              "text": "`125`",
              "correct": false,
              "feedback": "Erreur : `*` multiplie deux nombres, il ne colle pas des\nchiffres.\n"
            },
            {
              "text": "`\"60\"`",
              "correct": false,
              "feedback": "Erreur : `print` n'ajoute jamais de guillemets autour d'un\nnombre.\n"
            }
          ],
          "explanation": "`print` évalue d'abord ce qu'on lui donne : un calcul est effectué,\net seul son résultat est affiché."
        }
      ]
    },
    {
      "id": "q16",
      "difficulty": 2,
      "skills": [
        "print",
        "chaine",
        "calcul"
      ],
      "title": "Chaîne ou calcul",
      "statement": "```python\nprint(\"7 * 6\")\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`7 * 6`",
          "correct": true,
          "feedback": "Bonne réponse : entre guillemets, c'est un texte, affiché tel\nquel, sans aucun calcul.\n"
        },
        {
          "text": "`42`",
          "correct": false,
          "feedback": "Erreur : Python ne calcule pas à l'intérieur d'une chaîne.\n"
        },
        {
          "text": "`76`",
          "correct": false,
          "feedback": "Erreur : rien n'est calculé, le texte est affiché tel quel.\n"
        },
        {
          "text": "Une erreur, une chaîne ne contient pas d'opérateur",
          "correct": false,
          "feedback": "Erreur : une chaîne peut contenir n'importe quel caractère, y\ncompris `*`.\n"
        }
      ],
      "explanation": "Ce qui est entre guillemets n'est jamais évalué. `\"7 * 6\"` est un\ntexte de cinq caractères, `7 * 6` un calcul qui vaut 42."
    },
    {
      "id": "q17",
      "difficulty": 3,
      "skills": [
        "input",
        "conversion",
        "trace"
      ],
      "title": "Deux saisies additionnées",
      "statement": "```python\na = input(\"a : \")\nb = input(\"b : \")\nprint(int(a) + int(b), a + b)\n```\n\nL'utilisateur tape 5 puis 6. Qu'affiche le programme ?",
      "options": [
        {
          "text": "`11 56`",
          "correct": true,
          "feedback": "Bonne réponse : convertis en entiers, 5 et 6 s'additionnent en\n11 ; en chaînes, `\"5\" + \"6\"` donne `\"56\"`.\n"
        },
        {
          "text": "`11 11`",
          "correct": false,
          "feedback": "Erreur : `a` et `b` restent des chaînes, `a + b` les concatène.\n"
        },
        {
          "text": "`56 56`",
          "correct": false,
          "feedback": "Erreur : `int(a) + int(b)` est une vraie addition, qui vaut 11.\n"
        },
        {
          "text": "`56 11`",
          "correct": false,
          "feedback": "Erreur : c'est l'ordre inverse, l'addition d'entiers vient en\npremier.\n"
        }
      ],
      "explanation": "Le même `+` additionne des entiers et concatène des chaînes. Cet\nexemple montre les deux comportements côte à côte, à partir des\nmêmes saisies.",
      "variants": [
        {
          "statement": "```python\na = input(\"a : \")\nb = input(\"b : \")\nprint(int(a) + int(b), a + b)\n```\n\nL'utilisateur tape 5 puis 6. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`11 56`",
              "correct": true,
              "feedback": "Bonne réponse : convertis en entiers, 5 et 6 s'additionnent en\n11 ; en chaînes, `\"5\" + \"6\"` donne `\"56\"`.\n"
            },
            {
              "text": "`11 11`",
              "correct": false,
              "feedback": "Erreur : `a` et `b` restent des chaînes, `a + b` les concatène.\n"
            },
            {
              "text": "`56 56`",
              "correct": false,
              "feedback": "Erreur : `int(a) + int(b)` est une vraie addition, qui vaut 11.\n"
            },
            {
              "text": "`56 11`",
              "correct": false,
              "feedback": "Erreur : c'est l'ordre inverse, l'addition d'entiers vient en\npremier.\n"
            }
          ],
          "explanation": "Le même `+` additionne des entiers et concatène des chaînes. Cet\nexemple montre les deux comportements côte à côte, à partir des\nmêmes saisies."
        },
        {
          "statement": "```python\na = input(\"a : \")\nb = input(\"b : \")\nprint(int(a) + int(b), a + b)\n```\n\nL'utilisateur tape 12 puis 7. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`19 127`",
              "correct": true,
              "feedback": "Bonne réponse : convertis en entiers, 12 et 7 s'additionnent en\n19 ; en chaînes, `\"12\" + \"7\"` donne `\"127\"`.\n"
            },
            {
              "text": "`19 19`",
              "correct": false,
              "feedback": "Erreur : `a` et `b` restent des chaînes, `a + b` les concatène.\n"
            },
            {
              "text": "`127 127`",
              "correct": false,
              "feedback": "Erreur : `int(a) + int(b)` est une vraie addition, qui vaut 19.\n"
            },
            {
              "text": "`127 19`",
              "correct": false,
              "feedback": "Erreur : c'est l'ordre inverse, l'addition d'entiers vient en\npremier.\n"
            }
          ],
          "explanation": "Le même `+` additionne des entiers et concatène des chaînes. Cet\nexemple montre les deux comportements côte à côte, à partir des\nmêmes saisies."
        },
        {
          "statement": "```python\na = input(\"a : \")\nb = input(\"b : \")\nprint(int(a) + int(b), a + b)\n```\n\nL'utilisateur tape 3 puis 9. Qu'affiche le programme ?",
          "options": [
            {
              "text": "`12 39`",
              "correct": true,
              "feedback": "Bonne réponse : convertis en entiers, 3 et 9 s'additionnent en\n12 ; en chaînes, `\"3\" + \"9\"` donne `\"39\"`.\n"
            },
            {
              "text": "`12 12`",
              "correct": false,
              "feedback": "Erreur : `a` et `b` restent des chaînes, `a + b` les concatène.\n"
            },
            {
              "text": "`39 39`",
              "correct": false,
              "feedback": "Erreur : `int(a) + int(b)` est une vraie addition, qui vaut 12.\n"
            },
            {
              "text": "`39 12`",
              "correct": false,
              "feedback": "Erreur : c'est l'ordre inverse, l'addition d'entiers vient en\npremier.\n"
            }
          ],
          "explanation": "Le même `+` additionne des entiers et concatène des chaînes. Cet\nexemple montre les deux comportements côte à côte, à partir des\nmêmes saisies."
        }
      ]
    },
    {
      "id": "q18",
      "difficulty": 2,
      "skills": [
        "print",
        "affichage",
        "trace"
      ],
      "title": "Une valeur calculée puis affichée",
      "statement": "```python\nprix = 12\nprix = prix * 3\nprint(\"Total :\", prix)\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`Total : 36`",
          "correct": true,
          "feedback": "Bonne réponse : `prix` vaut 36 au moment de l'affichage, et\n`print` sépare ses deux arguments par une espace.\n"
        },
        {
          "text": "`Total : 12`",
          "correct": false,
          "feedback": "Erreur : la deuxième ligne a multiplié `prix` par 3 avant\nl'affichage.\n"
        },
        {
          "text": "`Total : prix`",
          "correct": false,
          "feedback": "Erreur : sans guillemets, `prix` est la variable, dont la valeur\nest affichée.\n"
        },
        {
          "text": "`Total :36`",
          "correct": false,
          "feedback": "Erreur : `print` insère une espace entre ses arguments.\n"
        }
      ],
      "explanation": "`print(\"Total :\", prix)` affiche le texte, puis la valeur de la\nvariable, séparés par une espace. On affiche toujours la valeur\ncourante, après les modifications.",
      "variants": [
        {
          "statement": "```python\nprix = 12\nprix = prix * 3\nprint(\"Total :\", prix)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Total : 36`",
              "correct": true,
              "feedback": "Bonne réponse : `prix` vaut 36 au moment de l'affichage, et\n`print` sépare ses deux arguments par une espace.\n"
            },
            {
              "text": "`Total : 12`",
              "correct": false,
              "feedback": "Erreur : la deuxième ligne a multiplié `prix` par 3 avant\nl'affichage.\n"
            },
            {
              "text": "`Total : prix`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `prix` est la variable, dont la valeur\nest affichée.\n"
            },
            {
              "text": "`Total :36`",
              "correct": false,
              "feedback": "Erreur : `print` insère une espace entre ses arguments.\n"
            }
          ],
          "explanation": "`print(\"Total :\", prix)` affiche le texte, puis la valeur de la\nvariable, séparés par une espace. On affiche toujours la valeur\ncourante, après les modifications."
        },
        {
          "statement": "```python\nprix = 25\nprix = prix * 4\nprint(\"Total :\", prix)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Total : 100`",
              "correct": true,
              "feedback": "Bonne réponse : `prix` vaut 100 au moment de l'affichage, et\n`print` sépare ses deux arguments par une espace.\n"
            },
            {
              "text": "`Total : 25`",
              "correct": false,
              "feedback": "Erreur : la deuxième ligne a multiplié `prix` par 4 avant\nl'affichage.\n"
            },
            {
              "text": "`Total : prix`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `prix` est la variable, dont la valeur\nest affichée.\n"
            },
            {
              "text": "`Total :100`",
              "correct": false,
              "feedback": "Erreur : `print` insère une espace entre ses arguments.\n"
            }
          ],
          "explanation": "`print(\"Total :\", prix)` affiche le texte, puis la valeur de la\nvariable, séparés par une espace. On affiche toujours la valeur\ncourante, après les modifications."
        },
        {
          "statement": "```python\nprix = 8\nprix = prix * 5\nprint(\"Total :\", prix)\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`Total : 40`",
              "correct": true,
              "feedback": "Bonne réponse : `prix` vaut 40 au moment de l'affichage, et\n`print` sépare ses deux arguments par une espace.\n"
            },
            {
              "text": "`Total : 8`",
              "correct": false,
              "feedback": "Erreur : la deuxième ligne a multiplié `prix` par 5 avant\nl'affichage.\n"
            },
            {
              "text": "`Total : prix`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `prix` est la variable, dont la valeur\nest affichée.\n"
            },
            {
              "text": "`Total :40`",
              "correct": false,
              "feedback": "Erreur : `print` insère une espace entre ses arguments.\n"
            }
          ],
          "explanation": "`print(\"Total :\", prix)` affiche le texte, puis la valeur de la\nvariable, séparés par une espace. On affiche toujours la valeur\ncourante, après les modifications."
        }
      ]
    },
    {
      "id": "q19",
      "difficulty": 3,
      "skills": [
        "input",
        "saisie",
        "chaine"
      ],
      "title": "Une saisie qui n'est pas un nombre",
      "statement": "Un robot reçoit ses commandes sous la forme d'une lettre et d'un\nnombre, comme `A50`.\n\n```python\ncommande = input(\"Commande : \")\nprint(\"Reçu :\", commande)\n```\n\nL'utilisateur tape `A50`. Qu'affiche le programme ?",
      "options": [
        {
          "text": "`Reçu : A50`",
          "correct": true,
          "feedback": "Bonne réponse : `input` renvoie la chaîne saisie, quelle qu'elle\nsoit, et `print` l'affiche après le texte.\n"
        },
        {
          "text": "`Commande : A50`",
          "correct": false,
          "feedback": "Erreur : `Commande :` est la question posée par `input`, pas ce\nqu'affiche `print`.\n"
        },
        {
          "text": "Une erreur, `A50` n'est pas un nombre",
          "correct": false,
          "feedback": "Erreur : aucune conversion n'est demandée, `input` accepte\nn'importe quel texte.\n"
        },
        {
          "text": "`Reçu : commande`",
          "correct": false,
          "feedback": "Erreur : sans guillemets, `commande` est la variable, dont la\nvaleur est affichée.\n"
        }
      ],
      "explanation": "`input` accepte n'importe quel texte et le renvoie sans le modifier.\nCe n'est qu'en appelant `int` ou `float` que le contenu doit être un\nnombre."
    },
    {
      "id": "q20",
      "difficulty": 3,
      "skills": [
        "print",
        "flottant",
        "conversion"
      ],
      "title": "Afficher un flottant arrondi",
      "statement": "```python\nmoyenne = 14.6667\nprint(round(moyenne, 1))\n```\n\nQu'affiche ce programme ?",
      "options": [
        {
          "text": "`14.7`",
          "correct": true,
          "feedback": "Bonne réponse : `round(x, 1)` arrondit à une décimale. 14.6667\nest plus proche de 14.7 que de 14.6.\n"
        },
        {
          "text": "`14.6`",
          "correct": false,
          "feedback": "Erreur : `round` arrondit au plus proche, il ne tronque pas.\n"
        },
        {
          "text": "`15`",
          "correct": false,
          "feedback": "Erreur : 15 serait `round(moyenne)`, sans décimale. Le second\nargument demande une décimale.\n"
        },
        {
          "text": "`14.67`",
          "correct": false,
          "feedback": "Erreur : 14.67 serait l'arrondi à deux décimales.\n"
        }
      ],
      "explanation": "`round(x, n)` arrondit `x` à `n` décimales, au plus proche. Sans\nsecond argument, `round(x)` arrondit à l'entier. C'est utile pour\nafficher un résultat lisible.",
      "variants": [
        {
          "statement": "```python\nmoyenne = 14.6667\nprint(round(moyenne, 1))\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`14.7`",
              "correct": true,
              "feedback": "Bonne réponse : `round(x, 1)` arrondit à une décimale. 14.6667\nest plus proche de 14.7 que de 14.6.\n"
            },
            {
              "text": "`14.6`",
              "correct": false,
              "feedback": "Erreur : `round` arrondit au plus proche, il ne tronque pas.\n"
            },
            {
              "text": "`15`",
              "correct": false,
              "feedback": "Erreur : 15 serait `round(moyenne)`, sans décimale. Le second\nargument demande une décimale.\n"
            },
            {
              "text": "`14.67`",
              "correct": false,
              "feedback": "Erreur : 14.67 serait l'arrondi à deux décimales.\n"
            }
          ],
          "explanation": "`round(x, n)` arrondit `x` à `n` décimales, au plus proche. Sans\nsecond argument, `round(x)` arrondit à l'entier. C'est utile pour\nafficher un résultat lisible."
        },
        {
          "statement": "```python\nmoyenne = 9.2789\nprint(round(moyenne, 1))\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`9.3`",
              "correct": true,
              "feedback": "Bonne réponse : `round(x, 1)` arrondit à une décimale. 9.2789\nest plus proche de 9.3 que de 9.2.\n"
            },
            {
              "text": "`9.2`",
              "correct": false,
              "feedback": "Erreur : `round` arrondit au plus proche, il ne tronque pas.\n"
            },
            {
              "text": "`9`",
              "correct": false,
              "feedback": "Erreur : 9 serait `round(moyenne)`, sans décimale. Le second\nargument demande une décimale.\n"
            },
            {
              "text": "`9.28`",
              "correct": false,
              "feedback": "Erreur : 9.28 serait l'arrondi à deux décimales.\n"
            }
          ],
          "explanation": "`round(x, n)` arrondit `x` à `n` décimales, au plus proche. Sans\nsecond argument, `round(x)` arrondit à l'entier. C'est utile pour\nafficher un résultat lisible."
        },
        {
          "statement": "```python\nmoyenne = 16.78\nprint(round(moyenne, 1))\n```\n\nQu'affiche ce programme ?",
          "options": [
            {
              "text": "`16.8`",
              "correct": true,
              "feedback": "Bonne réponse : `round(x, 1)` arrondit à une décimale. 16.78\nest plus proche de 16.8 que de 16.7.\n"
            },
            {
              "text": "`16.7`",
              "correct": false,
              "feedback": "Erreur : `round` arrondit au plus proche, il ne tronque pas.\n"
            },
            {
              "text": "`17`",
              "correct": false,
              "feedback": "Erreur : 17 serait `round(moyenne)`, sans décimale. Le second\nargument demande une décimale.\n"
            },
            {
              "text": "`16.78`",
              "correct": false,
              "feedback": "Erreur : 16.78 serait l'arrondi à deux décimales.\n"
            }
          ],
          "explanation": "`round(x, n)` arrondit `x` à `n` décimales, au plus proche. Sans\nsecond argument, `round(x)` arrondit à l'entier. C'est utile pour\nafficher un résultat lisible."
        }
      ]
    },
    {
      "id": "q21",
      "difficulty": 1,
      "skills": [
        "print",
        "virgule",
        "espace"
      ],
      "title": "Deux textes dans un même print",
      "statement": "Qu'affiche `print(\"Bonjour\", \"Lou\")` ?",
      "options": [
        {
          "text": "`Bonjour Lou`",
          "correct": true,
          "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par un espace.\n"
        },
        {
          "text": "`BonjourLou`",
          "correct": false,
          "feedback": "Erreur : la virgule de `print` insère un espace entre les\nvaleurs.\n"
        },
        {
          "text": "`Bonjour, Lou`",
          "correct": false,
          "feedback": "Erreur : la virgule sépare les arguments, elle n'est pas\naffichée.\n"
        },
        {
          "text": "`Bonjour` puis `Lou` sur deux lignes",
          "correct": false,
          "feedback": "Erreur : un seul `print` produit une seule ligne.\n"
        }
      ],
      "explanation": "Séparer les arguments de `print` par des virgules affiche tout sur\nune ligne, avec un espace entre chaque valeur.",
      "variants": [
        {
          "statement": "Qu'affiche `print(\"Bonjour\", \"Lou\")` ?",
          "options": [
            {
              "text": "`Bonjour Lou`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par un espace.\n"
            },
            {
              "text": "`BonjourLou`",
              "correct": false,
              "feedback": "Erreur : la virgule de `print` insère un espace entre les\nvaleurs.\n"
            },
            {
              "text": "`Bonjour, Lou`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments, elle n'est pas\naffichée.\n"
            },
            {
              "text": "`Bonjour` puis `Lou` sur deux lignes",
              "correct": false,
              "feedback": "Erreur : un seul `print` produit une seule ligne.\n"
            }
          ],
          "explanation": "Séparer les arguments de `print` par des virgules affiche tout sur\nune ligne, avec un espace entre chaque valeur."
        },
        {
          "statement": "Qu'affiche `print(\"Salut\", \"Sami\")` ?",
          "options": [
            {
              "text": "`Salut Sami`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par un espace.\n"
            },
            {
              "text": "`SalutSami`",
              "correct": false,
              "feedback": "Erreur : la virgule de `print` insère un espace entre les\nvaleurs.\n"
            },
            {
              "text": "`Salut, Sami`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments, elle n'est pas\naffichée.\n"
            },
            {
              "text": "`Salut` puis `Sami` sur deux lignes",
              "correct": false,
              "feedback": "Erreur : un seul `print` produit une seule ligne.\n"
            }
          ],
          "explanation": "Séparer les arguments de `print` par des virgules affiche tout sur\nune ligne, avec un espace entre chaque valeur."
        },
        {
          "statement": "Qu'affiche `print(\"Bravo\", \"Inès\")` ?",
          "options": [
            {
              "text": "`Bravo Inès`",
              "correct": true,
              "feedback": "Bonne réponse : `print` affiche ses arguments les uns après les\nautres, séparés par un espace.\n"
            },
            {
              "text": "`BravoInès`",
              "correct": false,
              "feedback": "Erreur : la virgule de `print` insère un espace entre les\nvaleurs.\n"
            },
            {
              "text": "`Bravo, Inès`",
              "correct": false,
              "feedback": "Erreur : la virgule sépare les arguments, elle n'est pas\naffichée.\n"
            },
            {
              "text": "`Bravo` puis `Inès` sur deux lignes",
              "correct": false,
              "feedback": "Erreur : un seul `print` produit une seule ligne.\n"
            }
          ],
          "explanation": "Séparer les arguments de `print` par des virgules affiche tout sur\nune ligne, avec un espace entre chaque valeur."
        }
      ]
    },
    {
      "id": "q22",
      "difficulty": 1,
      "skills": [
        "print",
        "texte",
        "nombre"
      ],
      "title": "Un texte et un nombre",
      "statement": "Qu'affiche `print(\"Total :\", 12)` ?",
      "options": [
        {
          "text": "`Total : 12`",
          "correct": true,
          "feedback": "Bonne réponse : `print` accepte un texte et un nombre, et les\naffiche séparés par un espace.\n"
        },
        {
          "text": "`Total :12`",
          "correct": false,
          "feedback": "Erreur : la virgule ajoute un espace entre les deux valeurs.\n"
        },
        {
          "text": "`Total : n`",
          "correct": false,
          "feedback": "Erreur : 12 est écrit sans guillemets, c'est un nombre dont la\nvaleur est affichée.\n"
        },
        {
          "text": "Une erreur, car on ne peut pas mélanger texte et nombre",
          "correct": false,
          "feedback": "Erreur : c'est `+` qui refuse le mélange, pas la virgule de\n`print`.\n"
        }
      ],
      "explanation": "Avec des virgules, `print` affiche des valeurs de types différents\nsans conversion.",
      "variants": [
        {
          "statement": "Qu'affiche `print(\"Total :\", 12)` ?",
          "options": [
            {
              "text": "`Total : 12`",
              "correct": true,
              "feedback": "Bonne réponse : `print` accepte un texte et un nombre, et les\naffiche séparés par un espace.\n"
            },
            {
              "text": "`Total :12`",
              "correct": false,
              "feedback": "Erreur : la virgule ajoute un espace entre les deux valeurs.\n"
            },
            {
              "text": "`Total : n`",
              "correct": false,
              "feedback": "Erreur : 12 est écrit sans guillemets, c'est un nombre dont la\nvaleur est affichée.\n"
            },
            {
              "text": "Une erreur, car on ne peut pas mélanger texte et nombre",
              "correct": false,
              "feedback": "Erreur : c'est `+` qui refuse le mélange, pas la virgule de\n`print`.\n"
            }
          ],
          "explanation": "Avec des virgules, `print` affiche des valeurs de types différents\nsans conversion."
        },
        {
          "statement": "Qu'affiche `print(\"Total :\", 7)` ?",
          "options": [
            {
              "text": "`Total : 7`",
              "correct": true,
              "feedback": "Bonne réponse : `print` accepte un texte et un nombre, et les\naffiche séparés par un espace.\n"
            },
            {
              "text": "`Total :7`",
              "correct": false,
              "feedback": "Erreur : la virgule ajoute un espace entre les deux valeurs.\n"
            },
            {
              "text": "`Total : n`",
              "correct": false,
              "feedback": "Erreur : 7 est écrit sans guillemets, c'est un nombre dont la\nvaleur est affichée.\n"
            },
            {
              "text": "Une erreur, car on ne peut pas mélanger texte et nombre",
              "correct": false,
              "feedback": "Erreur : c'est `+` qui refuse le mélange, pas la virgule de\n`print`.\n"
            }
          ],
          "explanation": "Avec des virgules, `print` affiche des valeurs de types différents\nsans conversion."
        },
        {
          "statement": "Qu'affiche `print(\"Total :\", 150)` ?",
          "options": [
            {
              "text": "`Total : 150`",
              "correct": true,
              "feedback": "Bonne réponse : `print` accepte un texte et un nombre, et les\naffiche séparés par un espace.\n"
            },
            {
              "text": "`Total :150`",
              "correct": false,
              "feedback": "Erreur : la virgule ajoute un espace entre les deux valeurs.\n"
            },
            {
              "text": "`Total : n`",
              "correct": false,
              "feedback": "Erreur : 150 est écrit sans guillemets, c'est un nombre dont la\nvaleur est affichée.\n"
            },
            {
              "text": "Une erreur, car on ne peut pas mélanger texte et nombre",
              "correct": false,
              "feedback": "Erreur : c'est `+` qui refuse le mélange, pas la virgule de\n`print`.\n"
            }
          ],
          "explanation": "Avec des virgules, `print` affiche des valeurs de types différents\nsans conversion."
        }
      ]
    },
    {
      "id": "q23",
      "difficulty": 1,
      "skills": [
        "input",
        "int",
        "conversion"
      ],
      "title": "Une saisie doublée",
      "statement": "L'utilisateur tape `7` puis Entrée. Qu'affiche ce programme ?\n```python\nn = int(input(\"Nombre ? \"))\nprint(n * 2)\n```",
      "options": [
        {
          "text": "`14`",
          "correct": true,
          "feedback": "Bonne réponse : `int` transforme la saisie `\"7\"` en entier,\net `n * 2` vaut 14.\n"
        },
        {
          "text": "`77`",
          "correct": false,
          "feedback": "Erreur : ce serait le résultat sans `int`, la chaîne `\"7\"`\nrépétée deux fois.\n"
        },
        {
          "text": "`n * 2`",
          "correct": false,
          "feedback": "Erreur : `print` affiche le résultat du calcul, pas son\nécriture.\n"
        },
        {
          "text": "Une erreur, `input` ne renvoyant pas un nombre",
          "correct": false,
          "feedback": "Erreur : `input` renvoie une chaîne, mais `int` la convertit\naussitôt en nombre.\n"
        }
      ],
      "explanation": "`int(input(...))` est le schéma habituel pour lire un entier au\nclavier.",
      "variants": [
        {
          "statement": "L'utilisateur tape `7` puis Entrée. Qu'affiche ce programme ?\n```python\nn = int(input(\"Nombre ? \"))\nprint(n * 2)\n```",
          "options": [
            {
              "text": "`14`",
              "correct": true,
              "feedback": "Bonne réponse : `int` transforme la saisie `\"7\"` en entier,\net `n * 2` vaut 14.\n"
            },
            {
              "text": "`77`",
              "correct": false,
              "feedback": "Erreur : ce serait le résultat sans `int`, la chaîne `\"7\"`\nrépétée deux fois.\n"
            },
            {
              "text": "`n * 2`",
              "correct": false,
              "feedback": "Erreur : `print` affiche le résultat du calcul, pas son\nécriture.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `input` renvoie une chaîne, mais `int` la convertit\naussitôt en nombre.\n"
            }
          ],
          "explanation": "`int(input(...))` est le schéma habituel pour lire un entier au\nclavier."
        },
        {
          "statement": "L'utilisateur tape `25` puis Entrée. Qu'affiche ce programme ?\n```python\nn = int(input(\"Nombre ? \"))\nprint(n * 2)\n```",
          "options": [
            {
              "text": "`50`",
              "correct": true,
              "feedback": "Bonne réponse : `int` transforme la saisie `\"25\"` en entier,\net `n * 2` vaut 50.\n"
            },
            {
              "text": "`2525`",
              "correct": false,
              "feedback": "Erreur : ce serait le résultat sans `int`, la chaîne `\"25\"`\nrépétée deux fois.\n"
            },
            {
              "text": "`n * 2`",
              "correct": false,
              "feedback": "Erreur : `print` affiche le résultat du calcul, pas son\nécriture.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `input` renvoie une chaîne, mais `int` la convertit\naussitôt en nombre.\n"
            }
          ],
          "explanation": "`int(input(...))` est le schéma habituel pour lire un entier au\nclavier."
        },
        {
          "statement": "L'utilisateur tape `4` puis Entrée. Qu'affiche ce programme ?\n```python\nn = int(input(\"Nombre ? \"))\nprint(n * 2)\n```",
          "options": [
            {
              "text": "`8`",
              "correct": true,
              "feedback": "Bonne réponse : `int` transforme la saisie `\"4\"` en entier,\net `n * 2` vaut 8.\n"
            },
            {
              "text": "`44`",
              "correct": false,
              "feedback": "Erreur : ce serait le résultat sans `int`, la chaîne `\"4\"`\nrépétée deux fois.\n"
            },
            {
              "text": "`n * 2`",
              "correct": false,
              "feedback": "Erreur : `print` affiche le résultat du calcul, pas son\nécriture.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `input` renvoie une chaîne, mais `int` la convertit\naussitôt en nombre.\n"
            }
          ],
          "explanation": "`int(input(...))` est le schéma habituel pour lire un entier au\nclavier."
        }
      ]
    },
    {
      "id": "q24",
      "difficulty": 2,
      "skills": [
        "print",
        "plusieurs-valeurs"
      ],
      "title": "Une multiplication affichée en toutes lettres",
      "statement": "Qu'affiche `print(3, \"fois\", 4, \"=\", 3 * 4)` ?",
      "options": [
        {
          "text": "`3 fois 4 = 12`",
          "correct": true,
          "feedback": "Bonne réponse : cinq valeurs sont affichées, séparées par des\nespaces, la dernière étant le résultat du calcul `3 * 4`.\n"
        },
        {
          "text": "`3 fois 4 = 3 * 4`",
          "correct": false,
          "feedback": "Erreur : `3 * 4` sans guillemets est un calcul, dont seul le\nrésultat est affiché.\n"
        },
        {
          "text": "`3fois4=12`",
          "correct": false,
          "feedback": "Erreur : chaque virgule ajoute un espace dans l'affichage.\n"
        },
        {
          "text": "`3 fois 4`",
          "correct": false,
          "feedback": "Erreur : le signe `=` et le résultat du calcul sont affichés\naussi.\n"
        }
      ],
      "explanation": "`print` évalue chaque argument, texte ou calcul, puis affiche le\ntout sur une ligne.",
      "variants": [
        {
          "statement": "Qu'affiche `print(3, \"fois\", 4, \"=\", 3 * 4)` ?",
          "options": [
            {
              "text": "`3 fois 4 = 12`",
              "correct": true,
              "feedback": "Bonne réponse : cinq valeurs sont affichées, séparées par des\nespaces, la dernière étant le résultat du calcul `3 * 4`.\n"
            },
            {
              "text": "`3 fois 4 = 3 * 4`",
              "correct": false,
              "feedback": "Erreur : `3 * 4` sans guillemets est un calcul, dont seul le\nrésultat est affiché.\n"
            },
            {
              "text": "`3fois4=12`",
              "correct": false,
              "feedback": "Erreur : chaque virgule ajoute un espace dans l'affichage.\n"
            },
            {
              "text": "`3 fois 4`",
              "correct": false,
              "feedback": "Erreur : le signe `=` et le résultat du calcul sont affichés\naussi.\n"
            }
          ],
          "explanation": "`print` évalue chaque argument, texte ou calcul, puis affiche le\ntout sur une ligne."
        },
        {
          "statement": "Qu'affiche `print(6, \"fois\", 7, \"=\", 6 * 7)` ?",
          "options": [
            {
              "text": "`6 fois 7 = 42`",
              "correct": true,
              "feedback": "Bonne réponse : cinq valeurs sont affichées, séparées par des\nespaces, la dernière étant le résultat du calcul `6 * 7`.\n"
            },
            {
              "text": "`6 fois 7 = 6 * 7`",
              "correct": false,
              "feedback": "Erreur : `6 * 7` sans guillemets est un calcul, dont seul le\nrésultat est affiché.\n"
            },
            {
              "text": "`6fois7=42`",
              "correct": false,
              "feedback": "Erreur : chaque virgule ajoute un espace dans l'affichage.\n"
            },
            {
              "text": "`6 fois 7`",
              "correct": false,
              "feedback": "Erreur : le signe `=` et le résultat du calcul sont affichés\naussi.\n"
            }
          ],
          "explanation": "`print` évalue chaque argument, texte ou calcul, puis affiche le\ntout sur une ligne."
        },
        {
          "statement": "Qu'affiche `print(9, \"fois\", 9, \"=\", 9 * 9)` ?",
          "options": [
            {
              "text": "`9 fois 9 = 81`",
              "correct": true,
              "feedback": "Bonne réponse : cinq valeurs sont affichées, séparées par des\nespaces, la dernière étant le résultat du calcul `9 * 9`.\n"
            },
            {
              "text": "`9 fois 9 = 9 * 9`",
              "correct": false,
              "feedback": "Erreur : `9 * 9` sans guillemets est un calcul, dont seul le\nrésultat est affiché.\n"
            },
            {
              "text": "`9fois9=81`",
              "correct": false,
              "feedback": "Erreur : chaque virgule ajoute un espace dans l'affichage.\n"
            },
            {
              "text": "`9 fois 9`",
              "correct": false,
              "feedback": "Erreur : le signe `=` et le résultat du calcul sont affichés\naussi.\n"
            }
          ],
          "explanation": "`print` évalue chaque argument, texte ou calcul, puis affiche le\ntout sur une ligne."
        }
      ]
    },
    {
      "id": "q25",
      "difficulty": 2,
      "skills": [
        "print",
        "concatenation",
        "erreur"
      ],
      "title": "Un nombre collé à un texte",
      "statement": "Que produit `print(\"Il reste \" + 3 + \" places\")` ?",
      "options": [
        {
          "text": "Une erreur, `+` refusant d'assembler texte et nombre",
          "correct": true,
          "feedback": "Bonne réponse : `+` concatène deux chaînes ou additionne deux\nnombres, mais refuse le mélange. Il faudrait `str(3)`, ou des\nvirgules.\n"
        },
        {
          "text": "`Il reste 3 places`, le nombre étant converti automatiquement",
          "correct": false,
          "feedback": "Erreur : ce serait le résultat avec `str(3)` ou avec des\nvirgules à la place des `+`.\n"
        },
        {
          "text": "`Il reste + 3 + places`, les signes étant affichés",
          "correct": false,
          "feedback": "Erreur : les `+` ne sont pas affichés, et le programme échoue\navant tout affichage.\n"
        },
        {
          "text": "`Il reste places`, le nombre étant ignoré",
          "correct": false,
          "feedback": "Erreur : le nombre n'est pas ignoré, c'est lui qui provoque\nl'erreur.\n"
        }
      ],
      "explanation": "Pour insérer un nombre dans un message, soit on le convertit avec\n`str`, soit on sépare les arguments de `print` par des virgules."
    },
    {
      "id": "q26",
      "difficulty": 2,
      "skills": [
        "input",
        "ordre",
        "print"
      ],
      "title": "Deux saisies affichées à l'envers",
      "statement": "L'utilisateur tape `Lyon` puis `Paris`. Qu'affiche ce programme ?\n```python\npremier = input(\"Premier ? \")\nsecond = input(\"Second ? \")\nprint(second, premier)\n```",
      "options": [
        {
          "text": "`Paris Lyon`",
          "correct": true,
          "feedback": "Bonne réponse : les saisies sont rangées dans l'ordre, mais\n`print(second, premier)` les affiche dans l'ordre inverse.\n"
        },
        {
          "text": "`Lyon Paris`",
          "correct": false,
          "feedback": "Erreur : regarde l'ordre des variables dans le `print`.\n"
        },
        {
          "text": "`second premier`",
          "correct": false,
          "feedback": "Erreur : sans guillemets, `second` et `premier` sont des\nvariables, remplacées par leur valeur.\n"
        },
        {
          "text": "`Premier ? Second ?`",
          "correct": false,
          "feedback": "Erreur : ces textes sont les invites affichées pendant la\nsaisie, pas le résultat du `print` final.\n"
        }
      ],
      "explanation": "L'ordre d'affichage est celui des arguments de `print`, pas celui\ndes saisies.",
      "variants": [
        {
          "statement": "L'utilisateur tape `Lyon` puis `Paris`. Qu'affiche ce programme ?\n```python\npremier = input(\"Premier ? \")\nsecond = input(\"Second ? \")\nprint(second, premier)\n```",
          "options": [
            {
              "text": "`Paris Lyon`",
              "correct": true,
              "feedback": "Bonne réponse : les saisies sont rangées dans l'ordre, mais\n`print(second, premier)` les affiche dans l'ordre inverse.\n"
            },
            {
              "text": "`Lyon Paris`",
              "correct": false,
              "feedback": "Erreur : regarde l'ordre des variables dans le `print`.\n"
            },
            {
              "text": "`second premier`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `second` et `premier` sont des\nvariables, remplacées par leur valeur.\n"
            },
            {
              "text": "`Premier ? Second ?`",
              "correct": false,
              "feedback": "Erreur : ces textes sont les invites affichées pendant la\nsaisie, pas le résultat du `print` final.\n"
            }
          ],
          "explanation": "L'ordre d'affichage est celui des arguments de `print`, pas celui\ndes saisies."
        },
        {
          "statement": "L'utilisateur tape `rouge` puis `bleu`. Qu'affiche ce programme ?\n```python\npremier = input(\"Premier ? \")\nsecond = input(\"Second ? \")\nprint(second, premier)\n```",
          "options": [
            {
              "text": "`bleu rouge`",
              "correct": true,
              "feedback": "Bonne réponse : les saisies sont rangées dans l'ordre, mais\n`print(second, premier)` les affiche dans l'ordre inverse.\n"
            },
            {
              "text": "`rouge bleu`",
              "correct": false,
              "feedback": "Erreur : regarde l'ordre des variables dans le `print`.\n"
            },
            {
              "text": "`second premier`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `second` et `premier` sont des\nvariables, remplacées par leur valeur.\n"
            },
            {
              "text": "`Premier ? Second ?`",
              "correct": false,
              "feedback": "Erreur : ces textes sont les invites affichées pendant la\nsaisie, pas le résultat du `print` final.\n"
            }
          ],
          "explanation": "L'ordre d'affichage est celui des arguments de `print`, pas celui\ndes saisies."
        },
        {
          "statement": "L'utilisateur tape `lundi` puis `mardi`. Qu'affiche ce programme ?\n```python\npremier = input(\"Premier ? \")\nsecond = input(\"Second ? \")\nprint(second, premier)\n```",
          "options": [
            {
              "text": "`mardi lundi`",
              "correct": true,
              "feedback": "Bonne réponse : les saisies sont rangées dans l'ordre, mais\n`print(second, premier)` les affiche dans l'ordre inverse.\n"
            },
            {
              "text": "`lundi mardi`",
              "correct": false,
              "feedback": "Erreur : regarde l'ordre des variables dans le `print`.\n"
            },
            {
              "text": "`second premier`",
              "correct": false,
              "feedback": "Erreur : sans guillemets, `second` et `premier` sont des\nvariables, remplacées par leur valeur.\n"
            },
            {
              "text": "`Premier ? Second ?`",
              "correct": false,
              "feedback": "Erreur : ces textes sont les invites affichées pendant la\nsaisie, pas le résultat du `print` final.\n"
            }
          ],
          "explanation": "L'ordre d'affichage est celui des arguments de `print`, pas celui\ndes saisies."
        }
      ]
    },
    {
      "id": "q27",
      "difficulty": 2,
      "skills": [
        "int",
        "addition",
        "chaine"
      ],
      "title": "Deux chaînes de chiffres converties",
      "statement": "Qu'affiche `print(int(\"3\") + int(\"4\"))` ?",
      "options": [
        {
          "text": "`7`",
          "correct": true,
          "feedback": "Bonne réponse : les deux chaînes sont converties en entiers\navant l'addition, qui donne 7.\n"
        },
        {
          "text": "`34`",
          "correct": false,
          "feedback": "Erreur : `\"3\" + \"4\"` collerait les chaînes, mais ici elles\nsont converties en nombres avant le `+`.\n"
        },
        {
          "text": "`'7'`",
          "correct": false,
          "feedback": "Erreur : le résultat d'une addition d'entiers est un entier,\naffiché sans guillemets.\n"
        },
        {
          "text": "Une erreur, `int` refusant les chaînes",
          "correct": false,
          "feedback": "Erreur : `int` accepte une chaîne de chiffres et la convertit.\n"
        }
      ],
      "explanation": "Convertir avant de calculer : c'est la règle pour toute valeur\nvenue d'une saisie ou d'un texte.",
      "variants": [
        {
          "statement": "Qu'affiche `print(int(\"3\") + int(\"4\"))` ?",
          "options": [
            {
              "text": "`7`",
              "correct": true,
              "feedback": "Bonne réponse : les deux chaînes sont converties en entiers\navant l'addition, qui donne 7.\n"
            },
            {
              "text": "`34`",
              "correct": false,
              "feedback": "Erreur : `\"3\" + \"4\"` collerait les chaînes, mais ici elles\nsont converties en nombres avant le `+`.\n"
            },
            {
              "text": "`'7'`",
              "correct": false,
              "feedback": "Erreur : le résultat d'une addition d'entiers est un entier,\naffiché sans guillemets.\n"
            },
            {
              "text": "Une erreur, `int` refusant les chaînes",
              "correct": false,
              "feedback": "Erreur : `int` accepte une chaîne de chiffres et la convertit.\n"
            }
          ],
          "explanation": "Convertir avant de calculer : c'est la règle pour toute valeur\nvenue d'une saisie ou d'un texte."
        },
        {
          "statement": "Qu'affiche `print(int(\"10\") + int(\"5\"))` ?",
          "options": [
            {
              "text": "`15`",
              "correct": true,
              "feedback": "Bonne réponse : les deux chaînes sont converties en entiers\navant l'addition, qui donne 15.\n"
            },
            {
              "text": "`105`",
              "correct": false,
              "feedback": "Erreur : `\"10\" + \"5\"` collerait les chaînes, mais ici elles\nsont converties en nombres avant le `+`.\n"
            },
            {
              "text": "`'15'`",
              "correct": false,
              "feedback": "Erreur : le résultat d'une addition d'entiers est un entier,\naffiché sans guillemets.\n"
            },
            {
              "text": "Une erreur, `int` refusant les chaînes",
              "correct": false,
              "feedback": "Erreur : `int` accepte une chaîne de chiffres et la convertit.\n"
            }
          ],
          "explanation": "Convertir avant de calculer : c'est la règle pour toute valeur\nvenue d'une saisie ou d'un texte."
        },
        {
          "statement": "Qu'affiche `print(int(\"21\") + int(\"9\"))` ?",
          "options": [
            {
              "text": "`30`",
              "correct": true,
              "feedback": "Bonne réponse : les deux chaînes sont converties en entiers\navant l'addition, qui donne 30.\n"
            },
            {
              "text": "`219`",
              "correct": false,
              "feedback": "Erreur : `\"21\" + \"9\"` collerait les chaînes, mais ici elles\nsont converties en nombres avant le `+`.\n"
            },
            {
              "text": "`'30'`",
              "correct": false,
              "feedback": "Erreur : le résultat d'une addition d'entiers est un entier,\naffiché sans guillemets.\n"
            },
            {
              "text": "Une erreur, `int` refusant les chaînes",
              "correct": false,
              "feedback": "Erreur : `int` accepte une chaîne de chiffres et la convertit.\n"
            }
          ],
          "explanation": "Convertir avant de calculer : c'est la règle pour toute valeur\nvenue d'une saisie ou d'un texte."
        }
      ]
    },
    {
      "id": "q28",
      "difficulty": 3,
      "skills": [
        "print",
        "division",
        "lignes"
      ],
      "title": "Deux divisions sur deux lignes",
      "statement": "Qu'affiche ce programme ?\n```python\nprint(10 / 4)\nprint(10 // 4)\n```",
      "options": [
        {
          "text": "`2.5` puis `2`",
          "correct": true,
          "feedback": "Bonne réponse : `/` donne le flottant 2.5, `//` le quotient\nentier 2, et chaque `print` occupe sa ligne.\n"
        },
        {
          "text": "`2` puis `2.5`",
          "correct": false,
          "feedback": "Erreur : l'ordre des lignes suit l'ordre des `print`, la\ndivision réelle d'abord.\n"
        },
        {
          "text": "`2.5 2`",
          "correct": false,
          "feedback": "Erreur : deux `print` produisent deux lignes, pas une seule.\n"
        },
        {
          "text": "`2` puis `2`",
          "correct": false,
          "feedback": "Erreur : `/` ne tronque pas, il renvoie un flottant.\n"
        }
      ],
      "explanation": "Chaque appel de `print` termine sa ligne. Les deux divisions, `/`\net `//`, ne donnent ni le même type ni la même valeur.",
      "variants": [
        {
          "statement": "Qu'affiche ce programme ?\n```python\nprint(10 / 4)\nprint(10 // 4)\n```",
          "options": [
            {
              "text": "`2.5` puis `2`",
              "correct": true,
              "feedback": "Bonne réponse : `/` donne le flottant 2.5, `//` le quotient\nentier 2, et chaque `print` occupe sa ligne.\n"
            },
            {
              "text": "`2` puis `2.5`",
              "correct": false,
              "feedback": "Erreur : l'ordre des lignes suit l'ordre des `print`, la\ndivision réelle d'abord.\n"
            },
            {
              "text": "`2.5 2`",
              "correct": false,
              "feedback": "Erreur : deux `print` produisent deux lignes, pas une seule.\n"
            },
            {
              "text": "`2` puis `2`",
              "correct": false,
              "feedback": "Erreur : `/` ne tronque pas, il renvoie un flottant.\n"
            }
          ],
          "explanation": "Chaque appel de `print` termine sa ligne. Les deux divisions, `/`\net `//`, ne donnent ni le même type ni la même valeur."
        },
        {
          "statement": "Qu'affiche ce programme ?\n```python\nprint(9 / 2)\nprint(9 // 2)\n```",
          "options": [
            {
              "text": "`4.5` puis `4`",
              "correct": true,
              "feedback": "Bonne réponse : `/` donne le flottant 4.5, `//` le quotient\nentier 4, et chaque `print` occupe sa ligne.\n"
            },
            {
              "text": "`4` puis `4.5`",
              "correct": false,
              "feedback": "Erreur : l'ordre des lignes suit l'ordre des `print`, la\ndivision réelle d'abord.\n"
            },
            {
              "text": "`4.5 4`",
              "correct": false,
              "feedback": "Erreur : deux `print` produisent deux lignes, pas une seule.\n"
            },
            {
              "text": "`4` puis `4`",
              "correct": false,
              "feedback": "Erreur : `/` ne tronque pas, il renvoie un flottant.\n"
            }
          ],
          "explanation": "Chaque appel de `print` termine sa ligne. Les deux divisions, `/`\net `//`, ne donnent ni le même type ni la même valeur."
        },
        {
          "statement": "Qu'affiche ce programme ?\n```python\nprint(21 / 6)\nprint(21 // 6)\n```",
          "options": [
            {
              "text": "`3.5` puis `3`",
              "correct": true,
              "feedback": "Bonne réponse : `/` donne le flottant 3.5, `//` le quotient\nentier 3, et chaque `print` occupe sa ligne.\n"
            },
            {
              "text": "`3` puis `3.5`",
              "correct": false,
              "feedback": "Erreur : l'ordre des lignes suit l'ordre des `print`, la\ndivision réelle d'abord.\n"
            },
            {
              "text": "`3.5 3`",
              "correct": false,
              "feedback": "Erreur : deux `print` produisent deux lignes, pas une seule.\n"
            },
            {
              "text": "`3` puis `3`",
              "correct": false,
              "feedback": "Erreur : `/` ne tronque pas, il renvoie un flottant.\n"
            }
          ],
          "explanation": "Chaque appel de `print` termine sa ligne. Les deux divisions, `/`\net `//`, ne donnent ni le même type ni la même valeur."
        }
      ]
    },
    {
      "id": "q29",
      "difficulty": 3,
      "skills": [
        "input",
        "float",
        "calcul"
      ],
      "title": "Un prix saisi puis majoré",
      "statement": "L'utilisateur tape `10`. Qu'affiche ce programme ?\n```python\nprix = float(input(\"Prix ? \"))\nprint(prix * 1.2)\n```",
      "options": [
        {
          "text": "`12.0`",
          "correct": true,
          "feedback": "Bonne réponse : la saisie est convertie en flottant, et le\nproduit par 1.2 est affiché avec sa partie décimale.\n"
        },
        {
          "text": "`12`",
          "correct": false,
          "feedback": "Erreur : ce serait le même nombre, mais Python affiche toujours\nun flottant avec un point décimal, même si sa valeur est entière.\n"
        },
        {
          "text": "`101.2`",
          "correct": false,
          "feedback": "Erreur : ce serait une concaténation ; après `float`, `prix`\nest un nombre et `*` multiplie.\n"
        },
        {
          "text": "Une erreur, `input` ne renvoyant pas un nombre",
          "correct": false,
          "feedback": "Erreur : `float` convertit la chaîne saisie en nombre à virgule\navant le calcul.\n"
        }
      ],
      "explanation": "`float(input(...))` lit un nombre à virgule. Le résultat d'un\ncalcul avec un flottant est un flottant, affiché avec son point.",
      "variants": [
        {
          "statement": "L'utilisateur tape `10`. Qu'affiche ce programme ?\n```python\nprix = float(input(\"Prix ? \"))\nprint(prix * 1.2)\n```",
          "options": [
            {
              "text": "`12.0`",
              "correct": true,
              "feedback": "Bonne réponse : la saisie est convertie en flottant, et le\nproduit par 1.2 est affiché avec sa partie décimale.\n"
            },
            {
              "text": "`12`",
              "correct": false,
              "feedback": "Erreur : ce serait le même nombre, mais Python affiche toujours\nun flottant avec un point décimal, même si sa valeur est entière.\n"
            },
            {
              "text": "`101.2`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation ; après `float`, `prix`\nest un nombre et `*` multiplie.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `float` convertit la chaîne saisie en nombre à virgule\navant le calcul.\n"
            }
          ],
          "explanation": "`float(input(...))` lit un nombre à virgule. Le résultat d'un\ncalcul avec un flottant est un flottant, affiché avec son point."
        },
        {
          "statement": "L'utilisateur tape `50`. Qu'affiche ce programme ?\n```python\nprix = float(input(\"Prix ? \"))\nprint(prix * 1.2)\n```",
          "options": [
            {
              "text": "`60.0`",
              "correct": true,
              "feedback": "Bonne réponse : la saisie est convertie en flottant, et le\nproduit par 1.2 est affiché avec sa partie décimale.\n"
            },
            {
              "text": "`60`",
              "correct": false,
              "feedback": "Erreur : ce serait le même nombre, mais Python affiche toujours\nun flottant avec un point décimal, même si sa valeur est entière.\n"
            },
            {
              "text": "`501.2`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation ; après `float`, `prix`\nest un nombre et `*` multiplie.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `float` convertit la chaîne saisie en nombre à virgule\navant le calcul.\n"
            }
          ],
          "explanation": "`float(input(...))` lit un nombre à virgule. Le résultat d'un\ncalcul avec un flottant est un flottant, affiché avec son point."
        },
        {
          "statement": "L'utilisateur tape `5`. Qu'affiche ce programme ?\n```python\nprix = float(input(\"Prix ? \"))\nprint(prix * 1.2)\n```",
          "options": [
            {
              "text": "`6.0`",
              "correct": true,
              "feedback": "Bonne réponse : la saisie est convertie en flottant, et le\nproduit par 1.2 est affiché avec sa partie décimale.\n"
            },
            {
              "text": "`6`",
              "correct": false,
              "feedback": "Erreur : ce serait le même nombre, mais Python affiche toujours\nun flottant avec un point décimal, même si sa valeur est entière.\n"
            },
            {
              "text": "`51.2`",
              "correct": false,
              "feedback": "Erreur : ce serait une concaténation ; après `float`, `prix`\nest un nombre et `*` multiplie.\n"
            },
            {
              "text": "Une erreur, `input` ne renvoyant pas un nombre",
              "correct": false,
              "feedback": "Erreur : `float` convertit la chaîne saisie en nombre à virgule\navant le calcul.\n"
            }
          ],
          "explanation": "`float(input(...))` lit un nombre à virgule. Le résultat d'un\ncalcul avec un flottant est un flottant, affiché avec son point."
        }
      ]
    },
    {
      "id": "q30",
      "difficulty": 3,
      "skills": [
        "print",
        "concatenation",
        "virgule"
      ],
      "title": "Un plus et une virgule dans le même print",
      "statement": "Qu'affiche `print(\"a\" + \"b\", \"c\")` ?",
      "options": [
        {
          "text": "`ab c`",
          "correct": true,
          "feedback": "Bonne réponse : `+` colle `\"a\"` et `\"b\"` sans espace, puis la\nvirgule sépare ce résultat de `\"c\"` par un espace.\n"
        },
        {
          "text": "`a b c`",
          "correct": false,
          "feedback": "Erreur : `+` n'ajoute aucun espace entre les deux premières\nchaînes.\n"
        },
        {
          "text": "`abc`",
          "correct": false,
          "feedback": "Erreur : la virgule, elle, insère un espace avant `\"c\"`.\n"
        },
        {
          "text": "`a + b c`",
          "correct": false,
          "feedback": "Erreur : le `+` est un opérateur, il n'est pas affiché.\n"
        }
      ],
      "explanation": "Deux façons d'assembler dans un `print` : `+` concatène sans\nespace, la virgule sépare par un espace.",
      "variants": [
        {
          "statement": "Qu'affiche `print(\"a\" + \"b\", \"c\")` ?",
          "options": [
            {
              "text": "`ab c`",
              "correct": true,
              "feedback": "Bonne réponse : `+` colle `\"a\"` et `\"b\"` sans espace, puis la\nvirgule sépare ce résultat de `\"c\"` par un espace.\n"
            },
            {
              "text": "`a b c`",
              "correct": false,
              "feedback": "Erreur : `+` n'ajoute aucun espace entre les deux premières\nchaînes.\n"
            },
            {
              "text": "`abc`",
              "correct": false,
              "feedback": "Erreur : la virgule, elle, insère un espace avant `\"c\"`.\n"
            },
            {
              "text": "`a + b c`",
              "correct": false,
              "feedback": "Erreur : le `+` est un opérateur, il n'est pas affiché.\n"
            }
          ],
          "explanation": "Deux façons d'assembler dans un `print` : `+` concatène sans\nespace, la virgule sépare par un espace."
        },
        {
          "statement": "Qu'affiche `print(\"x\" + \"y\", \"z\")` ?",
          "options": [
            {
              "text": "`xy z`",
              "correct": true,
              "feedback": "Bonne réponse : `+` colle `\"x\"` et `\"y\"` sans espace, puis la\nvirgule sépare ce résultat de `\"z\"` par un espace.\n"
            },
            {
              "text": "`x y z`",
              "correct": false,
              "feedback": "Erreur : `+` n'ajoute aucun espace entre les deux premières\nchaînes.\n"
            },
            {
              "text": "`xyz`",
              "correct": false,
              "feedback": "Erreur : la virgule, elle, insère un espace avant `\"z\"`.\n"
            },
            {
              "text": "`x + y z`",
              "correct": false,
              "feedback": "Erreur : le `+` est un opérateur, il n'est pas affiché.\n"
            }
          ],
          "explanation": "Deux façons d'assembler dans un `print` : `+` concatène sans\nespace, la virgule sépare par un espace."
        },
        {
          "statement": "Qu'affiche `print(\"un\" + \"deux\", \"trois\")` ?",
          "options": [
            {
              "text": "`undeux trois`",
              "correct": true,
              "feedback": "Bonne réponse : `+` colle `\"un\"` et `\"deux\"` sans espace, puis la\nvirgule sépare ce résultat de `\"trois\"` par un espace.\n"
            },
            {
              "text": "`un deux trois`",
              "correct": false,
              "feedback": "Erreur : `+` n'ajoute aucun espace entre les deux premières\nchaînes.\n"
            },
            {
              "text": "`undeuxtrois`",
              "correct": false,
              "feedback": "Erreur : la virgule, elle, insère un espace avant `\"trois\"`.\n"
            },
            {
              "text": "`un + deux trois`",
              "correct": false,
              "feedback": "Erreur : le `+` est un opérateur, il n'est pas affiché.\n"
            }
          ],
          "explanation": "Deux façons d'assembler dans un `print` : `+` concatène sans\nespace, la virgule sépare par un espace."
        }
      ]
    }
  ]
}