Partage
  • Partager sur Facebook
  • Partager sur Twitter

ZString

Sujet résolu
    1 avril 2008 à 20:20:29

    Bonjour (Bonsoir) à tous et à toutes.

    Voila, je suis en train de faire le nouveau chapitre de TP de C++ : La POO en pratique.
    Il consiste donc a recréer la classe String.

    J'ai crée une fonction insert qui me permet d'insérer un string dans un string...

    Voici la fonction :

    1. ZString ZString::insert(int x,const ZString & chaine_par)
    2. {
    3.        int i=0;
    4.        while(i<taille(chaine_par.chaine))
    5.        {
    6.             for(int k=0;k<=longueur - x-3;k++)
    7.                 chaine[longueur-k+1] = chaine[longueur - k];
    8.             (*this).chaine[x+i+1] = chaine_par.chaine[i];
    9.             i++;
    10.        }
    11.        (*this).longueur = longueur + taille(chaine_par.chaine);
    12.        return (*this);
    13. }


    L'objet comprend un char* : chaine, et un int : longueur (celle du tableau ;) )

    Ma fonction prend en paramètres la position ou on commence a insérer, ainsi que la chaine de caractères a insérer.

    Ainsi, dans le main, en faisant :

    1. ZString chaine("Bonjour"); //Creation dun objet de type ZString.
    2.     ZString chaine2("...");
    3.     cout << chaine.insert(3, chaine2) << endl<< endl;


    La fonction est sencé me retourner "bonj...our"

    Or pour cet exemple ci, elle me retourne : "bonj...rr".
    Quelqu'un a une idée ? Par ce que ca fait longtemps que je suis dessus la :(
    • Partager sur Facebook
    • Partager sur Twitter
      1 avril 2008 à 22:47:30

      Premier truc : s'assurer d'avoir assez de place.
      Deuxième truc, s'assurer que chaine1[0..x[ sont dans la nouvelle chaine
      Troisième truc, ajouter ensuite chaine2
      Quatrième truc : finir de copier ce qui reste de chaine1
      Et pour finir, on nettoie derrière nous.

      C'est linéaire, il n'y a pas de boucle dans des boucles, ni de 3 sortis de nulle part.
      Par contre, il faut rajouter des tests de condition aux limites.
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        1 avril 2008 à 22:58:54

        voici ma version :

        1. void zstring::inserer( const zstring & zs, zstring::size_type pos )
        2. {
        3.     if( pos >= len_ )
        4.     {
        5.         (*this) += zs;
        6.     }
        7.     else
        8.     {
        9.         (*this) = (substr( 0, pos ) + zs + substr( pos ));
        10.     }
        11. }
        • Partager sur Facebook
        • Partager sur Twitter
          1 avril 2008 à 23:05:02

          Oui, en fait, la fonction substr t'enlève une difficulté que je me suis coltiné.

          Soit elle supprime ce qu'il se trouve après pos, soit elle décalle les caractères vers le début du tableau.

          Moi ce que ma fonction fait, cest déplacer les caractères plus loin dans le tableau et cest le que ca plante.

          Je suis tout autant capable que toi de faire une, mais je voudrais bien savoir pourquoi la mienne marche pas :(

          Merci à vous en tout cas
          • Partager sur Facebook
          • Partager sur Twitter
            1 avril 2008 à 23:09:05

            Parce que l'algo n'est pas bon ... ?
            Prend un papier à petits carreaux, un crayon, et simule à la main ce qui se passe.

            NB: Tout le principe de l'algorithmie, c'est de décomposer un problème complexe et petits problèmes simples. Ce que MatteX a fait.
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              1 avril 2008 à 23:29:10

              J'avais deja fait sur papier. Je me suis donc remis a ma copie

              Et j'avais oublié 2 petits "+i".

              Vouala le resultat :

              1. ZString ZString::insert(int x,const ZString & chaine_par)
              2. {
              3.        int i=0;
              4.        while(i<taille(chaine_par.chaine))
              5.        {
              6.             for(int k=0;k<=longueur - x;k++)
              7.                 chaine[longueur-k+1+i] = chaine[longueur - k+i];
              8.             (*this).chaine[x+i+1] = chaine_par.chaine[i];
              9.             i++;
              10.        }
              11.        (*this).longueur = longueur + taille(chaine_par.chaine);
              12.        return (*this);
              13. }


              Encore merci à vous ;)
              • Partager sur Facebook
              • Partager sur Twitter

              ZString

              × 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