Publicité

02 correction-td smi-s3-algo2

Enseignant-chercheur à L’Université Hassan 1er Settat
15 Feb 2022
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
Publicité
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
Publicité
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
Publicité
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
Publicité
02 correction-td smi-s3-algo2
Prochain SlideShare
01 correction-td smia-s2-info201 correction-td smia-s2-info2
Chargement dans ... 3
1 sur 20
Publicité

Contenu connexe

Publicité

Dernier(20)

Publicité

02 correction-td smi-s3-algo2

  1. 1 / 20 Introduction à l’algorithmique Travaux dirigés (TD) Correction Youssouf EL ALLIOUI p y.elallioui@usms.ma Série 1 FONCTIONS ET PROCEDURES Exercice 5. 1. Ecrire une fonction distance ayant comme paramètres 4 rèels 𝑥𝑎, 𝑦𝑎, 𝑥𝑏 𝑒𝑡 𝑦𝑏 qui représentent les coordonnées de deux points 𝐴 et 𝐵 et qui renvoie la distance 𝐴𝐵. Tester cette fonction. Solution Fonction distance (xa:Rèel, xb:Rèel, ya:Rèel, yb:Rèel) : Rèel Var AB : Rèel Début AB ← sqrt ((xa - xb)2 + (ya - yb)2 ) distance ← AB Fin Tester cette fonction : Algo test Var xa, ya : Rèel Var xb, yb : Rèel Var distanceAB : Rèel Début Ecrire ("Entrer les cordonnées du point A : ") Lire (xa, ya) Ecrire ("Entrer les cordonnées de point B : ") Lire (xb, yb) distanceAB ← distance (xa, xb, ya, yb) Ecrire ("AB = ", distanceAB) Fin 2020
  2. 2 / 20 Exercice 5. 2. Ecrire une fonction 𝑓 ayant en paramètre un entier et qui renvoie un booléen : 𝑂𝑈𝐼 si l'entier est premier 𝑁𝑂𝑁 sinon. Tester cette fonction. Solution Fonction f (N : Entier) : Booleen Var estPremier : Booleen Var i : Entier Début estPremier ← Faux Pour i ← 1 A N Faire Si (N % i = 0) Alors estPremier ← Vrai f ← estPremier Fin Si Fin Pour f ← estPremier Fin Tester cette fonction : Algo test Var N : Entier Début Ecrire ("Entrer un nombre entier : ") Lire (N) Si (f(N)) Alors Ecrire (N, " est premier") Sinon Ecrire (N, " n’est pas premier") Fin Si Fin Exercice 5. 3. Ecrire une fonction 𝑠𝑤𝑎𝑝 ayant en paramètres 2 entiers a et b et qui échange les contenus de 𝑎 et de 𝑏. Tester cette fonction. Solution Procedure swap (A : Entier, B : Entier) Var C : Entier Début C ← A A ← B B ← C Fin
  3. 3 / 20 Tester cette fonction : Algo test Var A, B : Entier Début Ecrire ("Entrer le premier nombre : ") Lire (A) Ecrire ("Entrer le dexième nombre : ") Lire (B) swap (A, B) Ecrire ("A : ", A) Ecrire ("B : ", B) Fin Exercice 5. 4. Etablir une fonction 𝑟é𝑠𝑜𝑢𝑑𝑟𝑒 permettant de calculer les solutions de l'équation : (𝑬) : 𝒂𝒙𝟐 + 𝒃𝒙 + 𝒄 = 𝟎 𝒂, 𝒃 𝑒𝑡 𝒄 sont des réels Cette fonction aura comme paramètres 𝒂, 𝒃 et 𝒄. On prendra garde à bien tester tous les cas possibles : • 𝑎 est nul, et l'équation est en fait une équation du premier degré. Exemple : 4𝑥 − 2 = 0 donne une unique solution 𝑥 = 0.5. • Le discriminant 𝛥 = (𝑏" − 4 ∗ 𝑎 ∗ 𝑐) est nul, et il n'y a qu'une seule solution, appelée racine double, au problème. Exemple : 2𝑥² + 4𝑥 + 2 = 0 donne 𝑥 = −1. • Le discriminant 𝛥 est positif, et deux solutions existent : 𝑥# = $%$√' "∗) et 𝑥" = $%*√' "∗) . Exemple : 2𝑥² + 𝑥 − 6 = 0 donne 𝑥# = 1.5 et 𝑥" = −2. • Le discriminant 𝛥 est négatif, et il n'existe pas de solutions (réelles) au problème. Exercice 5. 5. Écrire les actions paramètres (procédure ou fonction) permettant de résoudre les problèmes suivants : 1) Calcul de la somme de deux nombres entiers. 2) Calcul de la factorielle de N (N !). 3) Vérifier si un nombre entier A divise un nombre entier B. 4) Calcul du quotient et du reste de la division entière de deux nombres entiers A et B. 5) Vérifier si un caractère donné est une voyelle (voyelles : 'a', 'e', 'i', 'o', 'u', 'y'). 6) Permet de permuter le contenu de deux variables rèelles. 7) Étant donné un entier A, calcule sa valeur absolue.
  4. 4 / 20 Solution 1) Calcul de la somme de deux nombres entiers. Fonction somme (x : Entier, y : Entier) : Entier Début somme ← x + y Fin 2) Calcul de la factorielle de N (N !). Fonction factorielle (x : Entier) : Entier Var i, fact : Entier Début Fact ← 1 Pour i ← 1 A x Faire fact ← fact * i Fin Pour factorielle ← fact Fin 3) Vérifier si un nombre entier A divise un nombre entier B. Fonction divise (A : Entier, B : Entier) : booleen Début divise ← Faux Si (B mod A = 0) Alors divise ← vrai Fin Si Fin 4) Calcul du quotient et du reste de la division entière de deux nombres entiers A et B. Procedure quotientDuReste (A : Entier, B : Entier) Var Q, R : Entier Début Q ← 0 R ← 0 Tantque (R>=B) faire R ← R mod B Q ← Q + 1 Fin Tantque Fin 5) Vérifier si un caractère donné est une voyelle (voyelles : 'a', 'e', 'i', 'o', 'u', 'y'). Fonction voyelle (c : Caractère) : Booleen
  5. 5 / 20 Var estVoyelle : Booleen Début estBooleen ← Faux Si (c = 'a' OU c = 'e' OU c = 'i' OU c = 'o' OU c = 'u' OU c = 'y') Alors estBooleen ← Vrai Fin Si voyelle ← estBooleen Fin 6) Permet de permuter le contenu de deux variables réelles. Procedure permuter (A : Entier, B : Entier) Var C : Entier Début C ← A A ← B B ← C Fin 7) Étant donné un entier A, calcule sa valeur absolue. Fonction valeurAbsolue (A : Entier) : Entier Début Si (A < 0) Alors valeurAbsolue ← -A Fin Si valeurAbsolue ← A Fin
  6. 6 / 20 Introduction à l’algorithmique Travaux dirigés (TD) Correction Youssouf EL ALLIOUI p y.elallioui@usms.ma Série 2 LA RÉCURSIVITÉ Exercice 2. 1 Écrire les actions paramètres (procédure ou fonction) permettant de calculer la factorielle d’un entier N (N !). Tester cette fonction. Solution : Fonction factorielle (x : Entier) : Entier Var i, fact : Entier Début If (N = 0 OU N = 1) Alors factorielle ← 1 Sinon factorielle ← N * factorielle (N-1) Fin Si Fin Tester cette fonction : Algo test Var N : Entier Début Ecrire ("Entrer un nombre entier : ") Lire (N) Ecrire (N, " ! = ", factorielle (N)) Fin Exercice 2. 2 Expliquez les fonctionnalités des fonctions suivantes 2020
  7. 7 / 20 Fonction fct1 (x : Entier, y : Entier) : Entier Début Si (x = 0) Alors fct1 ← y Sinon fct1 ← fct1 (x-1, x+y) Fin Si Fin Solution : La fonction fct1() calcule et retourne ((1 + 2 ... + x-1 + x) +y) qui est (x(x+1)/2) + y. Par exemple, si x est 5 et y est 2, alors fct1 devrait retourner 15 + 2 = 17. Exercice 2. 3 Expliquez les fonctionnalités des fonctions suivantes Fonction fct2 (n : Entier) : Entier Début Si (n = 1) Alors Fct2 ← 0 Sinon Fct2 ← 1 + fct2 (n/2) Fin Si Fin Solution : La fonction calcule et renvoie le plus grand entier inférieur ou égal à log2(n). Par exemple, si n est entre 8 et 15, fct2() renvoie 3. Si n est entre 16 et 31 alors fct2() renvoie 4. Exercice 2. 4 Expliquez les fonctionnalités des fonctions suivantes Procédure fct3 (n : Entier) Début Si (n = 0) Alors retourne Fin Si Fct3 (n/2) Écrire (n%2) Fin Solution : La fonction fct3() affiche l'équivalent binaire d'un nombre n.Par exemple, si n est 21, alors fct3() affiche 10101. Exercice 2. 5
  8. 8 / 20 Expliquez les fonctionnalités des fonctions suivantes Fonction fct4 (tab[] : Entier, n : Entier) : Entier Début x ← -1 Si (n = 1) Alors fct4 ← tab [0] Sinon x ← fct4 (tab, n-1) Fin Si Si (x > tab[n-1]) Alors fct4 ← x Sinon fct4 ← tab[n-1] Fin Si Fin Solution : fct4() renvoie la valeur maximale dans le tableau d'entrée tab[] de taille n. Exercice 2. 6 Expliquez les fonctionnalités des fonctions suivantes Fonction fct5 (a : Entier, b : Entier) : Entier Début Si (b = 0) Alors fct5 ← 1 Fin Si Si (b mod 2 = 0) Alors fct5 ← fct5(a*a, b/2) Fin Si fct5 ← fct5(a*a, b/2) * 2 Fin Solution : fct5() renvoie ab Exercice 2. 7 On souhaite écrire une fonction récursive qui calcule le carré d'un entier. Pour trouver un lien entre 𝑐𝑎𝑟𝑟𝑒(𝑛) et 𝑐𝑎𝑟𝑟𝑒(𝑛 − 1), on utilise la formule donnée en énoncé : (𝑛 + 1)" = 𝑛" + 2𝑛 + 1. En changeant 𝑛 en 𝑛 − 1, la formule se réécrit 𝑛" = (𝑛 − 1)" + 2(𝑛 − 1) + 1 d'où 𝑐𝑎𝑟𝑟𝑒(𝑛) = 𝑐𝑎𝑟𝑟𝑒(𝑛−) + 2 ∗ 𝑛 − 1. Dans le cas où 𝑛 est un entier négatif, on utilise le fait que (−𝑛)" = 𝑛" . On se ramène ainsi au cas où n est un entier positif. Les appels récursifs successifs nous mènent au cas de base : si 𝑛 = 0, alors 𝑐𝑎𝑟𝑟𝑒(𝑛) = 0.
  9. 9 / 20 Solution : Fonction carré (n : Entier) : Entier Début Si (n = 0) Alors carré ← 0 Fin Si Sinon Si (n < 0) Alors carré ← carré (-n) Sinon carré ← carré (n-1) + 2*n - 1 Fin Si Fin Exercice 2. 8 On veut écrire une fonction récursive qui calcule la somme de 1 à un entier 𝑛 : 1 + 2 + 3 +· · · +(𝑛 − 1) + 𝑛. On remarque que si on connaît 𝑠𝑜𝑚𝑚𝑒_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1), alors pour avoir 𝑠𝑜𝑚𝑚𝑒_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑓(𝑛) il suffit d'ajouter n au résultat précédent. On prend comme convention que si 𝑛 < 1, alors la somme est nulle. Le cas de base est celui où n vaut 1, et dans ce cas la somme vaut 1. Solution : De l'explication précédente on déduit : Fonction somme_recursive (n : Entier) : Entier Début Si (n < 0) Alors somme_recursive ← 0 Fin Si Sinon Si (n = 1) Alors somme_recursive ← 1 Sinon somme_recursive ← somme_recursive (n-1) + n Fin Si Fin Exercice 2. 9 Ecrire une fonction récursive qui calcule le produit de 1 à un entier 𝑛 : 1 ∗ 2 ∗ 3 ∗ · · · ∗ (𝑛 − 1 ∗ 𝑛. On remarque que si on connaît 𝑝𝑟𝑜𝑑𝑢𝑖𝑡_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1), alors 𝑝𝑟𝑜𝑑𝑢𝑖𝑡+,-.+/01(3) = 𝑛 ∗ 𝑝𝑟𝑜𝑑𝑢𝑖𝑡_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1). On prend comme convention que si 𝑛 < 1, alors le produit est nulle. Le cas de base est celui où n vaut 1 ou 0, et dans ce cas le produit vaut respectivement 1 et 0. Solution : De l'explication précédente on déduit : Fonction produit_recursive (n : Entier) : Entier Début
  10. 10 / 20 Si (n <= 0) Alors produit_recursive ← 0 Fin Si Sinon Si (n = 1) Alors produit_recursive ← 1 Sinon produit_recursive ← n * produit_recursive (n-1) Fin Si Fin
  11. 11 / 20 Introduction à l’algorithmique Travaux dirigés (TD) Correction Youssouf EL ALLIOUI p y.elallioui@usms.ma Série 3 LES FICHIERS Exercice 3. 1 Soit le fichier NOMBRES.BIN qui contient une liste de nombres entiers. Écrire un algorithme qui affiche les nombres du fichier, leur somme et leur moyenne. Solution : Algorithme Nombre Var F : Fichier d’entier Var X, S, Nb : Entier Var M : Réel Début Assigner(F,’NOMBRES.BIN’) Relire(F) Nb ← 0 S ← 0 Tantque Non FDF(F) Faire Lire(F,X) ; // Lire un élément du fichier Ecrire(X) ; // affichage à l’écran S ← S+X Nb ← Nb+1 Fin Tanque Si Nb≠0 Alors M ← S/Nb Ecrire(‘Somme des éléments =’,S,’ Moyenne=’,M) Sinon Ecrire(‘Fichier vide’) Fin Si Fermer(F) Fin Exercice 3. 2 Écrire un algorithme qui crée le fichier MOTS.TXT contenant une série de mots (longueur maximale d'un mot: 20 caractères). La saisie des mots se terminera à l'introduction du symbole '*' qui ne sera pas écrit dans le fichier. 2020
  12. 12 / 20 Écrire un algorithme qui affiche le nombre de mots ainsi que la longueur moyenne des mots contenus dans le fichier MOTS.TXT. 3- Écrire un algorithme qui crée un deuxième fichier MOTS10.TXT contenant les mots du fichier MOTS.TXT de plus de 10 caractères. Solution : Algorithme TraiteMot; Var F,G :Fichier de chaine[20] ; Var X : Chaine[20] ; Var Nb : Entier Var M : Réel Début /*question 1 Assigner(F,’MOTS.TXT’) ; Reecrire(F) ; /*ouvrir F en écriture Ecrire(‘Donner une suite de mots. Introduire le mot ‘*’ pour arrêter la saisie’) ; Lire(X) ; /*Lire le premier mot à l’extérieur de la boucle Tantque X≠’*’ Faire Ecrire(F,X) ; Lire(X) ; /*Lire le mot suivant Fait ; Fermer(F) ; /*question 2 Nb←0 ; M←0 ; /*on peut utiliser M pour la somme des longueurs puis pour la moyenne Relire(F) /*ouvrire F en lecture Tantque Non FDF(F) Faire Lire(F,X) ; /*Lire un élément du fichier M←M+Taille(X) ; Nb←Nb+1 ; Fait ; Si Nb≠0 Alors M←M/Nb ; Ecrire(‘Nombre de mots =’,Nb,’ Longueur Moyenne=’,M) Sinon Ecrire(‘Fichier vide’) Fsi ; Fermer(F) ; /*question 3 Assigner(G,’MOTS10.TXT’) ; Reecrire(G) ; Relire(F) /*ouvrir G en écriture et F en lecture Tantque Non FDF(F) Faire Lire(F,X) ; /*Lire un élément du fichier Si Taille(X)>10 Alors Ecrire(G,X) Fsi ; Fait ; Fermer(F) ;
  13. 13 / 20 Fermer(G) ; Fin Exercice 3. 3 Considérons le type enregistrement suivant : Type Étudiant = Enregistrement Matricule : Entier ; Nom, Prénom : Chaine [20] ; Moyenne : Réel ; Fin; Soit T un tableau d’au plus 100 étudiants. Écrire un algorithme permettant de recopier tous les étudiants admis appartenant à T dans un fichier ADMIS de type étudiant. Un étudiant est admis si sa moyenne est supérieure ou égale 10. Solution : Algorithme Étude Type Étudiant = Enregistrement Matricule : entier Nom, Prénom : chaine [20] ; Moyenne : réel Fin Var T : Tableau[1..100] de Étudiant Var F : Fichier de Étudiant Var X : Étudiant Var I,N : Entier ; Debut Ecrire(‘Donner le nombre d’’etudiants’) ; /*lecture des éléments du tableau Repeter Lire(N) Jusqu’à N>0 et N≤100 Pour I←1 à N Faire Avec X Faire Lire(Matricule) Lire(Nom,Prenom) Lire(Moyenne) Fait T[I]←X ; /*On peut utiliser directement T[I] et on évite l’affectation ( en bleu ) Avec T[I] Faire Lire(Matricule)
  14. 14 / 20 Lire(Nom,Prenom) Lire(Moyenne) Fait Fait /*création du fichier des admis Assigner(F,’ADMIS’) Reecrire(F) Pour I←1 à N Faire Si T[I].Moyenne)≥10 Alors Ecrire(F,T[I]) Fsi; /*même remarque, on peut utiliser un enregistrement X X←T[I] Si X.Moyenne)≥10 Alors Ecrire(F,X) Fsi Fait Fermer(F) Fin Exercice 3. 4 Soient les enregistrements suivants : Type TDate = Enregistrement Jour, mois, année : entier ; Fin Type TDiscipline = Enregistrement Discipline : chaine [10] ; Faculté : chaine [20] ; Fin; Type TEtudiant = Enregistrement Nom, prénom : chaine [20] ; DateN : TDate ; Filière : TDiscipline ; Fin; Soit FEtudiant un fichier d’étudiants. Écrire un algorithme qui permet de : - Remplir le fichier FEtudiant. - Éclater le fichier FEtudiant en deux fichiers, F1 (étudiants de la faculté ‘FEI’) et F2 (étudiants des autres facultés). Solution :
  15. 15 / 20 Algorithme Eclate Type TDate = Enregistrement Jour, mois, année : entier ; Fin Type TDiscipline = Enregistrement Discipline : chaine [10] ; Faculté : chaine [20] ; Fin; Type TEtudiant = Enregistrement Nom, prénom : chaine [20] ; DateN : TDate ; Filière : TDiscipline ; Fin; Var Étudiant : TEtudiant ; Var F, F1, F2 : Fuchier de TEtudiant ; Var FEI, Autre : Booléen ; Debut Assigner(F,’FEtudiant’) ; Réecrire(F) ; Avec Etudiant, Etudiant.DateN, Etudiant.Filiere Faire Ecrire(‘Nom :’) ; Lire(Nom) ; /*Lire 1er nom à l’extérieur de la boucle Tantque Nom<>’’ Faire Ecrire(‘Prénom :’) ; Lire(prenom) ; Ecrire(‘Date de naissance :’) ; Lire(Jour,mois,Annee) ; Ecrire(‘Discipline, Faculté :’) ; Lire(Discipline, Faculté) ; Ecrire(F,Etudiant) ; Ecrire(‘Nom :’) ; Lire(Nom) ; /*Lire le nom suivant Fait ; Fait ; Fermer(F) ; Relire(F) ; /*Pour éviter de créer des fichiers vides, on peut utiliser ces 2 indicateurs booléens, dans ce Cas /*l’assignation et la création ne se font que si nous trouvons un élément, après on remet le booléen à /*vrai pour ne pas refaire ces opérations /*CETTE OPERATION N’EST PAS OBLIGATOIRE MAIS MIEUX LA SAVOIR FEI ←Faux ; Autre ←Faux ; /*Si on n’utilise pas ces booléens, on doit assigner et ouvrir les 2 fichiers en écriture à ce niveau
  16. 16 / 20 Assigner(F1,’FFEI’) ; Réecrire(F1) ; Assigner(F2,’FAutrer’); Réecrire(F2); Si FDF(F) Alors Ecrire(‘Fichier vide’) Sinon Tantque Non FDF(F) Faire Lire(F,Etudiant) ; Avec Etudiant.Filiere Faire Si Faculté =’FEI’ Alors Si Non FEI Alors Assigner(F1,’FFEI’) ; Réecrire(F1) ; FEI ←Vrai Fsi ; Ecrire(F1,Etudiant) ; Sinon Si Non Autre Alors Assigner(F2,’FAutrer’); Réecrire(F2); Autre←Vrai Fsi ; Ecrire(F2,Etudiant) ; Fsi ; Fait ; Fait ; Fermer(F) ; Si FEI Alors Fermer(F1) Fsi ; Si Autre Alors Fermer(F2) Fsi ; Fsi ; Fin. Exercice 3. 5 1) Soient F1 et F2 deux fichiers d’entiers strictement positifs et sans répétition. Écrire un algorithme qui construit (crée) un fichier G d’entiers tel que G contient pour chaque valeur de F1 la valeur et tous ses multiples appartenant à F2 (F1 et F2 sont supposés existants). Exemple : F1 : 3 10 20 17 F2 : 3 6 19 60 40 30 G : 3 3 6 60 30 10 60 40 30 20 60 40 17 2) Écrire un algorithme qui permet à partir du fichier résultat (G) de générer un autre fichier (H) contenant toutes les valeurs du fichier (G) (sans répétition) avec leur nombre. Exemple : H : 3 2 6 1 60 3 30 2 10 1 40 2 20 1 17 1
  17. 17 / 20 Solution : 1) 1)
  18. 18 / 20 Exercice 3. 6 Soit F un fichier d’entiers représentant des séquences de nombres séparées par un ou plusieurs zéro. Écrire un algorithme qui réalise les traitements suivants : 1) A partir de F (fichier existant), crée un fichier G contenant pour chaque séquence, la moyenne des nombres qui la constituent. 2) 2- Puis, Supprimer les valeurs nulles du fichier G. Exemple : F : 0 0 1 4 3 7 0 0 0 6 -9 2 7 -6 0 -10 3 0 0 G : 3,75 0,00 -3,50 Avant suppression G : 3,75 -3,50 Après suppression Solution :
  19. 19 / 20
  20. 20 / 20 Introduction à l’algorithmique Travaux dirigés (TD) Correction Youssouf EL ALLIOUI p y.elallioui@usms.ma Série 4 LA COMPLEXITÉ ALGORITHMIQUE 2020
Publicité