31 / 49
Aug 2018

@manjaro Czy możesz teraz potwierdzić lub zaprzeczyć czy odpowiadałem na Twoje pytanie, a Ty po prostu nie rozumiałeś mojej odpowiedzi? Napisałem, że temat nieokreślonej ilości danych już był poruszany nawet w tym temacie. Ta pętla była w tym temacie.

Edit: Tak po prostu dla mojej satysfakcji.

Edit2: Możesz przy okazji wyjaśnić dlaczego wstawianie takiej pętli jest kompletnie bez sensu bo ani ja ani pewnie inni forumowicze tego nie wiedzą. Zwykły while - dopóki są dane… działaj.

@manjaro to nie jest twoje pierwsze pytanie na forum, ani nie jest to twoje pierwsze AC. Nie jesteś więc początkującym użytkownikiem SPOJ’a. Mimo to zamiast łatwiej, trudniej mi jest Ciebie zrozumieć. Masz ciągle pretensje do niezrozumiałej [przez Ciebie] treści zadań, ale sam ciągle zadajesz jeszcze bardziej niezrozumiałe pytania a potem masz pretensje do pomagających. Powinieneś jednak wiedzieć, że odpowiadanie na forum wynika z dobrej woli i chęci a nie z obowiązku.

PS
@manjaro, twój komentarz pod zadaniem, moim zdaniem jest spamem, pkt 2.

2018-08-10 16:05:52
Trzeba mieć chyba szklaną kulę żeby wiedzieć kiedy wypisać sumę wszystkich zestawów. Treść bez sensu

|Uwagi:|

  1. Nie nadsyłaj żadnego kodu źródłowego tutaj!|
  2. Proszę zamieszczaj krótkie uwagi i komentarze, nie spamuj!|
  3. Szerszą dyskusję (wskazówki, pomysły, rozwiązania) znajdziesz na forum.|
  4. Autorzy zadań mogą usunąć lub ukryć dowolny komentarz oraz mogą zamieszczać kod w html-u (np. w celu udostępnienia odsyłaczy).|

Oczywiście, mogę wyjaśnić. Dlatego że użytkownik nie ma normalnej programowej możliwości wyjścia z tej nieskończonej pętli. Jedyne możliwości to jakieś ALT+F4 albo CTRL+ALT+DEL albo CTRL+C lub CTRL-D albo wyjąć baterię :wink: To tak jakby dać komuś klucze do domu bez drzwi… Wyświetlenie sumy końcowej nigdy się nie wykona bo nie ma możliwości wyjścia z nieskończonej pętli. O to mi chodzi.

Poza tym wielu użytkowników, w tym również ja było przekonanych że wyjście z pętli kończy wprowadzenie w zestawie tylko jednej liczby 0. Sugerować mogą to kody pojawiające się w tym wątku.

Eee… co? Program ma wczytać i przetworzyć całe wejście, którego rozmiar nie będzie podany wprost. Tyle. Nota bene jest to klasyczna sytuacja w praktyce. Przykład - parsowanie przeciętnego csva. Nie wyobrażam sobie by klient dostał program z informacją, że musi sobie wcisnąć jakieś ALT+F4 bo inaczej nie wyjdzie z nieskończonej pętli i program tak sobie będzie wisiał i wisiał.

Z treści zadania dowiadujemy się, że: “Poszczególne zestawy zostaną rozdzielone znakiem nowej linii” oraz, że: “Pojedynczy zestaw składa się z ciągu liczb całkowitych, rozdzielonych spacjami i kończących się zerem.”. Poza tym wiemy, iż: “(…) podana zostanie pewna nieokreślona ilość zestawów danych”. Nie rozumiem pogrubionego fragmentu, ale treść zadania jest jasna podobnie jak przykład do niej.

Co do użytkowników świetną wskazówką jest pole “Rozwiązało osób” zawierające liczbę 3897. Nie twierdzę, że wszyscy zrozumieli treść zadania od co. Być może niejeden skopiował czyjś kod aby zobaczyć jak sobie poradzić z nieokreśloną liczbą testów. Potem ludzie (być może?) przeanalizowali kod i dowiedzieli się czegoś. Być może wielu pytało - niekoniecznie na tym forum. Pewnie niektórym pomogli nauczyciele informatyki albo lokalne guru. Inni analizowali treść przez kilkanaście minut. Natomiast:

to w moim odczuciu ataki osobiste. Z tym pół biedy: sądząc po liczbie zadań jesteś dość nowy, dużo się uczysz, frustracja przy niepowodzeniach jest zrozumiała, @redysz focha nie strzeli (chyba :wink: ), … . Natomiast:

to już całkowicie niemerytoryczne i bezpodstawne ataki ad personam na autora zadania. Zwracam uwagę na komentarz przy treści zadania zawierającej fragment: “Na samym końcu należy dodatkowo podać sumę wszystkich wczytanych z wejścia liczb”.

Autorzy nie mają płacone za tworzenie zadań, a przy takich uwagach ochoty na ich tworzenie również.

No właśnie ja też sobie nie wyobrażam sytuacji gdzie klient dostanie program z niekończącą się pętlą z której nie ma wyjścia… A tutaj mamy właśnie do czynienia z takim programem. Pól biedy jeszcze że pętla jest nieskończona bo to program teoretyczny i wiele już takich było wcześniej. Ale cały problem i zamieszanie tu wprowadza instrukcja która ma się wykonać po zakończeniu wczytywania danych, skoro z góry wiadomo że wczytywanie jest nieskończone i nie ma możliwości aby instrukcja się wykonała.
Analizując przykład który podał autor. Sugeruje on jednoznacznie że po podaniu trzeciego zestawu danych samotnego zera program jakimś cudem zakończył swoje działanie i wypluł sumę całkowitą. Siedziałem pół dnia nad tym co takiego skłoniło program do zakończenia wczytywania danych. Doszedłem do wniosku ( i sądząc po kodach innych osób że wielu przede mną również) że musiało to być samodzielne 0. Ale jak się później okazało niestety ot tak autor nagle sobie zakończył program (w magiczny sposób, bo program tego nie uwzględnia) i wypisał wynik.

Dobra @manjaro w skrócie to czego nie rozumiesz to fakt że:
Program niekoniecznie działa tak, że użytkownik wklepuje ręcznie te dane w tej pętli. Program działa tak, że pobiera dane z pliku. W pliku może być 200 linii, a może 2000. Tego nie wiesz i to popularna sytuacja.
Teraz while(cin>>cośtam) działa w ten sposób, że dopóki są dane (w pliku) to będzie działał, a jak się skończą to nastąpi coś co się zwie EOF (end of file) i wtedy cin>>cośtam w while(cin>>cośtam) zwróci EOF, a wtedy while(eof) to tak jak while(false) czyli nie wejdzie dalej w pętlę.

Czyli tak:

  • z tej pętli nie da się wyjść jeżeli wklepujesz dane “z palca” w konsoli (bo program nie wie czy są jeszcze dane); jeżeli wklepuje się dane z klawiatury. Tak na prawdę to co napisałem to kłamstwo, ale przyjmij je w celach naukowych.
  • z tej pętli wychodzi się z łatwością jeżeli użytkownik podał dane w pliku, a później uruchomił program tak by kolejne linie pobierał z pliku. To jest bardzo częsta sytuacja - na przykład w skryptach serwerowych.

Rozumiesz?

Jeśli nadal nie to wejdź na ideone.com3 i dane podaj w stdin. Program zachowa się jak w drugiej sytuacji i zobaczysz, że zadziała. Tak samo dzieje się na spoju.

Jeśli sobie tego nie wyobrażasz to poinformuję, że aktualnie programuję po stronie backendu w Pythonie i tam:
Ta sytuacja występuje cały czas (nawet tysiące razy na sekundę)
Gość/użytkownik mi wysyła żądanie w xmlu czy innym jsonie, a ja nie wiem ile jest tam danych. Moje skrypty napisane są właśnie tak - działają póki one są.

W jednym zdaniu tym razem:
Twoim problemem jest to, że przyjąłeś iż dane bedą schodzić z klawiatury co jest rzadkością, a przyjąłeś tak bo sam testujesz (nieprawidłowo) swoje programy podając dane z klawiatury.

Powinieneś testować na ideone lub odpowiednio z przekierowaniem standardowego wejścia/wyjścia z/do pliku.

To dobry, ale bardzo programistyczny i trudny do wyobrażenia dla ogółu ludzi przypadek. Można wyobrazić sobie coś bardziej codziennego niż “bekend”.

Klient zapisuje w formacie .csv arkusz kalkulacyjny zawierający dane pracowników firmy potrzebne do komunikacji między jej działami (czyli najczęściej imię, nazwisko, funkcja, dział, nr wewnętrzny, nr służbowy i tyle). Potrzebuje program, który przetworzy te dane do tabelki html / dokuwiki / … tak aby z danych mogli korzystać wszyscy pracownicy mający dostęp do listy firmowych procedur. Wprowadzenie warunku “niech Pan najpierw se policzy ilu ma Pan pracowników i wpisze tę liczbę na górze pliku” nie tylko komplikuje proste zadanie (zapisz plik jako .csv i uruchom zewnętrzną aplikację), ale też prowadzi do błędów (klientom nie należy ufać o czym dowie się każdy kto pół roku posiedzi w IT - jeżeli firma na 1230 pracowników to wpisana do .csv liczba będzie równa 123 albo 1330 bo tak i radź se Pan z tym).

