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 :

Palindrome en c++


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Points : 0
    Points
    0
    Par défaut Palindrome en c++
    Bonjour à tous,

    J'ai un petit souci avec mon code c++, alors voici ce qui m'a été demandé:

    Ecrire un programme c++ qui permet de déterminer si une chaîne de caractère entrée par l'utilisateur est un palindrome ou pas. Et par la même occasion gérer les imprévus dans le cas ou un utilisateur entre des espaces.

    Alors moi j'ai pu gérer le cas où l'utilisateur entre des espaces, mais par la suite je n'arrive pas à déterminer si le texte entré est un palindrome. Voici mon code:

    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
       //Déclaration des variables
       int n(0), j(0), i;
       string chaine;
     
       //Saisie de la chaîne
       cout << "Entrer une chaine de caractere: ";
       getline(cin, chaine);
     
       //Détermination du nombre de caractères du texte saisi
       n = chaine.size();
     
       //Gestion des espaces entrées par l'utilisateur
       for(i=0; i < n; i++)
        if(chaine[i] != ' ')
            chaine[j++] = chaine[i];
        chaine[j++] = '\0';
     
     
     
       i = 0,j = n - 1;
       /*Boucle permettant de comparer un à un les caractères.
          Elle compare les caractères en commençant par les extrémités jusqu'au milieu.*/ 
       while(i < j && chaine[i] == chaine[j]){
        i++,j--;
       }
     
       if(i >= j)
        cout << chaine << " est un palindrome" << endl;
       else
        cout << chaine << " n'est pas un palindrome" << endl;
     
      return 0;
    }

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 586
    Points : 7 724
    Points
    7 724
    Par défaut
    Bonjour,

    Le filtrage des espaces est effectué à la façon du langage C. C'est risqué en C++, ce que tu obtiens est un monstre. Tu ne peux pas changer la longueur de la chaîne (écrire un '\0' est un undefined behavior) et tu souhaites enlever des caractères.

    Si tu considères que la chaîne à une longueur j à la fin du filtrage (au lieu de n), ça devrait fonctionner.

    En C++ on n'écrirait pas ça. On pourrait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::cout << "la chaine \"" << chaine;
    auto fin = std::remove( chaine.begin() , chaine.end() , ' ' );  // déplacer les espaces en fin
    chaine.erase( fin , chaine.end() );                             // ôter vraiment ces espaces
    if (chaine == std::string( chaine.rbegin() , chaine.rend() )) // la chaîne est égale à la chaîne lue en partant de la fin
        std::cout << "\" est un palindrome\n";
    else
        std::cout << "\" n'est pas un palindrome";

  3. #3
    Membre régulier Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Points : 112
    Points
    112
    Par défaut
    salut,
    voila un petit code pour savoir si un mot entré est palindrome ou non , je l'ai gardé dans ma machine depuis que j’étais à l’université
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <iostream>
     #include<conio.h>
    using namespace std;
     
    char* miroir(char*w);
    int equal(char*u,char*v);
    int palindrome(char*w);
    int longueur(char*str);
    main()
          {
          char mot[255];
         cout <<"entrer votre mot : ";
          gets(mot);
          if(palindrome(mot)==1)  cout <<mot<<" est un palindrome ";
          if(palindrome(mot)==0) cout <<mot<<" n'est pas un palindrome ";      
          cout <<"\n\n\n ---- fin du programme -----\n\n";
        getch();
          }
    char* miroir(char*w)
          {
          int i,ii;
          char str[255];
          for(i=0;i<longueur(w);i++)
            {
            str[i]=w[longueur(w)-1-i];
            ii=i;
            }
          str[ii+1]='\0'; //pr ne pas ecrire des symboles à la fin du mot!!!
          return str;
          }
    int equal(char*u,char*v)
        {
         int i,ii,a;
         for(i=0;u[i]!='\0';i++)
           {
            if(u[i]==v[i])
              {
              a=1;
              ii=i;
              continue;
              }
            else
              {
              a=0;
              break;
              }
           }
        if(a==0) return 0;
        if(a==1)
                {
                  if(v[ii+1]=='\0') return 1;
                  else return 0;
                }
        }
    int palindrome(char*w)
         {
         if(equal(w,miroir(w))==1) return 1;
         if(equal(w,miroir(w))==0) return 0;
         }   
    int longueur(char*str)
        {
             int i,j=0;                      
             for(i=0;str[i]!='\0';i++)
             {
             j++;
             }
         return j;
         }

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Mais, ca, c'est du pur C, ce n'est pas du C++...

    Or, tu es dans la section C++ du forum, ici... la section C, elle est de l'autre coté de la rue

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Dia390 Voir le message
    Bonjour à tous,

    J'ai un petit souci avec mon code c++,
    ...
    Salut,
    Le problème est que tu réinitialises j à l'ancienne taille, après avoir supprimé les espaces (ligne 26).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
        //Gestion des espaces entrées par l'utilisateur
        for(i=0; i < n; i++)
            if(chaine[i] != ' ')
                chaine[j++] = chaine[i];
        for(int k=j; k < n; k++)
            chaine[k] = ' ';
     
        i = 0, j--;
        /*Boucle permettant de comparer un à un les caractères.
          Elle compare les caractères en commençant par les extrémités jusqu'au milieu.*/ 
    ...
    Et effectivement, ton code ressemble plus à du C qu'à du C++...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Citation Envoyé par SimonDecoline Voir le message
    Et effectivement, ton code ressemble plus à du C qu'à du C++...
    Mais le traitement n'est pas sur place (<- lien wiki en anglais)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string w2 = word;
    reverse(w2.begin(), w2.end());
     
    (word == w2) ? cout << "The word is a palindrome\n" : cout << "The word is not a palindrome\n";

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par foetus Voir le message
    Mais le traitement n'est pas sur place (<- lien wiki en anglais)
    Je ne comprends pas ta remarque : l'algo de Dia390 est bien in-place. Perso, je n'aurais pas fait de traitement, juste :

    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
     
       auto iter0 = chaine.begin();
       auto iter1 = chaine.end();
       --iter1;
     
       while (iter0 < iter1) {
           while (iter0 != chaine.end() and *iter0 == ' ') ++iter0;
           while (iter1 != chaine.begin() and *iter1 == ' ') --iter1;
           if (*iter0 != *iter1) break;
           ++iter0;
           --iter1;
       }
     
       if (iter0 >= iter1 )
           cout << chaine << " est un palindrome" << endl;
       else
           cout << chaine << " n'est pas un palindrome" << endl;

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Citation Envoyé par SimonDecoline Voir le message
    Je ne comprends pas ta remarque
    Elle est simple : toi et @koala01 critique l'approche C du test du palindrome. Effectivement, pour tester un palindrome, il faut tester caractère par caractère.

    Où est la notion d'objet ici ?
    La réponse est simple : nulle part

    Parce que dans mon exemple, un objet string est utilisé : tu y copies le mot et tu l'inverses. Pour enfin comparer les 2. Tu perds le traitement sur-place parce que tu utilises une variable avec laquelle tu fais le gros du traitement.
    Dans ton exemple, tu forces l'objet en utilisant des itérateurs. Donc 2 variables qui ne servent à rien juste pour dire "'JE VEUX DU C++ ET JE LE FERAI COÛTE QUE COÛTE"

    Par contre je ne remets pas en cause si c'est du C++ ou du C : dans du code objet, tu peux avoir à faire un peu de C (que tu planques dans une méthode ) - et les chaînes de caractères en ont souvent besoin pour être manipulées/ testées.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Houla, mais DETENDS TOI MON AMI...

    Dire qu'un code est du C n'est pas une critique. Ici, c'est la section C++ donc on fait juste une remarque pour dire qu'en C++ moderne on ne verrait pas forcément ce style de code. C'est juste pour aider quoi. Et figure toi que j'ai commencé par donner une correction très proche du code initial; c'est donc peut-être qu'on est pas aussi sectaire que tu le dis...

    J'ai pas compris ton truc "C++ donc objet". Si tu veux dire que les itérateurs sont des objets, figure-toi que string aussi. Tu voulais coder avec des char[] ?

    J'ai pas compris "les 2 itérateurs sont 2 variables qui ne servent à rien". Si si, enlève-les et tu verras que le code marche beaucoup moins bien forcément... Et en quoi c'est plus compliqué que d'utiliser deux indices i et j comme dans le code initial ?

    Perso, je ne suis pas un extrémiste du C++ mais là oui string simplifie le code et oui les itérateurs apportent un peu de sûreté (par exemple avec les itérateurs, tu peux comparer que l'un est devant l'autre et le compilateur vérifie bien que tu compares des itérateurs, alors qu'avec des indices, il vérifie juste que ce sont des int mais si tu compares un indice avec une taille, le compilateur ne détectera pas d'erreur).
    Dernière modification par LittleWhite ; 02/11/2019 à 12h24. Motif: Pas besoin de citer l'intégralité du message précédent

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Je ne devrais pas répondre

    Citation Envoyé par SimonDecoline Voir le message
    J'ai pas compris ton truc "C++ donc objet". Si tu veux dire que les itérateurs sont des objets, figure-toi que string aussi. Tu voulais coder avec des char[] ?
    Arrête de faire l'imbécile : @Dia390 a fait du code en C++ avec des string, des cout et des cin.
    C'est du C++, donc c'est la bonne section.

    Or toi et @koala01 reprochais l'aspect C du traitement test palindrome parce que @Dia390 a utilisé les crochets comme avec les chaînes de caractères en C.

    Et donc
    Citation Envoyé par SimonDecoline Voir le message
    C++ moderne on ne verrait pas forcément ce style de code.
    Comment tu le fais avec l'interface de l'objet string ou autre ? C'est à dire avec la stl (reverse, find), avec les itérateurs, ... comment tu fais pour coder le test un palindrome sans utiliser les crochets/ sans tester les caractères directement/ sans parcourir ta chaîne de caractères ... parce que c'est tellement C.
    C'est pour la partie pédagogique de ce fil de discussion

    Entre 4 réponses (toi et @koala01), vous nous faîtes une Francis Blanche : "Je peux le faire"
    Et je signalais également que le test palindrome avec les crochets (en parcourant ta chaîne et en testant caractère par caractère ) est un traitement sur-place : ce qui n'est pas négligeable - sans variables locales autres que les indices


    Citation Envoyé par SimonDecoline Voir le message
    J'ai pas compris "les 2 itérateurs sont 2 variables qui ne servent à rien". Si si, enlève-les et tu verras que le code marche beaucoup moins bien forcément... Et en quoi c'est plus compliqué que d'utiliser deux indices i et j comme dans le code initial ?
    Si, ils ne servent à rien parce que tu remplaces les indices entiers par des itérateurs ... et les itérateurs n'apportent rien de plus en sécurité.


    Citation Envoyé par SimonDecoline Voir le message
    Perso, je ne suis pas un extrémiste du C++ mais là oui string simplifie le code et oui les itérateurs apportent un peu de sûreté (par exemple avec les itérateurs, tu peux comparer que l'un est devant l'autre et le compilateur vérifie bien que tu compares des itérateurs, alors qu'avec des indices, il vérifie juste que ce sont des int mais si tu compares un indice avec une taille, le compilateur ne détectera pas d'erreur).
    Je te rappelle que dans le test palindrome tu as 2 indices, 1 qui part du début en sens croissant et l'autre qui part de la fin en sens décroissant.
    Explique moi comment tu n'arrives pas à comparer que l'un est devant l'autre (avec des entiers) et à quel moment tu compares un indice avec une taille
    Je suis curieux ... et évidemment, hors tests préconditions - chaîne vide ou d'1 caractère, ...

    C'est sûr que dans un test palindrome , tu peux comparer les indices avec la taille ou avec l'âge de la Reine d'Angleterre.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par foetus Voir le message
    Or toi et @koala01 reprochais l'aspect C du traitement test palindrome parce que @Dia390 a utilisé les crochets comme avec les chaînes de caractères en C.
    Encore une fois, je ne reproche rien à personne, je dis juste qu'il y a une façon plus "C++ moderne" de faire.

    Citation Envoyé par foetus Voir le message
    Comment tu le fais avec l'interface de l'objet string ou autre ? C'est à dire avec la stl (reverse, find), avec les itérateurs, ... comment tu fais pour coder le test un palindrome sans utiliser les crochets/ sans tester les caractères directement/ sans parcourir ta chaîne de caractères ... parce que c'est tellement C.
    C'est pour la partie pédagogique de ce fil de discussion
    C'est une blague ? J'ai donné un code correspondant au message #7.

  12. #12
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 477
    Points : 4 676
    Points
    4 676
    Par défaut Huile sur le feu ?
    Bonjour,

    Sauf erreur, le C++ reste un sur-ensemble du C (le premier compilateur était en fait un compilateur C précédé d'un pré-compilateur qui transformait en C les expressions C++).

    Aussi, la discussion porte plus sur la forme (C++ == objet) que sur le fond (un programme efficace et sûr compilable avec un compilateur C++).

    Dans le cas d'un exercice, si celui-ci a pour but d'appliquer les composantes haut niveau du C++, il me semble que le sujet devrait conduire à ce que la solution tire avantage des ajouts du C++. Je ne crois pas que ce soit le cas ici : l'exemple du code en pur C++ est bien moins efficace que la malheureuse boucle avec ses itérateurs convergents.

    En résumé, ici c'est l'exercice qui est plus C que C++. Aussi la solution hérite naturellement de cette coloration et se forcer à monter en abstraction en ferait un simple exercice de style sans autre justification.

    Salutations

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Citation Envoyé par SimonDecoline Voir le message
    C'est une blague ? J'ai donné un code correspondant au message #7.
    Ah ouais, mais quel code ! QUEL CODE !

    À ce niveau de compétence, la puissance du C++ est à son climax. On voit clairement la différence entre du code en C et du code en C++.
    Et comme tu l'as dit C'EST CA DU C++ MODERNE : au moins 1 ligne de plus pour les variables, des déréférencements au lieu de la syntaxe crochet ... ce sont de réels avantages du C++

    Et comme tu le dis "tu peux comparer que l'un [itérateur] est devant l'autre". Parce qu'effectivement, avec les entiers du C tu ne peux pas le faire
    Et surtout "des indices, il vérifie juste que ce sont des int mais si tu compares un indice avec une taille, le compilateur ne détectera pas d'erreur" : si le compilateur C++ comprend ce que tu veux coder et le corriger c'est du pur génie.

    Ton code devrait être imprimé et être encadré au mur. J'ai envie de me lever de ma chaise et d'applaudir des 3 mains : le C++ c'est oufissime.
    Et cette notion moderne. Ce n'est pas du C++ mais du C++ moderne : les itérateurs, sont apparus avec la norme C++98 et ça c'est moderne. Le langage C ça ce n'est pas moderne : le parcours d'1 chaîne de caractères caractère par caractère cela sent la naphtaline. Parce que les itérateurs cela change tout pour les chaîne de caractères ... c'est totalement différent.

    Mais maintenant je comprends la remarque de @koala01 @Dia390 tu fais perdre du temps aux experts éminents C++ qui font du C++ et que le langage C c'est de l'autre coté de la rue

    C++/ 20, code de génie / 20 mais surtout condescendance / l'infini


    Citation Envoyé par Guesset Voir le message
    il me semble que le sujet devrait conduire à ce que la solution tire avantage des ajouts du C++.
    C'est n'est pas vrai regarde le code de @Dia390 c'est du C++. Mais le test du palindrome est avant tout un algo itératif que l'on peut coder avec des objets en C++ (voir mon message #6 qui est plus C++ que le code de @SimonDecoline)
    Mais c'est le reste du code qui tire parti du C++, et non pas l'algo en lui même. Parce que l'objet string est plus simple à manipuler que les chaînes de caractères en C (... évidement si on reste sur de l'ASCII )

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Et, les gars!!!

    Moi je parlais du code d'abdenour qui nous a gentiment présenté un code tel qu'il l'a trouvé sur l'ordinateur de sa faq. Et, concernant ce code, je me suis contenté de signaler que c'est du pur C et qu'il faut choisir le langage avec lequel on s'adresse à l'ordinateur :
    Soit on décide de parler en C, mais alors, on s'est trompé de section, soit on décide de parler en C++, mais, dans ce cas là, un code C n'a pas d'avantage sa place dans cette section que le latin de jules césar à l'heure actuelle pour demander son chemin sur les champs élysés.

    Cela fait vingt-cinq ans que le C++ est devenu un langage tout à fait différent du C, et dont la seule erreur a été de vouloir maintenir un semblant de compatibilité avec le C.

    A cause de cette malencontreuse erreur, cela fait vingt-cinq ans que des gens viennent utiliser ce qui semble être de bonnes pratiques en C dans un langage pour lequel les pratiques en questions sont néfastes, pour ne pas dire nocives.

    Et cela fait vingt-cinq ans que l'on dispose de moyen fiables et efficace de gérer les chaînes de caractères de manière bien plus simple que ce que nous impose le C.

    Inverser une chaine de caractères, cela peut se faire en une suele instrution, simplement en construisant une nouvelle chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //soit la chaine qu'il faut inverser
    std::string origine; // on demandera à l'utilisateur de l'introduire par lui-même
    std::string inverse{origine.rbegin(), origine.rend()};
    A partir de là, un simple test if(inverse == origine) suffira à nous donner la réponse qui nous intéresse.

    Pourquoi faudrait-il se casser le cul à faire quelque chose de plus compliqué, en commençant à créer trois fonctions, dont une qui risque de poser un problème si la chaine d'origine dépasse les 255 caractères

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Pourquoi faudrait-il se casser le cul à faire quelque chose de plus compliqué, en commençant à créer trois fonctions, dont une qui risque de poser un problème si la chaine d'origine dépasse les 255 caractères
    Effectivement le code en 3 parties de @abdennour bouaicha est excessif.

    Donc pour toi faire une boucle avec 2 indices qui convergent c'est compliqué ... parce que je te signale que tu es hors sujet parce que @Dia390 voulait gérer en même temps les espaces (qui par ailleurs @Dia390 ne nous dit pas en quoi les espaces le gênent ? )
    Mais je reviens à ma question de mon message #6 (au passage ton code ne fait pas plus que le mien posté 1 journée plus tôt) : le traitement sur-place n'est pas important pour toi ?

  16. #16
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Je crois que je ne vais pas commencer à m'inquiéter directement de savoir si le traitement sur-place est important ou pas.

    Je crois que le principal est d'obtenir quelque chose qui fonctionne, avant de s'inquiéter des circonstances qui pourraient nous imposer de faire fonctionner la chose plus vite ou en utilisant moins de mémoire.

    Je crois que, comme Dia390 n'a pas signalé qu'il était dans une situation dans laquelle il devait être attentif au temps de traitement ou à l'utilisation de mémoire, la solution la plus simple reste de très loin la meilleure.

    Je crois que, si Dia390 avait voulu placer ce code sur un micro-contrôleur limité en terme de vitesse d'exécution ou en terme de mémoire, il nous l'aurait sans doute fait savoir.

    Je crois enfin que
    premature optimisation is root for all evil
    et que le code le plus simple place déjà des limites particulièrement difficiles à atteindre y compris sur les ordinateur les plus vieux qui sont encore en fonctionnement aujourd'hui.

    Attention, je ne dis pas que je rejette l'idée d'optimiser les choses si le besoin s'en fait sentir! Je dis juste que je préfères attendre d'avoir un indice franc que le besoin en question est bien réel

    Pour le reste, je crois que tu sais très bien que je suis l'un des principaux défenseurs d'une utilisation moderne du langage, que je n'ai rien contre le C, mais que je préfère malgré tout qu'on évite de l'utiliser dans un projet C++, tout comme je préfère que l'on évite d'utiliser le C dans un code java: ce sont des langages différents, qu'on les utilise dans des projets différents, quitte à fournir une passerelle qui puisse permettre la transition de l'un à l'autre en cas de besoin ;

    Si j'ai décidé d'écrire mon intervention précédente, c'était juste pour faire savoir que ma toute première intervention portait sur le message de abdennour bouaicha, parce que, selon toi,
    Or toi et @koala01 reprochais l'aspect C du traitement test palindrome parce que @Dia390 a utilisé les crochets comme avec les chaînes de caractères en C.
    et que je voulais être bien clair : je ne reproche pas quoi que ce soit à Dia390.

    Et sinon, ben, je constate qu'il y a "un problème" entre toi et SimonDecoline dans cette discussion, mais, pour ma part, je ne le comprends absolument pas (et je ne suis même pas sur de vouloir le comprendre). Et je constate que tu essayes de m'entraîner dans ce conflit alors que je n'ai aucune envie d'y prendre part.

    Si je t'ai choqué en disant que la section C était "de l'autre coté de la rue", je t'en fais mes excuses. Peut-être souhaiterais tu que je modifie mon message d'origine pour être plus précis (concernant la personne à qui j'adresse la remarque), et que j'en profite pour dire que "la section C, c'est la section d'à coté"
    Donc pour toi faire une boucle avec 2 indices qui convergent c'est compliqué ...
    C'est en tout cas beaucoup plus compliqué que de n'avoir aucune boucle et de laisser le langage tout faire pour nous

    De manière générale, je crois que si on a un code qui fait le taf en deux instructions lisibles et compréhensibles (comprends : sans que le lecteur ne doive commencer à se creuser la tête pour comprendre tout ce que les instrutions implique), et un autre code qui obtient exactement le même résultat en trois instructions (tout aussi lisibles et compréhensibles, cela va de soi), le code qui nécessite les trois instructions est, effectivement, "plus compliqué" (peut-être préférerais tu que j'utilise le terme "plus complexe" ) que le code qui n'en nécessite que deux

    parce que je te signale que tu es hors sujet parce que @Dia390 voulait gérer en même temps les espaces
    Ah, je crois comprendre le problème : pour toi, "Et par la même occasion gérer les imprévus dans le cas ou un utilisateur entre des espaces." implique que cette gestion devrait être effectuée en même temps que la vérification pour savoir si on a affaire à un palindrome.

    De mon point de vue, cela voulait tout juste dire qu'il fallait s'assurer de supprimer les espaces avant de faire la vérification, chose qui aurait très bien pu prendre place entre la ligne 3 et la ligne 4 du code que j'ai présenté

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Inverser une chaine de caractères, cela peut se faire en une suele instrution, simplement en construisant une nouvelle chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //soit la chaine qu'il faut inverser
    std::string origine; // on demandera à l'utilisateur de l'introduire par lui-même
    std::string inverse{origine.rbegin(), origine.rend()};
    A partir de là, un simple test if(inverse == origine) suffira à nous donner la réponse qui nous intéresse.
    La question initiale demande d'ignorer les espaces donc cette solution n'est pas suffisante. De plus, si Dia390 est parti sur un algo sans copie, ce n'est peut-être pas pour se compliquer la vie mais peut-être pour pouvoir traiter des grosses entrées plus efficacement.

    @foetus : Si tu n'es pas capable de comprendre qu'un itérateur apporte une sémantique différente d'un int, lis les docs et fais des tests. Pour le reste, ça relève de la psychiatrie, il faut juste que tu consultes un spécialiste.

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par SimonDecoline Voir le message
    La question initiale demande d'ignorer les espaces donc cette solution n'est pas suffisante.
    Elle n'est peut-être pas complète, je te l'accorde, car il manque sans doute effectivement quelque chose entre les lignes 3 et 4 pour supprimer les espaces, mais elle est amplement suffisante pour déterminer si on a affaire à un palindrome ou non

  19. #19
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Points : 0
    Points
    0
    Par défaut
    auto fin c'est une variable ou quoi ? si oui il est de quel type ?

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Effectivement , auto c'est un concept apparu avec le C++ moderne (C++11, C++14, C++17, C++19) et le principe c'est de manipuler des objets/ variables sans connaître leur type : c'est un type automatique.
    C'est le compilateur qui le gère pour toi.

    Le pourquoi de la chose, c'est de pouvoir faire du code avec lequel on peut changer les types facilement ... et qu'en définitive n'est pas important : on récupère "1 variable de type auto" que l'on passe en paramètre ou qu'on donne à un service.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Palindrome
    Par zouyou dans le forum C++
    Réponses: 18
    Dernier message: 05/05/2010, 02h28
  2. Palindrome
    Par casafa dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 02/12/2005, 08h33
  3. Tester si un mot est palindrome
    Par imeys dans le forum Langage
    Réponses: 2
    Dernier message: 22/11/2005, 16h03
  4. palindrome
    Par devdébuto dans le forum C
    Réponses: 6
    Dernier message: 17/11/2005, 23h53
  5. [Debutant] Programme de test de palindrome
    Par lala_ dans le forum Assembleur
    Réponses: 5
    Dernier message: 13/02/2005, 16h48

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