Aide programmation C++ (débutant)

Aide programmation C++ (débutant) - C++ - Programmation

Marsh Posté le 06-05-2013 à 19:02:11    

Bonjour à tous ! :)
 
Je viens à vous étant un peu perdu dans la jungle de Code::Blocks. Donc voilà, je suis en Terminale S option Info et pour le Bac on doit rendre un projet, le nôtre est de constituer une bibliothèque de fonctions (DLL). Le soucis c'est que notre prof n'est pas super compétent et je comprends pas trop ce qu'il attend de nous..
 
Pour être plus clair, voilà la consigne : "Bibliothèque de fonctions effectuant des calculs en valeur exacte sur des fractions. Mettre en œuvre la méthode de Héron pour calculer une racine carré en utilisant la bibliothèque."  
 
Voilà les différentes étapes qu'on doit être capable de retranscrire en C++ :
 
- déclarer deux tableaux "opérateurs" qui permettent de déclarer des fractions. ex: t(0) = 4 et t(1) = 7, la fraction vaut 4/7. Ces valeurs doivent être rentrées aléatoirement par l'utilisateur au début du programme. Ces fractions vont être celles qui vont être utilisées pour tous les types de calculs déclarés dans la suite du programme.
 
- faire apparaître le PGCD et le PPCM de ces deux fractions
 
- permettre le calcul d'un quotient de fractions, d'une somme de fractions, d'un produit de fractions
 
- dernière chose, permettre au programme de convertir le résultat fractionnaire sous forme de racine en appliquant la méthode de Héron
 
Tous les résultats de ces calculs devront être donnés par le programme sous forme fractionnaire !
 
Voilà, je m'excuse du pavé que je viens de créer, mais je suis vraiment perdu et je vous serais infiniment reconnaissant si vous pouviez me filer un coup de main.. Merci d'avance !  
 
Edit, le début de mon programme :
 
#include <iostream>
 
using namespace std;
 
int a ;
int b ;
int c ;
int d ;
 
 
 
int Op1[2] ;
{
    cin >> a ;
    cin >> b ;
    cout << Op1[i] << endl ;
}
 
 
int x ;
int Op2[2] ;
{
    cin >> c ;
    cin >> d ;
    cout << Op2[x] << endl ;
 
}
 
 
 
 
int pgcd (int a, int b)
{
    if (b==0) return a ;
    else return pgcd (b, a%b) ; //calcul du plus grand commun diviseur
}
 
int ppcm (int a, int b)
{
    return (a*b)/ppcm(a,b) ; // calcul du plus petit commun multiplicateur
 
}
 
 
int somme (int Op1[2], int Op2[2], int Res [2])
{
 
 
}
 
 
 
 
 
 
int main()
 
{
        return 0;
}

Reply

Marsh Posté le 06-05-2013 à 19:02:11   

Reply

Marsh Posté le 06-05-2013 à 19:24:49    

Bonjour !
 
Comme nous n'allons pas faire l'exercice à votre place (en tous cas, pas moi ...), puisque vous ne savez pas comment démarrer votre programme, avez-vous déjà les algorithmes correspondants aux questions demandées ?
 
Si oui, présentez-nous les, et dites-nous ce que vous n'arrivez pas à transcrire en C++.  
 
Bonne continuation.
 
PS : Très étranges, vos procédures de saisie ... Ça compile ?
 
Par ailleurs, pouvez-vous développer le concept de PGCD et de PPCM de deux fractions ? Et préciser la troisième question ?

Reply

Marsh Posté le 06-05-2013 à 20:01:03    

lire un cours de base s'avere plus que necessaire. Le code présenté n'a ni queue ni queue.

Reply

Marsh Posté le 07-05-2013 à 08:57:13    

Farian, je n'ai pas les algorithmes nécessaires puisque je ne sais pas du tout comment les programmer en C++..
Et non ça ne compile pas, puisqu'en fait je dois réaliser les fonctions et ensuite les insérer dans le main qui se trouve tout en bas, donc pour le moment mon main est bel et bien vide.
Le PGCD et le PPCM ce sont les deux fonctions déjà programmées, il s'agit du "plus grand commun diviseur" et du "plus petit commun multiplicateur".
 