W raczej już nieużywanym formacie .dbf przeglądanie pliku bazy danych przy użyciu języków z rodziny xBase dokonuje się właśnie w pętli:

do while !eof()
  ...
  dbskip()
enddo

Mając do czynienia z bazą danych SQL możesz stanąć przed problemem napisania aplikacji, która oblicza np. zyski ze sprzedaży i wypisuje je na różnych poziomach grupowania do różnych plików. Złożoność operacji na plikach i sytuacji handlowych, księgowych i ekonomicznych (wbrew pozorom zysk to nie jest po prostu ilość * (cena_sprzedaży - cena_zakupu)) uniemożliwi zrobienia tego pojedynczym zapytaniem. Kończysz z kilku(nasto) wymiarową kostką OLAP, którą trzeba przeglądać i analizować w programie napisanym np. w Javie. Serio będziesz iterował po select count(1)?

Używasz technologii wget lub curl by pobrać kod kilkudziesięciu tysięcy stron internetowych a potem w jakiś sposób go przetworzyć. Twój program będzie za każdym razem wyświetlał komunikat: “Pobieranie pliku 1275/98365 zakończone powodzeniem. Otwórz plik i sprawdź ile znaków zawiera, a następnie podaj tę wartość i zatwierdź klawiszem Enter”?

Owszem to teraz wiele wyjaśnia. I może wystarczyłoby napisać w zadaniu taką informację, że nie należy się przejmować tym jak i kiedy zakończy się wczytywanie danych. Zaoszczędziłoby to wiele czasu i nerwów ludziom którzy tu rzadziej bywają. Może dla spojowiczów którzy tu siedzą już 10 lat to jest oczywista oczywistość ale jak widać nie dla wszystkich. Bo nie wszyscy są programistami grubszego formatu którzy przetwarzają tysiące danych z jsona itp…

Do pewnego momentu masz racje, a jednak… takich zadań jak to jest na spoju multum. Czy w każdym należałoby pisać to ostrzeżenie? Tak na prawdę czytając ten wątek od początku (szczególnie po tej dyskusji) każdy już będzie wiedział o co chodzi.

Dziękuję za zrozumienie. Może jest multum i jak napisałem stali bywalcy wiedzą o co chodzi. Ja rozwiązałem kilkadziesiąt zadań i pierwszy raz spotkałem się z tego typu operacją, stąd moja frustracja. Pozdrawiam

Przyznam, że nic nie rozumiem:

I nie chodzi mi bynajmniej o nieaktualny link w w/w wątku tylko o to kto jest autorem podpowiedzi.

Chciałem też napisać o ctr d i ekwiwalencie w windowsach, ale w sumie przecież nikt nie pyta, tylko podaje swoje własne propozycje i pretensje.

Narbej naprawdę nie widzisz różnicy? Nie chodzi o stworzenie nieskończonej czy też inaczej pisząc nieokreślonej pętli tylko o to jak wyjść z tej nieskończonej pętli aby wykonać dalszą część zadania.

14 days later

Hej, mam problem z zadaniem.
Uzyskuje prawidłowe wyniki przy debugowaniu natomiast sędzia nie przyjmuje (niedobry ten sędzia :frowning: ).
Bardzo proszę o jakąś wskazówke gdzie popełniam błąd.

test
1 0
twój program daje
1
0
1

na pewno dobrze ? :wink:

Poprawiłem mój kod ale dalej lipton tea…

Dalej wykłada się na tym samym tescie. I przeczytaj treść zadania. Tam nigdzie nie pisze że zawsze występuje na końcu wszystkich testów pojedyncze zero. A twój program tego chce.

Dziękuje za pomoc :slight_smile: w końcu się udało.
Trudność tego zadania polega na zroumieniu co to znaczy nieokreślona ilość zestawów danych.
Jak się ogarnie to życie staję się piękniejsze :slight_smile:

1 month later

Cześć, mam mały problem z tym zadaniem.
W teorii program działa poprawnie, lecz sędzia go odrzuca.
Byłby ktoś w stanie pomóc?

dokładne przeczytanie treści zadania powinno pomóc
przeczytanie całego wątku też nie zaszkodzi
a potem zostanie tylko uproszczenie kodu i powinno działać :slight_smile: