35 / 42
Apr 2019

Dla danych 10001 twój program wypisze “brak” a przecież to nie prawda. Powinien wyświetlić coś w rodzaju: “dane wejściowe niezgodne z założeniem”.

Takie ograniczenia podane są przez autorów tylko po to, aby rozwiązujące osoby mogły dobrać odpowiedni typ zmiennych czy ewentualnie [w innych zadaniach] wielkości tablic statycznych.
Tutaj wartość 10000 sugeruje, że można użyć trypu short int. Ale przecież wykonujemy mnożenia, więc 10000 * 10000 = 10 0000 000, a dla takich wartości short to za mało, ale wystarczy w zupełności typ int. W zadaniach łatwych można w ciemno na 90% [99%] przyjąć, że typ int jest wystarczający i wskazany. Jeżeli w tym zadaniu użyjemy c’ = sqrt ( a² + b²) lub c" = hypot(a, b), to wtedy i tylko wtedy musimy użyć typów zmiennoprzecinkowych (double).

Zamiast wielokrotnego liczenia:

 a*a, b*b, c*c,

można zrobić to [pomnożyć] raz i potem używać:

aa = a*a, bb = b*b, cc = c*c 

ale jeszcze lepiej[?], na początek znaleźć najdłuższy odcinek i wtedy nie potrzeba pisać tak skomplikowanych [rozbudowanych] warunków. Po stwierdzeniu [sprawdzeniu], że można zbudować trójkąt, wystarczy już tylko:
diff = c² - (a² + b²), a następnie:
if diff == 0 to trójkąt taki
if diff < 0 to trójkąt siaki
else trójkąt inny :wink:

PS
Podejrzewam, że moje pierwsze rozwiązania tego zadania, też nie były takie ładne i proste, ale wolę tego teraz jeszcze nie sprawdzać. :wink:

1 month later

#include
#include
#include

using namespace std;

int main()
{
vector tab(3);
while(cin>>tab[0]>>tab[1]>>tab[2])
{
sort(tab.begin(),tab.end());
if((tab[0]+tab[1])<tab[2]) cout<<“brak”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])>(tab[2]*tab[2])) cout<<“ostrokatny”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])==(tab[2]*tab[2])) cout<<“prostokatny”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])<(tab[2]*tab[2])) cout<<“rozwartokatny”<<endl;
}
return 0;
}

Chciałbym się dowiedzieć gdzie jest błąd i czy dopuszczalna jest funkcja sort()?

Cześć, jedna poprawka i będzie AC
Mały test który uświadomi Ci brak w algorytmie:
7 4 3

Dzięki, super że dałeś mi pomocny test a nie od razu powiedziałeś w czym rzecz, rzeczywiście jak po złożeniu tych odcinków nie wyjdzie trójkąt tylko nic. Wielkie dzięki propsy dla ciebie kolego :slight_smile:

1 year later

Proszę o pomoc w tym zadaniu w miejscu w którym ma być nieokreślona liczba pomiarów, jak to wykonać,
próbowałem to zrobić z nieskończoną pętlą(odrzuca przez czas,tu był link) i z pętlą mającą się wykonać kilka razy(odrzuca przez błędną odp., tu był link)

rozwiązanie dla twojego problemu jest gdzieś powyżej - wystarczy przeczytać ten wątek

poszukałem trochę po tym wątku, kombinowałem sam, ale przy takim czymś nie mogę nadal znaleźć błędu.tu był link może ktoś podać jakiś zestaw, który nie działa

nie bardzo rozumiem, jak chcesz podać odpowiedź bez wczytywania danych (ja w każdym razie tak nie potrafię :slight_smile: )

naprawdę czytałeś ten wątek ? - jeżeli tak, to niedokładnie lub bez próby zrozumienia co czytasz - bo już w 2 poście tego wątku masz wyraźnie napisane, jak masz wczytywać dane

Jedną z prób, które robiłem było takie wczytywanie, jednak też nie zadziałało, być może wtedy był jakiś błąd. Nie zauważyłem że usunąłem przypadkowo wczytywanie. Czy na pewno wczytywanie while(cin>>a>>b>>c) jest dobre, bo mogę wprowadzić tylko jeden raz boki jednego trójkąta, przy kodzie tu był link

tak, takie wczytywanie na pewno jest dobre, tyle, że w twoim programie jest błąd, powodujący, że kończy się po jednym wczytaniu

Tytułem podpowiedzi, masz w kodzie instrukcję, która jest w niewłaściwym miejscu. Jeśli ją przesuniesz we właściwe miejsce to kod zadziała. Druga podpowiedź jest taka, że ta instrukcja jest w ogóle niepotrzebna.
Tak w ogóle to po co wykonujesz 3 razy taki sam blok? Uszereguj sobie zmienne w kolejności rosnącej np. tak a,b,c (jeśli wczytane zmienne będę miały inny porządek to je po prostu przedefiniuj). Wtedy wystarczy jeden blok

11 months later

Witam, czy mogę prosić o pomoc?
Próbowałem kilku przypadków i wydaje mi się, iż kod powinien być poprawny, lecz sędzia cały czas wykrywa mi błąd.

2 1 1
1 1 2
Obydwa przypadki oznaczają ten sam trójkąt. Prawda?

Sprawdź sobie u źródła (nie w pamięci) jak wygląda warunek trójkąta

Można to znacznie uprościć, @korkirw - udało Ci się doczytać kod do końca? :wink:

while (cin >> a >> b >> c) {   // <--- wystarczyło przejrzeć ten wątek od początku!

Nazwy zmiennych - w innym miejscu pisałem o nieużywaniu skrótów, ale dotyczy to tylko niezrozumiałych poza tworzącym kod skróconych nazw. W tym zadaniu chodzi o boki trójkąta, więc wystarczyłoby np samo największy bez _bok. Zdrugiej strony, dla każdego zajmującego sę geometrią, powinno być natychmiast, bez dodatkowych objaśnień, zrozumiałe równanie: a² + b² = c² [tw. Pitagorasa]. Podobnie dla fizyka E = mc², czy punkt[0].x, pkt[2].y itd, więc w takich wypadkach można sobie darować opisowe nazwy, czy nadmiar wyjaśniających komentarzy.

Musimy zagwarantować, aby c było faktycznie największe, a boki a i b, dowolnie inne [nie musimy szukać średniego ani najmniejszego.
Można to zrobić np tak:

if a > b :  swap a b
if b > c :  swap b c
...
if a + b <= c to ...
ELSE
wynik = c² - a² + b² 
if wynik == .. to
else if wynik < od to ...
else trójkątypozostałe.

PS
W tym zadaniu można użyć zmiennych całkowitych - dane przykładowe nie są ujemne.

@narbej przyznaję, że nie analizowałem całego kodu :slight_smile: . Zatrzymałem się gdy zobaczyłem warunek a+b >= c

3 years later

Mógłby ktoś podpowiedzieć czemu nie przechodzi?

10 days later