IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ada Discussion :

Problème Programme [Débutant(e)]


Sujet :

Ada

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 3
    Points
    3
    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 actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    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
    Invité
    Invité(e)
    Par défaut Une chaîne de longueur 1 est différent d'un caractère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for I in 1..Longueur loop
       case chaine(I) is
          .../...
    end loop;

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 49
    Points
    49
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 3
    Points
    3
    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
    Architecte technique
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 81
    Points
    81
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 3
    Points
    3
    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
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 3
    Points
    3
    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
    Invité
    Invité(e)
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Ah le c** , désolé.
    Merci beaucoup content que ça marche même si c'est un peu barbare !

  12. #12
    Invité
    Invité(e)
    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.
    Dernière modification par Invité ; 18/11/2012 à 15h01. Motif: ajout du "presque"

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 81
    Points
    81
    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.

Discussions similaires

  1. Problème Programmation MFC
    Par xyz dans le forum MFC
    Réponses: 17
    Dernier message: 13/05/2006, 20h00
  2. Problème Programmation MFC
    Par xyz dans le forum Réseau
    Réponses: 3
    Dernier message: 13/05/2006, 14h36
  3. [Problème] Programme huit reines
    Par thegreatbato dans le forum C
    Réponses: 20
    Dernier message: 04/05/2006, 22h04
  4. Problème programmation : log
    Par rootsl dans le forum C
    Réponses: 4
    Dernier message: 29/03/2006, 11h26
  5. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo