IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Inscrit en
    Mars 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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é
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    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é
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    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é
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    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
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    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é
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    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.

Discussions similaires

  1. inverser des lettres et des chiffres
    Par hacker59 dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/09/2013, 14h09
  2. select en fonction de la place des lettres dans un mot
    Par jeremili dans le forum Débuter
    Réponses: 2
    Dernier message: 18/06/2009, 22h03
  3. Réponses: 2
    Dernier message: 09/09/2008, 22h03
  4. Création de mots à partir de liste des lettres
    Par diditin dans le forum Prolog
    Réponses: 3
    Dernier message: 04/05/2007, 22h50
  5. Rrecherche des lettres dans un mot
    Par mikebranque dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo