Académique Documents
Professionnel Documents
Culture Documents
Exercices de
et d'algorithmique.
Partie 2.
2 Tableaux multidimensionnels 7
2.1 Transposition d'une matrice carrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Initialisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Recherche des points-col d'une matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Carrés magiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Jeu du mémory (d'après E. Desseree) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Autour des carrés k-valides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Tri de tableaux 11
3.1 Le tri bulle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Le tri sélectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 Tri par comptage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 Structures 13
4.1 Nombres rationnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 Gestion des voitures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5 Fonctions récursives 15
5.1 Puissance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2 Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.3 Factorielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.4 Fonction d'Ackerman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.5 Achage d'entiers (cf. C. David) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6 Pointeurs 17
6.1 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.3 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.4 Echange de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.5 Passage de paramètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.6 Passage par adresse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Chapitre 1
Chaînes de caractères
1.1 Achage vertical
Ecrire une procédure appelée verticale qui reçoit en entrée une chaîne de caractères et qui ache les
caractères de cette chaîne à raison d'un caractère par ligne (d'où le nom de verticale). Le marqueur de
n de chaîne n'est pas aché.
Dans les exercices 1.2 à 1.4, nous proposons de réécrire les fonctions de la librairie "cstring" les plus
courantes et les plus signicatives suivantes :
La comparaison au sens lexicographique consiste à comparer les chaînes caractère par caractère en
appliquant l'ordre alphabétique.
1.5 Palindrome
Un mot est un palindrome s'il est symétrique par rapport à son milieu, par exemple les mots RADAR
, LAVAL , etc. Ecrire une fonction booléenne appelée bool palindrome(char mot[]) qui retourne
vrai si la chaîne mot est un palindrome et faux sinon. La casse des caractères est à prendre en compte
("LAVaL" n'est pas un palindrome car 'a' est diérent de 'A').
1.6 Nombre de e
Ecrire un algorithme qui compte le nombre de 'e' (majuscules et minuscules confondues) contenus dans
une chaîne lue au clavier.
1.9 Cryptage
Ecrire un programme qui transforme une chaîne de caractères ainsi : pour chaque lettre,
si la lettre est une voyelle, la remplace par un _
si c'est une consonne, la remplace par la lettre située deux lettres plus loin (y est remplacé par
' ', z par a, etc.)
si c'est un espace, termine la chaîne de caractères
Chapitre 2
Tableaux multidimensionnels
2.1 Transposition d'une matrice carrée
La transposition d'une matrice carrée consiste à intervertir les éléments tab[i][j] et tab[j][i].
Ecrire la procédure void Transpose(float m[10][10]) qui permet la transposition d'une matrice
carrée de taille 10.
2.2 Initialisations
Dans cet exercice on considère un tableau 8 ∗ 8 d'entiers prédaclaré : int tab[8][8]. Vous pourrez
être amenés à utiliser la fonction int abs(int n) de la librairie cmath, et calculant la valeur absolue
d'un entier relatif passé en paramètre.
initialiser ce tableau comme une matrice identité (càd avec des 1 sur la diagonale principale et
des 0 ailleurs) et l'acher.
l'initialiser comme une matrice "identité-sym", qui n'a que des 0 et des 1, où les 1 sont portés
par l'autre diagonale.
l'initialiser comme une matrice 3-identité dont seules les 3 diagonales principales ont des 1.
l'initialiser avec des 0 et des 1, comme un échiquier
l'initialiser avec des diagonales de 0, des diagonales de 1, des diagonales de 2, . . . comme dans
le dessin ci-dessous :
0 1 2 3 4 5 6 7
1 0 1 2 3 4 5 6
2 1 0 1 2 3 4 5
3 2 1 0 1 2 3 4
4 3 2 1 0 1 2 3
5 4 3 2 1 0 1 2
6 5 4 3 2 1 0 1
7 6 5 4 3 2 1 0
En déduire un programme qui ache l'ensemble des carrés magiques 3*3. Vérier que ces carrés
magiques sont tous équivalents aux symétries ou rotations près.
1. Déclarez un tableau de taille T AILLE × T AILLE × 26 destiné à contenir les mots, où T AILLE
sera considéré comme une constante paire pour que le nombre de cases dans la grille soit pair
aussi. La troisième dimension (26) correspond à la longueur maximum d'un mot dans notre
langue.
2. Écrivez une fonction qui initialise un tableau T AILLE × T AILLE × 26 avec la chaîne "***" par
défaut dans chaque case.
3. Écrivez une fonction qui demande à l'utilisateur T AILLE 2 /2 chaînes de caractères qui seront
insérées aléatoirement dans la grille de jeu. Attention de bien vérier que la case sélectionnée est
vide avant d'insérer le mot.
4. Écrivez une fonction "Jouer" qui demande au joueur de choisir 2 cases, ache le contenu de ces
2 cases, et retourne un booléen indiquant si les deux cases ont le même contenu.
5. Simulez une partie jusqu'à ce que toutes les paires aient été trouvées. Le score de la partie est le
nombre d'essais du joueur, calculez-le.
Chapitre 3
Tri de tableaux
On cherche à trier les éléments d'un tableau selon l'ordre croissant. Pour cela, on dispose de plusieurs
méthodes. En voici quelques-unes.
constante), appelée M AX . Pour chaque entier compris donc entre 1 et M AX , on compte le nombre
d'apparitions dans A que l'on stocke dans un tableau B (de taille M AX ). Par exemple, si la valeur
i apparaît k fois dans A, on fait B[i] = k . On parcourt ensuite le tableau B pour restituer un 3ème
tableau C trié.
Chapitre 4
Structures
4.1 Nombres rationnels
Dans cet exercice, on va chercher à dénir le type rationnel, an de décrire les nombres de la forme
p/q , avec p et q entiers. On n'impose aucune contrainte sur les valeurs p et q , ce qui fait qu'un même
nombre pourra avoir plusieurs écritures.
1. A l'aide d'une structure, dénir le type rationnel composé des champs numerateur et denominateur.
2. Ecrire la fonction void construireRationnel(rationnel& r, int n,int d) qui construit le
rationnel n/d passé en paramètre.
3. Ecrire la fonction void afficheRationnel(rationnel& r) qui ache le rationnel r sous la forme
n/d. Vous noterez que pour éviter les copies de structures, on pourra les passer en référence même
si le paramètre n'est pas modié par la fonction.
4. Ecrire une fonction inverse qui inverse la valeur d'un rationnel passé en paramètre.
5. Ecrire la fonction bool estEgal(rationnel& r1,rationnel& r2) qui retourne VRAI si r1 et r2
sont égaux, et FAUX sinon.
6. Ecrire une fonction bool estIrreductible(rationnel& r) qui indique si r est écrit sous sa
forme irréductible ou non (càd qu'on ne peut pas simplier le rapport n/d).
7. Ecrire un programme principal qui initialise aléatoirement un tableau de 100 rationnels puis les
ache.
Pour sauvegarder les diérentes données, il est prévu d'utiliser diérents tableaux. Le tableau T proprio[M AX]
contiendra l'ensemble des propriétaires, et le tableau T voitures[M AX] contiendra l'ensemble des voi-
tures. Ces tableaux sont déclarés (dans l'algorithme principal) avec une taille maximale (M AX ).
Proprietaire Tproprio[MAX];
Voiture Tvoitures[MAX];
An de savoir combien de données sont déjà saisies dans les tableaux, deux variables de type entier
sont utilisées : N proprio et N voitures.
5. Créer une fonction qui ajoute une nouvelle voiture dans le tableau, en demandant à l'utili-
sateur au clavier toutes les infos nécessaires. Le prototype de cette fonction sera de la forme
void ajoutVoiture(Voiture t[], int& N), où t est le taleau de voitures, et N le nombre de
voitures déjà présentes.
An de faire le lien entre un propriétaire et une voiture, on crée la structure suivante :
struct CarteGrise{
Proprietaire *proprio;
Voiture *auto;
};
Un tableau contenant toutes les cartes grises est alors créé (dans l'algorithme principal) comme suit :
CarteGrise Tcg[MAX];
Et un entier N cg est également déclaré indiquant combien de cartes grises sont déjà saisies dans le
tableau.
6. Créer une fonction qui lie dans le tableau T cg , un propriétaire et une voiture. Cette procédure
reçoit en paramètre les 3 tableaux, le nombre de cartes grises déjà rentrées, ainsi que les indices
du propriétaire et de la voiture à ajouter dans le tableau T cg .
7. Ecrire une procédure qui ache le nom de tous les propriétaires ayant une voiture dans un
département donné. La procédure recevra en paramètre le tableau et le nombre de cartes grises,
ainsi que le numéro du département choisi. Si un propriétaire possède plusieurs voiture dans ce
département, il pourra apparaître plusieurs fois dans la liste.
8. On souhaite connaître tous les propriétaires possédant au moins 2 voitures. Ecrire une procédure
qui ache le nom de ces propriétaires (le nom d'un propriétaire ne doit apparaître qu'une seule
fois).
Chapitre 5
Fonctions récursives
Une fonction récursive est une fonction qui contient un ou plusieurs appels à elle-même dans sa déni-
tion.
5.1 Puissance
Ecrivez une fonction int puissance(int n, int p) qui retourne la valeur de np , sans utiliser de
boucle for ni while. Pour cela, une façon de faire est d'utiliser la dénition récurrente de la fonction
puissance, c'est à dire : np = n ∗ np−1 . Faites attention à la condition d'arrêt, c'est à dire que votre
fonction ne doit pas être appelée indéniment.
5.2 Fibonacci
Ecrivez une fonction int fibo(int n) qui retourne le neme terme de la suite de Fibonnacci, sans
utiliser de boucle for ni while. Pour cela, une façon de faire est d'utiliser la dénition récurrente de le
suite de Fibonnacci :
Fn+2 = Fn+1 + Fn
F1 = 1
F0 = 1
Si vous appelez cette fonction pour n = 4, càd vous appelez f ibo(4), combien de fois la fonction est-elle
appelée au total ? Vous pouvez faire un arbre des appels pour vous simplier le calcul.
5.3 Factorielle
Même question que 5.2 pour la fonction factorielle. Pour rappel, n! = n × (n − 1) × . . . × 2.
A(0, p) = p + 1
A(n, 0) = A(n − 1, 1)
A(n, p) = A(n − 1, A(n, p − 1))
Ecrire une fonction récursive qui calcule cette fonction pour tout n et tout p entiers positifs. Expliquer
pourquoi votre fonction se termine. Que vaut A(1, 1) ? Faites un arbre des appels pour valider votre
réponse. Même question pour A(2, 1) ? Combien de fois la fonction est-elle appelée lors du calcul de
A(2, 1) ? Pensez-vous que votre fonction peut être optimisée ?
Chapitre 6
Pointeurs
6.1 Exercice
int A[]={12, 23, 34, 45, 56, 67, 78, 89, 90};
char *C;
float F;
float* pF;
F=3.2;
pF=&F;
Dans le code ci-dessus, à quels types sont homogènes les valeurs/variables suivantes :
a) pF
b) &F
c) *C
d) A
e) *A
f) &pF
g) *&F
6.2 Exercice
Soit P un pointeur qui pointe sur un tableau A :
int A[]={12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresses fournissent ces expressions :
a) *P+2
b) *(P+2)
c) P+1
d) A[4]-3
e) A+3
f) A[7]-P
g) P+(*P-10)
h) *(P+*(P+8)-A[7])
6.3 Exercice
int a=1,b=2,c=3;
int *p1,*p2;
On considère les déclarations ci-dessus. Après chacune des instructions qui suit, complétez le tableau
pour dire ce que vaut chacune des cinq variables :
a b c p1 p2
p1=&a
p2=&c
*p1=(*p2)++
p1=p2
p2=&b
*p1-=*p2
++*p2
*p1*=*p2
a=++*p2**p1
p1=&a
*P2=*P1/=*P2