Calculatrice C# probleme Math.tan

Résolu
om1908 Messages postés 4 Date d'inscription mercredi 2 février 2011 Statut Membre Dernière intervention 11 mars 2011 - 16 févr. 2011 à 11:47
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 - 11 mars 2011 à 21:46
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

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
16 févr. 2011 à 14:02
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
3
om1908 Messages postés 4 Date d'inscription mercredi 2 février 2011 Statut Membre Dernière intervention 11 mars 2011
16 févr. 2011 à 20:49
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
0
om1908 Messages postés 4 Date d'inscription mercredi 2 février 2011 Statut Membre Dernière intervention 11 mars 2011
16 févr. 2011 à 20:54
Euh pas tres bien compris ce point la désolé
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mars 2011 à 17:37
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 mars 2011 à 17:39
edit : * différente de 90 et 270, mais vous m'aurez compris ;)
0
om1908 Messages postés 4 Date d'inscription mercredi 2 février 2011 Statut Membre Dernière intervention 11 mars 2011
11 mars 2011 à 16:40
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
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 mars 2011 à 21:46
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 ;)
0
Rejoignez-nous