Joel F je sais bien que je suis complètement hors sujet, mais notre prof ne nous a donné aucun cours, je ne sais même pas comment faire un tableau.. et étant donné le délai qu'il me reste, je viens chercher des explications ici !
 
Merci pour vos réponses :)

Reply

Marsh Posté le 07-05-2013 à 15:50:14    

WTF? J'ai un peu de mal à croire qu'un prof donne un exo sur une technologie non enseignée (et pas ce qui se fait de plus simple en la matière), ça me paraît complètement stupide comme exercice, sauf peut-être pour dégouter les éléves... tu ne chercherais pas à faire le devoir de quelqu'un d'autre là ? T'as séché des cours ?
 
Parce que le C++ n'est vraiment pas un langage de débutant, si tu n'as pas les bases, ce n'est pas ici qu'on pourra te les enseigner, ça serait beaucoup trop long. Te filer un code tout fait ne t'aideras pas non plus, tu vas probablement rien comprendre de toute façon...
 
Sérieux, j'ai vraiment du mal à croire qu'on peut filer un exo de C++ en terminale S, avec des concepts comme les DLL, sans faire un minimum de formation avant... c'est comme jeter un gamin dans la piscine pour lui apprendre à nager.

Reply

Marsh Posté le 07-05-2013 à 16:40:25    


 
Vous confondez l'algorithme et son codage ...
 
Avant de démarrer, vous avez certainement réfléchi à la façon dont vous alliez résoudre ce problème, voire écrit des bouts de solutions sur papier.
 
C'est au sujet de cette étape que je vous interrogeais, pas sur la "mise en musique" en C++, qui est la dernière étape, mais pas forcément la plus importante.
 
Bonne continuation !

Reply

Marsh Posté le 08-05-2013 à 18:48:15    


Salut.
Je vais pas répéter ce qui a été dit, je n'ai pas tout compris à tes explications.  
Mais si tu dois faire une lib dynamique (DLL pour win, ou .so pour linux) je ne vois pas ce que vient faire un main() dans la même unité de compilation.
 
Expose mieux ce qu'ils attendent de toi.

Reply

Marsh Posté le 09-05-2013 à 13:38:20    

tpierron, non je ne pratique pas l'école buissonnière, et je ne vois pas trop pourquoi je chercherais à faire les devoirs de quelqu'un d'autre, j'ai assez de choses à réviser pour le Bac :p  
Pour faire court, le prof ne nous a jamais donné de cours, juste des TP sans explications (du style de celui-ci). Comme on était tous un peu à la masse, on faisait ça en groupe, avec il faut bien le dire un "leader" celui qui touchait déjà un peu à la programmation.. Le problème c'est que du coup on a rien appris, et ce projet je suis totalement incapable de m'en sortir seul. Notre prof n'a soit disant "pas le temps" de nous aider, et c'est une évaluation de Bac à rendre dans 3 semaines. J'ai un peu honte d'en arriver là mais ce forum c'est un peu ma dernière chance :pfff:  
 
Farian, de façon littérale je suis capable d'expliquer ce qui est attendu de moi (enfin, ce que le prof a bien daigné m'expliquer), mais j'estime n'avoir aucunes bases en C++ et comme le disait tpierron, je ne peux pas espérer arriver au bout de ce programme sans cela..
 
make install, je vais t'exposer ce que j'ai cru comprendre. Mon programme est donc une DLL sous windows, ils attendent de moi que je crée cette DLL afin qu'elle réponde à la problématique posée (voir mon premier post) et aux différents points que j'ai cité également.  
En gros, je dois créer ces fonctions au début de mon programme, et ensuite les "insérer" dans le main pour qu'elles soient exécutables, je ne sais pas vraiment si tu saisis (?), je m'exprime mal.
 
Ne cherchez pas de buts précis à la réalisation de ce programme, il n'y en a pas. C'est juste une façon de tester nos acquis en C++, en créant ces différentes fonctions de calculs fractionnaires (PGCD, PPCM, somme, produit, quotient).
 
Merci :)

Reply

Marsh Posté le 09-05-2013 à 13:48:01    

Bonjour !
 
Justement, montrez-nous comment vous résoudriez ce programme "sur papier", nous vous ferons éventuellement nos remarques sur cette partie, puis, ensuite, nous pourrons passer au code.
 
Pour la partie "DLL", c'est encore un autre problème, encore plus "informatique" et décorrélé de la partie algorithmique.  
 
Pour moi, les étapes peuvent être les suivantes :  
 
 * Valider l'algorithme,
 * Faire une première version "tout en un" dans un programme complet, qui permet de tester les fonctions,
 * Séparer ce programme en 2, avec un "main" qui ne fait qu'appeler les fonctions qui ont été déplacées dans une DLL.
 
De ce que je vois, la première étape n'est pas encore franchie, il paraît prématuré de se poser la question de savoir comment faire une DLL ...
 
Bonne continuation !

Reply

Marsh Posté le 09-05-2013 à 14:05:35    

Farian a bien résumé le processus.
 
Mais dans ton explication de ce qu'est une DLL il y a touours un truc qui me laisse perplexe.
Une DLL et son main c'est 2 binaires, la DLL ne contient que les fonctions arithmétiques, et le programme main, plus ou moins que le main (dans ton cas).
 
Dire "je fais une DLL" et ensuite l'expliquer en disant "En gros, je dois créer ces fonctions au début de mon programme, et ensuite les "insérer" dans le main pour qu'elles soient exécutables" est justement le contraire du fonctionnement d'une DLL.
 
Es tu sur que c'est une vraie DLL que tu dois faire et pas simplement appel à des fonctions ?

Reply

Marsh Posté le 09-05-2013 à 14:05:35   

Reply

Marsh Posté le 09-05-2013 à 14:13:24    

make install, pour la question de la DLL, c'est mon professeur qui m'a expliqué que le but était de créer une DLL, ce qui pour moi n'est pas forcément évident en voyant la consigne du projet.. Voilà pourquoi je pensais plutôt faire autrement, puisque je n'ai absolument aucune idée de ce qu'est réellement une DLL et de comment la programmer  :fou:  
 
Farian, vous voulez donc que je vous écrive sous forme de phrases tout ce que je pense nécessaire de faire, diviser mon projet en étapes ?
 

Reply

Marsh Posté le 09-05-2013 à 14:31:49    

Ne le prends pas mal, je veux juste être sur que tu veuilles vraiment faire une DLL, et pas que tu te compliques la tâche pour rien.
 
En gros, il te faudra deux projets:
- libPGCD: avec libpgcd.cpp et libpgcd.h
- client: avec main.cpp
 
libPGCD sera a compiler de telle sort à produire libPGCD.dll.
libPGCD ne contient AUCUN main mais seulement des fonctions sur le pgcd.
 
Le main.cpp du projet isolé contiendra seulement un main(), et sera compilé en faisant référence à libPGCD, en utilisant son libpgcd.h et dans les directives de compilation. (bon moi je connais mal windows donc je ne connais pas les détails).
 
à l'execution ./main ira chercher libPGCD.dll
 
Voilà, "en gros".
Pour la partie algorithmique, tu pourras trouver des tutos un peu partout.
 
Une chose de plus, tu dois faire du CPP, très bien, mais du "vrai" CPP objet ? Ou juste du CPP pour dire que tu fais du CPP et finalement du C et simplement des fonctions ferait très bien l'affaire ?

Reply

Marsh Posté le 09-05-2013 à 15:01:15    

Le résume ci-dessus est très bien, cher collègue (asinus asinum fricat).

 

Pour la question de julien, l'idée est que nous n'allons pas vous donner directement une solution "clefs en main", c'est vous qui allez faire le travail.

 

Je vous proposais simplement de valider avec vous la première étape, avant de passer à la deuxième.

 

Sinon, dites-nous ce qui vous pose souci actuellement, en montrant où vous en êtes et le problème à résoudre pour avancer un petit peu vers la résolution.

 

Bon courage !

 

Edit : Je ne suis pas certain que le fait de faire du "vrai CPP" soit exigé, même si on pourrait envisager une classe "Fraction" qui sert de "front" (et qui masquerait donc les fonctions mathématiques), et définir les opérateurs "+", "*" et "/", ainsi que la redirection des "<<" et ">>" pour la saisie et l'affichage. Cela serait même assez élégant mais sans doute un peu trop "riche" par rapport à l'exercice !


