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 :

Probleme boucle for (modulo)


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Probleme boucle for (modulo)
    Bonjour à tout le monde,

    j'ai un petit soucis sur un code que je n'arrive pas à résoudre :

    En fait je saisi (dans mon main) une chaine de caractères, et là je dois vérifier si le nombre de caractères est un multiple de 3 et s'il ne l'est pas, je dois supprimer les caractères en trop. J'ai fait ça mais il ne veut pas passer dans ma boucle for. Qu'est ce qui ne va pas ?

    Merci

    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
    void FinirBrin(char *TAB)
    {
        int lg = strlen(TAB);
        int i;
        char temp[200];
     
        strcpy(temp,TAB);
     
     
        if ((lg % 3) != 0)
        {
            printf("Pas multiple de 3\n");
            printf("lg = %d\n",lg);
     
            for (i=lg ; (lg % 3) == 0 ; i--)
            {
                temp[i-1] = TAB[i];
                printf("i = %d  TAB[i] = %c\n",i,&TAB[i]);
                lg = strlen(temp);
     
            }
     
        }
        printf("%s",temp);
    }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ty666 Voir le message
    Bonjour à tout le monde,

    j'ai un petit soucis sur un code que je n'arrive pas à résoudre :

    En fait je saisi (dans mon main) une chaine de caractères, et là je dois vérifier si le nombre de caractères est un multiple de 3 et s'il ne l'est pas, je dois supprimer les caractères en trop. J'ai fait ça mais il ne veut pas passer dans ma boucle for. Qu'est ce qui ne va pas ?
    Hyper compliqué... C'est le moment d'utiliser div()...
    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
     
    #include <string.h>
    #include <stdlib.h>
     
    void FinirBrin (char *TAB)
    {
       int lg = strlen (TAB);
       if (lg > 3)
       {
          div_t d = div (lg, 3);
     
          if (d.rem != 0)
          {
             TAB[3 * d.quot] = 0;
          }
       }
    }
     
    #if TEST
    #include<stdio.h>
    #include <assert.h>
     
    static void test (char const in[], char const out[])
    {
       char *s = strdup (in);
       assert (s != NULL);
       FinirBrin (s);
       assert (strcmp (s, out) == 0);
       free (s);
    }
     
    int main (void)
    {
       test ("", "");
       test ("a", "a");
       test ("ab", "ab");
       test ("abc", "abc");
       test ("abcd", "abc");
       test ("abcde", "abc");
       test ("abcdef", "abcdef");
       test ("abcdefg", "abcdef");
       test ("abcdefgh", "abcdef");
     
       puts ("P A S S E D");
       return 0;
    }
    #endif
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Points : 109
    Points
    109
    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
    void FinirBrin(char *TAB)
    {
        int lg = strlen(TAB);
        int i;
        char temp[200];
     
        strcpy(temp,TAB);
     
    /* tu ne rentres ici que si lg % 3 est different de 0 */
        if ((lg % 3) != 0) 
        {
            printf("Pas multiple de 3\n");
            printf("lg = %d\n",lg);
     
    /* 
    *  on est rentré dans le if donc lg % 3 est different de 0
    * mais la condition de ton for peut etre traduit par
    * while (lg % 3 == 0). Mais comme lg % 3 different de 0 le 1er coup, tu ne
    * rentre jamais dans ta boucle.
    */
            for (i=lg ; (lg % 3) == 0 ; i--) 
            {
                temp[i-1] = TAB[i];
                printf("i = %d  TAB[i] = %c\n",i,&TAB[i]);
                lg = strlen(temp);
     
            }
     
        }
        printf("%s",temp);
    }
    sinon comme le dis Emmanuel, clairement c'est compliqué, il y a moyen de faire plus clair. Mais au moins voila pourquoi tu ne rentres jamais dans ton for (cf les commentaires que j'ai rajouté).

    Si tu veux garder le meme algo que tu as, mais le rendre fonctionnelle, tu peux transformer ton for en do while comme ceci :

    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
    void FinirBrin(char *TAB)
    {
        int lg = strlen(TAB);
        int i;
        char temp[200];
     
        strcpy(temp,TAB);
     
    /* tu ne rentres ici que si lg % 3 est different de 0 */
        if ((lg % 3) != 0) 
        {
            printf("Pas multiple de 3\n");
            printf("lg = %d\n",lg);
     
            i=lg ;
            do
            {
                temp[i-1] = TAB[i];
                printf("i = %d  TAB[i] = %c\n",i,&TAB[i]);
                lg = strlen(temp);
                i--;
            }
            while (lg % 3 == 0);
     
        }
        printf("%s",temp);
    }
    je n'ai pas verifier l'algo en lui meme mais au moins ici ta boucle fonctionne (je n'ai pas de compilo C sous la main, mais le principe est la). L'avantage des boucles do while, est que tu fais au moins 1 tour de boucle.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses mais je pense avoir trouvé la solution sans utiliser div() (et d'ailleurs si on peut m'expliquer car je n'ai pas réussi à compiler ton programme) ni de while :

    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
     
        int lg = strlen(TAB);
        int i,k;
        int j = (lg - (lg % 3))+1;
     
        // Supprime les caractères en trop si non multiple de 3
        if ((lg % 3) != 0)
        {
     
            for (i=lg ; i >= j ; i--)
            {
                TAB[i-1] = TAB[i];
            }
     
        }
        printf("Mutiple de 3 : %s\n",TAB);

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ty666 Voir le message
    Merci pour vos réponses mais je pense avoir trouvé la solution sans utiliser div() (et d'ailleurs si on peut m'expliquer car je n'ai pas réussi à compiler ton programme)
    C'est une fonction standard du C. Quel est le message d'erreur ?
    ni de while :
    oui, enfin, while() vs for(), 1-1 la balle au centre...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Probleme boucle For
    Par uldrych.maillet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/12/2007, 15h09
  2. Probleme boucle For Each controls
    Par Tusbar dans le forum Windows Forms
    Réponses: 21
    Dernier message: 13/09/2007, 23h56
  3. probleme boucle for
    Par ricoree78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/05/2007, 12h27
  4. probleme boucle for
    Par michael75 dans le forum Général JavaScript
    Réponses: 28
    Dernier message: 25/01/2007, 18h51
  5. Probleme boucle for
    Par griese dans le forum Linux
    Réponses: 4
    Dernier message: 06/12/2006, 14h39

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