Exercices Algorithmique et Programmation

Telechargé par odaim
Algorithmique et Programmation - Banque d'exercices
Remarque : jusqu'en 2018, les conventions du langage algorithmique étaient un peu différentes
les tableaux sont dynamiques (la taille n'est pas forcément fixée à la déclaration) et l'opération redim
permet de fixer la taille d'un tableau.
les tableaux et enregistrements sont supposés être toujours passés par référence, les autres
paramètres par valeur.
Thème : algorithmes et complexité
1- Anagramme sans doublon (30 mn - 2009) - Correction
2- Anagramme avec doublon (45 mn - 2009) - Correction
3- Tri à la bretonne (75 mn - 2010) - Correction
4- É limination des doublons (60 mn - 2010) - Correction
5- Tous différents (30 mn - 2011) - Correction
6- Supérieurs (30 mn - 2011) - Correction
7- Découpage de tableau (45 mn - 2012) - Correction
8- Inversion de tableau (30 mn - 2014) - Correction
9- Numération romaine (30 mn -2015) - Correction
10- Racine entière (30 mn - 2016) - Correction
11- Occurences de lettres (45 mn - 2016) - Correction
12- Comparaison de mots (60mn) - Correction
1- Anagramme sans doublon (30 mn)
Un mot est anagramme d'un autre s'ils sont écrits avec les mêmes lettres, par exemple, algorithme et
logarithme, ou imaginer et migraine. On travaille avec des mots stockés dans des tableaux de caractères. On
suppose que ces tableaux sont sans doublon (un caractère n'est présent au plus qu'une fois dans chaque
tableau).
1- Écrire une fonction qui prend en entrée deux tableaux de caractères représentant deux mots et
renvoie vrai si ces mots sont anagrammes l'un de l'autre et faux sinon.
2- Calculer la complexité au pire de la fonction précédente en expliquant quel est le pire cas et en
expliquant les calculs.
2- Anagramme avec doublon (45 mn)
Un mot est anagramme d'un autre s'ils sont écrits avec les mêmes lettres, par exemple, algorithme et
logarithme, ou imaginer et migraine. On travaille avec des mots stockés dans des tableaux de caractères. On
suppose que des doublons peuvent exister dans les tableaux (chaque caractère d'un tableau peut y apparaitre
plusieurs fois). On donne la fonction suivante :
// renvoie le nombre d'occurences de c dans t
fonction avec retour entier occurences(caractere c, caractere[] t)
entier result,i;
debut
result <- 0;
pour (i allant de 0 à t.longueur-1 pas 1) faire
si (t[i] == c) alors
result <- result + 1;
finpour
retourne result;
fin
1- Écrire une fonction qui prend en entrée deux tableaux de caractères représentant deux mots et
renvoie vrai si ces mots sont anagrammes l'un de l'autre et faux sinon.
2- Calculer la complexité en temps au pire de la fonction précédente en expliquant quel est le pire cas et
en expliquant les calculs.
3- Tri à la bretonne (75 mn)
En Bretagne, les crêpes sont faites sur des biligs (sortes de poêles) sans bords, et il est donc difficile de
faire des crêpes toutes de même taille. Mais une fois qu'une pile de crêpes de tailles différentes est prête, il
existe une méthode simple pour trier les crêpes de la plus grande à la plus petite.
Pour placer la plus grande crêpe en dessous de la pile, on glisse la pelle sous la crêpe la plus grande et
on retourne la pile des crêpes qui se trouvent au dessus de la pelle, ce qui place la crêpe la plus grande tout en
haut de la pile. Puis on glisse la pelle sous la crêpe la plus basse et on retourne toute la pile de crêpes, ce qui
place la crêpe la plus grande tout en bas de la pile. Pour trier toute la pile, il suffit de recommencer l'opération
sur le reste de la pile.
Dans cet exercice, le tas de crêpes est représenté par un tableau d'entiers (les entiers peuvent être vus
comme les diamètres des crêpes).
1- Écrire une fonction qui prend en paramètres un tableau d'entiers t et deux entiers i et j, et inverse
l'ordre des éléments dont les indices sont compris entre i et j inclus. Par exemple, appeler la fonction avec t =
[1,3,4,2,7,3], i = 1 et j = 4 conduira à t = [1,7,2,4,3,3]. On peut supposer que i et j sont compris entre 0 et la
longueur de t moins un et que i < j.
2- Écrire une fonction qui prend en paramètres un tableau d'entiers t et un entier i et renvoie l'indice du
plus grand élément parmi ceux d'indices inférieurs ou égal à i.
3- Écrire une fonction qui prend en paramètre un tableau d'entiers t et le trie par la méthode du tri
breton.
4-Donner, en justifiant vos calculs, les complexités des deux premières fonctions, puis celle de la
fonction de tri (on pourra se limiter à la complexité au pire).
4- Élimination des doublons (60 mn)
On veut éliminer les doublons dans des tableaux de caractères.
1- Écrire une fonction qui prend en paramètre un tableau de caractères t, un caractère c et un entier i
supposé compris entre 0 et la longueur du tableau-1, et renvoie vrai si le caractère c apparait dans le tableau t
dans une case d'indice compris entre 0 et i inclus.
2- Écrire une fonction qui prend en paramètre un tableau de caractères t pouvant contenir des doublons
et renvoie un tableau de caractères contenant les mêmes caractères que le premier, mais sans doublon. On
peut utiliser la méthode suivante :
- parcourir une première fois le tableau t pour compter le nombre de caractères différents qu'il contient
(la fonction du 1 peut être utile).
- créer un deuxième tableau t2 de taille égale au nombre de caractères différents contenus dans t.
- parcourir t et remplir t2 avec les caractères contenus dans t, mais sans doublon.
3- Calculer la complexité en temps au pire de la fonction précédente en expliquant quel est le pire cas et
en expliquant les calculs.
5- Tous différents (30 mn)
1- Écrire un algorithme qui prend en paramètre un tableau d'entiers et renvoie vrai si tous les entiers du
tableau sont différents les uns des autres, et faux sinon.
2- Indiquer quel est le pire cas d'exécution de cet algorithme du point de vue du temps d'exécution.
Donner, en justifiant les calculs, la complexité temporelle au pire de cet algorithme.
6- Supérieurs (30 mn)
1- Écrire un algorithme de complexité temporelle logarithmique qui prend en paramètre un tableau
d'entiers supposés tous différents et triés dans l'ordre croissant, et un entier e et renvoie le nombre d'entiers du
tableau supérieurs strictement à e. Par exemple, l'appel de l'algorithme sur le tableau [2,4,7,8,12,45] et sur
l'entier 7 renverra 3.
2- Indiquer quel est le pire cas d'exécution de l'algorithme du point de vue du temps d'exécution. Justifier
la complexité temporelle logarithmique au pire de cet algorithme.
7- Découpage de tableau (45 mn)
1- Écrire une fonction qui prend en paramètre un tableau de caractères t et un entier i et découpe t en
plusieurs tableaux de caractères de taille i. La fonction doit renvoyer un tableau de tableau de caractères
regroupant tous les morceaux générés. Par exemple, si la fonction est appelée sur le tableau
['d','e','c','o','u','p','a','g','e'] et l'entier 3 le résultat sera [['d','e','c'],['o','u','p'],['a','g','e']]. Si la longueur du tableau t
n'est pas un multiple de i, le dernier tableau généré sera complété par des blancs. Par exemple, si la fonction
est appelée sur le tableau ['d','e','c','o','u','p','a','g','e']} et l'entier 2, le résultat sera [['d','e'],['c','o'],['u','p'],['a','g'],['e','
']].
2- Indiquer quel est le paramètre de complexité de cette fonction, et calculer la complexité temporelle de
cette fonction.
8- Inversion de tableau (30 mn)
La fonction ci_dessous inverse l'ordre des éléments d'un tableau de réels. Elle est optimisée pour
n'échanger deux éléments que s'ils sont différents.
fonction sans retour inverse(reel[] t)
reel j; entier i;
début
pour (i allant de 0 à t.longueur/2 pas 1) faire
si (t[i] ≠ t[t.longueur-1-i]) alors
j <- t[i];
t[i] <- t[t.longueur-1-i];
t[t.longueur-1-i] <- j;
finsi
finpour
fin
Donner le paramètre de complexité de la fonction, indiquez le cas échéant s'il existe des cas au mieux et
au pire et calculez la complexité de la fonction (dans les cas au mieux et au pire s'ils existent, dans le cas
général sinon).
9- Numération romaine (30 mn)
On veut réaliser des calculs en chiffres romains. On a déjà une fonction qui traduit chaque chiffre romain
en son équivalent en chiffres arabes :
fonction avec retour entier equivalent(caractère c)
début
si (c = 'I') alors retourne 1; finsi
si (c = 'V') alors retourne 5; finsi
si (c = 'X') alors retourne 10; finsi
si (c = 'L') alors retourne 50; finsi
si (c = 'C') alors retourne 100; finsi
si (c = 'D') alors retourne 500; finsi
si (c = 'M') alors retourne 1000; finsi
retourne 0;
fin
Le principe pour traduire en chiffres arabes un nombre écrit en chiffres romains est le suivant : si le
premier chiffre du nombre romain a une valeur inférieure au deuxième, alors on le soustrait de la valeur de tout
le reste, sinon on l'additionne à la valeur de tout le reste.
1- Écrire une fonction qui prend en paramètre un tableau de caractères représentant un nombre écrit en
chiffres romains et retourne sa valeur entière.
2- Indiquer le paramètre de complexité de la fonction récursive. Indiquer s'il existe des cas au mieux ou
au pire, et calculer la complexité de la fonction dans le cas au pire s'il existe, dans le cas général sinon.
10- Racine entière (30 mn)
1- Écrire une fonction racine qui prend un entier en paramètre et renvoie sa racine carrée entière. La
racine carrée entière d'un entier e est le plus grand nombre entier r tel que r ² e. Par exemple la racine carrée
entière de 3 est 1, la racine carrée entière de 10 est 3.
2- Donnez le paramètre de complexité de la fonction racine. Indiquez le cas échéant s'il existe des cas
au mieux et au pire et calculez la complexité de la fonction (dans le cas au pire s'il existe, dans le cas général
sinon).
11- Occurences de lettres (45 mn)
On veut obtenir le nombre d'occurences de chaque lettre dans un mot donné et afficher ces nombres à
l'écran. On se limite aux lettres minuscules non accentuées. Par exemple, si le mot traité est
anticonstitutionnellement, le programme va afficher :
a : 1 fois
b : 0 fois
c : 1 fois
d : 0 fois
e : 3 fois
...
z : 0 fois
1- Écrire une fonction qui prend en entrée un mot, sous forme d'un tableau de caractères, et qui affiche
le nombre d'occurences de chaque lettre dans le mot (le type caractère est doté de l'opération + qui permet de
passer au caractère suivant. Par exemple 'a'+1 donne 'b', 'b'+1 donne 'c', etc.).
2- Indiquer le paramètre de complexité de la fonction. Indiquez s'il existe des cas au mieux ou au pire, et
calculez la complexité de la fonction dans le cas au pire s'il existe, dans le cas général sinon.
12- Comparaison de mots (60mn)
Le but de cet exercice est d'écrire des fonctions permettant de comparer des mots représentés par des
tableaux de caractères. Par exemple, le mot Bonjour sera représenté par le tableau char[] t
{'B','o','n','j','o','u','r'}. Ces fonctions peuvent entre autres être utilisées pour la recherche de
documents par mots-clés, dans un moteur de recherche par exemple.
1- Écrire une fonction qui prend en paramètres deux tableaux de caractères et renvoie vrai ou faux selon
que le premier est ou non le début du deuxième, c'est-à-dire si le contenu du deuxième est identique au contenu
du premier, mais avec des cases supplémentaires à la fin. Par exemple, l'appel de la fonction sur les tableaux
['c','h','a','t'] et ['c','h','a','t','o','n'] renvoie vrai, et son appel sur les tableaux ['c','h','a','t'] et ['c','h','a','p','i','t','r','e']
renvoie faux.
2- Écrire une fonction qui prend en paramètres deux tableaux de caractères et renvoie l'indice à partir
duquel on trouve les éléments du premier tableau, tels quel, dans le deuxième tableau. La fonction renvoie -1 si
le contenu du premier tableau n'apparaît pas dans le deuxième. Par exemple, l'appel de la fonction sur les
tableaux ['c','h','a','t'] et ['a','c','h','a','t','-','v','e','n','t','e'] renvoie 1, son appel sur les tableaux ['c','h','a','t'] et
['q','u','e','l','b','e','a','u','c','h','a','t'] renvoie 8, et son appel sur les tableaux ['c','h','a','t'] et ['c','h','o','c','o','l','a','t']
renvoie -1.
3- Écrire une fonction qui prend en paramètres deux tableaux de caractères et renvoie -1 si le deuxième
représente un mot plus petit, au sens lexicographique, que le premier, 0 si les 2 tableaux représentent le même
mot, et 1 si le premier représente un mot plus petit, au sens lexicographique, que le deuxième (l'ordre
lexicographique est l'ordre du dictionnaire). Par exemple, l'appel de cette fonction sur les tableaux ['c','h','a','t'] et
['c','h','i','e','n'] renvoie 1, et l'appel de cette fonction sur les tableaux ['c','h','i','e','n'] et ['c','h','a','t'] renvoie -1. On
suppose que les opérateurs <, ≤, > et ≥ existent sur les caractères.
1 / 14 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!