Probleme exercice

Ouais ben le voilà : cryptage_decryptageV3

Bon c'est loin d'être parfait, il manque pas mal de gestion d'erreur je pense, et peut-être d'optimisation. J'ai mis quelques remarques dans le classeur.

Après je me demandais si on pouvait pas passer par des variables tableau et des boucles pour le calcul des matrices, et pouvoir proposer de créer une matrice 2x3 ou 3x2 ou 4x4,...

Je vous l'envoie juste avant le w-e, comme ça ça vous laisse 2 jours pour réfléchir aux améliorations

Bon w-e

L’objectif premier de ce projet est de vous permettre d’assimiler les outils qui vous ont été présentés lors des 3 séances de TD en utilisant un maximum de ces outils lors de la conception d’une « note de calcul » conviviale, sécurisée, fonctionnelle et performante

Quels sont ces outils gégé? Peut-être que ça pourrait nous aider à t'aider mieux!!

Salut sylvain, gégé et le forum,

Après quelques tests, il se trouve que ton problème d'espace en fin de texte existe aussi pour les matrices 3x3.

1. Par exemple, en mettant un espace à la fin du message à coder suivant : "CA Y EST CA MARCHE", le message crypté (avec la matrice 3x3 par défaut) est le même que s'il n'y avait pas d'espace.

En fait je ne vois pas trop d'où vient le problème car j'avoue que ce que tu as fait sylvain commence à ne plus être de mon niveau!!

Je savais même pas que ce que tu as codé en VBA existait!!

2. Une autre ptite (!) amélioration consiste à faire en sorte que lorsqu'on choisit de créer sa propre matrice 3x3, lorsqu'on appuie sur "Tabulation", le curseur aille dans "l'ordre" des cases!!

Je m'explique. Soient :

1 2 3

4 5 6

7 8 9

les neuf cases de la matrices 3x3. Le curseur est par défaut en case 1. Il serait bien que lors de l'appui sur la touche Tab, le curseur aille en 2, puis en 3, puis en 4 et ainsi de suite.

Dans ton cas sylvain, le curseur va dans l'ordre suivant : 1, 2, 4, 5, puis sur le bouton OK (!), puis sur 8, 7, 9, 6, 3!! Ceci est dû au fait que tu n'as pas dessiné les boutons dans le bon ordre!!

3. Lors de la création de notre propre matrice, si on ne rentre pas de valeur et qu'on clique sur OK, une erreur de type "Incompatibilité de type" est retournée.

Voilà sylvain quelques améliorations possibles! Vu que t'es le plus en mesure d'ajouter ces améliorations et que j'ai seulement un rôle plus basique (celui d'énoncer ces améliorations ), j'espère que ça te dérange pas!!

vba-new a écrit :

en mettant un espace à la fin du message à coder suivant : "CA Y EST CA MARCHE", le message crypté (avec la matrice 3x3 par défaut) est le même que s'il n'y avait pas d'espace

Oui c'est bien ce que je dis : j'avais choisi ce message car il contient 18 caractères, donc multiple de 2 et de 3.

Si tu ajoutes 1 ou 2 caractères avec une matrice 3x3, ils sont négligés, car le "produitmat" ne marche pas avec les dernières valeurs nulles...

Donc moi ce que je veux c'est ajouter des espaces pour arriver à un multiple de 2 ou de 3, en fonction de la matrice utilisée.

vba-new a écrit :

lorsqu'on appuie sur "Tabulation", le curseur aille dans "l'ordre" des cases!!

Ouais ça j'avais vu aussi... J'ai pas trop l'habitude des userforms encore, mais je pense que je devrais arriver à le résoudre, en renommant les textbox dans leur ordre de création. Le problème vient du fait que j'ai copié le userform 2x2 pour faire le 3x3.

vba-new a écrit :

Lors de la création de notre propre matrice, si on ne rentre pas de valeur et qu'on clique sur OK, une erreur de type "Incompatibilité de type" est retournée.

Là c'est de la gestion d'erreur, ça doit pas être trop compliqué mais ça prend du temps, c'est pour ça que je l'avais sauté jusqu'ici... Tout comme si tu as un message trop long je quitte tout, alors qu'il serait plus agréable de reprendre l'inputbox, mais j'avais la flemme

Vu le temps qu'il fait chez moi ce w-e, je pense que je vais consacrer un peu de temps à améliorer tout ça.

gege a écrit :

...... Ben non il a pas écrit grand chose en fait...

Allez plus qu'une semaine et on n'a toujours pas tes remarques...

Salut sylvain,

J'ai fait une petit modif des userforms pour que le curseur aille dans l'ordre. Ce sera déjà ça de fait!! (Si ce n'est pas déjà fait )

https://www.excel-pratique.com/~files/doc2/cryptage_decryptageV4_userform_bon.zip

Re,

1. Après une petite recherche sur internet, regarde ce que j'ai trouvé sylvain : http://www.apprendre-en-ligne.net/crypto/hill/hill3.html

Ca pourrait t'aider je pense!! Ca parle de la cryptographie de Hill avec matrice 3x3.

2. Dans le fichier que tu avais mis en ligne, ta dernière remarque était judicieuse :

La matrice inverse ne doit contenir que des arguments entiers, ce qui n'est souvent pas le cas pour des matrices rentrées au hasard. Il faudrait le vérifier et interdire la procédure si ça ne colle pas.

En fait, ceci est vrai si on calcule la matrice inverse de façon "ordinaire".

Apparemment, dans la cryptographie de Hill, le calcul de l'inverse d'une matrice se fait modulo 26. Pour justement se retrouver qu'avec des nombres entiers non négatifs dans les arguments de la matrice inverse.

Explication à l'adresse suivante : http://www.apprendre-en-ligne.net/crypto/hill/index.html

Dans notre cas, on calculerait l'inverse de la matrice modulo 27 (car 26 caractères + espace).

Seulement voilà, ce point n'a visiblement pas été pris en compte (mais pourrait servir à remonter la note ) dans le sujet de gégé. On ne se préoccupe pas du "modulo 27" (qui signifie : "le reste de la division par 27"). L'inverse matriciel se calcule de manière basique.

Il existe des algorithmes efficaces pour déterminer l'inverse de k (mod n), par exemple l'algorithme d'Euclide étendu. Mais quand n=26, la méthode "force brute" est sans doute la manière la plus simple

Oui mais nous on a n=27, alors force brute ou pas ??

Bon j'avais vu ton post hier soir, mais un fois de plus j'avais pas ma clé USB pour récupérer ces infos et essayer de les assimiler à tête reposée...

Du coup je me suis pas occupé de ça, ni d'aucune gestion d'erreur d'ailleurs. Je reconnais que c'est un point super important pour rendre un travail propre, mais ça m'amuse pas trop, donc flemme (eh oui je sais je suis incorrigible )

A la place je me suis grillé quelques neurones à mettre en place un système de boucles pour utiliser le même code, quels que soient les nombres de lignes et de colonnes de la matrice d'encryptage... 8)

Un boulot pas facile, pour un résultat pas facile à comprendre non plus je pense

Pas testé à 100% mais il semble que ça marche quand même.

Un point faible à cette nouvelle méthode : comme j'utilise un copier-coller pendant la mise en place des matrices, on ne peut pas coller un message dans l'userform de saisie. Ou bien il faut aller le chercher dans une autre application qu'excel, après que l'userform soit apparu

Enfin je suis pas mécontent quand même

Ce qu'il faudrait faire maintenant de facile : un seul bouton "matrice perso", qui renvoie sur un userform pour choisir de créer une 2x2, 2x3, 3x2 ou 3x3

Moi je m'occupe de dire que si les arguments inverses ne sont pas entiers on quitte la procédure avec un message d'erreur, ce ne sera pas très élégant mais bon...

Ah oui voici quand même mon fichier : cryptage_decryptageV5

PS : Gege si tu passes par là, ce serait sympa d'éditer ton premier message, pour remplacer le titre du sujet par "Matrice de cryptage" par exemple (pour permettre des recherches)

Salut sylvain, tu m'as l'air d'avoir fait du bon travail!!

Sylvain TBM a écrit :

mais ça m'amuse pas trop, donc flemme

J'ai fait !! C'est un peu mon cas aussi ! Et vu que gege nous motive pas trop, encore plus flemme!!

J'ai regardé ton fichier Sylvain, j'ai vu que t'a créé de nouvelles macros mais j'avoue ne pas trop comprendre le code!!

Sylvain TBM a écrit :

Il existe des algorithmes efficaces pour déterminer l'inverse de k (mod n), par exemple l'algorithme d'Euclide étendu. Mais quand n=26, la méthode "force brute" est sans doute la manière la plus simple

Oui mais nous on a n=27, alors force brute ou pas ??

Je dirais que oui. Pour n=27, ça change pas grand chose.

Sylvain TBM a écrit :

Ce qu'il faudrait faire maintenant de facile : un seul bouton "matrice perso", qui renvoie sur un userform pour choisir de créer une 2x2, 2x3, 3x2 ou 3x3

Ah bon

Sylvain TBM a écrit :

Moi je m'occupe de dire que si les arguments inverses ne sont pas entiers on quitte la procédure avec un message d'erreur, ce ne sera pas très élégant mais bon...

Oui je pense que t'as raison, et pis ça fait moins de travail . Je dis ça plus pour toi sylvain que pour moi!

désolé de ne pas être la pendant un certain temps ( pas chez moi^^)

Salut Gege,

Je vais essayer de regarder dans ton sens.

Je comprends pas trop ce point :

Gege a écrit :

il faut forcément que je réinitialise sur VBA pour a chaque fois changer de mot

Pour l'instant juste un petit truc au vol : si tu veux éviter de passer par tes formules lourdes (mais audacieuses ) pour récupérer les caractères du message, tu peux remplacer ta macro Private Sub Btn_codage_Click() par

Private Sub Btn_codage_Click()
Dim Message As String, Caractere As String
Dim i As Byte

Message = Edit_codage.Value
Range("A19:A70").ClearContents

For i = 1 To Len(Message)
    Caractere = Mid(Message, i, 1)
    [code]Sheets("donnees").Range("A18").Offset(i, 0) = Caractere

Next i

End Sub[/code]

En français : Tu fais évoluer une variable i de 1 jusqu'au nombre de caractères du message (avec un pas de 1)

Pour chaque valeur que prend i

Caractere = Mid(Message, i, 1)

isole le caractère qui se trouve en position i dans la chaîne de caractère "Message"

Sheets("donnees").Range("A18").Offset(i, 0) = Caractere

copie le caractère dans la cellule A18, décalée de i lignes

Gege a écrit :

je n'arrive pas a regrouper toute les lettres en une phrase pour l'incorporer dans la boite de dialogue

Commence à réfléchir en te servant de la boucle ci dessus (for i = 1 to ... )

Ce qu'il te faut faire : prendre chaque cellule de E19 jusqu'à la dernière remplie (ou jusqu'au nombre de caractères du message, puisque tu le connais)

pour chaque cellule (chaque valeur de i) tu récupères le caractère, et tu dis que ton message = le message + le caractère

Tu auras donc pour i=1 : message = "" & O

pour i=2 : message = O & L

pour i=3 : message = OL & T

pour i=4 : message = OLT & W

Bon courage, si tu comprends ça, tu t'ouvriras des possibilités énormes

ok merci

pour le point que tu n'a pas compis en fait il n'y a pas de probleme

sinon pour le premier point que tu as écrit je ne comprend pas car cela ne marche pas à moins que j'ai oublié de faire quelque chose

j'ai changer le code sur vba mais après il faut faire quelque chose d'autre?

pour le second point expliquer il faut que je marque cette fonction sur vba sur la zone de texte où je veux que la phrase s'affiche??

gege37 a écrit :

sinon pour le premier point que tu as écrit je ne comprend pas car cela ne marche pas à moins que j'ai oublié de faire quelque chose

j'ai changer le code sur vba mais après il faut faire quelque chose d'autre?

Non quand tu cliqueras sur le bouton "Coder un message" (après avoir rempli la TextBox Edit_Codage bien sûr), ça va mettre les lettres dans les cellules directement, plutôt que de passer par tes formules et ton copier-coller transposé

gege37 a écrit :

pour le second point expliquer il faut que je marque cette fonction sur vba sur la zone de texte où je veux que la phrase s'affiche??

Non plus, tout doit se passer dans la macro "Private Sub Btn_codage_Click()"

Tu ajoutes du code pour récupérer ta variable "message codé", puis tu l'affectes à la valeur de la TextBox "Edit_reponse1"

j'ai un petit problème mais vba me dit qu'il y a une erreur de compilation sur le premier programme marqué et je ne comprend pas pourquoi même si l'avnt dernière ligne (

Sheets("donnees").Range("A18").Offset(i, 0) = Caractere

)

voila

heu j'ai remarqué un petit problème dans mon programme

je remarque que mon codage ne donne pas le même résultat que pour le codage meme si les premières sont bonnes

est ceque quelcun a la solution

Je viens de m'apercevoir que dans le code que je t'ai donné, j'aurais dû mettre

Sheets("donnees").Range("A19:A70").ClearContents

sinon on efface la plage sur la feuil1 puisque c'est elle qui est active...

Bon pour ton classeur et pour qu'on soit d'accord je te le renvoie un peu modifié : https://www.excel-pratique.com/~files/doc2/projet_inf2_1V2.xls

J'ai ajouté du code (Sub Matrices) pour le choix de la matrice à utiliser. En passant par des "If" comme tu l'avais envisagé.

Donc en fonction de la matrice choisie, je la copie en O36:P37, et les formules se mettent à jour.

Puis comme je te l'avais annoncé, je récupère la chaîne cryptée ou décryptée, et je l'affiche dans la textbox correspondante.

Regarde et dis nous.

PS : j'aime bien l'utilisation de ton userform : sobre et pratique. Peut-être pourrais tu afficher des images comme j'avais fait, pour savoir qu'est ce qu'on utilise comme matrice

Et pour le plaisir et les remarques, je mets aussi où j'en étais avec mon classeur (gestion d'erreur améliorée si caractères interdits, ajout d'espaces pour arriver au bon nombre de caractères,...) : cryptage_decryptageV6

j'ai un problème

mon problème est si difficile que cela^^

Salut gege,

Qu'est-ce que la variable Lig? A quoi est-elle égale?

je ne peut pas le dire sa n'est pas moi qui est écrit cette partie de programme

logiquement enfin je pense que lig correspond à la ligne comme col correspond à la colonne

Rechercher des sujets similaires à "probleme exercice"