Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour Code César en Js

    30 décembre 2017 à 20:55:17

    Bonjour je suis entrain de coder un Chiffre de César cependant quand il y a un décalage qui dépasse 25 (sort de l'alphabet) je n'arrive pas a revenir au début ce qui est clairement embêtent, cependant le code fonctionne très bien pour le reste... Merci d'avance

    function chiffreEnCesar() {
    
    			var texteDechiffre = document.getElementById('texteDechiffre').value;
    			var decalage = document.getElementById('decalage').value;
    			//	alert(decalage);
    			texteDechiffre = texteDechiffre.toUpperCase();
    			//alert(texteDechiffre);
    			var tabSortie = [];
    			var tabRang = [];
    
    			for(i = 0; i < texteDechiffre.length; i++) {
    				tabRang.push(decalageRang(texteDechiffre[i]));
    				//alert(tabRang[i]);
    
    			}
    
    			for (var j = 0; j < tabRang.length; j++) {
    				tabSortie.push(swapRangLettre(tabRang[j]));
    				//alert(tabSortie[j]);
    			}
    
    			var texteSortie = tabSortie.join("");
    			texteSortie = texteSortie.toLowerCase();
    			document.getElementById("texteChiffre").innerHTML = texteSortie;
    			
    			//alert(texteSortie);
    
    
    			function decalageRang(lettreMaj){
    				var valeur = 65-decalage;
    				var outputRangLettreMaj = lettreMaj.charCodeAt() - valeur;
    				if(outputRangLettreMaj > 25){
    					
    				}
        			return outputRangLettreMaj;
       			 }
    
       			 function swapRangLettre(Rang){
       				var rang = Rang+65;
       			 	var outputswapRangLettre = String.fromCharCode(rang);
       			 	return outputswapRangLettre;
       			 }
    	}
    	function dechiffreEnCesar() {
    		var texteChiffre = document.getElementById('texteChiffre').value;
    		var decalage = document.getElementById('decalage').value;
    		texteChiffre = texteChiffre.toUpperCase();
    		var tabDeChiffre = [];
    		var tabDecalageRang = [];
    
    
    			for(z = 0; z < texteChiffre.length; z++) {
    				tabDecalageRang.push(decaleRang(texteChiffre[z]));
    
    			}
    
    			for (var x = 0; x < tabDecalageRang.length; x++) {
    				tabDeChiffre.push(swapRangDechiffre(tabDecalageRang[x]));
    			}
    
    			var texteDechiffre = tabDeChiffre.join("");
    			texteDechiffre = texteDechiffre.toLowerCase();
    			document.getElementById("texteDechiffre").innerHTML = texteDechiffre;
    
    			function decaleRang(lettreMaj){
    				var ValeurRang = 65 + parseInt(decalage);
    				var outputRandDecale = lettreMaj.charCodeAt() - ValeurRang;
        			return outputRandDecale;
       			 }
    
       			 function swapRangDechiffre(Rang){
       				var rang = Rang+65;
       			 	var rangDechiffre = String.fromCharCode(rang);
       			 	return rangDechiffre;
       			 }
    	}
    <body>
    	<div> 
    		<p>Texte dechiffre</p>
    		<textarea id="texteDechiffre"></textarea> 
    		<p>Texte chiffre en Cesar</p>
    		<textarea id="texteChiffre"></textarea> 
    	</div>
    	<p>Decalage de : </p>
    	<div>
    		<input type="text" name="decalage" id="decalage">
    	</div>
    
    	<input type="submit" value="Chiffre" onClick="chiffreEnCesar();"/>
    	<input type="submit" value="Dechiffre" onClick="dechiffreEnCesar();">
    </body>
    p {
    			font-size: 110%
    		}
    		#texteDechiffre {
    			width: 500px;
    			height: 300px;
    			border: 3px black solid;
    			border-radius: 10px;
    			font-size: 110%;
    
    		}
    		#texteChiffre {
    			width: 500px;
    			height: 300px;
    			border: 3px black solid;
    			border-radius: 10px;
    			font-size: 110%;
    
    		}
    		#decalage {
    			border: 3px black solid;
    			border-radius: 6px;
    		}




    -
    Edité par EliottDonatien 30 décembre 2017 à 21:01:04

    • Partager sur Facebook
    • Partager sur Twitter
      1 janvier 2018 à 15:58:37

      Il faut raisonner modulo 26 ! C'est-à-dire que le décalage doit être remplacé son reste dans la division par 26

      Beaucoup de code pour pas grand chose :

      var str="BONJOUR";
      var dec=Math.floor(Math.random()*26);
      
      var csr=str.split("").map(function(rng){return String.fromCharCode(65+(rng.charCodeAt(0)-65+dec)%26)}).join("");
      
      console.log(str+" "+dec+" "+csr)

      EDIT : J'avais oublié de revenir à une chaine de caractère =>join("");

      -
      Edité par 007julien 6 janvier 2018 à 12:50:23

      • Partager sur Facebook
      • Partager sur Twitter
        2 janvier 2018 à 10:41:53

        Merci 007julien, cependant j'aimerais bien que tu m'aide pour mon cas présent malgré que ton idée soit ingénieuse je ne code pas depuis si longtemps du coup je préfèrerais utilisé ma méthode merci...
        • Partager sur Facebook
        • Partager sur Twitter
          2 janvier 2018 à 16:44:38

          Avec:

          var decalage = parseInt(document.getElementById('decalage').value) % 26;





          -
          Edité par Krogoth 2 janvier 2018 à 16:46:53

          • Partager sur Facebook
          • Partager sur Twitter
          Un petit +1 si je vous ai aidé est toujours appréciable :).
            6 janvier 2018 à 13:35:45

            Partant d'une lettre de code c, il convient de calculer en premier lieu c-65 (le décalage par rapport au A) puis d'ajouter le décalage de César (noté d, soit c-65+d) en veillant à ce que ce nombre ne dépasse pas 26 d'où le (c-65+d)%26 à ajouter à 65 pour obtenir le nouveau code.

            Ceci dit, il convient encore de vérifier que le décalage initial est positif et inférieur à 25 pour conserver les caractères différents des lettres majuscules (comme les espaces code 32 et autres signes de ponctuation...).

            D'où un schéma de script plus clair

            function chiffrer(s){
               var dec=... // le décalage positif inférieur à 26 (ajouter 26 tant que dec<0 puis prendre un %26)
               var txt=... // le texte à chiffrer
               var lng=txt.length; // sa longueur
               var csr="",code,i;
            
               for (i=0;i<lng;i++) {
                  code=txt.charCodeAt(lng);
                  if (64<code && code<91) csr+=String.fromCharCode(65+(code-65+dec)%26);
                 else csr+=String.fromCharCode(code);
               }
               return csr;
            }
            
            Ensuite pour décoder, on peut utiliser la même fonction en changeant simplement le signe du décodage (et en ajoutant 26 pour retrouver un décalage positif). D'où un argument s comme signe que l'on utilisera avec un dec=0<s?dec:26-dec
            • Partager sur Facebook
            • Partager sur Twitter

            Aide pour Code César en Js

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown