Calculatrice C# probleme Math.tan [Résolu]

Signaler
Messages postés
4
Date d'inscription
mercredi 2 février 2011
Statut
Membre
Dernière intervention
11 mars 2011
-
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
Bonjour a tous , Je dois faire une calculette avec quelques fonctions comme sin , cos tan ,1/x

J'ai tout réalisé mais j'ai quelques prob pour tan

Donc je voudrai quand je tombe sur 90° ou 270° qu'il me fasse un test et m'affiche fonction incorecte mais je voudrais egalement que si on ajoute un tour au cercle trigo donc 90 ° ==> 450 ° ect ... il m'affiche également fonction incorect .

Pour ajouté un tour je devrais utilisé un modulo(%) mais comme j'utilise une varible double => 450.00 je dois divisé le nombre en sa partie entiere et sa partie décimal et faire le modulo sur la partie entiere mais la je bloque completement

Pouvez vous m'aider ?

Je publie le code que j'ai déja écrit :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace tp8ex1
{

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

}

double nb1;
char operateur;
double nb2;


private void Form1_Load(object sender, EventArgs e)
{

}

private void button9_Click(object sender, EventArgs e)
{


textBox1.Text = (textBox1.Text + "1");




}

private void button6_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "2");
}

private void button12_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "3");
}

private void button10_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "4");
}

private void button5_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "5");
}

private void button3_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "6");

}

private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "7");
}

private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "8");
}

private void button4_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "9");
}

private void button7_Click(object sender, EventArgs e)
{
textBox1.Text = (textBox1.Text + "0");
}

private void button16_Click(object sender, EventArgs e)
{//bouton +
nb1 = Convert.ToDouble(textBox1.Text);
textBox1.Text = "";
operateur = '+';
}

private void button23_Click(object sender, EventArgs e)
{// bouton nb2 Convert.ToDouble(textBox1.Text) ;
switch(operateur)
{
case '+' : textBox1.Text = Convert.ToString(nb1 + nb2);
break;
case '-': textBox1.Text = Convert.ToString(nb1 - nb2);
break;
case '*': textBox1.Text = Convert.ToString(nb1 * nb2);
break;
case '/': textBox1.Text = Convert.ToString(nb1 / nb2);
break;


}
}

private void button13_Click(object sender, EventArgs e)
{//bouton -
nb1 = Convert.ToDouble(textBox1.Text);
textBox1.Text = " ";
operateur = '-';
}

private void button15_Click(object sender, EventArgs e)
{//bouton *
nb1 = Convert.ToDouble(textBox1.Text);
textBox1.Text = " ";
operateur = '*';
}

private void button11_Click(object sender, EventArgs e)
{// bouton /
nb1 = Convert.ToDouble(textBox1.Text);

textBox1.Text = " ";
operateur = '/';
}

private void button21_Click(object sender, EventArgs e)
{// bouton ==>
if (textBox1.Text.Length > 0)
{
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
}
}

private void button22_Click(object sender, EventArgs e)
{// Bouton C
textBox1.Text = "";
}

private void button20_Click(object sender, EventArgs e)
{
//Bouton 1/X
nb1 = Convert.ToDouble(textBox1.Text);

textBox1.Text = Convert.ToString(1 / nb1);
}

private void button14_Click(object sender, EventArgs e)
{
//bouton ,
textBox1.Text = (textBox1.Text + ",");
}

private void button8_Click(object sender, EventArgs e)
{
//bouton -
textBox1.Text = (textBox1.Text + "-");
}

private void button17_Click(object sender, EventArgs e)
{
//bouton sin

nb1 = Convert.ToDouble(textBox1.Text);
nb1 = Math.Sin(Math.PI * nb1 / 180);
if (Math.Abs(nb1) < 0.000000000000001)
{
nb1 = 0;

}
textBox1.Text = Convert.ToString(Math.Sin(Math.PI * nb1 / 180));



}

private void button18_Click(object sender, EventArgs e)
{

//bouton cos
nb1 = Convert.ToDouble(textBox1.Text);
nb1 = Math.Cos(Math.PI * nb1 / 180);
if (Math.Abs(nb1) < 0.0000000000000001)
{
nb1 = 0;
}
textBox1.Text = Convert.ToString(nb1);

}

private void button19_Click(object sender, EventArgs e)
{
//bouton Tan


nb1 = Convert.ToDouble(textBox1.Text);
textBox1.Text = Convert.ToString(Math.Tan(Math.PI * nb1 / 180));
if (Math.Abs(nb1) < 0.000000000000001)
{
nb1 = 0;
}
if (nb1 == 90)
{
textBox1.Text = "incorecte";
}





}
}
}

7 réponses

Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
Par transtypage ça ne marche pas ?
D'ailleurs, je ne vois pas en quoi la virgule gène : tan (90.4°) existe.

Le but est de savoir si c'est un nombre multiple de 90°.
Pour cela il faut savoir si le nombre divisé par 90° est égal à la partie entière du nombre divisée par 90°.

En gros:

if ( (int)(nb1 / 90) == (angle / 90))
{
textBox1.Text = "Fonction incorrecte"; 
}


sinon, pour être sûr à 100% de ne pas avoir laissé passer une exception, on utilise les bloc try et catch

exemple
try
{
  nb1 = Math.Tan (nb1)  // On test
}
catch (Exeption exeption) // Ca ne bug pas si c'est pas possible
{
   textBox1.Text = "Fonction incorrecte"; // On affiche que c'est pas possible
}



C#rdialement,
Pop70
Messages postés
4
Date d'inscription
mercredi 2 février 2011
Statut
Membre
Dernière intervention
11 mars 2011

Merci Pop70 Pour ta réponse , Je ne peux tester le code maintenant demain matin je le testerai

Mais par contre quand tu dis "D'ailleurs, je ne vois pas en quoi la virgule gène : tan (90.4°) existe."

enfait C'est parce que comme je veux faire un test sur 90° mais que j'ai déclarer nb1 comme un double donc 90.0 si je veux faire un test je dois séparé le 90 et le .0 ? C'est ce que mon prof ma dit mais j'ai très bien compris ce point la.

Merci en tt cas de ton aide , Je poste demain des que j'ai testé le code


Bien a toi
om1908
Messages postés
4
Date d'inscription
mercredi 2 février 2011
Statut
Membre
Dernière intervention
11 mars 2011

Euh pas tres bien compris ce point la désolé
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut, je ne sais pas si tu es encore intéressé par une solution, mais la voilà quand même, alors fais pas la tête ><

Déjà, il faut faire ton test au tout début de ton évènement, sinon ton appel à la fonction tangente va lever une exception.

Maintenant, à quoi doit ressembler ce test. Première chose, rapporter ta valeur à l'ensemble [0;360], il te faut donc récupérer le reste de la division euclidienne de ta valeur par 360
double vnorm = (nb1 % 360.0d);

ensuite il te faut simplement vérifier que cette valeur est différente de 90 et 180 :
if ((vnorm 90.0d) || (vnorm 270.0d))
textBox1.Text = "t'as écris une ânerie";
else {
// je fais mon calcul de tangente
}


On dit souvent qu'il est déconseillé de faire des comparaison brut de pomme avec des double/float. En effet de telles variables passées à travers différentes opérations peuvent traîner des pouillèmes (ex. : 90.00000000000001). Mais si t'as pas exactement cette valeur la fonction tan ne va pas broncher, donc pourquoi s'en faire ? ^^

PS : la méthode des try-catch est la plus sûre, mais je suis vraiment pas fan de l'usage intensif de ces blocks. ça blinde le code, pour sûr, mais ça pourrit les perf.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
edit : * différente de 90 et 270, mais vous m'aurez compris ;)
Messages postés
4
Date d'inscription
mercredi 2 février 2011
Statut
Membre
Dernière intervention
11 mars 2011

Merci beaucoup Pour vos réponses , J'ai tester la solution de pop70 et sa fonctionne :) Je testerai la tienne aussi :) En tt cas merci beaucoup
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Si la réponse de pop te convient, t'embête pas avec la mienne ;)
Par contre note sa réponse comme "acceptée", pour que les gars avec le même problème qui passeraient par là sachent qu'ils y trouveront leur réponse ;)