Simplification racine carrée en c++ [Résolu]

Messages postés
340
Date d'inscription
jeudi 3 novembre 2016
Dernière intervention
18 septembre 2017
- 11 janv. 2017 à 18:15 - Dernière réponse :
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 12 janv. 2017 à 10:45
Bonjour,

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 :

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

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

6 réponses

Messages postés
15828
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 11 janv. 2017 à 19:16
0
Merci
Bonjour,

"J'apprends pour le moment la POO en C++"
Ton code ne fait pas de POO... et pire, tu as tout mis dans le main !

if (nombreX == 4 || 9 || 16 || 25 || 36 || 49 || 64 || 81 || 100 || 121 || 144 || 169 || 196 || 225 || 256 || 289 || 324 || 361 || 400 || 441 || 484 || 529)

Ce code est faux. Il faudrait plutôt faire
if (nombreX == 4 || nombreX == 9 || nombreX == 16 ...)
même si dans le fond, lister l'ensemble de ces valeurs n'est pas la bonne manière de faire.

Ce qu'il faut c'est faire une décomposition en produit de facteurs premiers de ta racine, et à chaque fois que tu as deux facteurs identiques, le sortir de la racine.

Voir algorithme de décomposition en produit de facteurs premiers
Commenter la réponse de KX
Messages postés
340
Date d'inscription
jeudi 3 novembre 2016
Dernière intervention
18 septembre 2017
- 11 janv. 2017 à 21:42
0
Merci
Bonjour,

Oui effectivement, il n'y a pas de POO,... Je contais le dire, puis je me suis dit que ça allait alourdir mon message... Je ne suis pas tres bon en POO, meme vraiment pas bon... Ce qui est normal, j'ai enormement d'activité et je ne peux pas avancer rapidement en programmation...
Oui, j'ai tous mis dans la main, c'est ce que j'appelle un "premier jet", seulement celui-ci ne fonctionnant pas, je l'ai publié pour que vous m'aidiez a m'en sortir (ce que vous avez fait et je vous en remercie).
J'ai continuer un peu mon programme par moi meme et si vous l'accepter, j'aimerais beaucoup recevoir des conseils pour structurer ma POO, je ne "pense pas encore objet"...
Je vous met mon 2e code plus bas. Je vais encore surement l'améliorer.

Merci beaucoup pour votre message tres instructif !
Commenter la réponse de gillesdc
Messages postés
340
Date d'inscription
jeudi 3 novembre 2016
Dernière intervention
18 septembre 2017
- Modifié par KX le 11/01/2017 à 21:58
0
Merci
Bonjour,

J'ai un peu retravaillé mon code, il compile maintenant et est un rien plus lisible. Je vais encore travailler a sa lisibilité. J'adorais recevoir de l'aide pour la POO, ne fusse que pour structurer le code. Cela me ferait enormement plaisir !
mon code main.cpp :
#include <iostream>
#include <cmath>
#include "Nombre.h"

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 nombreA(0); //initialisation de toutes les variables
    int nombreB (0);
    int nombreC (0);
    int nombreD (0);
    int nombreE (0);
    int nombreGauche1 (1);
    int nombreGauche2 (0);
    int nombreDroite1 (nombreB);
    int nombreDroite2 (nombreC);

for (nombreA = 150; nombreA > 2; nombreA--)

{
               int nombreY (nombreX%nombreA); //nombre Y egal doit valeur 0
               int nombreZ (nombreX/nombreA);

if (nombreY == 0)
                     {
                        cout << nombreA << " X " << nombreZ << endl; //affichage des PPCM
                     }
                 else
                 {
                     cout << "erreur de simplification" << endl;
                 }
          }

cout << "Indiquer le premier facteur PPCM" << endl;
    cin >> nombreB;
    cout << "Indiquer le deuxieme facteur PPCM" << endl;
    cin >> nombreC;
    nombreD = carreParfaitOuNon(nombreB); // vérification qu'il s'agit bien de carré parfait
    nombreE = carreParfaitOuNon(nombreC);
    if (nombreD == 1)
    {
        nombreGauche1 = sqrt(nombreB);
    }
    else
    {
        nombreDroite1 = nombreB;
    }

if (nombreE == 1)
    {
        nombreGauche2 = sqrt(nombreC);
    }
    else
    {
        nombreDroite2 = nombreC;
    }

cout << nombreGauche1 << " X " << nombreGauche2 << " sqrt " << nombreDroite1 << " X " << nombreDroite2 << endl;

return 0;

}


mon code nombre.h :

#ifndef NOMBRE_H_INCLUDED
#define NOMBRE_H_INCLUDED

int carreParfaitOuNon(int nombreA)
{
  int nombreB(0);
  bool nombreCarreParfait(true);
  nombreB = sqrt(nombreA);
  if (nombreB*nombreB == nombreA)
  {
      return 1;
  }
  else
  {
      return 0;
  }
}

#endif // NOMBRE_H_INCLUDED


On retrouve dans nombre.h une fonction qui pourrait peut etre servir de méthode pour l'objet, non ?

Merci d'avance,
Commenter la réponse de gillesdc
Messages postés
15828
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 11 janv. 2017 à 21:58
0
Merci
Alors je ne vois pas du tout le rapport entre ton code et ton objectif, car si j'ai bien compris ce que tu veux faire, la fonction de calcul fait 10 lignes...

int f(int n) {
    int a = 1;
    for (int d = 2, s = sqrt(n); d <= s; d++) {
        int p = d * d;
        while (n % p == 0) {
            a *= d;
            n /= p;
            s /= d;
        }
    }
    return a;
}

Exemple :

void s(int n) {
    int a = f(n);
    int b = n / (a * a);
    printf("sqrt(%d)=%d.sqrt(%d)\n", n, a, b);
}

int main() {
    s(16);    // sqrt(16)=4.sqrt(1)
    s(77);    // sqrt(77)=1.sqrt(77)
    s(24255); // sqrt(24255)=21.sqrt(55)
}

Après tu peux mettre un peu d'objet là dedans, mais très honnêtement je ne vois pas trop l’intérêt ici, ce n'est que du calcul...
Commenter la réponse de KX
Messages postés
340
Date d'inscription
jeudi 3 novembre 2016
Dernière intervention
18 septembre 2017
- 11 janv. 2017 à 22:09
0
Merci
Effectivement, ça n'a probablement aucun interet !
Je prends ça plutot comme un entrainement pour m'améliorer ;)
Commenter la réponse de gillesdc
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
- Modifié par cptpingu le 12/01/2017 à 17:20
0
Merci
Bonjour.

Je ne vais pas rien ajouter à la discussion concrètement puisque KX a très bien répondu à ta question.

2 petites remarques tout de même:
  • Évite les using namespace std, c'est ultra crade, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
  • POO != obligation. La POO n'est pas une fin en soi. Certains langages ne font même pas de POO ! Dire que tu veux faire de la POO dans ce programme, c'est comme dire: "Faut vraiment que je visse ce clou, parce que je ne sais pas utiliser de tournevis". Il faut bien comprendre que l'on utilise la POO avec parcimonie, et que si l'on se force à en mettre, c'est vraisemblablement inadapté. Pour apprendre la POO, cherche des exos de POO. Ne pas oublier que le C++ n'est pas un langage de "POO", mais un langage "multi-paradigme" (qui est adapté pour mélanger plusieurs styles), dont le principal atout est le "RAII". Si on doit décrire le C++, alors on dira que c'est un langage qui gère le RAII (voir ce qu'est le RAII ici: https://fr.wikipedia.org/wiki/Resource_acquisition_is_initialization).


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.