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 !! :lol:

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 :mrgreen:

Phrase$ = ??? :P

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 :D
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$)