Funkcja z bool która sprawdza jaki jest trójkąt

0

Cześć!

Mam napisać program który sprawdza czy podane przez użytkownika wartości mogą stworzyć trójkąt prostokątny. Nie za bardzo rozumiem w jaki sposób zapisać bool w funkcji, stworzyłem coś takiego, ale to nie działa i nie za bardzo wiem co moge tu poprawić:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad1
{
    class Program
    {
        bool CzyTrojkat1(double a, double b, double c)
        {
            if (c == Math.Sqrt(a * a + b * b))
            {
                Console.WriteLine("Poprawnie");
            }
            else
            {
                Console.WriteLine("błąd");
            }

        }
        
        static void Main(string[] args)
        {

            double a, b, c;
            Console.WriteLine("Podaj długość 1 boku: ");
            a = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Podaj długość 2 boku: ");
            b = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Podaj długość 3 boku: ");
            c = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("oto {0)" + CzyTrojkat1());

            Console.ReadKey();       

                   
                                
            

        }
    }
}

2

Powinien być taki warunek jak tutaj:

        public static bool IsRightTriangle(double a, double b, double c)
        {
            return Math.Abs(c - Math.Sqrt(a * a + b * b)) < double.Epsilon;
        }

Pamiętaj, że porównujesz liczby zmiennoprzecinkowe i należy to zrobić w odpowiedni sposób. Generalnie jeżeli mamy dwie liczby a i b typu double i chcemy je porównać to należy skorzystać ze wzoru: ABS(a - b) < EPSILON. Totaj wartością a ze wzoru jest liczba c natomiast wartością b jest wyrażenie: Math.Sqrt(a * a + b * b)

No i działa: http://ideone.com/PO20vN

PS: warto nazwać, które boki to przyprostokątne, a które to przeciwprostokątna, bo można się pomylić podając wartości w nieodpowiedniej kolejności.
PS2: Twój kod się nie skompiluje bo:

  • funkcja nie jest statyczna, tak jak main więc main jest nie "widzi";
  • funkcja nie zwraca żadnej wartości;
  • źle wywołujesz funkcję CzyTrojkat;

PS3: najlepiej jeszcze raz przerób sobie podstawy, bo takie troszkę podstawowe błędy robisz tutaj w swoim kodzie.

0

Nie rozumiem tego rozwiązania, po co tam wartość bezwzględna?
Warunek na trójkąt prostokątny to cc=aa+b*b
Po co mam jeszcze kombinować coś z epsilonem?

Nie można tego jakoś prościej napisać? :/

1

Nie można, ponieważ jest to liczba zmiennoprzecinkowa więc równość tak naprawdę nigdy nie będzie zachodzić. Eplison jest takim "błędem pomiaru", z dokładnością, do którego sprawdzasz czy zachodzi równość. Tak po prostu musi być.

Tutaj masz ładnie wyjaśnione: http://cpp0x.pl/forum/temat/?id=20414

0

Po co mam jeszcze kombinować coś z epsilonem?

A co konkretnie nie działa ? W którym miejscu program zaczyna działać inaczej od załozonych przewidywań ? hehe.

0

Kiedy napisałem coś takiego:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad02
{
    class Program
    {
        bool CzyTrojkat1(double a, double b, double c)
        {
            return Math.Abs(c - Math.Sqrt(a * a + b * b)) < double.Epsilon;
        }
        static void Main(string[] args)
        {
            string a, b, c;
            Console.WriteLine("Podaj pierwszą przyprostokątna: ");
            a = Console.ReadLine();

            Console.WriteLine("Podaj drugą przyprostokątna: ");
            b = Console.ReadLine();

            Console.WriteLine("Podaj trzecią przyprostokątną: ");
            c = Console.ReadLine();

            Console.WriteLine(CzyTrojkat1(c));

            Console.ReadKey();
            

        }
    }
}

To jak ma mi się wyświetlić czy zwraca prawdę czy fałsz? Bo na samym końcu próbowałem napisac komunikat implementując tam c, jednak nie mam pojęcia jak zrobić aby się wyświetliło true/false...

2

No, a ile argumentów ma funkcja, a ile przekazujesz w jej wywołaniu? Poza tym przekazujesz do funkcji stringi zamiast double. Ten kod nawet się nie skompiluje.

0

Kiedy napisałem tak końcówkę:

  Console.WriteLine("Czy Trójkąt jest prostokątny?", CzyTrojkat1(Convert.ToDouble(a), Convert.ToDouble(b), Convert.ToDouble(c)));

