17 / 17
Oct 2018

Siema. Wiem że o tym zadaniu już było i to parę razy ale nigdzie nie znajduje rozwiązania.
oto mój kod71 który według SPOJ'a daje błędną odpowiedź. Nie mam pojęcia dlaczego. Jakieś rady? Z góry dzięki :slight_smile:

  • created

    Mar '17
  • last reply

    Sep '18
  • 16

    replies

  • 1.6k

    views

  • 7

    users

  • 5

    links

Rzeczywiście, dla tych danych jest pewien problem, wyrzuca różne wyniki. Rozumiem że jest problem z porównywaniem do zera. Czytałem o tym w innym temacie lecz nie rozumiem jak to zrobić.
Czym zastąpić if (delta==0) ??

Zacznij od sprawdzenia tego co się wczytuje pod Twoje zmienne dla danych wejściowych podanych w przykładzie:
0.3 0.3 0.4
0.5 1 0.5
-0.5 -0.5 0

Może być w debuggerze, albo po prostu wypisz coutem to co wczytałeś cinem i daj znak nowej linii dla każdego testu.

Rzeczywiście są pewne błędy: przy -0.5 -0.5 0; gubi jeden "-" przy -0.5 a dla danych 1 2 1 już w ogóle wariuje. Jednak dalej nie wiem czym to może być spowodowane, przecież chyba dobrze wczytuje te wartości? Czyli cin>>a>>b>>c?

A czy a,b,c to jedyne wartości jakie wczytujesz?

No tak, przecież tylko to jest podawane na wejście. Przy kombinacji 1 2 1 raz nic nie pokazuje, raz 0 lub 1 czy 2, kompletnie bez sensu. Widzę błędy w wyniku lecz nie mam pojęcia z jakiego błędu w kodzie one wynikają. Ten debugger w postaci wyswietlania tego co wczytuje przy zestawie 1 2 1 zamienia miejscami te liczby.

Skoro z taką pewnością piszesz, to przepraszam, że w ogóle zapytałem. Intryguje mnie jedynie jaką funkcję spełnia ten 'x'?

Nie to miałem na myśli, piszę te programy od niedawna i nie miało to zabrzmieć jakbym się wymądrzał, bo pewnie 95% ludzi tutaj ogarnia to bardziej niż ja. Po prostu zdaje mi się że 'x' nie przypisuje żadnej wartości.
A jest on po to żeby móc zczytywać dowolną ilość zestawów danych oczywiscie

Z całym szacunkiem, ale nawet ktoś 'zielony' w temacie powinien zwrócić uwagę na to, że ten zapis:
cin>>x
jest prawie identyczny z tym:
cin>>a>>b>>c

A skoro tak to i działanie obu komend powinno być zbliżone.
Debugger wyraźnie Ci podpowie co i gdzie się wczytuje w Twoim kodzie.

Już działa :slight_smile: problem był tak jak mówisz z tym 'x' po prostu nie sądziłem że jeśli jest on warunkiem pętli to będzie on wczytywał dane z wejścia. Taka mała zmiana kodu41 << a cieszy. Dzięki na nakierowanie a nie zwykłe powiedzenie co mam zmienić.

Skoro już poradziłeś sobie z rozwiązaniem zadania, to można teraz przeanalizować czemu debugger pokazywał, że liczby zamieniały się miejscami.

A więc przy tym teście:
-0.5 -0.5 0
z uwagi na to, że zmienna 'x' była zdeklarowana jako int, to strumień wczytywał to co było przed znakiem '.', czyli '-0'. Potem resztę próbował wczytać do zmiennych double a,b,c - więc do zmiennej 'a' poszło '.5' co zostało zinterpretowane jako 0.5, a pozostałe dwie zmienne zostały odczytane poprawnie.
Teraz łatwo możesz zrozumieć dlaczego prawdziwe cyrki się działy przy próbach wczytania testu złożonego z liczb całkowitych, np. 1 2 1 .

Na przyszłość warto poczytać trochę o strumieniach w c++ i pracy z debuggerem.

A samo wczytywanie testów można też zrealizować tak:
while(cin>>a>>b>>c)

lub za każdym przebiegiem pętli samemu sprawdzać flagę EOF strumienia.

12 days later

Cześć wszystkim, grzebie już trochę nad tym zadaniem, wydawało się banalne a nauczyłem się już nowej rzeczy, ale niestety nie mogę zmusić sędziego do przyjęcia kodu i wyświetlenia wymarzonego zielonego tła, wrzucam kod24, będę bardzo wdzięczny za jakieś naprowadzenie na odpowiednie tory rozumowania. Patryk

Problem jest z warunkiem stopu kończącym wczytywanie danych. Jeden z błędnie obsługiwanych przypadków już sam podałeś w linku.

Wygodniej jest wczytać zestaw danych a następnie sprawdzić czy to się rzeczywiście udało patrząc na flagi błędu. Może Ci się przydać dedykowany operator konwersji do bool'a dostępny w strumieniach.

1 year later

Też mam z problem z tym żeby zakończyć program, bo klikając enter przechodzi nadal do kolejnej linii, używałam metody:
while (cin>>a>>b>>c)
{cin>>a>>b>>c;
Nie działa. Nawet samo
while (cin>>a>>b>>c)
{cin>>a>>b>>c; }
nie działa, także proszę o pomoc jak to należy zrobić żeby działało.

Użyj:

...
while(cin >> a >> b >> c)
   cout << a << b << c << endl;
...

tzn potestuj i pobaw się w/w metodą.

Po ostatnim enterze, jeżeli chcesz “powiedzieć” swojemu programowi, że to jest już koniec [nie ma już nic, jesteśmy wolni, możemy iść …] i że nie będziesz wprowadzała więcej danych, sygnalizujesz to [symulujesz EOF https://pl.wikipedia.org/wiki/EOF3] ctr z <-- windows, ctrl d <-- Unix [Linux], Mac.

A najlepiej przestań testować swoje programy na konsoli, a zacznij używając przekierowań z/do plików lub używając poprawnie ideone: How to use Ideone.com