Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 11-05-2009 16:00:22
- Genki
- Invité
[Visual Basic] Algorithme de Cesar
Bonjour,
Voila pour un cours d'algorithme, j'ai un projet à rendre qui repose sur l'algorithme de Cesar =)
Si vous avez vu Da Vinci Code, la méthode est employer avec le Cryptex
Voici mon TP (je réalise seulement la partie informatique sur VB)
http://www.acyrin.com/sujet-projet-09-cesar.PDF
Je sais à peine par ou commencer, sachant que mon TP se fait à l'aide de Visual Basic Express.
Merci
#2 11-05-2009 17:18:24
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Bonjour,
Je ne connais pas le Visual Basic mais j'ai déjà programmé en BASICs (Basic GFA, QuickBASIc, TurboBasic et Basic Amstrad) et j'ai mis en ligne un script de codage et de décodage en Python dans ce Forum...
La méthode qui t'es imposée revient au même que la mienne, même si je la trouve un poil plus complexe...
Bon, donc il me faut savoir si en VB (et quels sont les mots-clé) on peut
- Afficher une lettre à partir de son code ASCII en principe CHR$ (chr tout court en Python): print chr$(65) --> A
- Trouver le code ASCII d'une lettre, en principe ASC : print ASC("H") --> 72 (print ord("A") en Python)
Soit à coder "ALGORITHME DE CESAR"
1. Je stocke cette "phrase dans une chaîne de caractères" par exemple acoder$="ALGORITHME DE CESAR"
2. Je détermine le decalage : decalage = 12, par exemple.
3. Je détermine la longueur de la "phrase" : longueur=LEN(acoder$)
4. Je crée un tableau Talpha, par exemple, de dimension 26 que je remplis ainsi :
Talpha[0]="A"
Talpha[1]="B"
.........................
Talpha[25]="Z"
4. Je crée une boucle de la longueur voulue :
FOR i =0 TO longueur
5. Maintenant, il faut extraire lettre par lettre, prendre le code ASCII de la lettre et s'il est différent de 32 (l'espace) lui enlever 64, on obtient ainsi le rang de la lettre dans l'alphabet...
Donc tu dois utilise l'instruction MID (dans les autres BASIC, c'était MID$).
Si tu fais :
FOR i = 0 TO longueur
lettre$=MID(acoder$,i,1)
rang = ASC(lettre$)-65
print rang;
NEXT
Tu vas obtenir : 0 11 6 14 17 8 19 7 12 4 -33 3 4 -33 2 4 18 0 17
ok ?
Maintenant, il te faut ajouter le décalage (cette histoire de décalage à gauche ou à droite est peu bofbof ; décaler de -2, c'est la même chose que décaler de + 24.
Si tu fais alors :
FOR i = 1 TO longueur
lettre$=MID(acoder$,i,1)
print rang+12;
NEXT
tu obtiens : 12 23 18 26 29 20 31 19 24 16 -21 15 16 -21 14 16 30 12 29
Et comme aucun rang ne doit dépasser 26, il te faut calculer le reste avec mod (modulo) 26...
Donc
* créer une chaine vide motchiffre$ (si pas besoin de $ tu t'adaptes !)
* lancer la boucle
* extraire le caractère en position i,
* Si caractère = " " (espace) alors motchiffre = motchiffre+ " "
* sinon rang = ASC(lettre$)-65 et rangch=(rang+12)modulo 26, puis motchiffre=motchiffre+Talpha[rangch]
* fin de boucle
* afficher le résultat
Ca doit marcher,
Je vérifie en traduisant en Python...
C'est bon !
Résultat (avec déclage de 12) : MXSADUFTYQ PQ OQEMD
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#3 11-05-2009 19:04:11
- Genki
- Invité
Re : [Visual Basic] Algorithme de Cesar
Ouah ! Pas mal ! Sa va bien m'aider ça.
Pour te répondre, notre prof nous interdit d'utiliser leur valeur ASCII =(
Mais on a le droit de donner une valeur numérique à chaque lettre
A => 1
B => 2
x => n
Z => 26
#4 11-05-2009 19:17:35
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Salut,
Pour te répondre, notre prof nous interdit d'utiliser leur valeur ASCII =(
Peux-tu préciser ?
Tu n'as pas le droit d'extraire la valeur ASCII d'une lettre ? C'est ça ? Boufre ! Ca c'est ch...
En Python, aucun pb on a les dictionnaires, mais je ne connais pas le VBE (je me documente), il faut donc trouver une astuce pour savoir que la lettre A correspond au n° défini (l'inverse de ton tableau Talpha, quoi).
Je vais rejeter un oeil sur ton lien, donc...
@+
[EDIT]
Il n'est pas précisé que le code ASCII est interdit sur les pages en lien...
Arx Tarpeia Capitoli proxima...
Hors ligne
#5 12-05-2009 01:24:56
- Genki
- Invité
Re : [Visual Basic] Algorithme de Cesar
En effet, ce n'est pas écrit, en revanche c'est un détail qui a été dit oralement =/
Mais c'est difficile de faire ce que j'ai dit ?
A = 1
B = 2
etc...
?
Ensuite on chance la valeur de chaque lettre (+le décalage) et on les affiche à nouveaux
nan ?
#6 12-05-2009 07:42:54
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Bonjour,
Oui, ce n'est pas simple si ce n'est pas prévu...
Pourquoi ?
Un tableau est géré par des indices numériques, ainsi si tu demandes Talpha[2] tu obtiens C..
Mais on peut pas gérer un tableau via des lettres, sauf en Python où tu peux construire un "dictionnaire" de telle façon que Dico["C"] te renvoie 2...
En VB, je l'ignore...
De toutes façons, j'ai trouvé un moyen de contourner la difficulté.
Donc :
Puisque la fonction INSTR existe en QuickBaic, en TurboBasic et en Basic Amstrad, il n'y a aucune raison qu'en VB cette fonction INSTR n'existe pas...
Elle marche comme ça : INSTR("GINGEMBRE","M") donne 5. Vérification si tu demandes MID("GINGEMBRE",5,1) tu obtiens bien M...
Donc, si ça existe, je crée une variable chaîne Alphabet$ :
Alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Et dès que tu as récupéré la lettre et testé que ce n'est pas une espace (donc dans la partie ELSE), tu obtiens le rang de ta lettre, non plus par rang=ASC(lettre$)-65, mais par rang=InStr(Alphabet$,lettre$)
Après, on continue comme indiqué.
Alors où en es-tu ? Tu avances j'espère parce que le temps presse !
[EDIT] Je viens de Chercher sur Google : la réponse est oui, cette fonction existe... alors au boulot !
@+
PS
Lorsque tu auras écrit ton prg et qu'il marchera, puisque tu dois faire des commentaires, tu pourras leur expliquer qu'on peut se passer d'écrire rangch=(rang+decalage)Mod 26...
Il suffit d'utiliser un 2e tableau TalphaX2 qui va contenir 52 lettres A, B....Z, A, B....Z, ainsi tu seras sûr de tomber sur la bonne lettre rangch=rang+decalage puis TalphaX2[rangch]. Quant aux décalages gauche/ou droite, c'est facile à gérer :
* pour gauche on prend une boucle qui va de 26 à la fin
* pour droite on va de 0 à 25 (ou 26 ça dépend du VB en Python pour décrire 26 itértations de 0 à 25, il faut donner un indice de fin de 26 et non 25).
PS2
Apparemment, après recherche, la boucle For/Next fonctionne comme dans les BASICs que je connais.
Donc ce n'est plus Longueur=len(Acoder$), mais Longueur=len(Acoder$)-1, puisque la boucle démarre de 0 :
For i = 0 To Longueur
Donc tu commences par déclarer Alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Avec une première boucle, tu remplis Talpha :
For i = 0 To 25
Talpha[i]=Mid(Alphabet$,i,1)
Next i
Tu déclares ensuite PhraseCodee$="" et Acoder$="AVE CESAR MORITURI TE SALUTANT"
Puis Longueur=len(Acoder$)-1
Et enfin tu lances ta 2e boucle :
For i = 0 To Longueur
lettre$=Mid(Acoder$,i,1)
If...
...
Else....
....
....
....
Next i
Et écriture du résultat obtenu PhraseCodée$
PS3
Je viens de simuler en Python les instructions que je t'ai données, sauf le InStr qui n'existe pas (mais je l'ai remplacé par son équivalent : find), ça colle :
AVE CESAR MORITURI TE SALUTANT
Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF
Dernière modification par yoshi (12-05-2009 18:44:14)
Arx Tarpeia Capitoli proxima...
Hors ligne
#7 17-05-2009 10:44:10
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Bonjour,
Notre ami Genki n'ayant pas redonné signe de vie, probablement terrassé par les légions de Jules Cesar, n'a donc peut-être pas pu, lui, franchir son Rubicon...
Pour ceux que ça intéresse, voici donc, brut de décoffrage (non testé : je n'ai pas VB, mais je serais surpris qu'il ne fonctionne pas) : le petit script VB de codage selon l'algorithme de Cesar :
Dim decalage, rang, rangch, i, Longueur As Integer
Dim Talpha(26) As String
Alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
For i = 0 To 25
Talpha(i) = Mid(Alphabet,i,1)
Next i
PhraseEnClair = "AVE CESAR MORITURI TE SALUTANT"
PhraseCodee = ""
Longueur = Len(PhraseEnClair)-1
decalage = 12
For i = 0 To Longueur
caractere = Mid(PhraseEnClair,i,1)
If caractere = " " Then
PhraseCodee = PhraseCodee + " "
Else
rang = InStr(1,Alphabet,caractere)
rangch = (rang + decalage) Mod 26
PhraseCodee = PhraseCodee + Talpha(rangch)
Next i
MsgBox(PhraseCodee)
Réactions ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#8 17-05-2009 19:40:54
Re : [Visual Basic] Algorithme de Cesar
Lu,
Désolé mais j'ai une question qui n'a aucun rapport direct avec le code :
-qu'est ce qu'un "Rubicon"
Et sinon pour le code il est facilement compréhensible sauf je comprend pas trop dans les Dim les "As" après une variable à quoi servent-ils(serai-ce pour dire quelle style de variable elle est?), et "Talpha(26)" à quoi servent les parenthèses et le 26(je pense que c'est les lettre de l'alphabet mais je ne comprend pas le fonctionnement...)???
@+
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#9 17-05-2009 19:59:20
- Barbichu
- Membre actif
- Inscription : 15-12-2007
- Messages : 405
Re : [Visual Basic] Algorithme de Cesar
Lut,
http://fr.wikipedia.org/wiki/Rubicon
La première section de l'article devrait te permettre de tout comprendre.
++
Barbichu
Hors ligne
#10 17-05-2009 20:15:55
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Hey Lutcho,
C'est un peu comme en Basic Panoramic : il faut déclarer le type des tableaux (et leur taille), et des variables...
Integer : nombre entier relatif
String : qui contient des caractères non numériques...
Ce travail était un exercice imposé, regarde ici les conditions imposées à Genki :
http://www.acyrin.com/sujet-projet-09-cesar.PDF,
on y parle notamment de ce Talpha qui t'intrigue...
Pour moi, Talpha = contraction de Tableau+Alphabet...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#11 18-05-2009 14:34:14
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Bonjour,
Voilà la variante Python de l'algo de cryptage de Cesar, avec la même problématique et en collant au plus près du script Visual Basic :
# -*- coding: Latin-1 -*-
A_Coder="AVE CESAR MORITURI TE SALUTANT"
Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
decalage = 12
Phrase_Codee=""
Talpha=[]
for i in xrange(26):
Talpha.append(Alphabet[i])
longueur=len(A_Coder)
for i in xrange(longueur):
car=A_Coder[i]
if car==" ":
Phrase_Codee+=" "
else:
rangch=(Alphabet.find(car)+decalage)%26
Phrase_Codee+=Talpha[rangch]
print
print " Phrase à coder :"
print A_Coder
print
print " Phrase codée avec un décalage de 12 :"
print Phrase_Codee
Résultat :
AVE CESAR MORITURI TE SALUTANT
Phrase codée avec un décalage de 12 :
MHQ OQEMD YADUFGDU FQ EMXGFMZF
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#12 19-05-2009 00:57:33
- Genki
- Invité
Re : [Visual Basic] Algorithme de Cesar
Bonjour
Je viens au nouvelle, c'est cool de vous êtes autant dévoué à m'accorder votre temps sur ce sujet, malheureusement, suite au blocage de ma FAC, la prof à carrément annulé le projet ><
Tant pis, mais merci pour tout quand même !
Laisser quand même le sujet ouvert on ne sais jamais ^^
Genki.
#14 19-05-2009 20:39:34
Re : [Visual Basic] Algorithme de Cesar
Salut,
Bon je me "ré-incruste" un peu dans le sujet mais c'est juste pour dire merki à Barbichu(pour le Rubicon) et a yoshi(pour les explications) :-)
@+
[edit] Voilà j'ai lu le code python juste après avoir posté le message (oui c'est stupide ^^''), et y a un truc que je comprend pas :
Cette ligne se trouve juste après un else d'une condition qui se trouve dans la boucle de codage ; bon, j'ai compris que tu rechercher le caractère "car" dans l'alphabet avec le .find mais je ne pige pas trop comment tu peux additionné une variable string avec un nombre(12) mais je pense avoir mal compris...
Dernière modification par Lutcho74 (19-05-2009 20:49:01)
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#15 19-05-2009 21:01:30
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 947
Re : [Visual Basic] Algorithme de Cesar
Salut,
Alphabet.find(car) te renvoie la position (en partant de 0) du caractère car dans la chaine Alphabet.
Alphabet.find(car) est donc un nombre entier...
Lance Python.
En mode console tu tapes :
>>> Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> car = "I"
>>> Alphabet.find(car)
Et tu obtiens 8...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#16 20-05-2009 12:26:14
Re : [Visual Basic] Algorithme de Cesar
Salut,
A oui j'avais pas penser à ça....
Merci pour ta réponse, j'aurais appris un nouveau truc avec python :-)
@+
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#17 05-10-2009 20:20:54
- gatha
- Membre
- Inscription : 28-09-2009
- Messages : 46
Re : [Visual Basic] Algorithme de Cesar
bonsoir
ce sujet est passionant, en l'occurence, il me rappelle le système de codage allemand
"Enigma". destiné essentiellement aux U-Boats.
Sa force résidait dans le fait qu'il est "facile" de décoder en fonction de la fréquence d'apparition des lettres.
En français, par exemple, on repère vite le E car c'est la lettre la plus usitée.
Enigma, par un simple jeu de rouleaux de décalage, codait chaque lettre différement selon sa fréquence au sein du message. Ainsi je tape un a, apparaît un nb. je retape un a c'est un autre nb qui s'affiche.
Je crois savoir que les systèmes de codage US st basés sur les nombres premiers.
quelqu'un en sait-il plus?
Bonne soirée à tous et Semper en dabant!
Hors ligne
Pages : 1