Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rotation alphabétique

Langage C

    26 septembre 2022 à 17:59:53

    Bonjour à tous.

    J'aurai besoin de votre aide s'il vous plait.
    Je dois écrire une fonction en langage C qui effectue une rotation alphabétique de N éléments sur une chaîne de caractères fournies en paramètre, et quand on arrive à la fin de l'alphabet on revient au début.
    Par exemple faire une rotation :
    - de 3 éléments sur 'Y' donne 'B' ;
    - de -2 éléments sur 'f' donne 'd' .

    Aussi la fonction doit pouvoir gérer les majuscules et les minuscules, et laisser inchangés les caractères non alphabétiques.

    J'ai écris la fonction void alphaRotate et dans mon programme j'ai pris comme exemple la chaine str[]="Bonjour toi"  :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void alphaRotate(char* str, int n)    		  	 		 		   		 
    {    		  	 		 		   		 
        for (int i=0; str[i]!='\0'; i++)    		  	 		 		   		 
        {    		  	 		 		   		 
            if ((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z'))    		  	 		 		   		 
            {    		  	 		 		   		 
                printf("%c", str[i] += n);    		  	 		 		   		 
            }
            else
            {
                printf("%c", str[i]);
            }
        }    		  	 		 		   		 
    }    		  	 		 		   		 
    
    
    int main(int argc, char **argv)
    {
        char str[]="Bonjour toi";
        
        alphaRotate(str, 1);    
        return 0;
    }

    Le problème est que je ne sais pas comment faire pour revenir au début de l'alphabet. C'est-à-dire que si mon caractère='Z' et que je veux faire une rotation de 2 éléments, ma fonction va afficher le caractère '\' alors qu'il devrait afficher 'B'.

    Pourriez-vous m'aider s'il vous plait ?

    Merci beaucoup.

    • Partager sur Facebook
    • Partager sur Twitter
      26 septembre 2022 à 18:52:15

      combien de lettres entre 'A' et 'Z' (ou 'a' et 'z') ? 

      comment tu ferais une rotation de chiffres de 0 à 9 selon le même principe? (9+2 => 1; 1-3=>8)?

      indices (j'espère):

      9+2=11=X+1

      1-3=-2=>8=X-2

      mais 5+3=8=0*X+8

      • Partager sur Facebook
      • Partager sur Twitter
        26 septembre 2022 à 19:07:15

        Pour décaler  'Y' de 3.

        • c'est une majuscule
        • on regarde sa  distance à 'A' . 'Y' c'est 89 (dans le code ASCII), 89 - 65 c'est 24.
        • 24 + 3 = 27
        • 27 étant >=  24, on lui enlève 26 (*). Il reste 1
        • 'A' + 1 = 'B'
        (*) Si on envisage de décaler de + de 26; voir le reste de la division. Attention, si on veut aussi un décalage négatif, le modulo est piégeux.

        -
        Edité par michelbillaud 26 septembre 2022 à 19:08:51

        • Partager sur Facebook
        • Partager sur Twitter
          26 septembre 2022 à 20:46:21

          Un code simple, juste pour les majuscules
          #include <stdio.h>
          
          // Juste pour les majuscules
          
          char Shift(int c,int n) {
          	c+=n;
          	if(c>'Z')
          		c-=26;
          	if(c<'A')
          		c+=26;
          	
          	return(c);
          }
          
          
          
          void TestShift(int c,int shift) {
          	printf("%c + (%d) --> %c\n",c,shift,Shift(c,shift));
          }
          
          
          int main(void) {
          	TestShift('Y',12);
          	TestShift('B',-8);
          	TestShift('A',-1);
          	TestShift('A',1);
          	TestShift('A',0);
          	return(0);
          }
          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            27 septembre 2022 à 1:26:57

            Ceci semble fonctionner même pour les décalages négatifs:
            -
            #include <stdio.h>
            #include <ctype.h>
             
            void rotate(char string[], int shift) {
                shift = ((shift % 26) + 26) % 26;
                for( ; *string; string++) {
                    if(isalpha(*string)) {
                        char haHA = (islower(*string)) ? 'a' : 'A';
                        *string = ((*string - haHA) + shift) % 26 + haHA;
                    }
                }
            }
             
            int main(void) {
                char str[] ="Bonjour chez vous, je suis le numero 6";
                rotate(str, -53);
                printf("%s\n", str);
            }
            -

            Anmintq bgdy untr, id rthr kd mtldqn 6

            -
            Edité par PierrotLeFou 27 septembre 2022 à 2:39:29

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              27 septembre 2022 à 6:23:41

              Merci beaucoup pour vos réponses ça m'a bien aidé. Il y a tellement de méthode en fait je n'y avait pas pensé
              • Partager sur Facebook
              • Partager sur Twitter

              Rotation alphabétique

              × 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