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 :

Comprendre un code


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut Comprendre un code
    Bonjour à tous,

    Je dois dire ce qu’affiche le code suivant sans explication (c’est un QCM) et je voulais savoir comment je devrais m’y prendre pour ne pas m’y perdre ?
    Je pourrais tout simplement le compiler et voir le résultat mais ce n’est pas l’objectif :-).

    Mon raisonnement:
    Calculer nested_while(a = 2; b = 2; c = 3)
    —> m = 7 (on “écrase” la variable globale, on prend la locale)
    0<7 OK ; 0 < 2 OK -> j = 1 -> Print: 1 0
    -> R = 1.
    Etc.
    J’arrive à quelque chose du genre 1 0 2 1 pour result.
    m pour moi vaut 2 quand on le print dans le main mais c’est faux car la réponse n’est même pas proposée.

    On propose:
    A / 102022
    B/ 102020
    C/ 10203023
    D/ 102062



    Code dont je fais référence:
    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
     
    #include <stdio.h>
       int m = 2;
     
       int nested_while(int a, int b, int c){
       int i, j, m, r;
       m = a + b + c;
       i = 0;
       j = 0;
       r = 0;
       while (i < m) {
         while (j < b) {
           j++;
           printf("%d %d ", j, i);
           r = i + j;
    }
    i++; }
    return r; }
     int main() {
       int c, i, j;
    int result;
       c = 3;
       i = 1;
       j = ++i;
       result = nested_while(i, j, c);
       printf("%d %d", m, result);
    return 0; 
    }
    Réponse du corrigé (si jamais): A.

    Si vous avez des astuces ou quoi que ce soi pour m’aider, ça serait super!

  2. #2
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut
    La première chose que tu peux faire, est d'indenter ton code.
    Ensuite, tu peux simplifier ton programme, dans le cas, présent il y a des instructions/boucles qui sont inutiles.

    Exemple : la première boucle while ne sert à rien. Tu peux commenter le while(i < m), et tu aura le même résultat.
    Par conséquent on peut en déduire que si while(j < b) est executé alors i == 0. Donc tu peux remplacer tous les i par des 0.
    Dernière simplification, on sait que pendant le dernier tour de ta boucle, tu auras r = i + j soit r = 0 + b donc r == b.

    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
    int nested_while(int a, int b, int c){
       int i, j, m, r;
       m = a + b + c;
       //i = 0;
       j = 0;
       //r = 0;
       //while (i < m) {
         while (j < b) {
           j++;
           printf("%d %d ", j, i);
           //r = i + j;
    }
    //i++; }
    //return r; }
    return b;}
    Puis après un petit coup d'indentation, c'est maintenant plus lisible :

    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
    int nested_while(int a, int b, int c)
    {
        int j, m;
        m = a + b + c; // ici on assigne une valeur au m local crée une ligne plus haut, et non au m global. C'est un piège pour voir si tu connais bien ton cours ;)
        j = 0;
         
        while (j < b)
        {
            j++;
            printf("%d %d ", j, 0);
        }
        
        return b;
    }

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Merci.
    Comment as-tu faire pour remarquer pour la boucle ? J'y aurais jamais pensé et vu qu'on a pas le droit à l'ordi pour compiler je dois essayer de le remarquer comme ça.
    Ceci dit, toujours avec ton code je trouve pas le bon résultat (attendu):

    Result = nested_while(a= 2, b = 2, c = 3);
    On a m = 7 (m local).
    Tant que j < 2:
    j = 1 : print : 1 0
    j = 2 : print : 2 0

    Retour dans le main:


    On print m puis result donc: on reprend le m global qui vaut 2 (car pas de m local) puis on imprime result qui vaut 1 0 2 0
    --> 2 1 0 2 0
    Ce qui n'est pas proposé non plus. Ce qui me dérange le plus c'est le "m" surtout car aucune proposition ne commence par 2.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Bonjour,

    tes raisonnements sont bons, mais tu oublies que les affichages correspondent tout simplement aux printf
    Les boucles affichent 1 0 puis 2 0, le result est calculé c'est le dernier r=i+j à la fin des 2 boucles (donc 2+0=2), et comme tu le dis m est resté à 2.
    Le dernier printf indique m et r donc 2 et 2.
    D'où le résultat affiché : 1 - 0 - 2 - 0 - 2 - 2

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Merci beaucoup !
    C'est beaucoup plus clair !
    Juste, comment avez-vous remarqué comme ça immédiatement que la première boucle était inutile ? :p

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Citation Envoyé par georg_mf Voir le message
    Juste, comment avez-vous remarqué comme ça immédiatement que la première boucle était inutile ? :p
    Lors de la première itération de la première boucle, 'j' va être incrémenté jusqu'à atteindre 'b'.
    Lors de toutes les autres itérations de la première boucle, 'j' a déjà atteint 'b' et donc la seconde boucle n'est plus déroulée.
    Finalement la première boucle ne sert qu'à incrémenter 'i' (elle sert quand même à faire qu'à la fin 'i' vaudra 'm', mais personne n'utilise 'i' ensuite, donc est finalement inutile).

Discussions similaires

  1. Besoin d aide pour comprendre un code
    Par litlebasic dans le forum Delphi
    Réponses: 4
    Dernier message: 22/06/2006, 13h00
  2. Réponses: 6
    Dernier message: 18/06/2006, 00h22
  3. Aide pour comprendre un code
    Par Spacy_green dans le forum Assembleur
    Réponses: 2
    Dernier message: 13/02/2006, 13h22
  4. Aide pour comprendre le code
    Par jfreuff dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/01/2006, 17h54
  5. Comprendre un code asm relatif aux bitmaps
    Par sorry60 dans le forum Assembleur
    Réponses: 8
    Dernier message: 20/04/2005, 21h31

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