Message édité par Farian le 09-05-2013 à 15:07:27
Reply

Marsh Posté le 10-05-2013 à 20:40:48    

make install, je ne le prends pas mal du tout, je suis là pour que vous me conseilliez :) C'est juste que si je m'en rappelle bien, c'est assez bizarre, mon prof m'a parlé d'une DLL mais ne m'a jamais dit que le main serait écarté..
Pour le reste de votre message, je dois vous avouer que je n'ai pas tout saisi, et cela me semble trop complexe pour un projet de Terminale avec 6 mois de cours sur le langage C++, nan ? :ouch:  
 
Farian, ce qui me pose soucis c'est dans l'essence même du projet, le prof je ne le reverrai plus avant l'évaluation, et actuellement je ne suis même pas sûr d'avoir complètement saisi ce que je devais faire, il ne m'a donné que des bribes d'indications. Si vous voulez savoir ce que j'ai cru comprendre, tout est dans mon premier post.
 
Pour être franc, j'aimerais déjà commencer par programmer cela avec un main qui appelle les fonctions, et je lui ferai ensuite parvenir cette version pour savoir si cela correspond à la consigne, ou si je dois effectivement créer une DLL.

Reply

Marsh Posté le 10-05-2013 à 21:07:25    

Ben au début tu parles de bibliothèques & DLLs, donc j'imagine que c'est ce que tu dois faire. A moins que ton prof ne sache pas non plus ce qu'est une DLL :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 10-05-2013 à 21:36:11    

J'imagine aussi, mais vu comme il me l'a expliquée, je commence à douter de lui.. :sarcastic:

Reply

Marsh Posté le 12-05-2013 à 17:50:43    

Il y a quelqu'un ? :??:

Reply

Marsh Posté le 12-05-2013 à 22:26:36    

Ce que votre prof attends de vous à priori:
1 - La création d'une bibliothèque de fonctions opérant sur les fractions (par exemple simplification, inversion, addition, soustraction, multiplication, division, ...)
     Cette bibliothèque sera implémentée dans une DLL.
     Il exige de plus que une fraction soit implémentée comme int fraction[2] ce qui est quelque peu problématique [int fraction[2] ne peut pas être la valeur de retour d'une fonction, et donc il faut passer le résultat d'une opération en parametre] (si vous avez vu les classes, vous avez probablement le droit de construire une classe fraction avec un membre int fraction[2] ce qui vous donnera un peu plus souplesse, mais c'est a vérifier).
2- Que vous écriviez un programme de calcul de la racine carrée d'un nombre (entier je pense) en utilisant la méthode de Héron, qui calcule les approximations successives avec des opérations sur les fraction, donc en utilisant les fonctions de votre bibliothèque.
 
 

Citation :

L'algorithme de Héron d'Alexandrie  
Cet algorithme donne très vite un grand nombre de chiffres significatifs.
Soit donc à chercher la racine carrée x du nombre strictement positif a
 
                  x2 = a
                  donc 2 x2 = x2 + a
                  donc 2 x = (x2 + a) / x
                  donc x = (x2 + a) / (2 x)
                  donc x = (x + a/x ) / 2
                  On obtient la formule :
                           http://therese.eveilleau.pagesperso-orange.fr/pages/truc_mat/images/rac_newton.gif  
 
Le calcul peut être commencé avec n'importe quelle valeur différente de zéro.
.Exemple avec la racine de 2 en partant de 1
 
                  x0 = 1
                  x1 = (1/2) ( 1 + 2/1) = 3/2 =1,5
                  x2 = (1/2) ( 1,5 + 2/1,5) = 17/12 ~ 1,4166666
                  x3 = (1/2) ( 17/12+ 2/(17/12)) = 577/408 ~ 1,41421568
                  x4 = (1/2) ( 577/408+ 2/(577/408)) ~ 1,4142135
 
nous avons déjà 5 décimales qui sont correctes : 1,41421
En pratique on se fixe une précision et on arrête le calcul lorsque la différence entre les deux derniers résultats est inférieure à la précision souhaitée soit 10-5 pour l'exemple ci-dessus.
On peut constater l'exceptionnelle efficacité de cet algorithme.


 
 
A+,


Message édité par gilou le 12-05-2013 à 22:33:51

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-05-2013 à 18:16:20    

gilou, je n'ai pas vu les "classes" non, mais je pense que vous résumez bien la situation dans laquelle je suis, cependant je suis incapable de programmer quoi que ce soit
 
Quelqu'un pourrait-il me donner un début ou des explications complémentaires svp ?

Reply

Marsh Posté le 13-05-2013 à 19:27:47    

Si tu n'as pas vu les classes, alors clairement, ton prof attends quelque chose comme
typedef int fraction[2];
Bref, un truc qui est du C déguisé en habits de C++
Et des fonctions à implémenter,
void addition(fraction a, fraction b, fraction& resultat);
void soustraction(fraction a, fraction b, fraction& resultat);
void multiplication(fraction a, fraction b, fraction& resultat);
void division(fraction a, fraction b, fraction& resultat);
...
Puis à implémenter l'algo racine carrée de Héron en utilisant ces fonctions
 

Citation :

cependant je suis incapable de programmer quoi que ce soit


Ben je vois pas trop ce qu'on va pouvoir faire pour toi alors, vu qu'on va pas faire le boulot à ta place.
 
Une indication, pour le moment, ne te préoccupe pas de l'histoire de la DLL, fais tout dans un unique fichier, tu pourras découper ce fichier en deux, une partie librairie (la DLL) et une partie programme faisant appel aux fonctions de la librairie, plus tard, quand ce sera au point. C'est un truc assez mineur cette histoire, il ne faut pas te focaliser dessus pour le moment.
 
A+,
 
P.S. Si votre prof avait été compétent, il aurait attendu ceci: typedef std::array<int, 2> fraction; qui est bien plus pratique à maniper


Message édité par gilou le 13-05-2013 à 19:28:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-05-2013 à 23:23:39    

Vu l'ampleur du projet, je propose qu'on fasse ça par étape.
 
Il m'a demandé dans un premier temps de faire une fonction qui additionne deux fractions (ces fractions doivent être définies par des tableaux à deux entrées au préalable).

Reply

Marsh Posté le 16-05-2013 à 11:52:46    

Donc:
void addition(fraction a, fraction b, fraction& resultat);  
Ecrivez déjà l'algo d'addition, puis tentez une écriture en C++
A+,

Message cité 2 fois
Message édité par gilou le 16-05-2013 à 11:53:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-05-2013 à 14:48:31    

gilou a écrit :

Donc:
void addition(fraction a, fraction b, fraction& resultat);  
Ecrivez déjà l'algo d'addition, puis tentez une écriture en C++
A+,

Pas mieux !!!  Cf. mon post du 06/05 :

Farian a écrit :

... avez-vous déjà les algorithmes correspondants aux questions demandées ?
Si oui, présentez-nous les, et dites-nous ce que vous n'arrivez pas à transcrire en C++.  


Bonne continuation !

Reply

Marsh Posté le 16-05-2013 à 19:05:21    

gilou a écrit :

Donc:
void addition(fraction a, fraction b, fraction& resultat);  
Ecrivez déjà l'algo d'addition, puis tentez une écriture en C++
A+,


 
 
fraction add(fraction const& a, fraction const& b) :o

Reply

Marsh Posté le 26-05-2013 à 11:58:47    

Alors voilà, j'en sais un peu plus sur mon programme, et j'ai réussi à avancer au niveau de son écriture. Cependant j'ai encore quelques erreurs que j'aimerais que vous m'aidiez à comprendre svp.
 
Voilà le programme :
 
#include <iostream>
 
using namespace std;
 
 
int multiplication_fraction(int Op1[2], int Op2[2], int Op3[2])
{
/* On suppose que le dénominateur ne peut pas être nul, cf saisie */
Op3[0] = Op1[0]*Op2[0];
Op3[1] = Op1[1]*Op2[1];
return 0;
}
 
 
int division_fraction(int Op1[2], int Op2[2], int Op3[2])
{
/* On suppose que le dénominateur ne peut pas être nul, cf saisie */
Op3[0] = Op1[0]*Op2[1];
Op3[1] = Op1[1]*Op2[0];
return 0;
}
 
 
int addition_fraction(int Op1[2], int Op2[2], int Op3[2])
{
/* On suppose que le dénominateur ne peut pas être nul, cf saisie */
Op3[0] = Op1[0]*Op2[1]+Op1[1]*Op2[0];
Op3[1] = Op1[1]*Op2[1];
return 0;
}
 
 
int soustraction_fraction(int Op1[2], int Op2[2], int Op3[2])
{
/* On suppose que le dénominateur ne peut pas être nul, cf saisie */
Op3[0] = Op1[0]*Op2[0]-Op1[1]*Op2[0];
Op3[1] = Op1[1]*Op2[1];
return 0;
}
 
 
int simplification_fraction(int Op1[2], int Op2[2])
 
/* Division par 2 */
while (Op1[0]!=Op3[0])
{
  pas encore terminé
}
 
 
int afficher_fraction(int Op[2])
{
    cout << "Votre fraction est : " ;
    cout << Op[0] ;
    cout << "/" ;
    cout << Op[1];
    cout << endl ;
return 0;
}
 
 
int pgcd (int a, int b)
{
    if (b==0) return a ;
    else return pgcd (b, a%b) ; //calcul du plus grand commun diviseur
}
 
 
int ppcm (int a, int b)
{
    return (a*b)/ppcm(a,b) ; // calcul du plus petit commun multiplicateur
 
}
 
 
int Heron ()
{
   pas encore commencé
}
 
 
 
 
int main()
{
    int Op1[2] ; /* Tableau de la fraction 1 */
    int Op2[2] ; /* Tableau de la fraction 2 */
    int Op3[2] ; /* Tableau de la fraction résultat */
    int Op4[2] ; /* Tableau de la fraction pour l'affichage après simplification*/
    int i ;
    int num_ope ; /* Choix de l'opération */
 
    /*Saisie Fraction 1 */
    cout << "Tapez le numerateur de la premiere fraction : " ;
    cin >> Op1[0] ;
 
    Op1[1]=0 ;
    while (Op1[1]==0)
    {
      cout << "Tapez un denominateur de la premiere fraction : " ;
      cin >> Op1[1] ;
      if (Op1[1]==0) cout << "Erreur, denominateur non valide " << endl ;
    }
    afficher_fraction(Op1);
 
    /*Saisie Fraction 2 */
    cout << "Tapez un numerateur de la deuxieme fraction : " ;
    cin >> Op2[0] ;
 
    Op2[1]=0 ;
    while (Op2[1]==0)
    {
      cout << "Tapez un denominateur de la deuxieme fraction : " ;
      cin >> Op2[1] ;
      if (Op2[1]==0) cout << "Erreur, denominateur non valide " << endl ;
    }
    afficher_fraction(Op2);
 
 
    /* Choix de l'opération*/
    cout << "Taper 1 pour effectuer une addition, 2 pour une soustraction, 3 pour une division, 4 pour une multiplication, et autre = sortie : " ;
    cin >> num_ope ;
 
    /* Calcul de l'opération*/
    if (num_ope == 1)  addition_fraction(Op1,Op2,Op3);
 
    if (num_ope == 2)  soustraction_fraction(Op1,Op2,Op3);
 
    if (num_ope == 3)  division_fraction(Op1,Op2,Op3);
 
    if (num_ope == 4)  multiplication_fraction(Op1,Op2,Op3);
 
 
    /* Calcul de l'opération*/
    /* simplification_fraction(Op3,Op4); */
    afficher_fraction(Op3);
 
 
return 0 ;
}
 
En rouge les soucis que je rencontre, par exemple pour les fonctions addition et soustraction il ne comprend pas mes commandes, par exemple 3/4 + 2/5 devrait donner 23/20 et là ça donne 6/20. Au lieu de faire Op3[0] = Op1[0]*Op2[1]+Op1[1]*Op2[0]; il fait seulement Op3[0] = Op1[0]*Op2[1]. Ce qui fait que le numérateur devrait faire 23 et il fait 2*3=6..


Message édité par Profil supprimé le 26-05-2013 à 12:00:41
Reply

Marsh Posté le 26-05-2013 à 12:06:47    

Assure toi que la fonction a bien les valeurs que tu crois.
Rajoute un cout de debug style cout << Op1[0] <<'*' << Op2[1] << '+' << Op1[1] '*' << Op2[0];

Reply

Marsh Posté le 26-05-2013 à 12:11:25    

Les calculs de multiplication et de division fonctionnent correctement avec les valeurs entrées, est ce que ce ne serait pas une erreur d'écriture ?
 
On peut écrire ça ainsi ? Op3[0] = Op1[0]*Op2[1]+Op1[1]*Op2[0]


Message édité par Profil supprimé le 26-05-2013 à 12:11:38
Reply

Marsh Posté le 26-05-2013 à 12:15:23    

Oui. La priorité de * est plus grande que +, comme en maths.
Mais pour la lisibilité tu peux parenthéser.

Reply

Marsh Posté le 26-05-2013 à 12:31:41    

Justement, tout est ok, j'ai vérifié plusieurs fois, je ne comprends pas ce résultat :heink:  
 
Pourquoi le numérateur ne fait pas ce que je lui dis, et me donne 6 au lieu de 23 ?

Reply

Marsh Posté le 26-05-2013 à 13:05:57    

...
Je n'ai rien chagé à ton programme a part supprimer les fonctions non terminées :

Spoiler :

$ ./a.out  
Tapez le numerateur de la premiere fraction : 3
Tapez un denominateur de la premiere fraction : 4
Votre fraction est : 3/4
Tapez un numerateur de la deuxieme fraction : 2
Tapez un denominateur de la deuxieme fraction : 5
Votre fraction est : 2/5
Taper 1 pour effectuer une addition, 2 pour une soustraction, 3 pour une division, 4 pour une multiplication, et autre = sortie : 1                                                                                                      
Votre fraction est : 23/20

Reply

Marsh Posté le 26-05-2013 à 14:01:51    

Je ne comprends pas.. peut-être un problème de sauvegarde ou quelque chose comme ça :sweat:

Reply

Marsh Posté le 26-05-2013 à 15:17:17    

J'ai essayé en copiant mon programme dans un nouveau projet, voici le message d'erreur :
 
 
-------------- Build: Debug in program ---------------
 
Compiling: main.cpp
Execution of 'mingw32-g++.exe -Wall -fexceptions  -g     -c C:\Users\Julien\Documents\program\main.cpp -o obj\Debug\main.o' in 'C:\Users\Julien\Documents\program' failed.
Nothing to be done.

Reply

Marsh Posté le 30-05-2013 à 16:12:25    

Ca fonctionne !  
 
Cependant, j'aurais encore besoin de votre aide une dernière fois. Le programme est quasiment clos, je n'ai plus qu'à mettre en place l'algorithme de Héron.
Voilà la démarche :
 
EN C++ :
 
int approx (int a) // on cherche l'approximation (i) de la racine du nombre donné (a)
{ int i=0 ;
    while (i*i<a) // tant que i*i est inférieur à (a) on continue à incrémenter i de 1
    {
       i=i+1 ;
    }
    return i-1 ; // lorsque i est passé supérieur à x, on prend la dernière valeur i inférieure à (a)
}
 
 
Pour 17 par exemple, on sortira avec i=4, le premier nombre dont le carré est inférieur à 17.
 
2) ALGORITHME DE HERON
 
 C’est en fait un algorithme qui permet de calculer une approximation la plus précise possible de la racine d’un nombre donné. Dans notre projet, l’utilisateur entrera ce nombre A. Cependant, pour que cet algorithme se lance, il faut une première approximation vague de la racine, c’est pourquoi nous avons crée la fonction approx qui nous la donnera automatiquement.
 
 L’utilisateur entre donc sa donnée A et en obtient directement l’approximation vague de la racine. A l’aide d’une boucle « while » dont nous définirons le nombre de répétitions sur 3, le programme va alors calculer x = (x+(A/x))/2 trois fois de suite, et en sortira de la boucle, la valeur plus précise de x.
 
