programmation
Transcription
programmation
Prépa-Agreg de Math, Tp d’informatique Thibaut Henin 3 mars 2009 Résumé Ce document reprent une liste d’exercices de prṕaration à l’option informatique de l’agreg de mathématique. Ces questions représentent environ 30 minutes de travail et sont indépendantes. 1 Carré Magique Principe : Le but du jeu est de mettre tous les chiffres de 1 à n2 dans un carré n × n pour que la somme des chiffres soit partout la même. – sur les lignes horizontales. – sur les lignes verticales. – sur les lignes diagonales. Problème : Faites un programme qui vérifie si un carré est magique ou pas. Faites un programme qui génére un carré magique n × n. 2 Pivot de Gauss Principe : La méthode du pivot de Gauss est une méthode pour transformer un système en un autre système équivalent (ayant les mêmes solutions) qui est triangulaire et est donc facile à résoudre. Les opérations autorisées pour transformer ce système sont : – échange de deux lignes. – multiplication d’une ligne par un nombre non nul. – addition d’un multiple d’une ligne à une autre ligne. Problème : Faites un programme qui multiplie deux matrices. Faites un programme qui implémente la méthode du pivot de Gauss. 3 Graphes Principe : Un graphe orienté G = (V, E) peut être codé de plusieurs manières. La plus simple est de donner E comme un ensemble d’élément de V × V . Pour des raisons algorithmiques, on préfère associer à chaque sommet une liste d’adjacence, c’est-à-dire une liste contenant tous les sommets vers lesquels pointent les arêtes partant de ce sommet. Enfin, on peut utiliser une matrice d’adjacence : c’est une matrice de dimension |E| × |E| dont l’élément non-diagonal aij est le 1 nombre d’arêtes liant le sommet i au sommet j. L’élément diagonal aii est le nombre de boucles au sommet i. Problème : Faites un programme transformant un graphe codé sous forme de couples d’entiers en un graphe codé sous forme de matrice d’adjacence. Faites un programme qui calcule la fermeture transitive d’un graphe (en utilisant la matrice d’adjacence). Faites un programme qui calcule la distance entre les sommets (en utilisant aussi la matrice d’adjacence). 4 Arbres binaires de recherche Principe Les arbres binaires de recherche sont des arbres binaires étiquetés aux sommets. L’étiquette d ?un sommet x est la clé ou le contenu du sommet, et noté c(x). Si A est un arbre binaire non vide, on note Ag et Ad ses sous-arbres gauche et droit. Pour tout sommet x, on note A(x) le sous-arbre de racine x, et Ag(x), Ad(x) les sous-arbres de A(x). Un arbre binaire de recherche est un arbre muni d ?une fonction clé c sur l ?ensemble de ses sommets vérifiant : c(y) < c(x) < c(z) pour tout sommet x, et pour tous sommets y de Ag(x) et z de Ad(x). Il revient au même de dire que les clés sont croissantes si on les liste dans l ?ordre symétrique. Un arbre binaire A est un arbre AVL si, pour tout sommet de l ?arbre, les hauteurs des sous-arbres gauche et droit diffèrent d ?au plus 1. Questions Faites un programme qui insère un entier dans un arbre binaire de recherche. Faites un programme qui transforme un arbre binaire de recherche en une liste triée d’entiers. Faites une fonction qui détermine si un arbre de recherche est AVL. 5 Expressions entières Principe On considère un sous-ensemble des expressions entières dont la syntaxe est donnée par : expr ::= var | N | expr + expr | expr ∗ expr | (expr) où var est une chaı̂ne de caractères désignant un nom de variable. Questions Ecrivez un évaluateur pour les expressions entières qui ne contiennent pas de variables. Ecrivez un évaluateur auquel on donne en entrée une liste de couples (var, int) donnant la valeur des variables utilisées dans l’expression que l’on veut évaluer. Ecrivez une fonction qui dérive une expression. 6 Jeu de cartes Principe On considère le jeu de belote (sans annonce). J’imagine qu’il n’y a pas besoin de vous expliquer les règles . . . 2 Questions Etant donné d’une main (représenté sous la forme d’une liste de cartes) et d’un tas de cartes déjà jouées, écrivez une fonction qui indique quels sont les coups valides (c.a.d. les cartes jouables dans la main). Faites une fonction qui compte le nombre de points présents dans une listede cartes gagnés, en fonction d’une couleur d’atout. (Simulez une partie aléatoire). 7 Parcours d’arbre Principe On peut décrire les différents parcours d’arbre usuels (parcours en profondeur et en largeur) de la manière suivante : on a une liste de sommets à explorer, qui est vide au début de l’algorithme, qui est rempli au fur et à mesure de l’exploration en ajoutant à chaque fois les fils du noeud courant. A chaque fois qu’on a fini de traiter un noeud, on choisit le premier noeud de la liste comme nouveau noeud courant. Le parcours en profondeur consiste à ajouter les nouveaux noeuds en début de liste, le parcours en largeur consiste à ajouter les nouveaux noeuds en fin de liste. Questions Ecrivez une fonction qui génère un arbre aléatoire de taille n, et dont les noeuds sont étiquetés par des entiers compris entre 1 et n. La forme de l’arbre ainsi que l’etiquetage doit être aléatoire. Ecrivez une fonction, paramétrée par la manière dont on rajoute lesn nouveaux noeuds, qui implante un parcours d’arbre. Testez cette fonction pour les parcours en largeur et profondeur. 3