Problème dans une double boucle For en C++
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Problème dans une double boucle For en C++



  1. #1
    Blueshift

    Problème dans une double boucle For en C++


    ------

    Bonjour, j'ai un programme à créer et j'ai un problème dans ma double boucle FOR, je souhaiterais alors que quelqu'un me vienne en aide pour m'aider à trouver mon erreur.
    Je vous laisse lire l'énoncé:

    Considérons les opérations suivantes applicables à un nombre entier (positif) :

    — si ce nombre est divisible par 3, on lui ajoute 4 ;

    — s’il n’est pas divisible par 3 mais divisible par 4, on le divise par 2 ;

    — s’il n’est divisible ni par 3, ni par 4, on lui soustrait 1.

    On répète ces opérations successivement jusqu’à arriver à 0. Concrètement, partant d’un entier n0, on applique les opérations à n0 pour obtenir n1, puis si n1 n’est pas nul, on lui applique à nouveau les opérations précédentes, et ainsi de suite jusqu’à obtenir un nombre nk valant 0.
    Par exemple, si on part de 7, on trouve successivement les valeurs : 6, 10, 9, 13, 12, 16, 8, 4, 2, 1 et 0. Le nombre k de répétitions des opérations décrites ci-dessus est alors 11. Par contre, si on part de 1, on tombe tout de suite sur 0, et le nombre de répétitions est alors de k = 1.
    On vous demande d’écrire un programme qui affiche le nombre de répétitions des opérations précédentes nécessaires pour tomber à 0, en partant tour à tour de chacun des entiers compris entre deux entiers saisis au clavier.
    Par exemple, si l’on demande ce nombre de répétitions pour chaque entier entre 1 et 7, l’affichage produit par votre programme devra être :
    1 -> 1
    2 -> 2
    3 -> 12
    4 -> 3
    5 -> 4
    6 -> 10
    7 -> 11

    J'ai vérifié si ce qui était au dessus de ma seconde boucle For était correcte et c'est le cas, cependant je ne trouve pas l'erreur dans ma seconde boucle for.
    sachant que les entrées sont : debut (le nombre a partir duquel on veut partir: ici 1) et fin(celui qui va terminer la boucle: ici 7)
    Voici mon programme (la partie qui nous intéresse) :
    Code:
    for (int i(debut);i<=fin;++i) {
    
    
    
    for (int m(1); debut!=0;++m) { 
    	
    
    	if (debut%3==0) {
    		debut=debut+4;
    	} else if ((debut%3!=0) and (debut%4==0)) {
    		debut=(debut/2);
    	} else {
    		debut=debut-1;
    	}
    	
    	cout << i <<" -> "<< m;
    }
    }
    Et voilà ce que cela m'affiche :

    de (>= 1) ? 1
    a (>= 1) ? 7
    1 -> 1

    Est-ce que quelqu'un pourrait me dire ce qui cloche svp ?

    Cordialement,
    Blueshift.

    -----
    Dernière modification par Jack ; 10/10/2016 à 18h01. Motif: Ajout balises code

  2. #2
    Dlzlogic

    Re : Problème dans une double boucle For en C++

    Bonjour,
    Je n'ai qu'un seul conseil à vous donnez : rédigez l'algorithme en français.
    Puis, à partir de cet algorithme, vous vérifierez que ça marche pour quelques nombres.
    Enfin, vous pourrez le traduire en code suivant votre langage préféré.

  3. #3
    jiherve

    Re : Problème dans une double boucle For en C++

    Bonsoir
    En fait tu testes une valeur constante durant ta seconde boucle car 'début' est fixé en dehors est il n'est il pas? ne faudrait t il pas tester 'i' qui lui balaye les valeurs d'entrée?
    Donc je n'ai pas du tout l'impression que ce qui est codé corresponde aux attendus.
    pour ma culture que fait :
    cout << i <<" -> "<< m;
    çà c'est typiquement le genre de ligne absconse que le C autorise!
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    Blueshift

    Re : Problème dans une double boucle For en C++

    Bonsoir et merci beaucoup !
    Mon programme fonctionne !
    Merci en tout cas.

    cout<<i<< "->"<<m;

    affiche la valeur de i suivit de "->" et de la valeur de m

    Cordialement.
    Blueshift

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Problème dans une double boucle For en C++

    Il y a effectivement un problème avec debut car il sort de la boucle interne avec la valeur 0.

    Du coup a l'exécution du "for (int m(1); debut!=0;++m) { " suivant, tu vas sortir immédiatement de la boucle.

    En passant, dans "else if ((debut%3!=0) and (debut%4==0)) {", le "(debut%3!=0) and " est inutile puisque tu es dans le "else" donc debut%3 est forcément différent de 0.

    Enfin, le "cout << i <<" -> "<< m;" est dans la boucle interne, alors qu'il ne devrait s'afficher qu'à chaque itération de la boucle externe (celle du i).

    Pour jiherve "cout << i <<" -> "<< m;" cout représente la console, le stdout du C. << est un opérateur d'injection qui envoie donc vers la console tout ce qui suit, de la gauche vers la droite.

  7. #6
    jiherve

    Re : Problème dans une double boucle For en C++

    Re
    N'utilisant pas le C autrement qu'en embarqué et en plus de façon marginale(je suis un assembly addicted, l'âge sans doute ) je ne suis donc pas familier avec ce type de commande.
    Merci pour l'explication.
    JR
    l'électronique c'est pas du vaudou!

  8. #7
    bzh_nicolas

    Re : Problème dans une double boucle For en C++

    Attention, il y a une différence entre

    — si ce nombre est divisible par 3, on lui ajoute 4 ;
    — s’il n’est pas divisible par 3 mais divisible par 4, on le divise par 2 ;
    — s’il n’est divisible ni par 3, ni par 4, on lui soustrait 1.

    et

    Code:
    if (debut%3==0) {
    	debut=debut+4;
    } else if ((debut%3!=0) and (debut%4==0)) {
    	debut=(debut/2);
    } else {
    	debut=debut-1;
    }
    Cette partie de ton algo est fausse

  9. #8
    Jack
    Modérateur

    Re : Problème dans une double boucle For en C++

    Je ne sais pas si c'est l'heure, mais je ne vois pas ce qui cloche mis à part la redondance dans le 2ème test qui n'est pas une erreur en soi.

  10. #9
    Bluedeep

    Re : Problème dans une double boucle For en C++

    Citation Envoyé par jiherve Voir le message
    çà c'est typiquement le genre de ligne absconse que le C autorise!
    JR
    Non, le "<<" ici est l'opérateur de redirection du C++; ce n'est pas l'opérateur de décalage de bit du C.

  11. #10
    Jack
    Modérateur

    Re : Problème dans une double boucle For en C++

    Je chipote, mais je n'aime pas trop le terme de "redirection" qui peut entraîner la confusion avec celui d'un shell.

    J'utilise plutôt opérateur d'injection, bien que le terme exact soit "insertion operator", qui me semble plus représentatif. Pour lire depuis une entrée, l'opérateur >> s'appelle lui "extraction opérator"

    A+

  12. #11
    Bluedeep

    Re : Problème dans une double boucle For en C++

    Citation Envoyé par Jack Voir le message
    Je chipote, mais je n'aime pas trop le terme de "redirection" qui peut entraîner la confusion avec celui d'un shell.
    Et tu as absolument raison; n'ayant pas pratiqué le C++ depuis au moins 20 ans, j'ai quelques lacunes .....

  13. #12
    jiherve

    Re : Problème dans une double boucle For en C++

    Bonjour

    Citation Envoyé par Bluedeep Voir le message
    Non, le "<<" ici est l'opérateur de redirection du C++; ce n'est pas l'opérateur de décalage de bit du C.
    Que cela soit l'une ou l'autre je n'avais rien compris à cette ligne maintenant je saurais mais comme elle n'avait pas vraiment de rôle dans l'algo cela ne me gênait pas plus que çà.
    JR
    l'électronique c'est pas du vaudou!

  14. #13
    Dlzlogic

    Re : Problème dans une double boucle For en C++

    Bonjour,
    Je rebondis sur le message de Nicolas.
    En d'autres termes, le test suivant doit-il être fait après le test et l'opération précédente ou non ?
    L'écriture de l'algorithme en français aurait tranché le problème.
    Ce type d'erreur dans un programme de 10000 lignes où ce cas est rare peut être catastrophique.

    J'aimerais bien quelques détails sur la syntaxe de la ligne
    for (int m(1); debut!=0;++m)
    Je veux bien qu'on puisse déclarer une fonction " int m(1) " à l'intérieur d'un module ou d'un bloc, mais alors que représente ++m ?
    Donc ma question "m" est une fonction ou une variable ?
    Je préfère très nettement cette syntaxe :
    for (int m=1; debut != 0; m++) (je me suis permis de rajouter des espaces dans un souci de lisibilité)

  15. #14
    Bluedeep

    Re : Problème dans une double boucle For en C++

    Citation Envoyé par jiherve Voir le message
    Que cela soit l'une ou l'autre je n'avais rien compris à cette ligne maintenant je saurais mais comme elle n'avait pas vraiment de rôle dans l'algo cela ne me gênait pas plus que çà.
    Ce que je voulais dire c'est que ce n'était pas une syntaxe C, mais spécifiquement C++.

  16. #15
    Jack
    Modérateur

    Re : Problème dans une double boucle For en C++

    Je veux bien qu'on puisse déclarer une fonction " int m(1) " à l'intérieur d'un module ou d'un bloc
    Il s'agit à nouveau d'une syntaxe spécifique au C++ pour déclarer et initialiser une variable d'un coup:
    int m(1); équivaut à int m = 1;
    Si tu es familier avec la programmation objet et les classes, tu peux voir int m(1); comme un appel au constructeur de l'objet, en l'occurrence un simple entier, d'où la similitude syntaxique avec un appel de fonction.

  17. #16
    Bluedeep

    Re : Problème dans une double boucle For en C++

    Citation Envoyé par Jack Voir le message
    Il s'agit à nouveau d'une syntaxe spécifique au C++ pour déclarer et initialiser une variable d'un coup:
    int m(1); équivaut à int m = 1;
    Si tu es familier avec la programmation objet et les classes, tu peux voir int m(1); comme un appel au constructeur de l'objet, en l'occurrence un simple entier, d'où la similitude syntaxique avec un appel de fonction.
    La comparaison est osee. De memoire il ya bien un operateur "new" en C++ ?
    Je pense qu'il faut plutot classer ca dans la trop longue liste des syntaxes 'perverses' du C++ (avec l'ineffable '=0' de declaration des methodes abstraites).
    On aura compris que je n'aimais pas ce language, que j'ai toujours considere comme "batard".

    (desole, message ecrit avec un clavier qwerty)

  18. #17
    Dlzlogic

    Re : Problème dans une double boucle For en C++

    Bonsoir,
    Un gros plus pour Bluedeep.
    Il y a à peut près 20 ans, j'ai eu la version de C++. J'ai fait des tests, en particulier avec la classe io, et j'ai laissé tomber.
    Par contre, les classes, c'est l'ajout du C++ par rapport au C, j'ai testé et j'ai adopté.
    Si on développe et si on code avec rigueur, c'est très bien, par contre, toutes les classes "spécial C++", je n'utilise pas.
    Pour mémoire, j'ai fait des tests de performance (et non de rapidité d'écriture du code) et y'a pas photo.

  19. #18
    Jack
    Modérateur

    Re : Problème dans une double boucle For en C++

    La comparaison est osee
    Pas tant que ça pour l'instanciation d'un objet. Pour l’instanciation d'un entier, les 2 syntaxes sont complètement équivalentes et ne font évidemment appel à aucun constructeur.

    De memoire il ya bien un operateur "new" en C++ ?
    Oui, mais quel est le rapport?

    Je pense qu'il faut plutot classer ca dans la trop longue liste des syntaxes 'perverses' du C++ (avec l'ineffable '=0' de declaration des methodes abstraites).
    Oui, il fallait oser en effet. Pour être exact, tu décris la déclaration d'une méthode virtuelle pure, ce qui permet de déclarer la classe comme étant abstraite, donc non instanciable.

    Pour aller dans ton sens sur le fond, j'ai vraiment du mal avec ce qu'on appelle le C++ moderne, donc toutes les nouveautés des normes de 2011 et 2014. Par rapport à mes besoins, ça me passe un peu au dessus de la tête.

Discussions similaires

  1. Programation sous R: problème de compteur dans une boucle
    Par aykio dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 17/07/2014, 10h27
  2. problème boucle interruption avec boucle spi
    Par alice123 dans le forum Électronique
    Réponses: 8
    Dernier message: 16/03/2013, 02h26
  3. Probleme boucle for ou boucle do...while imbriquées
    Par Pilou81 dans le forum Électronique
    Réponses: 8
    Dernier message: 09/06/2010, 10h32
  4. Langage C : problème dans une boucle
    Par invitedba13d1f dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 25/05/2009, 10h48
  5. Matlab : Problème de format dans boucle
    Par invite2d9939ba dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 03/04/2008, 11h15