to nadal nie działa.

Wyskakuje błąd "An object reference is required for the non-statis field, method, or property 'Zad02.Program.CzyTrojkat1(double,double,double)'

1

@Jumpeq wydaje mi się, że nie znasz podstaw. Funkcja, którą próbujesz wywołać nie jest statyczna. Funkcja main jest statyczna jako główna funkcja programu więc nie widzi Twojej funkcji CzyTrojkat. Poza tym nie sprawdzasz czy użytkownik podaje na wejściu prawidłowe dane. Zawsze przecież może wpisać literę zamiast liczby i wtedy program się wywali. Jako, że .NET "lokalizuje" programy to prawidłową liczbą typu double wpisaną z konsoli jest liczba z przecinkiem zamiast kropki - inaczej jak chociażby w C++.

Popatrz tutaj:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace App
{
    class Program
    {
        public static bool IsRightTriangle(double a, double b, double c)
        {
            return Math.Abs(c * c - (a * a + b * b)) < double.Epsilon;
        }

        public static void Main(string[] args)
        {
            double a, b, c;
            do { Console.Write("Set 'a': "); } while (!double.TryParse(Console.ReadLine(), out a));
            do { Console.Write("Set 'b': "); } while (!double.TryParse(Console.ReadLine(), out b));
            do { Console.Write("Set 'c': "); } while (!double.TryParse(Console.ReadLine(), out c));
            Console.WriteLine("Your right triangle is: " + (IsRightTriangle(a, b, c) ? "good" : "bad"));
        }
    }
}

Do poczytania:

A najlepiej przerób sobie jakiś kurs C# z Internetu czy jakąś książkę.

EDIT: możesz pójść o krok dalej i zrobić sobie ładną funkcję czytającą prawidłowe liczby typu double z konsoli:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace App
{
    class Program
    {
        static bool IsRightTriangle(double a, double b, double c)
        {
            return Math.Abs(c * c - (a * a + b * b)) < double.Epsilon;
        }

        static double ReadDouble(string label = "")
        {
            double number;
            do { Console.Write(label); } while (!double.TryParse(Console.ReadLine(), out number));
            return number;
        }

        static void Main(string[] args)
        {
            double a = ReadDouble("Set 'a': ");
            double b = ReadDouble("Set 'b': ");
            double c = ReadDouble("set 'c': ");
            Console.WriteLine("Your right triangle is: " + (IsRightTriangle(a, b, c) ? "good" : "bad"));
        }
    }
}
0

Nigdy nie programowałem, mam teraz programowanie na studiach więc zaczynam od początku.

Nadal kiedy wpisałem końcówkę:

 Console.WriteLine("Czy Trójkąt jest prostokątny?" + (CzyTrojkat1(Convert.ToDouble(a), Convert.ToDouble(b), Convert.ToDouble(c)))); 

to wyświetla się ten sam błąd i nie działa. Chodzi mi o to aby program zwracał już wbudowane komendy z funkcji bool (czyli false i true) ale nie umiem jej kompletnie dobrze napisać!

To co pisze na msdn jest bardzo dla mnie nie zrozumiałe, nie lubię tych publikacji.

0

...nie lubię tych publikacji.

Najwyższy czas polubić, bo to bardzo dobre źródło informacji od autorów całego .NET'a.
A co do błędu to już Ci napisałem. Twoja funkcja jest niestatyczna.

0

Statyczna, niestatyczna... nic mi to nie mówi.
Nie wiem co gdzie wpisać, co użyć, w którym miejscu, ciągle coś mi się z tego programu wysypuje, nie mam bladego pojęcia jak to zrobić a strona msdn jest dla bardziej zaawansowanych użytkowników, ja z tego nic nie rozumiem jak na obecną chwilę

1

Wystarczy porównać funkcję IsRightTriangle, którą napisałem z funkcją CzyTrójkat z tego posta Funkcja z bool która sprawdza jaki jest trójkąt, którą Ty napisałeś. No... nawet znak po znaku przeleć i przekonasz się, że są różne no:)

PS: A MSDN wcale nie jest dla zaawansowanych, bo to zwykła dokumentacja .NET i tyle.

0

Po dodaniu static do funkcji:

  static bool CzyTrojkat1(double a, double b, double c) 

program od razu zadziałał, kompletnie to przeoczyłem. Bardzo dziękuję za pomoc! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1