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 :

Simplification de racine carrée


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut Simplification de racine carrée
    Bonjour a tous !

    J'apprends pour le moment la POO en C++, et je me suis lancé comme défi de faire un programme qui ne calculerait pas la racine, mais la simplifierait, pour ce, j'ai divisé mon programme en 2 parties :

    1) on trouve les PPCM du nombre
    2) on calculs les chiffres qui doivent etre a l'interieur ou a l'exterieur de la racine (ici le point virgule ";").

    Seulement, voilà, mon programme fonctionne bien pour la premiere partie, mais pour la deuxieme, il met tous les chiffres a l'exterieur de la racine,...
    je vous met mon programme :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
     int nombreX (0); //initialisation de la valeur de la racine
     
    int main()
    {
        cout << "Choississez la valeur de la racine : ";
        cin >> nombreX;
        int nombreW (0);
        if (nombreX == 4 || 9 || 16 || 25 || 36 || 49 || 64 || 81 || 100 || 121 || 144 || 169 || 196 || 225 || 256 || 289 || 324 || 361 || 400 || 441 || 484 || 529)
                     {
                         nombreW = sqrt(nombreX);
                         cout << nombreW << " il s'agit d'un carre parfait, ne vous preoccupez pas du reste." << endl;
                     }
        int nombreA(0);
        for (nombreA = 150; nombreA > 2; nombreA--)
     
              {
                   int nombreY (nombreX%nombreA); //nombre Y egal soit 1 soit 0
                   int nombreZ (nombreX/nombreA);
     
                     if (nombreY == 0)
                         {
                            cout << nombreA << " X " << nombreZ << endl;
                         }
                     else
                     {
                         cout << "erreur" << endl;
                     }
              }
     
        int nombreB (0);
        int nombreC (0);
        int nombreGauche1 (1);
        int nombreGauche2 (0);
        int nombreDroite1 (0);
        int nombreDroite2 (0);
     
        cout << "Indiquer le premier facteur PPCM" << endl;
        cin >> nombreB;
        cout << "Indiquer le deuxieme facteur PPCM" << endl;
        cin >> nombreC;
     
        if (nombreB == 4 || 9 || 16 || 25 || 36 || 49 || 64 || 81 || 100 || 121 || 144 || 169 || 196 || 225 || 256 || 289 || 324 || 361 || 400 || 441 || 484 || 529)
        {
            nombreGauche1 = sqrt(nombreB);
        }
        else
        {
            nombreDroite1 = nombreB;
        }
     
        if (nombreC == 4 || 9 || 16 || 25 || 36 || 49 || 64 || 81 || 100 || 121 || 144 || 169 || 196 || 225 || 256 || 289 || 324 || 361 || 400 || 441 || 484 || 529)
        {
            nombreGauche2 = sqrt(nombreC);
        }
        else
        {
            nombreDroite2 = nombreC;
        }
     
        cout << nombreGauche1 << " X " << nombreGauche2 << ";" << nombreDroite1 << " X " << nombreDroite2 << endl;
     
     
        return 0;
     
    }
    Il n'est pas tres beau et concis, mais soyez indulgent, c'est mon premier programme aussi dur tout seul
    Si vous savez comment corriger ce probleme, comment ameliorer la beauté de mon programme ou comment proceder pour le transformer en POO, je suis a l'écoute !

    Merci d'avance,

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Tu devrais déjà commencer par respecter l'un des principe de base de la programmation : le principe de la responsabilité unique.

    Ce principe nous dit que toute fonction et toute classe ne devrait jamais s'occuper que d'une seule chose, afin que nous puissions nous assurer qu'elle le fasse bien.

    Ici, tu as -- très clairement -- trois étapes distinctes :
    1. calculer le ppcm
    2. calculer les valeurs qui doivent être à l'intérieur et à l'extérieur (quoi que cela puisse vouloir dire) et
    3. afficher le résultat

    Tu dois donc ad minima avoir ... trois fonctions.

    Ce qui implique que, même si on passe sur le fait que la fonction main a déjà sa propre responsabilité, et que l'on décide d'accepter que l'affichage du résultat est de la responsabilité de la fonction main, il te reste encore au minimum deux fonctions à créer, de manière à ce que tu puisse t'assurer que ces deux fonctions fonctionnent correctement séparément.

    Une fois que ce sera fait (et que tu auras pu obtenir la garantie que ces deux fonctions font correctement leur job), tu pourras envisager de les regrouper pour qu'elles soient effectuées l'une après l'autre, ce qui te permettra d'avoir le résultat auquel tu t'attend

    D'ailleurs, sans vouloir relancer le débat sur "le nombre de lignes maximal d'une fonction", le simple fait que ta fonction main fasse près de 70 lignes est très certainement le symptome qu'elle est beaucoup trop longue (environ deux à trois fois), et donc, qu'elle en fait beaucoup trop

    Enfin, quelques remarques en vrac :
    1. n'utilises pas la directive using namespace std;; Je sais que de nombreux EDI la mettent encore par défaut, mais cette directive a été essentiellement utilisée pour permettre à "la base de code existante" au moment de l'apparition des espaces de noms de continuer à fonctionner "sans trop de modifications". A l'heure actuelle, elle occasionne bien plus de problèmes qu'elle n'en résoud
    2. les variables globales, c'est mal
    3. ne pré déclares pas tes variables : déclares tes variable le plus près possible de l'endroit où elles sont utilisées
    4. par convention, l'utilisateur est un "imbécile distrait", et que l'on ne peut en aucun cas lui faire confiance quand on lui demande d'introduire quelque chose... Tout ce qu'il introduit doit donc être vérifié pour nous garantir qu'il n'introduit pas quelque chose de totalement aberrant
    5. il est toujours bon de séparer très clairement tout ce qui "a trait à l'affichage" de tout ce qui " a trait à l'acquisition de données" et du "reste du code". Quand on commence à mélanger le tout, cela donne très vite le tournis
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    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,

    Attention à la syntaxe d'utilisation de l'opérateur ||. On doit mettre de part et d'autre un test, par exemple
    if (nombreX == 4 || nombreX == 9 || nombreX == 16 || nombreX == 25 ) pour tester si le nombre vaut 4, 9, 16 ou bien 25.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Attention à la syntaxe d'utilisation de l'opérateur ||. On doit mettre de part et d'autre un test, par exemple
    if (nombreX == 4 || nombreX == 9 || nombreX == 16 || nombreX == 25 ) pour tester si le nombre vaut 4, 9, 16 ou bien 25.
    J'ai trouvé un moyen pour contourner le problème, mais je prends note !
    Merci,

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Attention à la syntaxe d'utilisation de l'opérateur ||. On doit mettre de part et d'autre un test, par exemple
    if (nombreX == 4 || nombreX == 9 || nombreX == 16 || nombreX == 25 ) pour tester si le nombre vaut 4, 9, 16 ou bien 25.
    En fait, pour être précis, ce n'est pas *** forcément *** un test qu'il faut utiliser comme opérande : c'est une expression booléenne (comprends : une expression qui peut au final être évaluée à true ou à false).

    Car c'est l'instruction if qui représente le test ici, alors que les opérandes de l'opérateur || sont des comparaisons (d'égalité) et que true || false serait considéré comme tout à fait valide, car les deux opérandes sont bel et bien "évaluable de manière booléenne" (malgré le fait qu'il n'aurait pas grand intérêt étant donné que... le résultat peut être directement déduit de ce genre d'expression )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut
    Bonjour !

    Merci beaucoup pour ta réponse, tres instructive, je ferais au mieux pour améliorer mon code.
    J'ai déjà créé une fonction vérifiant si le nombre est un carré parfait, reste a faire les autres !
    Je ne connaissais pas ce principe de 1 fonction = 1 usage, comme quoi j'ai encore beaucoup a apprendre !
    Je vais tenter de bien tout séparé, et meme pourquoi pas apres, faire un peu de POO...

    A bientot,

Discussions similaires

  1. [Python 3.X] Simplification de racine carré
    Par Keyller76 dans le forum Général Python
    Réponses: 2
    Dernier message: 25/03/2015, 19h32
  2. [VB]Math : racine carrée et quotient
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 24
    Dernier message: 20/04/2006, 17h08
  3. Utilisation de la fonction racine carré
    Par derf_r dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2005, 16h30
  4. [Astuce] Approximation de racines carrées
    Par Smortex dans le forum Assembleur
    Réponses: 16
    Dernier message: 18/05/2004, 06h17
  5. Racine carrée
    Par SteelBox dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/11/2002, 17h15

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