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 :

boucle incomplet en while


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut boucle incomplet en while
    Bonjour.

    J'ai un tableau de 21 indices (cases).
    Et un compteur qui va de 0 à 100, pour remplir le tableau.

    Mon problème c'est que le boucle s'arrête au douzième élément.

    voici le 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
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    int main(void)
    {
    	int Far[21];
    	float Cel[21];
     
    	printf("Affichage:\nFar---Cel\n\n");
     
    	int i=0;
    	int cpt=0;
    	float val=0;
     
    	while(i<=100){
     Far[i]=cpt;
     
    (float)val=(5*(cpt-32))/9;
    Cel[i]=val;
     
     printf("%d---%.2f\n", Far[i], Cel[i]);
    printf("\n");
     
    i=i+5;
    cpt=cpt+5;
     
    }
     
     
     
    return 0;
    }

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Je vois pas pourquoi ta boucle ne serait pas executée 26 fois
    Qu'est ce qui te fait croire que ça passe que 12 fois?
    A part ça, j'admire l'indentation

  3. #3
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Ça ne s'arrête pas, ça plante. Vous comptez certes i de 5 en 5, mais en faisant ça vous adressez les tableaux Far et Cel au delà de l'indice 20...

  4. #4
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Citation Envoyé par Pierre Maurette Voir le message
    Ça ne s'arrête pas, ça plante. Vous comptez certes i de 5 en 5, mais en faisant ça vous adressez les tableaux Far et Cel au delà de l'indice 20...
    Merci, je m'en étais pas rendu compte.

  5. #5
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Pour l'indentation il faut remércier block note, mes talents n'y sont pour rien.

    D'autre part j'attend 21 tour, mais toi tu parles de 26....

    sinon pour le problème: je ne veux pas te faire un dessin, mais parfois c'est plusutile qu'un long discours.

    alors la voici

    http://imaginons.hautetfort.com/albu...gique/pb-c.JPG

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    D'autre part j'attend 21 tour, mais toi tu parles de 26
    Ce n'est pas parce que l'indice sort de la place [0..20] que le programme plante nécessairement, car malheureusement (?) C permet d'adresser Cel[i] en dehors du tableau Cel tel que tu l'as défini. Il se trouve qu'à l'indice 12, tu sors de l'espace d'adressage de ton programme (qui est tout petit). Si le programme avait été beaucoup plus gros, tu aurais pu ne pas planter dans cette boucle, mais véroler tout le reste de ton programme.

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Je pense que le depassement du tableau ecrase i, voila pourquoi on sort de la boucle

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Je pense que le depassement du tableau ecrase i, voila pourquoi on sort de la boucle
    Ah oui, j'avais mal lu et cru que le programme plantais...

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2007
    Messages : 31
    Par défaut Voila la solution pour ton problème:
    La solution est la suivante:

    pour un simple calcule tu va decouvrir la faute....

    ta boucle et répétée 12 fois puis elle s'arrete . C'est normale parcque tu incrémente le compteur i par 5 " i = i+5 " alors i={5,15,20,25,...,100}

    et ds la déclaration du tableau "Far" tu la déclaré par 21 case... Pas de probleme jusqua mnt.......

    Le problème vient dans la ligne:

    printf("..... ",Far[i],Cel[i]); alors Ici suposons que i =25 !!!!!

    Far[25] n'existe pas!!!!!ton tableau n'a que 21 case.... vous voyez le problème en claire je pense...


    La solution cé de déclaré un tableau au moin >70 case


    J'espère bien que ta bien compris...

    A:\MEDIUM

  10. #10
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    allez c'est inutile de vous bagarrer. J'ai une solution.
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    int main(void)
    {
    	int Far[21];
    	float Cel[21];
     
    	printf("Affichage:\nFar   Cel\n\n");
     
    	int i=0;
    	int cpt=0;
    	float val=0;
     
    	while(i<=100){
            Far[cpt]=i;
            (float)val=(5*(i-32))/9;
            Cel[cpt]=val;
                    printf("%d...%.2f\n", Far[cpt], Cel[cpt]);
                    printf("\n");
                i=i+5;
                cpt=cpt+1;
                }
    return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    Bonjour.

    J'ai un tableau de 21 indices (cases).
    Et un compteur qui va de 0 à 100, pour remplir le tableau.

    Mon problème c'est que le boucle s'arrête au douzième élément.

    voici le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(void)
    {
       int i=0;
     
       while(i<=100){
     
          i=i+5;
       }
    }
    Je ne sais pas trop ce que tu cherches à faire mais comme l'indice augmente de 5 à chaque fois, tu sors rapidement du tableau et le comportement devient indéterminé. Pourquoi ce code est-il si compliqué ? Tu n'as pas du tout besoin de tableau. D'autre part, je recommande que les calculs soient faits en double, sinon les divisions sont entières. Enfin, il est important que les identificateurs aient du sens... :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       int deg = 0;
     
       printf ("Far -> Cel\n\n");
     
       while (deg <= 100)
       {
         double far = (5 * (deg - 32.0)) / 9;
          printf ("%3d -> %7.2f\n", deg, far);
          deg += 5;
       }
     
       return 0;
    }
    Pose des questions si tu ne comprends 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
     
    Far -> Cel
     
      0 ->  -17.78
      5 ->  -15.00
     10 ->  -12.22
     15 ->   -9.44
     20 ->   -6.67
     25 ->   -3.89
     30 ->   -1.11
     35 ->    1.67
     40 ->    4.44
     45 ->    7.22
     50 ->   10.00
     55 ->   12.78
     60 ->   15.56
     65 ->   18.33
     70 ->   21.11
     75 ->   23.89
     80 ->   26.67
     85 ->   29.44
     90 ->   32.22
     95 ->   35.00
    100 ->   37.78
     
    Press ENTER to continue.

  12. #12
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    les tableaux c'était pas mon idée, mais celle du manuel de C.

    les identifications...bein, Far pour Fahrenheit et Cel pour Celsius ...c'est assez censé je trouve.

    Mais bon, j'essaie de me justifier comme je peux, même si je sais que je n'ai pas le niveau pour te tenir tête.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    les tableaux c'était pas mon idée, mais celle du manuel de C.
    Comme tu n'as pas expliqué ce que tu vous lais faire, j'ai été au plus simple...
    les identifications...bein, Far pour Fahrenheit et Cel pour Celsius ...c'est assez censé je trouve.
    OK pour le nom des tableaux, mais i, cpt et val ? Je vois pas trop ce que ça veut dire dans ce contexte...
    Mais bon, j'essaie de me justifier comme je peux, même si je sais que je n'ai pas le niveau pour te tenir tête.
    Personne ne te demande te te justifier...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle For et While
    Par mairou dans le forum Débuter
    Réponses: 6
    Dernier message: 20/09/2008, 20h33
  2. Pb. ac un "read" dans une boucle de type "while read"
    Par florant23 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/05/2008, 10h23
  3. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55
  4. [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/07/2006, 01h04

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