Page 1 of 1

Programme cryptage

Unread postPosted: 09 Oct 2013, 19:19
by Cudilov
Bonjour, j'ai un petit programme à faire un programme:
Je souhaite que celui-ci me réalise tout seul un "chiffrement affine":
- Pour cela, l'utilisateur rentre une chaîne de caractères
- Puis le programme fait correspondre à chaque lettre son chiffre (0 pour A, 1 pour B...)
- Ensuite, est appliquée à chaque chiffre la fonction affine voulue (x->ax+b, ou a et b sont rentrés par l'utilisateur)
- Puis on récupère le reste de la division du chiffre obtenu par 26
- Et on fait correspondre la lettre au chiffre obtenu

Ainsi, par exemple: Pour une chaine: "Chiff" avec a = 7 et b = 17, on obtient au final "FOVAA"

Voici mon programme, qui m'affiche une erreur "Variable pas définie":
Code: Select all
Define Cryptage()=
Prgm
:Local a,b,c,d,e,f,ß,þ
:Disp "Chiffrement affine (ax+b) "
:RequestStr "Lettres?",b
:Request "a?",e
:Request "b?",f
:ß:={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}
:1→a
:dim(b)→d
:For j,1,d
:left(b,a)→c
:right(c,1)→c
:inString("abcdefghijklmnopqrstuvwxyz",c)→þ
:remain(þ*e+f,26)→þ
:Disp ß[þ]
:a+1→a
:EndFor
:EndPrgm


Savez vous d'ou peut provenir mon erreur?
Je me suis peut être aussi un peu compliqué dans le programme, on peu surement faire un peu plus simple.

Re: Programme cryptage

Unread postPosted: 09 Oct 2013, 19:22
by davidElmaleh
Peut être que ton erreur viens de la:

Code: Select all
ß:={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}


dans ta liste, il y a des variables déjà utilisées
notamment b,e,f,a,d,c
essaye de les remplacer par des mots plutôt, tu y verras plus claire et ton programme fonctionnera peut être

EDIT: non, en fait ton problème vient du fait que tu n'a pas mis les lettres dans la liste ß sous forme de chaines, donc il ne reconnais pas les variables

Mets plutôt ceci
Code: Select all
ß:={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}

Re: Programme cryptage

Unread postPosted: 09 Oct 2013, 19:27
by Cudilov
Oui , il me semblait que le problème pouvait venir de la, du coup j'ai essayé avec d'autres variables comme tu dis, mais ça ne marchait toujours pas...

Re: Programme cryptage

Unread postPosted: 09 Oct 2013, 19:30
by davidElmaleh
regarde mon dernier EDIT:

Mets plutot ceci
Code: Select all
ß:={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}

Re: Programme cryptage

Unread postPosted: 09 Oct 2013, 19:41
by AnToX98
Il n'y a pas 36 solutions, il faut simplement corriger en fonction de ton erreur.
"Variable pas définie", c'est évident, dans le ß:={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} toutes les lettres sont considérées comme des variables.
Fait donc comme te l'indique david_elmaleh dans le post au dessus.

Re: Programme cryptage

Unread postPosted: 09 Oct 2013, 19:50
by Cudilov
Ok super merci, j'ai effectivement oublié ce petit détail ;)

Re: Programme cryptage

Unread postPosted: 10 Oct 2013, 23:18
by Bisam
Tout d'abord, il y a une petit erreur :
Code: Select all
remain(þ*e+f,26)→þ
doit être remplacé par
Code: Select all
remain(þ*e+f-1,26)+1→þ
pour renvoyer une valeur entre 1 et 26 et non une valeur entre 0 et 25.

Ensuite, il y a quelques améliorations simples que tu devrais retenir et quelques autres plus techniques que tu peux revenir consulter plus tard...
Pour ce qui est du simple :
- tu devrais utiliser la valeur j de ta boucle "for" en lieu et place de la variable a qui prend exactement les mêmes valeurs,
- tu devrais également remplacer
Code: Select all
left(b,a)->c
right(c,1)->c
par
Code: Select all
mid(b,j,1)->c
qui est bien plus efficace.
- tu ne devrais même pas te servir de la variable c ... puisque maintenant, elle ne te sert qu'une seule fois.

Donc ton code se réécrit :
Code: Select all
    Define Cryptage()=
    Prgm
    :Local b,d,e,f,ß,þ
    :Disp "Chiffrement affine (ax+b) "
    :RequestStr "Lettres?",b
    :Request "a?",e
    :Request "b?",f
    :ß:={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}
    :dim(b)→d
    :For j,1,d
    :inString("abcdefghijklmnopqrstuvwxyz",mid(b,j,1))→þ
    :remain(þ*e+f-1,26)+1→þ
    :Disp ß[þ]
    :EndFor
    :EndPrgm


Pour ce qui est du plus délicat :
- La ligne
Code: Select all
inString("abcdefghijklmnopqrstuvwxyz",c)→þ
peut être avantageusement remplacée par
Code: Select all
ord(c)-ord("a")+1->þ
ou encore, si on se rappelle que ord("a")=55, par
Code: Select all
ord(c)-54->þ

- Tu peux aussi remplacer ta liste ß par la chaîne "abcdefghijklmnopqrstuvwxyz" et remplacer ß[þ] à la fin par
Code: Select all
mid(ß,þ,1)
mais tu peux aussi ne pas utiliser du tout ß et remplacer ß[þ] par
Code: Select all
char(þ+54)
en utilisant l'opération inverse de celle que j'ai suggérée dans le paragraphe précédent.
- Tu peux encore éliminer une variable, à savoir þ, en faisant tout calculer dans des fonctions successives.

Au final, ton code peut ressembler à cela :
Code: Select all
    Define Cryptage()=
    Prgm
    :Local b,d,e,f
    :Disp "Chiffrement affine (ax+b) "
    :RequestStr "Lettres?",b
    :Request "a?",e
    :Request "b?",f
    :dim(b)→d
    :For j,1,d
    :Disp char(remain(ord(mid(b,j,1))-54)*e+f-1)+55)
    :EndFor
    :EndPrgm