EN C++ :
 
int Heron (int a, int x, int n)
{
    cout << "Tapez le nombre dont vous voulez connaitre la racine : " ; // l'utilisateur tape le nombre voulu
    cin >> a ;
 
    int x=approx(a) ; // on déclare et on affiche (x) comme étant l'approximation i de la racine du nombre
    cout << x << endl ;
 
    while (n<4) // tant que n est inférieur à 4, on répète l'algorithme de Héron (avec la formule)
    {
        (x+(a/x))/2=x ;
    }
    cout << x << endl ;

    return 0 ;
}
 
C'est la partie en gras qui me tracasse, je ne sais pas comment faire pour que l'opération (x+(a/x))/2=x se fasse 3 fois de suite en prenant à chaque fois la nouvelle valeur de x.


Message édité par Profil supprimé le 30-05-2013 à 16:29:58
Reply

Marsh Posté le 30-05-2013 à 19:37:42    

Je ne suis pas sur d'avoir compris exactelent comment tu voulais implémenter l'algo.
Je pense que tu Appelles Heron() une seule fois pour un "a" donné ?
Donc pourquoi n est en paramètre ? il devrait être un compteur local je suppose.
Du coup ton while est en fait un for:
for(int i = 0; i < 3 ; ++i)

 

EDIT :
Ow j'avais pas vu ton affectaction de variable sytaxiquement incorrecte. Tu ne peux pas faire ça. à gauche d'une affectation tu dois obligatoirement avoir une variable, pas une expression (bon en fait pas vraiment, mais je suppose que tu n'as pas entendu parler des références)


Message édité par make install le 30-05-2013 à 19:39:58
Reply

Marsh Posté le 01-06-2013 à 16:00:18    

Je vais vous faire une démonstration :
 
a = 17
approx(a) = 4
 
donc dans la boucle ça donne pour n allant de 0 à 3, on fait donc trois fois la boucle :
 
x = (x+(a/x))/2 = ((4/1)+(17/4))/2 = 33/8
 
on prend la nouvelle valeur de x :
 
x = ((33/8)+(17/(33/8)))/2 = ((33/8)+(136/33))/2 = 2177/528
 
on prend la nouvelle valeur de x :
 
x = ((2177/528)+(17/(2177/528)))/2 = ((2177/528)+(8976/2177))/2 = 9478657/2298912
 
Qui correspond à 4,123105626, qui est bien une racine précise de 17.
 
Comment programmer cela ?
 

Reply

Marsh Posté le 01-06-2013 à 16:29:46    

variable = expression.
donc : x = (x+(a/x))/2 plutot que l'inverse.
Ceci plus le for que je t'ai donné et je pense que l'algo se déroule comme il faut.
 
J'anticipe ta future remarque : petite recherche sur les cast en double ou float pour ce genre de calculs sinon tu risques de te retrouver avec des entiers tronqués.
Et donc ne stocke pas ton résultat dans un int.

Reply

Marsh Posté le 01-06-2013 à 18:19:00    

Corrigé :)
 
Justement en parlant de ta remarque, il me faudrait un résultat sous forme fractionnaire, voilà ce à quoi j'ai pensé :
 
x= ((x/1)+(a/x))/2
 
int Heron (int a, int n, int Op3[2])
{
    cout << "Tapez le nombre dont vous voulez connaitre la racine : " ; // l'utilisateur tape le nombre voulu
    cin >> a ;
 
    int x=approx(a) ; // on déclare et on affiche (x) comme étant l'approximation i de la racine du nombre
 
    n=0 ;
    while (n<3) // tant que n est inférieur à 4, on répète l'algorithme de Héron (avec la formule)
    {
        int p = ppcm (1, x) ; // calcul du ppcm des deux dénominateurs des deux fractions
        int j = p/x ; // calcul du rapport ppcm/dénominateur1 = j
        int k = p/a ; // calcul du rapport ppcm/dénominateur2 = k
        Op3[0] = x*j + a*k ; // on multiplie numérateur1 par g et numérateur2 par h, afin d'obtenir le numérateur résultat
        Op3[1] = p*2 ; // le dénominateur résultat = ppcm;
        cout << "Votre fraction est : " ; // on affiche la fraction sous la forme Op[0]/Op[1]
        cout << Op3[0] ;
        cout << "/" ;
        cout << Op3[1];
        cout << endl ;
 
        n = n+1 ;
    }
 
    cout << x << endl ;
    return 0 ;
}


Message édité par Profil supprimé le 01-06-2013 à 18:20:57
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed