Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut Problème Programme

    Bonjour,

    Je suis débutant avec ADA, et je voulais créer un programme permettant de coder un message avec comme base A vaut K .. B vaut L ainsi de suite.
    Mais j'ai un problème que je n'arrive pas à résoudre.

    -- Codeur "Avocat"

    WITH Ada.Text_IO;

    PROCEDURE P_Codeur_Decrypteur IS

    Max : CONSTANT Integer := 60;

    Longueur : Integer;
    Chaine : String (1 .. Max);
    I : Integer;


    BEGIN
    Ada.Text_IO.Put("Saisir le message a coder : ");
    Ada.Text_Io.Get_Line (Chaine, Longueur);
    FOR I IN 1..Longueur LOOP
    CASE Chaine(I..I) IS
    WHEN 'A' =>
    Chaine(I..I) := 'K';
    END CASE;
    END LOOP;
    Ada.Text_Io.Put("Voici le message coder : ");
    Ada.Text_Io.Put (Chaine(1..Longueur));
    END P_Codeur_Decrypteur;
    Merci d'avance pour votre aide,

    Cordialement,

    Syllox

  2. #2
    Membre régulier
    Profil pro
    Mathématicien
    Inscrit en
    mars 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien
    Secteur : Finance

    Informations forums :
    Inscription : mars 2012
    Messages : 70
    Points : 97
    Points
    97

    Par défaut Problème

    Citation Envoyé par Syllox Voir le message
    Mais j'ai un problème que je n'arrive pas à résoudre
    Lequel ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    juin 2006
    Messages
    924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : juin 2006
    Messages : 924
    Points : 415
    Points
    415

    Par défaut Une chaîne de longueur 1 est différent d'un caractère.

    Code :
    1
    2
    3
    4
    5
    # gnatmake p_codeur_decrypteur.adb 
    gcc-4.4 -c p_codeur_decrypteur.adb
    p_codeur_decrypteur.adb:18:06: expected a discrete type
    p_codeur_decrypteur.adb:18:06: found type "Standard.String"
    gnatmake: "p_codeur_decrypteur.adb" compilation error
    Je m'en doutais à la lecture du code.

    Il faudrait procéder ainsi :
    Code ada :
    1
    2
    3
    4
    5
    for I in 1..Longueur loop
       case chaine(I) is
          .../...
    end loop;

  4. #4
    Nouveau Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    avril 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : avril 2012
    Messages : 27
    Points : 35
    Points
    35

    Par défaut

    Lorsque tu utilises l'instruction CASE, tu dois tester différents cas et même tous les cas possibles ! Tu ne peux donc tester que des types discrets : des character ou des integer ou des types énumérés pour faire vite. Mais quand tu écris CHAINE(I..I) tu testes une chaîne de caractères, pas seulement un caractère ! Comme te le dis Jovalise, écris plutôt CHAINE(I).

    Il faudra aussi une ligne : WHEN OTHERS => pour les cas non traités. Si tu ne souhaites rien faire, il y a l'instruction NULL.

  5. #5
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Merci pour vos réponses ,
    En suivant vos conseils j'arrive à quelqu'un chose qui commence à fonctionner. Cependant , cela prend en compte que la première lettre de la chaîne de caractères ..

    Voici mon nouveau code.

    Encore merci de votre aide.

    -- Codeur "Avocat"

    WITH Ada.Text_IO;

    PROCEDURE P_Codeur_Decrypteur IS

    Max : CONSTANT Integer := 60;

    Longueur : Integer;
    Chaine : String (1 .. Max);
    I : Integer;


    BEGIN
    Ada.Text_IO.Put("Saisir le message a coder : ");
    Ada.Text_Io.Get_Line (Chaine, Longueur);
    FOR I IN 1..Longueur LOOP
    CASE Chaine(I) IS
    WHEN 'A'=>
    Chaine(I) := 'K';
    WHEN 'B'=>
    Chaine(I) := 'L';
    WHEN 'C'=>
    Chaine(I) := 'M';
    WHEN 'D'=>
    Chaine(I) := 'N';
    WHEN 'E'=>
    Chaine(I) := 'O';
    WHEN 'F'=>
    Chaine(I) := 'P';
    WHEN 'G'=>
    Chaine(I) := 'Q';
    WHEN 'H'=>
    Chaine(I) := 'R';
    WHEN 'I'=>
    Chaine(I) := 'S';
    WHEN 'J'=>
    Chaine(I) := 'T';
    WHEN 'K'=>
    Chaine(I) := 'U';
    WHEN 'L'=>
    Chaine(I) := 'V';
    WHEN 'M'=>
    Chaine(I) := 'W';
    WHEN 'N'=>
    Chaine(I) := 'X';
    WHEN 'O'=>
    Chaine(I) := 'Y';
    WHEN 'P'=>
    Chaine(I) := 'Z';
    WHEN 'Q'=>
    Chaine(I) := 'A';
    WHEN 'R'=>
    Chaine(I) := 'B';
    WHEN 'S'=>
    Chaine(I) := 'C';
    WHEN 'T'=>
    Chaine(I) := 'D';
    WHEN 'U'=>
    Chaine(I) := 'E';
    WHEN 'V'=>
    Chaine(I) := 'F';
    WHEN 'W'=>
    Chaine(I) := 'G';
    WHEN 'X'=>
    Chaine(I) := 'H';
    WHEN 'Y'=>
    Chaine(I) := 'I';
    WHEN 'Z'=>
    Chaine(I) := 'J';
    WHEN OTHERS =>
    NULL;
    END CASE;
    END LOOP;

    Ada.Text_Io.Put("Voici le message coder : ");
    Ada.Text_Io.Put (Chaine(1..Longueur));
    END P_Codeur_Decrypteur;

  6. #6
    Membre régulier Avatar de poincare
    Homme Profil pro Henri Poincare
    Architecte technique
    Inscrit en
    mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri Poincare
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mai 2007
    Messages : 48
    Points : 75
    Points
    75

    Par défaut Un grand classique qui a 2000 ans

    Le codage complet de César :
    http://rosettacode.org/wiki/Caesar_cipher#Ada

  7. #7
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Le problème c'est que c'est un travail à rendre avec les compétences qu'on a déjà abordé; Or nous n'avons pas encore vu les tableaux ni les fonctions comme dans le code que tu m'as envoyé.

    Cordialement,

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    juin 2006
    Messages
    924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : juin 2006
    Messages : 924
    Points : 415
    Points
    415

    Par défaut

    Citation Envoyé par Syllox Voir le message
    Le problème c'est que c'est un travail à rendre avec les compétences qu'on a déjà abordé; Or nous n'avons pas encore vu les tableaux ni les fonctions comme dans le code que tu m'as envoyé.

    Cordialement,
    Une chaîne de caractère est un tableau donc, tu devrais avant, avoir vu les tableaux. Bref.

    Ton programme à l'air de fonctionner.
    Code :
    1
    2
    3
    r# ./p_codeur_decrypteur 
    Saisir le message a coder : BONJOUR
    Voici le message coder : LYXTYEB
    Autre chose, Si ta variable I ne sert à rien, supprime la.
    Pour la variable I utilisé dans la boucle for, elle est déclarée par le le for lui même et n'est visible que dans la porté du for, jusqu'au en loop.

  9. #9
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    D'accord,

    Moi J'ai ça ..
    Saisir le message a coder : Bonjour
    Voici le message code : Lonjour
    Je compile sous AdaGIDE.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    juin 2006
    Messages
    924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : juin 2006
    Messages : 924
    Points : 415
    Points
    415

    Par défaut

    Citation Envoyé par Syllox Voir le message
    D'accord,

    Moi J'ai ça ..


    Je compile sous AdaGIDE.
    Ben oui, remarque.... Ton code ne prend que les majuscules en comptes dans le "case".
    Si tu met des majuscule dans ton code, ton programme acceptera des majuscule, logique.

  11. #11
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Ah le c** , désolé.
    Merci beaucoup content que ça marche même si c'est un peu barbare !

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    juin 2006
    Messages
    924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : juin 2006
    Messages : 924
    Points : 415
    Points
    415

    Par défaut

    Tu pourrais maintenant t'intéresser à l'attribut Pos.
    Tout type définit (presque) possède par héritage un ensemble d'attributs dont Pos qui retourne un entier naturel qui n'est autre que la position de la valeur dans la liste des valeurs admise en commençant par zéro.

    Donc, pour un charactere le A sera à une position dans la liste des caractère et le a sera un peut plus loin. Tout les caractère en majuscule ce suivent, et tout ceux en minuscule également.

    Tu peut utiliser l'attribut Image qui retourne la chaîne de caractères correspondant à une valeur dans une liste admise.
    Avec ça, tu peux faire un text_io.put_line("Caractère : " & One_Char & " position :" & natural'image(character'pos(One_Char)));

    Avant de poursuivre ta liste de problème, pense au utilisateurs qui font souvent n'importe quoi.

  13. #13
    Membre régulier Avatar de poincare
    Homme Profil pro Henri Poincare
    Architecte technique
    Inscrit en
    mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri Poincare
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mai 2007
    Messages : 48
    Points : 75
    Points
    75

    Par défaut Le code cité est vraiment trop laid

    Une manière de faire moins laide et plus concise :

    Chaine_codee := String (Chaine'Range);

    CASE Chaine(I) IS
    when 'A' .. 'Z' =>
    -- calcul modulo 26 du nouveau charactère
    Chaine_codee (I) := A toi de bosser
    when others =>
    Chaine_codee (I) := ' ';-- sur les minuscules et autres un espace
    end case;

    Remarques :
    La declaration de la variable I à la ligne 11 ne sert à rien et rentre en
    conflit avec la variable de boucle.
    => pour le voir compiler avec les warnings.

    Orthographe merci "Voici le message coder : " codé est un participe passé pas un infinitif.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •