Page 2 sur 2
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 12:45
par Backup
par contre j'ai un soucis si on declale trop..
pas le temps de regarder
si ça depasse 13 ça risque de deconner ...
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 14:21
par Ar-S
J'ai modifié et corrigé le code, j'ai aussi mis 2 modes possibles.
J'ai renommé la procédure en
CesarIt() (cryptage cesar)
CesarIt(Decalage,phrase$,[mode])
mode = 1 : se base sur la Nieme lettre le l'alphabet
mode = 0 (ou rien) : incrémente le décalage de
Decalage
Exemple en mode 0
CesarIt(1,phrase$)
"aaa" devient "bbb" car CesarIt décale de 1 par rapport à la 1ere lettre de l'alphabet
CesarIt(2,phrase$)
"aaa" devient "ccc"
Exemple en mode 1
CesarIt(1,phrase$,1)
"aaa" devient "aaa" car CesarIt se positionne sur la lettre 1
CesarIt(2,Phrase$,1)
"aaa" devient "bbb"
Code : Tout sélectionner
; procedure originale : Dobro
; Modifiée par Ar-S
Procedure.s CesarIt(pos,Phrase$,MODE=0)
; mode : 0 = decalage normal
; mode : 1 = decalage via position
If MODE = 1
pos-1
decalage = pos
Else
pos = pos
decalage = pos
EndIf
sortie$ = ""
ref$="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"
ref2$="abcdefghijklmnopqrstuvwxyz"
Phrase$=LCase(Phrase$)
If decalage = 0
decalage = 1
ElseIf decalage<1 Or decalage>26
ProcedureReturn "Erreur"
EndIf
For i=1 To Len(Phrase$)
extrait$=Mid(Phrase$,i,1)
Position=FindString(ref2$,extrait$,1)
If Position + pos > 26
Position = (Position + pos) - 26
Else
Position + pos
EndIf
extrait2$=StringField(ref$,Position,",")
sortie$+extrait2$
Next i
Debug Phrase$+" devient "+sortie$
ProcedureReturn sortie$
EndProcedure
Phrase$="attz"
Debug CesarIt(2,Phrase$,1) ; Decale à la 2 eme lettre => (B)
Debug CesarIt(2,Phrase$) ; Decale de 2 a partir de A => (C)
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 15:12
par Backup
cool !
l'utilisation de stringfield permet de considerer une chaine comme un tableau
a une dimension , sans le cirque qui va avec...
j'aime vraiment cette fonction
bon certes , c'est surement moins rapide qu'avec des peeks
mais au moins on voit concretement ou on en est
rien qu'avec Stringfield, Purebasic est un grand langage !!

Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 15:20
par Backup
...............
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 15:26
par Backup
..............
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 15:32
par Ar-S
héhé oui comme quoi un petit rafraichissement ça fait du bien
CesarIt(13,Phrase$) = wrfhvfharpneebggranvar
Phrase$ = ???

Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 15:36
par Good07
Bonjour Ar-s
J'ai pas tout lu, mais ne serai-ce pas plus simple de faire comme ça ?
Code : Tout sélectionner
Global crypto$, Phrase$
Phrase$="ATTZ"
Procedure.s Cesar(Texte$,Decalage)
crypto$=""
For n=1 To Len(Phrase$)
ValLettre=Asc(Mid(Phrase$,n,1))
Res=ValLettre+Decalage
If Res>90
Res=Res-26
EndIf
crypto$=crypto$+Chr(Res)
Next n
ProcedureReturn crypto$
EndProcedure
Debug Cesar(Phrase$,1)
Debug Cesar(Phrase$,7)
Bien sûr il faut que le texte de base soit en majuscule
Mais on peut aussi travailler avec des minuscules en changeant la valeur ASCII.
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 16:01
par Ar-S
merci Good007,
C'était mon orientation première de passer par les Asc() et Chr()
ça marche aussi et c'est une méthode de plus (j'aime la prog pour ça)
pour ton histoire de Majuscule, c'est plus simple de les imposer avec un phrase$=Ucase(phrase$), ça évite d'avoir à changer les Valeurs Ascii
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 16:09
par Good07
Pas de problème, et effectivement il vaut mieux forcer le texte en majuscule.
Pour améliorer le système il faudrait rajouter une procédure de formatage du texte qui enlève les lettres accentuées et les espaces ainsi que les signes de ponctuation.
Ça évite pas mal de problèmes quand on tape une phrase sans faire trop attention.
Bonne continuation.
Re: [Resolu] Gestion des DIM et décalage
Publié : ven. 02/sept./2011 16:34
par Ar-S
Exacte, pour les accents j'y viendrait, pour les espaces c'est fait.
Voilà ma procédure modifiée avec possibilité de décrypter une phrase en utilisant la valeur négative.
Je reprends l'histoire du ROT13
Code : Tout sélectionner
; procedure CesarIt() par Ar-S / 02/09/2011
; v0.6 Ajout de la fonction décodage si on entre un chiffre négatif
; v0.5 Correctifs mineurs
; v0.4 Ajout du mode 1
;
; procedure originale : Dobro
Global.b cesar
;{- Proce CESARIT
Procedure.s CesarIt(pos,Phrase$,MODE=0)
; mode : 0 = decalage normal
; mode : 1 = decalage via position
Shared ref2$
sortie$ = ""
ref$="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"
ref2$="abcdefghijklmnopqrstuvwxyz"
Phrase$=LCase(Phrase$)
Phrase$=RemoveString(Phrase$," ")
If pos < -26
ProcedureReturn "Erreur"
ElseIf pos < 0 And pos > -27
MODE = 0 ;(on force le MODE 0)
pos = pos-(pos*2)
; La feinte :)
ref$=ReverseString(ref$)
ref2$=ReverseString(ref2$)
Else
If MODE = 1
pos-1
Else
pos = pos
EndIf
decalage = pos
If decalage = 0
decalage = 1
ElseIf decalage<1 Or decalage>26
ProcedureReturn "Erreur"
EndIf
EndIf
For i=1 To Len(Phrase$)
extrait$=Mid(Phrase$,i,1)
Position=FindString(ref2$,extrait$,1)
If Position + pos > 26
Position = (Position + pos) - 26
Else
Position + pos
EndIf
extrait2$=StringField(ref$,Position,",")
sortie$+extrait2$
Next i
Debug Phrase$+" devient "+sortie$
ProcedureReturn sortie$
EndProcedure
;}-
cesar = 13
; Decalage de la phrase de 13 (ROT13)
Phrase$="je suis une carrotte naine"
Debug CesarIt(cesar,Phrase$) ; devient => "wrfhvfharpneebggranvar"
; Décodage du ROT13
Phrase$="wrfhvfharpneebggranvar"
CesarIt(-13,Phrase$)