Advertisement
Guest User

Untitled

a guest
Apr 13th, 2019
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 5.12 KB | None | 0 0
  1. with Ada.Text_IO;
  2.  
  3. procedure Pierre is
  4. --  Je vais commencer par traiter la version récursive
  5.  
  6. --  ###############################VOTRE CODE##################################
  7. --  function Palindrome(Mot : in String(Mot'First..Mot'Last)) return Boolean is
  8. --  ###############################VOTRE CODE##################################
  9.  
  10. --  Ici, vous n'avez pas besoin de contraindre le type String. En fait, on se fout de la taille qu'il
  11. --  fait étant donné qu'on va le traiter indépendamment de cette information. De plus, la syntaxe que
  12. --  vous utilisez ici est une tautologie, vous dites en gros : tu vas recevoir une chaîne de caractères
  13. --  dont la qui commence à son premier caractère et fini à son dernier caractère. Ada ne saura pas vraiment
  14. --  quoi faire de cette information, et va donc râler avec une insulte du genre :
  15. --  pierre.adb:20:44: constraint not allowed here
  16. --  Pour éviter ca, on va l'écrire comme ça, tout simplement  (au passage, on peut se passer du in étant donné
  17. --  qu'il s'agit d'une fonction, elle n'est donc pas susceptible de modifier Mot) :
  18.     function Palindrome(Mot : String) return Boolean is
  19.     Trouver : Boolean;
  20.     begin
  21.         --##############VOTRE CODE##################
  22.         --if Mot'Length /= 0 or Mot'Length /= 1 then
  23.         --##############VOTRE CODE##################
  24.  
  25.         -- Attention, ici vous avez inversé la logique du test : le cas trivial
  26.         -- est celui où il reste un mot de longueur 0 ou 1, ici vous dites "si il
  27.         -- y a un mot dont la longueur n'est ni 0 ni 1, on est dans le cas trivial"
  28.         -- La bonne version est la suivante :
  29.         if Mot'Length = 0 or Mot'Length = 1 then
  30.             Trouver := True;
  31.         else
  32.             if Mot(Mot'First) = Mot(Mot'Last) then
  33.                 -- Ici il y avait une erreur de syntaxe, ce n'est pas directement
  34.                 -- First + 1 et Last + 1 mais Mot'First + 1 et Mot'Last - 1,
  35.                 -- mais j'ai supposé que vous ne l'aviez pas écrit par flemme étant
  36.                 -- donné que vous le faites correctement avec 'Length.
  37.                 Trouver := Palindrome(Mot(Mot'First + 1 .. Mot'Last - 1));
  38.             -- Il y a le cas où le test Mot(Mot'First) = Mot(Mot'Last) est faux,
  39.             -- dans ce cas la variable Trouver doit valoir False. Or, comme vous
  40.             -- ne l'initialisez pas à la déclaration directement à False, il faut
  41.             -- absolument rajouter un else, sinon le cas n'est pas géré :
  42.             else
  43.                 Trouver := False;
  44.             end if;
  45.         end if;
  46.         return Trouver;
  47.     end Palindrome;
  48.  
  49.  
  50. --  Ici, il y avait la même erreur que plus haut, dans la signature de la fonction. Je corrige ici aussi,
  51. --  l'explication est similaire.
  52.     function PalindromeIteratif(Mot : String) return Boolean is
  53.     Trouver : Boolean := False;
  54.     Compteur : Natural := 0;
  55.     begin
  56.     -- Ici, la logique ne convient pas, effectivement.
  57.     -- Déjà, imaginons le mot suivant : baobab
  58.     -- Votre fonction va entrer dans la boucle, on a bien
  59.     -- Mot(Compteur) = Mot(Mot'Last - 1), donc Trouver va passer à True et ...
  60.     -- votre boucle est terminée, la fonction vous dit que c'est un palindrome,
  61.     -- game over, ce n'en est pas un.
  62.     -- Ici, vous regardez à chaque fois Mot(Mot'Last - 1), donc vous comparez également
  63.     -- tout le temps avec l'avant dernière lettre. Il faut : Mot(Mot'Last - Compteur)
  64.     -- Ensuite, votre façon de calculer l'indice à examiner n'est pas bonne :
  65.     -- en effet, en ADA on peut faire commencer un tableau à n'importe quel indice.
  66.     -- Si un gars bizarre vous file une chaîne dont Mot'First vaut 4, par exemple,
  67.     -- votre calcul (Mot'Last - Mot'First) / 2 (qu'au passage, on pourrait remplacer par
  68.     -- Mot'Length / 2 ) va vous donner une boucle qui examine les éléments de l'indice 1
  69.     -- à l'indice Mot'Length / 2. Or, l'indice 1 n'existe pas, la fonction va planter.
  70.     -- Il vaut mieux calculer l'indice à examiner en faisant Mot(Mot'First + Compteur),
  71.     -- et du coup votre incrémentation de compteur doit être faite après le test.
  72.    
  73.     while not Trouver and Compteur <= (Mot'Last - Mot'First) / 2 loop
  74.             Compteur := Compteur + 1;
  75.             -- Ce type de test est superflu : Mot(Compteur) = Mot(Mot'Last - 1) est déjà un booléen.
  76.             -- vous pouvez donc écrire :
  77.             -- Trouver := Mot(Compteur) = Mot(Mot'Last - 1)
  78.             if Mot(Compteur) = Mot(Mot'Last - 1) then
  79.                 Trouver := True;
  80.             else   
  81.                 Trouver := False;
  82.             end if;
  83.         end loop;
  84.         return Trouver;
  85.  
  86.     end PalindromeIteratif;
  87.  
  88.     -- Je vous propose la version suivante, qui est assez proche de ce que vous vouliez faire mais qui évite
  89.     -- les quelques soucis que j'ai mentionné.
  90.     function PalindromeIteratifCorrige(texte: String) return Boolean is
  91.     Compteur : Integer := 0;
  92.     Erreur : Boolean := False;
  93.     begin
  94.         if texte'Length = 0 then
  95.             Erreur := False;
  96.         else
  97.             while not Erreur and Compteur <= texte'Length / 2 loop
  98.                 Erreur := not (texte(texte'First + Compteur) = texte(texte'Last - Compteur));
  99.                 Compteur := Compteur + 1;
  100.             end loop;
  101.         end if;
  102.         return not Erreur;
  103.     end PalindromeIteratifCorrige;
  104.  
  105.     test : String := "baobab";
  106. begin
  107.     Ada.Text_IO.Put_Line(Integer'Image(test'Length/2));
  108.     if PalindromeIteratif(test) then
  109.         Ada.Text_IO.Put_Line("C'est un palindrome");
  110.     else
  111.         Ada.Text_IO.Put_Line("Ce n'est pas un palindrome");
  112.     end if;
  113.  
  114. end Pierre;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement