Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 17:20 Der er 27 kommentarer og
1 løsning

trekantsprogram virker ikke !

Hej eksperter... jeg har denne if-sætning til at beregne de tre vinkler ud fra de tre side-længder, men det virker ikke helt ???

if(textBox4.Text != "0" && textBox5.Text != "0" && textBox6.Text != "0")
{
B = Math.Asin(b / a);

//konverter til grader
B = B * 180 / Math.PI;

textBox2.Text = Convert.ToString(B);

C = Math.Asin(c / a);

//konverter til grader
C = C * 180 / Math.PI;

textBox3.Text = Convert.ToString(C);
                   

A = 180 - B - C;
textBox1.Text = Convert.ToString(A);

return;
}
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 17:23 #1
se evt www.kimcs-clan.dk/Trigonometri.exe (prøv at indtast 3 sider)
kildekode: www.kimcs-clan.dk/Form1.cs
Avatar billede nielle Nybegynder
12. oktober 2005 - 17:45 #2
Dine formler er heller ikke korrekte:

double A = Math.Acos((a*a - b*b - c*c)/(2*b*c));
A = A * 180 / Math.PI;

double B = Math.Acos((b*b - a*a - c*c)/(2*a*b));
B = B * 180 / Math.PI;

double C = Math.Acos((c*c - a*a - b*b)/(2*a*b));
C = C * 180 / Math.PI;
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:09 #3
nu bliver A, B og C 120 grader ???
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:10 #4
de tre vinkler bliver dobelt så store ?
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:15 #5
ahh del med to og så virker det !

se evt http://www.exp.dk/spm/655151
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:15 #6
og læg et svar her og få dine points !
Avatar billede nielle Nybegynder
12. oktober 2005 - 18:18 #7
Der bør *ikke* skulle deles med 2 for at få det til at virke - der er et eller andet galt i dine udregninger. Imidlertid gav jeg dig også de forkerte formler - en almindelig fortegnsfejl - prøv med disse og se om de ikke er bedre:

double A = Math.Acos((b*b + c*c - a*a)/(2*b*c));
A = A * 180 / Math.PI;

double B = Math.Acos((a*a + c*c - b*b)/(2*a*b));
B = B * 180 / Math.PI;

double C = Math.Acos((a*a + b*b - c*c)/(2*a*b));
C = C * 180 / Math.PI;

- hvilket ikke ændre på resultatet
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:18 #8
eller www.kimcs-clan.dk/trig.txt (lidt mere overskuelig)
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:20 #9
;)
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:20 #10
12/10-2005 18:18:20 - det virker !
Avatar billede nielle Nybegynder
12. oktober 2005 - 18:24 #11
Husk nu at lægge det seneste op som:

12/10-2005 18:18:51

Forresten... Hvorfor omregner du ikke fra grader til radianer en gang for alle helt oppe i toppen af din kode, i stedet for at gøre det for hver if-sætning?

... og et svar :^)
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:50 #12
er det ellers alt sammen rigtigt ?
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 18:55 #13
nu har jeg opdateret den...(www.kimcs-clan.dk/trig.txt) er alle formlerne rigtige ?
Avatar billede nielle Nybegynder
12. oktober 2005 - 19:08 #14
Du har i hvert fald nogle fejl hvor du laver kode som denne:

// a, A og B er kendt
if (textBox1.Text != "0" && textBox2.Text != "0" && textBox4.Text != "0")
{
    C = Math.PI - A - B;
    C = C * 180 / Math.PI;
    textBox3.Text = Convert.ToString(C);

    c = a * Math.Sin(C) / Math.Sin(A);
    textBox6.Text = Convert.ToString(c);

    b = a * Math.Sin(B) / Math.Sin(A);
    textBox5.Text = Convert.ToString(b);
                   
    return;
}

Her starter C med at være i radianer, hvorefter du så omregner til grader - men dette giver dig problemer når du efterfølgende skriver:

Math.Sin(C)

- i det denne forventer at C stadig er i radianer.
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 19:11 #15
så skriver jeg bare C = Math.PI / 180 * C efter textBox3.Text = Convert.ToString(C);
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 19:11 #16
???
Avatar billede nielle Nybegynder
12. oktober 2005 - 19:22 #17
// a, A og B er kendt
if (textBox1.Text != "0" && textBox2.Text != "0" && textBox4.Text != "0")
{
    C = Math.PI - A - B;

    c = a * Math.Sin(C) / Math.Sin(A);
    textBox6.Text = Convert.ToString(c);

    b = a * Math.Sin(B) / Math.Sin(A);
    textBox5.Text = Convert.ToString(b);

    C = C * 180 / Math.PI;
    textBox3.Text = Convert.ToString(C);
                   
    return;
}
Avatar billede nielle Nybegynder
12. oktober 2005 - 19:23 #18
... lav konverteringen til grader når du er færdig med at bruge radian-værdien.
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 19:30 #19
ok...men er der nogle formler der er forkerte i koden www.kimcs-clan.dk/trig.txt ?
Avatar billede nielle Nybegynder
12. oktober 2005 - 19:33 #20
Hvis du lægger en rettet version op så skal jeg gerne kigge den igennem for dig. :^)
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 19:35 #21
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 19:58 #22
er du i gang med at tjekke koden eller hvad ?
Avatar billede nielle Nybegynder
12. oktober 2005 - 19:58 #23
Der var en enkelt fejl, og så har jeg flyttet om på nogen af dine led:

        private void button1_Click(object sender, System.EventArgs e)
        {
            try
            {
                a = Double.Parse(textBox4.Text);
                b = Double.Parse(textBox5.Text);
                c = Double.Parse(textBox6.Text);

                A = Double.Parse(textBox1.Text);
                B = Double.Parse(textBox2.Text);
                C = Double.Parse(textBox3.Text);

                A = Math.PI / 180 * A;
                B = Math.PI / 180 * B;
                C = Math.PI / 180 * C;
            }
            catch
            {
            }

            if ((textBox4.Text == "0" && textBox5.Text == "0" && textBox5.Text == "0"))
            {
                MessageBox.Show("Sidelængderne kan ikke bestemmes uden at kende mindst en af siderne.");
                return;
            }

            if ((textBox4.Text != "0" && textBox5.Text == "0" && textBox5.Text == "0") ||
                (textBox4.Text != "0" && textBox5.Text != "0" && textBox5.Text == "0") ||
                (textBox4.Text != "0" && textBox5.Text != "0" && textBox5.Text != "0"))
            {
                // a, A og B er kendt
                if (textBox1.Text != "0" && textBox2.Text != "0" && textBox4.Text != "0")
                {
                    C = Math.PI - A - B;

                    b = a * Math.Sin(B) / Math.Sin(A);
                    textBox5.Text = Convert.ToString(b);

                    c = a * Math.Sin(C) / Math.Sin(A);
                    textBox6.Text = Convert.ToString(c);

                    C = C * 180 / Math.PI;
                    textBox3.Text = Convert.ToString(C);
                   
                    return;
                }

                // a, A og C er kendt
                if (textBox1.Text != "0" && textBox3.Text != "0" && textBox4.Text != "0")
                {
                    B = Math.PI - A - C;

                    b = a * Math.Sin(B) / Math.Sin(A);
                    textBox5.Text = Convert.ToString(b);

                    c = a * Math.Sin(C) / Math.Sin(A);
                    textBox6.Text = Convert.ToString(c);

                    B = B * 180 / Math.PI;
                    textBox2.Text = Convert.ToString(B);

                    return;
                }

                // a, B og C er kendt
                if (textBox2.Text != "0" && textBox3.Text != "0" && textBox4.Text != "0")
                {
                    A = Math.PI - B - C;

                    b = a * Math.Sin(B) / Math.Sin(A);
                    textBox5.Text = Convert.ToString(b);

                    c = a * Math.Sin(C) / Math.Sin(A);
                    textBox6.Text = Convert.ToString(c);

                    A = A * 180 / Math.PI;
                    textBox1.Text = Convert.ToString(A);

                    return;
                }

                // a, b og A kendt
                if (textBox1.Text != "0" && textBox4.Text != "0" && textBox5.Text != "0")
                {
                    B = Math.Asin(b / a * Math.Sin(A));
                   
                    C = Math.PI - A - B;

                    c = a * Math.Sin(C) / Math.Sin(A);
                    textBox6.Text = Convert.ToString(c);

                    B = B * 180 / Math.PI;
                    textBox2.Text = Convert.ToString(B);

                    C = C * 180 / Math.PI;
                    textBox3.Text = Convert.ToString(C);

                    return;
                }

                // a, b og B er kendt
                if (textBox2.Text != "0" && textBox4.Text != "0" && textBox5.Text != "0")
                {
                    A = Math.Asin(a / b * Math.Sin(B));  // Der var fejl i denne formel.

                    C = Math.PI - A - B;

                    c = a * Math.Sin(C) / Math.Sin(A);
                    textBox6.Text = Convert.ToString(c);

                    A = A * 180 / Math.PI;
                    textBox1.Text = Convert.ToString(A);

                    C = C * 180 / Math.PI;
                    textBox3.Text = Convert.ToString(C);
                   
                    return;
                }

                // a, b og C kendt
                if (textBox3.Text != "0" && textBox4.Text != "0" && textBox5.Text != "0")
                {
                    c = Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2) - 2 * a * b * Math.Cos(C));

                    textBox6.Text = Convert.ToString(c);

                    A = Math.Asin(a / c * Math.Sin(C));

                    B = Math.PI - A - C;

                    A = A * 180 / Math.PI;
                    textBox1.Text = Convert.ToString(A);
                   
                    B = B * 180 / Math.PI;
                    textBox2.Text = Convert.ToString(B);

                    return;

                }

                // a, b og c er kendt
                if (textBox4.Text != "0" && textBox5.Text != "0" && textBox6.Text != "0")
                {
                    A = Math.Acos((b*b + c*c - a*a)/(2*b*c));  // Her kan du selvfølgelig også bruge Math.Pow(a, 2) istedet for a*a.

                    A = A * 180 / Math.PI;
                    textBox1.Text = Convert.ToString(A);

                    B = Math.Acos((a*a + c*c - b*b)/(2*a*b));
                   
                    B = B * 180 / Math.PI;
                    textBox2.Text = Convert.ToString(B);

                    C = Math.Acos((a*a + b*b - c*c)/(2*a*b));
                   
                    C = C * 180 / Math.PI;
                    textBox3.Text = Convert.ToString(C);
                       
                    return;
                }
                   
            }
            else
            {
                MessageBox.Show("Du skal dreje trekanten sådan at de kente sidelængder starter fra a, b og c.");
                return;
            }
        }
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 20:17 #24
nu ved jeg ikke om det virker men i hvert fald tak !
Avatar billede nielle Nybegynder
12. oktober 2005 - 20:21 #25
Selvfølgelig virker det ;^)

Forresten kan du skrive sådan noget som:

A = A * 180 / Math.PI;

- på denne måde:

A *= 180 / Math.PI;

- eller hvad der egentlig var bedre i denne sammenhæng: Du kan lave dig en funktion RadianTilGrad sådan at du kunne gøre sådan her:

A = RadianTilGrad(A);
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 22:02 #26
ok mange tak for dig og arnes hjælp til programmet....
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 22:04 #27
når jeg er færdig med finpusningen lægger jeg den færdige version (1.0) op på www.faarup.1go.dk/trigonometri/Trigonometri.exe - evt. forslag til programmet - send mig en mail på peter.faarup@gmail.com
Avatar billede visualdeveloper Nybegynder
12. oktober 2005 - 22:13 #28
har du nogle ideer til udvidelse af programmet ?
eller til hvordan en v2 udgave kan se ud ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester