Bonjour à tous !
Alors je voudrais savoir comment faire pour convertir un texte (changer les lettres pour d'autre)
Ex: Bonjour où,
A = Z
B = Y
C = X
,etc...
et "bonjour" devient par exemple : YLMQLEI
Merci d'avance
-----
Bonjour à tous !
Alors je voudrais savoir comment faire pour convertir un texte (changer les lettres pour d'autre)
Ex: Bonjour où,
A = Z
B = Y
C = X
,etc...
et "bonjour" devient par exemple : YLMQLEI
Merci d'avance
Hello,
le plus souvent on crée une table qui associe à chaque lettre «en clair» la lettre «qui crypte».
L'implémentation dépend du langage évidemment ainsi que du character set utilisé. Tu essayes de le faire dans un langage particulier ?
Je suis en C# WPF, j'utilise un fichier texte dans lequel chaque ligne est une lettre "codé" dans l’ordre alphabétique, je lis chaque lignes et pour chaque lettres (a,b,c,d) j'utilise Textbox.Text.Replace("a", Lignes[1])
Le problème, c'est qu'il marche seulement à moitié ex:
abcdefghijklmnopqrstuvwxyz et il me donne, abcdefghijklmmlkjihgfedcba, où A = Z, B= Y, C=X, etc.
Comme vous le voyez, il commence à inverser après M.
Donc je vous savoir comment faire pour corriger ce bug.
Merci d'avance
themoder
Sans code ça va être un peu dur ... Il va falloir le poster.
Désoler j'ai oublier x)
Code:private void CodeClick(object sender, RoutedEventArgs e) { StreamReader Code = new StreamReader(AppDomain.CurrentDomain.BaseDirectory + comboBox1.SelectedItem + ".txt"); int NbrLigne = 27; string[] LineNumber = new string[NbrLigne]; for (int i = 1; i < NbrLigne; i++) { LineNumber[i] = Code.ReadLine(); } TextCrypter.Text = TextNonCrypter.Text. Replace("a",LineNumber[1]). Replace("b",LineNumber[2]). Replace("c",LineNumber[3]). Replace("d",LineNumber[4]). Replace("e",LineNumber[5]). Replace("f",LineNumber[6]). Replace("g",LineNumber[7]). Replace("h",LineNumber[8]). Replace("i",LineNumber[9]). Replace("j",LineNumber[10]). Replace("k",LineNumber[11]). Replace("l",LineNumber[12]). Replace("m",LineNumber[13]). Replace("n",LineNumber[14]). Replace("o",LineNumber[15]). Replace("p",LineNumber[16]). Replace("q",LineNumber[17]). Replace("r",LineNumber[18]). Replace("s",LineNumber[19]). Replace("t",LineNumber[20]). Replace("u",LineNumber[21]). Replace("v",LineNumber[22]). Replace("w",LineNumber[23]). Replace("x",LineNumber[24]). Replace("y",LineNumber[25]). Replace("z",LineNumber[26]); }
Poste également le contenu exact de ton fichier.
Le conseil habituel : Papier et crayon pour voir ce que fait ton algo
P.S. : les tableau en C# commence à 0 pas à 1.
Dans mon fichier :
z
y
x
w
v
u
t
s
r
q
p
o
n
m
l
k
j
i
h
g
f
e
d
c
b
a
Et merci pour l'info sur les tableaux
Meme si je change la ligne Replace("b", "y"). , b devient quand meme b
Vu ton fichier je comprends mieux. Papier crayon, et reprends ton algo, étapes par étapes, notamment l'hallucinant appel (indice: le problème vient de là) :
J'adore encore plus avec cette présentationCode:TextCrypter.Text = TextNonCrypter.Text.Replace("a",LineNumber[1]). Replace("b",LineNumber[2]).Replace("c",LineNumber[3]).Replace("d",LineNumber[4]).Replace("e",LineNumber[5]).Replace("f",LineNumber[6]).Replace("g",LineNumber[7]).Replace("h",LineNumber[8]).Replace("i",LineNumber[9]).Replace("j",LineNumber[10]).Replace("k",LineNumber[11]).Replace("l",LineNumber[12]).Replace("m",LineNumber[13]).Replace("n",LineNumber[14]).Replace("o",LineNumber[15]).Replace("p",LineNumber[16]).Replace("q",LineNumber[17]).Replace("r",LineNumber[18]).Replace("s",LineNumber[19]).Replace("t",LineNumber[20]).Replace("u",LineNumber[21]).Replace("v",LineNumber[22]).Replace("w",LineNumber[23]).Replace("x",LineNumber[24]).Replace("y",LineNumber[25]).Replace("z",LineNumber[26]);
Quand je dis étape par étape ça veut dire réécris ta chaine à chaque appel de Replace (au bout 13-14 réécriture tu devrais voir le problème).
Est-il possible qu'il reconvertisse ce qu'il a déja converti ?
re-,
si tu as suivi le conseil de bzh_nicolas tu n'as plus aucun doute ... c'est le cas.
si je peux me permettre quelques remarques :
* tu ouvres un fichier, le lis, construis la table à chaque clic ... plutôt moyen
J'imagine que tu as construit ton interface avec juste un bouton. C'est peut- être à revoir.
Soit séparer la lecture du fichier et le codage d'une chaine, soit ne charger le fichier que si nécessaire.
* tu devrais créer un objet qui gère l'encodage
* tu devrais choisir un autre algorithme pour encoder, en parcourant la chaine à encoder caractère par caractère par exemple
* utiliser un stringbuilder ?
Re,
Je suis semi-débutant en C#, si vous pouviez un peu m'aider, sa serait vraiment sympa
1. Un objet qui gère l'encodage, c'est quoi plus précisement ?
2. J'avais penser à faire cette algo (juste après ma découverte x) ), comment pourrais-je le faire ? Avec un boucle ?
3. ... Un stringbuilder c'est quoi ?
Merci de votre aide
Je vais essayer d'être clair, tu me dis où tu as des problèmes pour comprendre
1. L'idée est d'écrire une classe, on va la nommer Decodeur. Cette classe va se charger de lire le fichier, et offrira une méthode pour décoder une chaine de caractère.
Vois-tu comment faire cela ?
2. Oui une boucle est ce qu'il te faut pour ça
3. En c# les string sont immutables, cela signifie qu'une fois créé un string ne peut plus être modifié. Par exemple quand tu écris quelquechose du genre : s=s.replace("a","b"), par derrière le code génère un nouveau string où toutes les occurences de a sont remplacés par des b. L'ancien string sera détruit lors du prochain passage par le GC.
Faire énormément de manipulations sur les strings peuvent vite devenir inneffectives. La solution est d'utiliser un objet StringBuilder (un constructeur de string). Un string builder te permet de faire des manipulations sur les chaines et quand tout est fini un appel à la méthode ToString te donne le string final.
4. Il faut essayer de gérer les erreurs ... le fichier n'est pas trouvé, pas lisible, ne contient pas la bonne information ...
5. Tu peux essayer de regarder du côté des collections génériques. Il y a les Dictionary.
En gros tu déclares Dictionary<char,char> Translate = new Dictionary()
Tu peux ajouter des paires d'éléments :
Translate.Add('a','z')
Translate.Add('b','y')
...
Translate.Add('z','a')
L'indexeur Translate['c'] te renvoie ´x´.
Pratique
1. La classe je suis pas trop sur, de comment faire, juste un petit exemple de ce que c'est et ca devrait aller, et dedans je mets, la méthode pour lire mon fichier et pour décoder le texte entré ?
2. La boucle je la fais comment ? Je ne sais pas exactement quel méthode prendre pour lire un à un les caractères et les changers.
3. Comment j'utilise le stringBuilder ?
Note: le fichier de code est choisi dans un combobox
Tu débutes en c# mais ce que tu essayes de faire est un exercice que tu dois faire ?
Non simplement un projet perso, j'ai déja fais un petit jeux et un logiciel de transfert vers un serveur FTP
Effectivement, c'est la rançon du progrès.Envoyé par Photon573. En c# les string sont immutables, cela signifie qu'une fois créé un string ne peut plus être modifié. Par exemple quand tu écris quelquechose du genre : s=s.replace("a","b"), par derrière le code génère un nouveau string où toutes les occurences de a sont remplacés par des b. L'ancien string sera détruit lors du prochain passage par le GC.
Faire énormément de manipulations sur les strings peuvent vite devenir inneffectives. La solution est d'utiliser un objet StringBuilder (un constructeur de string). Un string builder te permet de faire des manipulations sur les chaines et quand tout est fini un appel à la méthode ToString te donne le string final.
http://www.dotnetperls.com/replaceEnvoyé par DotnetperlsBenchmarks
Here we want to see if there is a difference between Method A, which uses string Replace, and Method B, which uses StringBuilder Replace. It is great to read MSDN and know the two are different—but is the timing different significant?
Replace methods benchmark for short strings
20 characters in strings; 10000 iterations.
Method A - String Replace: 5.60 seconds
Method B - StringBuilder Replace: 0.62 seconds [faster]
Replace methods benchmark for long strings
1000 characters in strings; 10000 iterations.
Method A - String Replace: 21.80 seconds
Method B - StringBuilder Replace 4.89 seconds [faster]
Merci
Mais par quel algo je pourrais remplacer l'ancien ? Je sais pas trop comment faire pour lire un caractere a la fois et le changer
Une petite réponse rapide ...
s.Length te donne la longueur de la chaîne de caractères en nombre de caractères UTF16
s[0] pour accéder au premier, s[1] pour le second etc ...
une solution avec une boucle for est :
À tout moment tu as la position du caractère courant et tu peux facilement accéder au précédant ou au suivant par exempleCode:for(int i=0; i<s.Length;i++) faire qqch avec s[i]
Une autre solution est
Tu n'as pas directement la position courante.Code:foreach(char c in s) faire qqch avec le caractère c
Tu as aussi une autre méthode qui utilise Linq mais là ça c'est pour un niveau plus avancé.
Ok pour,
Je ne sais pas trop se que je pourrais faire avec :/Code:for(int i=0; i<s.Length;i++) faire qqch avec s[i]
Si tu disposes d'une fonction Encode qui admet un caractère en entrée et qui renvoie le caractère crypté le tour est joué ...
A priori, vu que tu débutes, je ne peux que te conseiller de d'abord raisonner en Français pour construire un algo, puis le traduire en c#.Code:for(int i=0; i<s.Length; i++) res=res+Encode(s[i]);
Bon, la classe qui encode, sa marche comment ? et "res" est-ce Résultat ?
Pour apprendre il vaut mieux y aller doucement d'abord et seulement écrire une fonction Encode. res est juste un string qui contient la chaine encodée à la fin du l'algorithme.
Oui mais comment je creer la classe Encoder ? je ne suis pas sur de comment faire :/
On ne parle plus de classe. On oublie ça pour l'instant.
Sais-tu créer une fonction ?
Non :/ en fait, que veu tu dire par une fonction? je ne suis pas encore tres famillier avec le jargon de programmeur :/
OK, il va d'abord falloir que tu apprennes ce qu'est une fonction pour pouvoir aller plus loin.
En gros une fonction est un morceau de code auquel tu passes des paramètres et qui te rend un résultat ou effectue une action particulière. Par exemple CodeClick est une fonction.
Tu peux écrire tes propres fonctions et les appeler dans ton code.
As-tu déjà fait quelquechose de similaire ?
OK comme pour moi, CodeClick est déclencher par un évenement, lors du click sur un bouton, donc, lorsque je click, la fonction CodeClick s'active ?
La fonction exécute les "méthodes"(<--- pas sur du mot :/) dans celle ci ?
C'est un peu plus compliqué que ça ...
L'événement s'appelle Click, quand il est activé, toutes les fonctions enregistrées seront exécutées.
Le plus simple à mon avis est que tu commences par apprendre le langage en suivant un tutoriel. Tu en trouveras un très bon avec toutes les ressources nécessaires sur http://tahe.developpez.com/dotnet/csharp/.