@dziabagooo
Pokolei:
Czy możesz opowiedzieć co robi klamra po klamrze w Twojej pętli while’a?
while(cin>>a>>b>>c)
{
{
Podobnie co rozumiesz przez:
else
{
if
w szczególności z chęcią się dowiem czym się różni od zwykłego else if {
Jak już poprawisz kod na czytelny, to możesz zastanowić się czy masz poprawny out (czyt. nie masz) dla danych:
1 2 3
PS. W 99% (w 99.99% ?) przypadków gdy twierdzisz, że Tobie działa, a na spoju nie to twierdzisz źle. Twój program źle działa np. dla powyższego testu, ale takiego nie sprawdzałeś, albo nie wiesz kiedy można zbudować trójkąt.
Wiem, Kiedy mozna zbudowac trojkat - skonczylem Politechnike Warszawska
ZLe dalem warunek sprawdzania dlugosci bokow
Powinno byc i zamiast lub
Czyli
if (a<b+c && b<a+c && c<a+b && a>0 && b>0 && c>0 && a<10000 && b<10000 && c<10000)
Co rozumie hmm najpierw chcialem sprawdzic ifem czy da sie zbudowac trojkat (czyli kazdy bok mniejszy od sumy dwoch pozostalych i wiekszy zero)
Jezeli tak jest to ma sprawdzic jaki to typ trojkata
Pewnie za duzo klamerek dalem
Popracuje nad tym jeszcze
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
PS
Podejrzewam, że moje pierwsze rozwiązania tego zadania, też nie były takie ładne i proste, ale wolę tego teraz jeszcze nie sprawdzać.
To teraz takie zadanie: http://pl.spoj.com/problems/TTRI/23
Tu wystarczy “tylko” odpowiedzieć, czy da się zbudować trójkąt czy nie.
Dyskutowano już o tym zadaniu tu -> : 1361. Trzy liczby [TTRI]
#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()?
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
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