Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Inversion des lettres d'un mot


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inversion des lettres d'un mot
    Bonjour,

    Je suis en train d'essayer de faire un programme qui doit
    1) demander a l'utilisateur de rentrer une phrase dans un tableau de type char
    2) ressortir le tableau en ayant inverser l'ordre des lettres de chaque mots. sans changer l'ordre des mots
    exemple cin "bonjour vous"
    cout "ruojnob suov"

    voici le programme que j'ai fait mais qui ne marche pas

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
     
    # include <iostream>
    # include <cstring>
     
    using namespace std;
     
    void inverse (char t[])
    {
    	int flag=0,i=0;
    	for(int y=0;y<strlen(t);y++)
    	{
    		if (t[y]!=' ')
    			flag++;
     
     
    		if (t[y]==' ' || t[y]==0)
    		{
    			for(int j =0;j<=(flag-1)/2;j++)
    			{
    				char temp;
    				temp=t[j];
    				t[j]=t[flag-1-j];
    				t[flag-1-j]=temp;
     
    			}
    			flag=0;
    		}
     
     
    	}
    }
     
     
    int main()
    {
    	char t [80];
    	cout<<" entrez une phrase "<<endl;
    	cin.getline(t,80);
     
    	inverse(t);
    	for(int i=0;i<strlen(t);i++)
    	{
    		cout<<t[i];
    	}
    	cout<<endl;
     
     
     
    	system ("pause");
     
    	return 0;
     
    }


    ce programme ne m’inverse que le premier mot seulement qu'en il y a un nombre de mot paire

    merci d'avance !

  2. #2
    Membre éclairé
    C'est du C, ça. (enfin, sauf iostream, mais bon ...)

    Une solution peut être de lire chaque mot un par un :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    #include <string>
    std::string mot;
    while (std::cin >> mot) {


    Puis d'inverser chaque mot et de l'afficher :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    std::copy(mot.rbegin(), mot.rend(), std::ostream_iterator<char>(std::cout));
    std::cout << ' ';


    Enfin, d'afficher la fin de la ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    std::cout << std::endl;


    Et d'être content du résultat !

  3. #3
    Nouveau Candidat au Club
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <iostream>
    #include <string>
    using namespace std;
     
     
    int main ()
    {
     
      string chaine; 
      getline( std::cin, chaine );
     
      char * token = (char *) chaine.c_str();
      char * div = strtok(token," ");
     
      while (div != NULL)
      {
    	  	int fin = 0;
     
    		// rotation détéction de la fin de la chaine
    		while(true)
    			{
    				if(div[fin] != '\0')
    				fin++;
    				else break;
    			}
     
    		char * intr;
    		intr = new char[fin];
    		fin --;
     
    		// rotation
    		for (int i = 0; i<=fin ; i++)
    		intr[fin-i] = div[i];
    		intr[fin+1] = '\0';
     
    		cout << intr << " ";
    		div = strtok(NULL," ");
      }
     
      cout << endl;
     
      system("PAUSE");			
      return 0;
    }

  4. #4
    Membre éclairé
    Cette solution est bien peu élégante ... (D'ailleurs, je ne l'ai pas testée, et elle est bien trop compliquée pour ce qu'elle fait).

    Si le problème est que je n'ai pas donné de code tout cuit, alors le voici, avec les commentaires :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <iterator>
    #include <string>
     
    int main(int, char**) {
      std::string mot;
      while (std::cin >> mot) { // On lit les mots de l'entree un par un
        std::copy(mot.rbegin(), mot.rend(), std::ostream_iterator<char>(std::cout)); // On copie (copy) le mot (mot) à l'envers (rbegin/rend : reverse begin/reverse end) sur la sortie (cout)
        std::cout << ' '; // On affiche un espace pour séparer les mots entre eux
      }
      std::cout << std::endl; // Et on termine la ligne avant de clore le programme
      // Pas de system pause ici, c'est trop horrible. Et, grace à la boucle, il y a juste à taper Ctrl+Z pour quitter ! C'est-y pas magique ?
    }


    Et une version pour les acharnés de la simplicité (donc sans ctrl-z, mais plus long) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
    #include <iterator>
    #include <sstream>
    #include <string>
     
    int main(int, char**) {
      std::string ligne;
      std::getline(std::cin, ligne);
     
      std::istringstream iss(ligne); // Un lecteur mot par mot (pour faire simple)
      std::string mot;
      while (iss >> mot) { // On lit les mots de l'entree un par un
        std::copy(mot.rbegin(), mot.rend(), std::ostream_iterator<char>(std::cout)); // On copie (copy) le mot (mot) à l'envers (rbegin/rend : reverse begin/reverse end) sur la sortie (cout)
        std::cout << ' '; // On affiche un espace pour séparer les mots entre eux
      }
      std::cout << std::endl; // Et on termine la ligne avant de clore le programme
      // Pas de system pause ici, c'est trop horrible quand même. Mais du c++ tout beau !
      std::cout << "Veuillez appuyer sur Enter pour quitter ...";
      std::cin.get();
    }

  5. #5
    Rédacteur

    Citation Envoyé par Ekleog Voir le message
    snip...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    #include <string>
     
    int main() 
    {
       std::transform(
          std::istream_iterator<std::string>(std::cin)
          ,std::istream_iterator<std::string>()
          ,std::ostream_iterator<std::string>(std::cout," ")
          ,[](std::string const&s)->std::string{return {s.rbegin(),s.rend()};}
       );
     
       return 0;
    }


    Citation Envoyé par raphy20 Voir le message
    Bonjour,

    Je suis en train d'essayer de faire un programme qui doit
    1) demander a l'utilisateur de rentrer une phrase dans un tableau de type char
    2) ressortir le tableau en ayant inverser l'ordre des lettres de chaque mots. sans changer l'ordre des mots
    exemple cin "bonjour vous"
    cout "ruojnob suov"

    voici le programme que j'ai fait mais qui ne marche pas

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
     
    # include <iostream>
    # include <cstring>
     
    using namespace std;
     
    void inverse (char t[])
    {
    	int flag=0,i=0;
    	for(int y=0;y<strlen(t);y++)
    	{
    		if (t[y]!=' ')
    			flag++;
     
     
    		if (t[y]==' ' || t[y]==0)
    		{
    			for(int j =0;j<=(flag-1)/2;j++)
    			{
    				char temp;
    				temp=t[j];
    				t[j]=t[flag-1-j];
    				t[flag-1-j]=temp;
     
    			}
    			flag=0;
    		}
     
     
    	}
    }


    ce programme ne m’inverse que le premier mot seulement qu'en il y a un nombre de mot paire

    merci d'avance !
    Au delà de l'exercice de style, j'imagine que l'objectif du TD est d'abord algorithmique. Deux solutions pour trouver ton erreur :
    soit tu as un debugger et je te conseille de l'utiliser en mode pas à pas pour voir le comportement de ton implémentation
    soit tu n'as pas de debugger, alors prends un stylo et une feuille de papier et exécute en pas à pas ton algorithme.
    Tu devrais te rendre compte que l'algo que tu présentes ne fonctionne pas.

    Coup de pouce : Ton problème se décompose en deux phases qui se répètent successivement : les espaces et les mots à inverser. Cela devrait se retrouver dans ton algo.

  6. #6
    Membre éclairé
    Citation Envoyé par 3DArchi Voir le message
    snip
    C++11, c'est de la triche, et dire que je m'efforçais d'éviter de l'utiliser !

  7. #7
    Rédacteur

    Citation Envoyé par Ekleog Voir le message
    C++11, c'est de la triche, et dire que je m'efforçais d'éviter de l'utiliser !
    Au contraire. Faut en abuser. Que cela devienne naturel au développeur lambda

  8. #8
    Membre expert
    Pourquoi vous n'utilsez pas reverse pour l'inversion des lettres d'un mot? http://en.cppreference.com/w/cpp/algorithm/reverse

  9. #9
    Membre éclairé
    Pourquoi l'utiliser, alors que c'est inutile / ça surcharge le code, dans ce cas ?

    3DArchi> Oui, sauf que le développeur lambda ne sait pas configurer son compilateur ...

  10. #10
    Rédacteur

    Citation Envoyé par Klaim Voir le message
    Pourquoi vous n'utilsez pas reverse pour l'inversion des lettres d'un mot? http://en.cppreference.com/w/cpp/algorithm/reverse
    Ca a été aussi mon premier réflexe. Mais seuls les mots doivent être inversés, pas leur ordre dans la saisie. Ensuite, on pourrait l'utiliser dans la lambda mais ça n'a plus vraiment d'intérêt.