Prepa Help
Prepa Help › Cours › Informatique (MP2I), 1re année

Algorithmes, discipline de programmation et tests en MP2I : cours, méthodes et exercices corrigés

Algorithme et programme, paradigmes, compilation et interprétation ; entiers bornés et flottants ; terminaison par variant, correction par invariant ; complexité dans le pire cas, en moyenne et amortie ; spécification, programmation défensive et assertions, typage faible du C et fort d'OCaml, exceptions ; jeux de tests par partition et limites, graphe de flot de contrôle, couvertures et test exhaustif des conditions, en C et en OCaml.

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

Ce chapitre ouvre l'année de MP2I : il apprend à écrire un programme dont on peut répondre de la justesse, en C et en OCaml. On spécifie chaque fonction (signature, précondition, postcondition, effets), on se défend contre les entrées invalides par des assertions, on prouve qu'une boucle s'arrête par un variant et qu'elle calcule ce qu'on attend par un invariant, en distinguant correction partielle et correction totale. On compte le coût dans le pire cas, et sur des exemples simples le coût moyen et le coût amorti. On calcule juste avec des entiers bornés et des flottants. Enfin, on teste : jeux de tests construits par partition des entrées et valeurs limites, graphe de flot de contrôle, couverture des sommets, des arcs et des chemins sans cycle, test de toutes les façons d'évaluer une condition composée. Les sujets de Mines-Ponts, de CCINP et de Centrale-Supélec en filière MPI posent ces questions, reprises dans les exercices et les problèmes. Tous les programmes ont été compilés avec les options -Wall -Wextra -std=c99 ou par ocamlc, exécutés et testés.

Ce que tu sauras faire

Ce chapitre ouvre l'année. Il n'enseigne pas encore les langages, qui ont leurs chapitres : il enseigne ce qu'on fait de tout programme, dans les deux langages du programme, le C et OCaml. Écrire ce qu'une fonction doit faire, se protéger des entrées invalides, prouver qu'une boucle s'arrête et calcule le bon résultat, compter son coût, puis la soumettre à des tests bien choisis. À la fin, tu dois savoir :

L'essentiel : Algorithmes et programmes Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

À retenir Trois mots

Un problème : des entrées et la sortie attendue. Un algorithme : une méthode finie qui le résout, décrite sans langage. Un programme : la mise en œuvre d'un algorithme dans un langage.

  • Paradigmes : impératif (actions qui modifient des variables, boucles : le C), fonctionnel (valeur d'une expression, sans modification : OCaml), logique (on décrit ce qu'on veut : SQL, mentionné seulement). GOTO est hors programme.
  • Fichier source, fichier objet (gcc -c), exécutable (édition de liens). OCaml : ocamlc (code-octet, lancé par ocamlrun), ocamlopt (natif), boucle interactive ocaml. Un interprète exécute le source sans produire d'exécutable.
  • Interface (.h, .mli) : ce que le module promet. Implémentation (.c, .ml) : comment il le tient.

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 16 méthodes, 22 pièges corrigés, la carte mentale, 33 exercices corrigés, 3 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Ce chapitre est offert : il s’ouvre en entier avec un compte d’essai gratuit.

Ouvrir l'essai gratuit

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Écrire la spécification d'une fonction
  2. Choisir entre précondition, assertion et valeur spéciale
  3. Écrire une assertion juste en C et en OCaml
  4. Prévenir un dépassement d'entier
  5. Comparer des flottants et repérer un calcul instable
  6. Prouver la terminaison d'une boucle par un variant
  7. Trouver un invariant de boucle
  8. Rédiger une preuve de correction par invariant
  9. Annoter un code bloc par bloc et y trouver l'erreur
  10. Évaluer la complexité d'un code à boucles
  11. Construire un jeu de tests par partition et limites
  12. Écrire un programme de test
  13. Tracer le graphe de flot de contrôle d'une fonction
  14. Choisir des tests qui couvrent les sommets, puis les arcs
  15. Tester exhaustivement une condition composée
  16. Trouver un contre-exemple à un code faux et le corriger

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (13)

Entraînement (15)

Approfondissement (5)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Qu'est-ce qu'un variant de boucle ?

Un variant est une quantité qui prouve qu'une boucle s'arrête. Sa justification tient en trois points : c'est un entier ; il est positif tant que la condition de boucle est vraie ; il décroît strictement à chaque tour. Une suite d'entiers positifs strictement décroissante est finie : la boucle fait un nombre fini de tours. Dans une dichotomie entre deb et fin, le variant est fin - deb. Les rapports de jury relèvent que le caractère strict de la décroissance est souvent oublié : une quantité qui peut rester égale ne prouve rien.

Comment rédiger une preuve par invariant de boucle ?

On énonce une propriété II des variables, puis on la prouve en trois temps. Initialisation : II est vraie avant le premier tour. Conservation : si II et la condition de boucle sont vraies au début d'un tour, II est vraie à la fin. Conclusion : en sortie, la condition est fausse et II est vraie, ce qui donne la postcondition. Pour une boucle for sur i, l'invariant parle de l'état au début du tour d'indice i, par exemple « s vaut la somme de t[0..i−1]t[0..i-1] ». Un invariant prouvé mais pas exploité en sortie ne prouve rien.

Quelle différence entre correction partielle et correction totale ?

Un algorithme est partiellement correct si, pour toute entrée qui vérifie sa précondition, le résultat vérifie la postcondition lorsqu'il s'arrête. Il est totalement correct s'il est partiellement correct et s'il termine sur toute entrée qui vérifie la précondition. L'invariant prouve la correction partielle, le variant la terminaison. Un sujet qui écrit « si la fonction se termine » dans une postcondition demande une correction partielle ; la terminaison se prouve à part.

À quoi sert assert en C et en OCaml ?

assert(condition) vérifie, à l'exécution, une propriété qui doit être vraie, le plus souvent une précondition, placée avant l'opération risquée. Si elle est fausse, le programme C s'arrête avec un message qui donne la condition, le fichier et la ligne ; en OCaml, assert lève l'exception Assert_failure. La condition écrite est ce qui doit être vrai, et une assertion ne contient jamais d'effet : compilé avec l'option -DNDEBUG, un programme C n'exécute plus aucune assertion, et ocamlc -noassert les retire en OCaml.

Comment construire un bon jeu de tests ?

On calcule chaque résultat attendu avant d'exécuter, et l'on écrit les tests sous forme d'assertions : un affichage n'est pas un test. On découpe le domaine des entrées en classes (sous, dans et au-dessus d'un intervalle ; tableau vide, d'une case, de plusieurs ; valeur en tête, en queue, absente) et l'on prend un représentant par classe, puis les valeurs limites : chaque borne et sa voisine. On ne teste pas une entrée hors de la précondition. Pour un tri, on vérifie l'ordre et la conservation des valeurs.

Qu'est-ce que la couverture des arcs et des chemins sans cycle ?

Le graphe de flot de contrôle d'une fonction a un sommet par bloc d'instructions et par condition, et un arc par passage possible. Un jeu de tests couvre les sommets s'il exécute chaque instruction, les arcs s'il emprunte chaque branche, y compris la branche « faux » d'un if sans else. Un chemin de l'entrée à la sortie est dit sans cycle quand il parcourt chaque boucle au plus une fois ; couvrir les chemins sans cycle faisables est plus exigeant que couvrir les arcs, qui l'est plus que couvrir les sommets. Certains chemins sont infaisables : aucune entrée ne les suit. Aucune couverture ne prouve l'absence d'erreur.

Comment y accéder

Ce chapitre fait partie des chapitres offerts : il s'ouvre en entier avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet, les tarifs ou une question, écris-nous sur WhatsApp.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France.

Essayer gratuitement Prepa Help

Langage C : types, tableaux, pointeurs, allocation →