ADA Problème Programme débutant

Discutez d'informatique ici !
syllox
Messages: 5
Enregistré le: 17 Nov 2012, 21:17

ADA Problème Programme débutant

par syllox » 17 Nov 2012, 21:18

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



Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 17 Nov 2012, 21:32

Moi j'aurais fais autrement, j'aurais créer un tableau qui contiendrait les lettres de l'alphabet en totalité.

TU fais entré le décalage voulu que l'utilisateur veut pour coder son message, en gros le nombre de lettre entre A et K dans ton cas.

ET tu applique ça au tableau.

En fait tu décales les valeurs du tableau. Voilà je sais pas si c’est bien clair dis comme ça.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

syllox
Messages: 5
Enregistré le: 17 Nov 2012, 21:17

par syllox » 17 Nov 2012, 21:37

Rockleader a écrit:Moi j'aurais fais autrement, j'aurais créer un tableau qui contiendrait les lettres de l'alphabet en totalité.

TU fais entré le décalage voulu que l'utilisateur veut pour coder son message, en gros le nombre de lettre entre A et K dans ton cas.

ET tu applique ça au tableau.

En fait tu décales les valeurs du tableau. Voilà je sais pas si c’est bien clair dis comme ça.


Merci pour ta réponse,
Le problème c'est que j'ai pas encore vu les tableaux en cours. Donc j'aimerais faire avec ceux que j'ai proposé en faisant un décalage aussi. Enfin si c'est possible ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 17 Nov 2012, 21:52

Ok, dans ce contexte là je ne saurais pas vraiment t'aider. Mais ce que tu demande me parait compliqué dans la mesure où tu effectues le programme avec une chaine de caractère string.

La solution barbare ce serait de faire des conditions en utilisant le type character plutôt que string
If (lettre = 'a') then
lettre := 'k';

pour chaque lettre possible. Donc autant de condition que de lettre, c'est pas forcément la bonne solution =)
A part avec un tableau je vois pas si on peut construire un décalage autrement que de la manière dont j'ai parlé. Parce que je ne pense pas que si tu utilises directement un string le changement s'opère. A tester, mais si ça marche avec un string c'est tout aussi bien.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

syllox
Messages: 5
Enregistré le: 17 Nov 2012, 21:17

par syllox » 17 Nov 2012, 22:30

Oui je ferais ça sinon , mais c'est pas très beau ..
Surtout si c'est noté, je voudrais parcourir les caractères de Chaine un par un avec une boucle pour I de 1 à Longueur, et affecter à Chaine(I..I) une valeur décalée, par exemple avec un
case Chaine(I..I)
when ‘A’ => Chaine(I..I) := ‘K’ etc…

Mais je sais pas comment le faire après..

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 17 Nov 2012, 23:18

Effectivement c'est pas très beau.Désolé, je ne comprends déjà pas la syntaxe que tu utilises donc je vais avoir un peu de mal.La meilleure façon c'est un tableau, maintenant si quelqun d'autre à une solution...

C'est bizarre, tu utilises des expressions que je n'ai pas encore vu alors que j'ai pourtant vu les tableaux...

when ‘A’ => Chaine(I..I) := ‘K’

EN ada on utiliserait plutôt un If (..) then

ET => je vois pas ce que ça veut dire non plus, si c'est supérieur ou égal alors ça serait plutot >=

Je ne sais pas non plus ce que signifie case donc voilà...


Désolé tu devrais plutôt attendre l'aide de quelqun de mieux informé que moi.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

syllox
Messages: 5
Enregistré le: 17 Nov 2012, 21:17

par syllox » 17 Nov 2012, 23:32

Rockleader a écrit:Effectivement c'est pas très beau.Désolé, je ne comprends déjà pas la syntaxe que tu utilises donc je vais avoir un peu de mal.La meilleure façon c'est un tableau, maintenant si quelqun d'autre à une solution...

C'est bizarre, tu utilises des expressions que je n'ai pas encore vu alors que j'ai pourtant vu les tableaux...

when ‘A’ => Chaine(I..I) := ‘K’

EN ada on utiliserait plutôt un If (..) then

ET => je vois pas ce que ça veut dire non plus, si c'est supérieur ou égal alors ça serait plutot >=

Je ne sais pas non plus ce que signifie case donc voilà...


Désolé tu devrais plutôt attendre l'aide de quelqun de mieux informé que moi.


Merci beaucoup en tout cas.
Je voudrais bien essayé par tableau mais je ne sais pas comment le rédiger du tout ...

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 17 Nov 2012, 23:41

Pour utiliser un tableau c'est assez simple, il suffit de le définir.


type nomDuTableau is array (Integer 1..max) of type des variables;


où max est une constante, dans ton cas le nombre de lettre de l'alphabet par exemple.
Ici type c'est character

ensuite il te suffit de créer une variable que tu désigne avec le type créer

monTableau : nomDuTableau;

Après quand tu l'utilisera ça se présentera sous la forme

monTableau(compteur) := lettre;

où ton compteur prendra toutes les valeurs de 1 à max avec une boucle for ou while dans laquelle tu incrémente le compteur et tu met à jour la lettre en fonction de ce que tu veux.







Mais si tu n'as pas vu les tableaux fais le autrement.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

syllox
Messages: 5
Enregistré le: 17 Nov 2012, 21:17

par syllox » 11 Déc 2012, 12:53

Rockleader a écrit:Pour utiliser un tableau c'est assez simple, il suffit de le définir.


type nomDuTableau is array (Integer 1..max) of type des variables;


où max est une constante, dans ton cas le nombre de lettre de l'alphabet par exemple.
Ici type c'est character

ensuite il te suffit de créer une variable que tu désigne avec le type créer

monTableau : nomDuTableau;

Après quand tu l'utilisera ça se présentera sous la forme

monTableau(compteur) := lettre;

où ton compteur prendra toutes les valeurs de 1 à max avec une boucle for ou while dans laquelle tu incrémente le compteur et tu met à jour la lettre en fonction de ce que tu veux.







Mais si tu n'as pas vu les tableaux fais le autrement.


Salut ,
Désolé de pas avoir répondu tout de suite,
Donc j'essaie sous forme de tableau maintenant et je te dis quoi.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 11 Déc 2012, 13:58

Bonjour,
Je ne vous répondrai pas pour le codage en ADA que je ne connais pas, mais sur l'algorithme.
Donc, voila ce que je peux répondre :

Pour chaque lettre du message
On lit son code ASCII
Si il est inférieur à 26 =[code de K] - [code de A] ( à 1 unité près)
alors new code de lettre = code de lettre + [code de K] - [code de A]
sinon
alors new code de lettre = code de lettre + [code de K] - [code de A] - 26

Bien sûr à vérifier les valeurs.
Il y 3 fonctions ADA à utiliser
1- lecture de la nième lettre d'un string
2- code ASCII de ce caractère
3- écriture de la nième lettre d'un string

Je n'ai tenu compte ni des majuscules/minuscules ni et surtout des caractères accentués.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 11 Déc 2012, 14:34

Bon, ayant du faire l'autre jour un problème un peu similaire, je vais rajouter quelque chose à mon précédent post.

La méthode a suivre est bien la suivante:

Prendre la lettre
Transformer en ascii
Ajouter la clé à l'ascii
Transformer l'ascii en lettre.


Pour cela il existe des fonctions prédéfinies que j'ai oublié.



Dernier point, l'utilisation de string en ada est un peu génante, car tu définis une taille max pour ta chaine, cela t'oblige à rentrer une chaine comportant ce nombre de caractère,

si ta chaîne va jusqu'à 10 tu dois rentrer 10 caractère, pas 9 ni 11 mais bien 10, sinon la programme ne continuera pas l’exécution.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 11 Déc 2012, 14:43

Quelle est l'instruction qui permet d'écrire une chaine ce caractère ?
Comment est définie une chaine de caractère ?
L'ADA, c'est bien un langage compilé, ou je me trompe ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 11 Déc 2012, 15:01

Dlzlogic a écrit:Quelle est l'instruction qui permet d'écrire une chaine ce caractère ?
Comment est définie une chaine de caractère ?
L'ADA, c'est bien un langage compilé, ou je me trompe ?



ADA est un langage compilé oui.

Ensuite dans la pratique je pourrais pas te donner trop d'info sur les chaines de caractères j'en utilise rarement, je fais plutôt tourner des boucles en demandant un simple caractère à chaque fois.

Mais de façon générale

TU déclares une variable de type string avec une taille


Par exemple tu auras:

monTexte : String(1..10); Je suis pas exactement sur que ça se déclare comme ça comme je ne les utilise pas, mais c'est comme ça que ça a été déclaré dans le programme plus haut.

Sa voudra dire qu'à chaque fois que tu demandera la valeur de la variable monTexte, il faudra rentrer précisément 10 caractère à la suite ni plus ni moins.


E fait il faut voir le type string comme un tableau ne contenant que des caractère et qui doit obligatoirement être remplie en entier.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 11 Déc 2012, 15:26

[qoute]E fait il faut voir le type string comme un tableau ne contenant que des caractère et qui doit obligatoirement être remplie en entier.[/quote]
Oui, mais rien n'empêche de compléter par de blancs.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 11 Déc 2012, 19:36

Dlzlogic a écrit:[qoute]E fait il faut voir le type string comme un tableau ne contenant que des caractère et qui doit obligatoirement être remplie en entier.

Oui, mais rien n'empêche de compléter par de blancs.[/quote]

certes mais le soucis dans le programme en question c'est que si tu rentres un blanc, littéralemment tu rentres un espace, cet espace a également un code ascii qui sera traduit, et s'il ne veut traduire que les lettre et pas les espaces ben au lieu d'avoir avec une clé de 2 a b se transformer en c d il aura c.qqchose.d et je susi pas sur que ce soit cela qu'il recherche.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 11 Déc 2012, 19:44

On mélange un peu les problèmes.
1- l'analyse de l'algorithme : il est certain au A doit être transformé en K, et Z qu'en fait-on ? pour l'espace (code 32 de mémoire) il doit naturellement être conservé.
2- l'utilisation des fonctions ADA

Pour le reste, il faut demander à Léon, lui sait.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 11 Déc 2012, 20:21

A vaut K .. B vaut L ainsi de suite

Si tu look la table ascii, tu as
Code: Tout sélectionner
        065  A
         066  B
         067  C
         068  D
         069  E
         070  F
         071  G
         072  H
         073  I
         074  J
         075  K
         076  L
         077  M
         078  N
         079  O
         080  P
         081  Q
         082  R
         083  S
         084  T
         085  U
         086  V
         087  W
         088  X
         089  Y
         090  Z

ton offset c'est 10 (ascii(K) - ascii(A) == 75-65 == 10)

Le problème c'est que j'ai pas encore vu les tableaux en cours

ya pas besoin de manipuler des tableaux plus que ca
l'idée c'est d'itérer sur ta chaine de caractere et d'ajouter 10 à chaque fois.
Code: Tout sélectionner
Pour i=0, i90 alors
  continuer;//on ne veut pas modifier un charactere qui n'est pas dans [A-Z]
 finsi
 
 //on sait que s[î] est un charactere dans [A-Z]
 nouveauCaractere = s[i] + 10
 si nouveauCaractere>90 alors
  nouveauCaractere=nouveauCaractere-26; //un peu comme un modulo...
 finsi
 s[i] = nouveauCaractere;
finpour
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite