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