• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Trójki pitagorejskie

VPS Starter Arubacloud
0 głosów
1,351 wizyt
pytanie zadane 22 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
zamknięte 22 czerwca 2019 przez magda_19

Próbuję rozwiązać zadanie z trójkami pitagorejskimi, ale kompilator pokazuje mi błąd w tej części kodu:

 

bool funkcja(int a, int b, int c)
{
    bool test;
    if(a*a+b*b == c*c);
      return true;
   else
      return false;

Jak mam zapisać else, tak aby program zwracał mi wartość 0, gdy nie będzie równości?

komentarz zamknięcia: Zostało rozwiązane
komentarz 22 czerwca 2019 przez Chess Szeryf (76,710 p.)

Tak, to chociaż mogłaś napisać w komentarzu, że chodziło o średnik przed "return true". Możesz też objąć blok kodu w klamrę:

if(a*a+b*b == c*c) {
  return true;
} else {
  return false;
}
komentarz 23 czerwca 2019 przez manjaro Nałogowiec (37,390 p.)
edycja 23 czerwca 2019 przez manjaro

A co ta funkcja ma wspólnego z trójkątami pitagorejskimi?

Funkcja tylko sprawdza czy liczby są bokami trójkąta prostokątnego a nie pitagorejskiego.

komentarz 23 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)

@magda_19,
Program będzie prawidłowo działać pod warunkiem że a,b,c będą liczbami naturalnymi, bo jeśli źle zapiszesz resztę kodu który dokona konwersji z liczb całkowitych na rzeczywiste i będziesz badać float, to może zwrócić złą wartość. Na przykład mamy trójkę 3,4,5. Jeśli program zamieni 5 na float, to może się zdarzyć że w reprezentacji maszynowej będzie on wyglądać jak 5,00000000000000000001 i wtedy a*a+b*b<>c*c. W sytuacjach wątpliwych gdy grozi taka konwersja typu, lepiej badać liczby po ich zaokrągleniu do liczby całkowitej.

komentarz 23 czerwca 2019 przez manjaro Nałogowiec (37,390 p.)

Program będzie prawidłowo działać pod warunkiem że a,b,c będą liczbami naturalnymi, bo jeśli źle zapiszesz resztę kodu który dokona konwersji z liczb całkowitych na rzeczywiste i będziesz badać float, to może zwrócić złą wartość. Na przykład mamy trójkę 3,4,5. Jeśli program zamieni 5 na float, to może się zdarzyć że w reprezentacji maszynowej będzie on wyglądać jak 5,00000000000000000001 i wtedy a*a+b*b<>c*c. W sytuacjach wątpliwych gdy grozi taka konwersja typu, lepiej badać liczby po ich zaokrągleniu do liczby całkowitej.

A co to za herezje? Przecież masz napisane że funkcja przyjmuje argumenty całkowite 

komentarz 23 czerwca 2019 przez jankustosz1 Nałogowiec (35,880 p.)
Ciekawe, bo wspomniany problem z zapisem binarnym liczb rzeczywistych rzeczywiście występuje, ale jakoś nie zdarzyło mi się nigdy, żeby to coś popsuło program. Nie wiem, ale możliwe że c++ jakoś radzi sobie z tym problemem i jakoś umiejętnie zaokrągla do przedostatniej możliwej cyfry po przecinku, ale nwm.
komentarz 23 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
edycja 23 czerwca 2019 przez mrspock1

Powiem ci tak, że nie można liczyć na szczęście. Jeżeli taki problem występowałby dla sprawdzania bardzo dużych liczb które mają na przykład czterysta cyfr, to wtedy zaokraglanie może być tak duże że przekroczy wartość jedności. Ja czytałem o tym jeszcze w książce wydanej 30 lat temu w książce Dennie van Tassel Praktyka programowania.

W szczególnych wątpliwych przypadkach zaleca się, żeby nawet nie liczyć na dokładne sprawdzenie czy liczba jest kwadratem liczby naturalnej przez zaokrąglenie pierwiastka i podniesienie do kwadratu bo może się nie zgodzić z liczbą pierwotną, tylko żeby mieć pewność, bierzemy pierwiastek, następnie ustalamy jakiś niewielki  przedział wokół pierwiastka i sprawdzamy liczby z tego przedziału czy a*a=liczba pierwotna przez przeszukiwanie binarne tego przedziału.

komentarz 25 czerwca 2019 przez jankustosz1 Nałogowiec (35,880 p.)
400 cyfr nie zmieściłoby się w żadnej wbudowanej zmiennej.

Chodzi mi o to, że pisałem masę algorytmów i wogóle się tym problemem nigdy nie przejmowałem, a zawsze wszystko działało. Ale teraz w sumie domyślam się dlaczego to mogło działać. Domyślnie cout zaokrągla liczbę do któregośtam miejsca i te niedokładności pozostają niezauważone.

To co ty mówisz z binsearchem to jest algorytm na szukanie pierwiastka. Nie ma sensu pisać własnego, aby sprawdzić czy coś jest kwadratem liczby naturalnej, po prostu wystarczy zaokrąglić do np. 6 miejsca po przecinku i sprawdzić czy po przekonwertowaniu na inta jest to to samo.

Podobne pytania

0 głosów
2 odpowiedzi 3,792 wizyt
0 głosów
2 odpowiedzi 493 wizyt
pytanie zadane 12 grudnia 2021 w C i C++ przez Pan Stevens Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 533 wizyt
pytanie zadane 26 grudnia 2018 w C i C++ przez malaameba Początkujący (310 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...