40 / 69
May 2017

:wink: Czy za każdym razem, używając: #include<...> <-- coś tam z STL [lub boost, a możliwe, że są/będą dostępne i inne biblioteki?] nie korzystasz z więcej niż jednego pliku i jednocześnie czy twój program, nie jest już w pewnym sensie trochę obiektowy? :wink: [raczej pytam retorycznie]

Jeżeli naprwdę chcesz "liznąć" PO, możesz u siebie to robić i robić to tak jak lubisz, w wielu plikach, klasach, podklasach itd, a po skompilowaniu i przetestowaniu u siebie, możesz wysyłać taki kod, sklejając wcześniej odpowiednie pliki źródłowe w jeden - pewnie wystarczyłby do tego nawet bash, ale możesz sobie napisać też specjalny programik [obiektowo] w c++, automatycznie sklejający potrzebne pliki.

Jeżeli miałeś w ręku Algorytmikę praktyczną, to pewnie zauważyłeś, że większość kodu jest pisana tam z użyciem klas, struktur, template, więc może jednak można i warto?

PS
Powyższe piszę tylko teoretycznie, bo sam tak [jeszcze] nie robię. :wink:

Słusznie węszyłem haczyk w Twoim pytaniu :wink: Ale fakt - w tym sensie plików jest duużo więcej :wink:

Ło ma lamo, to byłby koszmar :wink:

Ależ ja (sporadycznie) również stosuję na SPOJu szablony, struktury a by nie pisać unsigned long long zbyt często - także define. Czasami takie podejście ułatwia sprawę bo jest mniej kodu do zaklepania. Tylko czy na SPOJu tego rodzaju twory stosuje się podobnie jak w rzeczywistych projektach programistycznych? :wink: Myślę, że podobieństwo dotyczy głównie słów kluczowych :wink:

11 days later

Hej, sklecilem kod do zadania MWPZ06H 6, na danych z przykladu i moich wlasnych wyglada, ze dziala w porzadku, niestety otrzymuje zwrotke ze uplynal limit czasu... czy ktos moze mi powiedizec co jest tego powodem? sam kod jest zbyt powolny? sortowanie kiepskie? czy po prostu w ktoryms momencie program czeka na wprowadzenie danych, ktore nie nastepuje?

http://ideone.com/3zQwvI6

Witam,

Czy mógłby ktoś wrzucić więcej testów do tego zadania. Poszukuję błędu w swoim kodzie (C#). Sędzia zgłasza NZEC. Testy na ideone przechodzą
http://ideone.com/ULyfa09
Z góry dziękuję.

Dobrym nawykiem po zrobieniu zadania jest sprawdzenie na minimalnych danych wejściowych jakie mogą być w zadaniu. Jeśli autor pisze:

N (1 ≤ N ≤ 200)

To najprawdopodobniej będzie przynajmniej jeden test z N = 1 i N = 200 :wink:

Racja, umknęła mi ta jedynka. Dzięki za podpowiedź, kod zaliczony :slight_smile:

3 months later

Witam
Zainteresował mnie bardzo punkt 11) Twojej wypowiedzi. Miałem ten sam problem co autor posta (program działa w konsoli ale na ideone już nie a sędzie zwraca błąd SIGABRT). Oto mój kod (który swoją drogą nie podaje nadal poprawnej odpowiedzi, jeszcze głowie się nad tym dlaczego): https://ideone.com/Tl6aRq9 Jednak po usunięciu linii z instrukcjami "delete" już wspomniany błąd nie pojawia się. Czy mógłby ktoś wytłumaczyć od strony technicznej (sposobu działania sędziego) dlaczego tak się dzieje? :wink:

Sędzia nie ma tu nic do rzeczy,sędzia tylko informuje o nieoczekiwanym zakończeniu programu, czyli nie poprzez return 0 w main()

Zaś program kończy działanie, gdy próbujesz zwalniać pamięć, której poprzednio nie zarezerwowałeś lub jest już zwolniona

Też nie do końca wiem dla czego, ale już się nie głowię i dałem sobie spokój. Przyjmij [na wiarę], że po prostu twój kod jest tak brzydki, że kompilator nie wie jak go skompilować i tworzy błędny program. Mam na myśli nowy kompilator. Stary nie ma zastrzeżeń i jest AC :wink:
Oczywiście z kompilatorem to żart, aale reszta to szczera prawda :wink:

Dlaczego, nie mam pomysłu i po prostu przyjmij to za dobrą monetę [AC na starym kompilatorze] i na przyszłość zacznij pisać lepsze kody, a przede wszystkim pisz jak najwięcej [ i jak najlepiej].

PS

Co masz na myśli? Rozumiem, że chodzi Ci o jakąś wypowiedż tarpauwatratar'a, ale o jaką?

PS 2

@mariusz193 wyjaśnił więc tylko powtórzę.
Nawet gdybyś był problemsetterem, to na początku, do prostych zadań nie jest Ci potrzebna wiedza na temat techniki działania sędziego. Wystarczy wiedza, że wyłapuje błędy - ale czasami są problemy - tak jak tu.
U Ciebie t nie wskazuje adresu początku tablicy, więc delete [] t powoduje natychmiast błąd SIGABRT. Nie można też kasować dwukrotnie tego samego obiektu więc gdyby jednak delete [] t zadziałało to delete [] tab spowodowałoby błąd SIGABRT, ale program już wcześniej zostaje przerwany, przez delete [] t.

Coś czuję że częściej będę się udzielał na forum ze swoimi rozwiązaniami :wink:. Dzięki, naprawdę, nic tak dobrze nie robi nauce jak krytyka kodu przez kogoś bardziej kompetentnego. Ale czy mógłbyś sprecyzować co tu z grubsza jest takiego beznadziejnego? Podejrzewam że trochę mocno przesadziłem ze wskaźnikami no i też sposób sortowania nie jest zbyt górnolotny, ale to na pewno nie jedyne problemy. Idąc dalej, skąd brać Twoim zdaniem i na czym można się wzorować przeglądając "ładny" kod? A co do mojego pytania o inną wypowiedź to już wyjaśniłeś wszystko dwie linijki niżej.

Nic takiego nie napisałem, a że brzydki, to był żart, [uśmiech na końcu zdania nie był ironiczny] bo nie przychodziło mi inne wyjaśnienie - w kompilatorze c++ 4.3.2 bez zmian twój kod uzyskuje AC [akccepted], w wyższym, 6.3, już nie - sam to sprawdź.
Piękność-brzydota to pojęcie względne i rzecz gustu, a o gustach się nie dyskutuje i są to [raczej] drobiazgi

Po kolei:

  1. Tak, trochę przesadziłeś ze wskaźnikami, i używa się ich też do uproszczenia kodu, a nie zagmatwania.
  2. Umieszczanie nawiasu otwierającego:
    do { // tak jak preferuję
    main()
    { // nie preferuję i to u Ciebie pewna drobna niekonsekwencja w stosunku do do, przecież nie masz
    do
    {
    To samo w stosunku do innych pętli, dla mnie zawsze for (){, while(){ itd
  3. t = tab = new int [a]
  4. while (a--) cin >> *t++;
  5. dalej w [twoim] kodzie wskaźniki nie przynoszą korzyści [w uproszczeniu zapisu kodu] w stosunku do zwykłych indeksów, a nawet [moim zdaniem] bardziej go gmatwają/zaciemniają.
  6. zmienna pom w my_sort jest nie używana.
  7. Sortowanie bąbelkowe to jak sam piszesz: "sposób sortowania nie jest zbyt górnolotny,"

Chyba tylko tyle :wink: i się nie przejmuj, czym więcej będziesz pisał [i ewentualnie czytał], tym szybciej dojdziesz do ładnego kodu: https://helion.pl/ksiazki/piekny-kod-tajemnice-mistrzow-programowania-andy-oram-greg-wilson,szpppv.htm3, Czysty kod, czy wreście https://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm2, tak dobry stary C

2 months later

https://ideone.com/gYwM6h4

Stworzyłem coś takiego, na ideone wszystkie wyniki wydają się być poprawne, w codeblocks na prywatnym komputerze jednak dzieje się coś dziwnego, przy więcej niż dwóch elementach i liczbach większych od mniej więcej 100, zawsze jeden element tablicy jest zamieniany na wielokrotność 8 np. 8, 16, 32. Dzieje się to w fragmencie “//sortowanie tablicy”. Wypisanie zawartości przed tym fragmentem pokazuje dobre wartości, za nim już właśnie z tym błędem. Nie spotkałem się nigdy z takim czymś. Co może być przyczyną? Czy może to być przyczyną błędu jeśli ideone kompiluje kod poprawnie?

Przykład takiej zamiany: Przechwytywanie

P.S. Zamienienie funkcji swap na ręczną zamianę pozycji z trzecią zmienną daje ten sam efekt.

Według specyfikacji C++ nie powinieneś pisać

int liczba[N];

a

int *liczba = new int[N];

Ale twój błąd jest w pętli sortującej. Iterujesz do elementu N, ale odwołujesz się jeden element dalej:

for(int j=0;j<N;j++)
{
    if(liczba[j]>liczba[j+1]) 

i zgarniasz jakiś przypadkowy blok pamięci do swojej tablicy. Zresztą widzę po Dlaczego tylko 3? Wiatraczki FANGEN że masz do tego szczęście :smiley:

PS. Czemu nie pójdziesz o krok dalej i nie uzyjesz funkcji sort zamiast funkcji swap?

I czasami tam dalej jest wartość, która nie przeszkadza, a czasami przeszkadza, powoduje błąd.

W posortowanej tablicy, dużo łatwiej się szuka, niż w nie posortowanej, czyż nie?

PS
Czemu nie ma SIGSEG czy czegoś podobnego? Pewnie z powodu takiego [lekko błędnego] sposobu deklarowania wielkości tablicy [statyczno-pseudo-dynamicznej :wink: ]

Dzięki, zamieniłem tablicę na dynamiczną i użyłem sort, teraz wszystko ładnie działa i zaakceptowano.

Chyba zacznę bardziej zwracać uwagę, żeby nie wychodzić poza tablicę :smiley:

1 month later

na jakim kompilatorze ?
edit na C++ 4.3.2 działa na innych nie :c

Hmm, zazwyczaj takie rzeczy powodują takie rzeczy jak sięganie za tablicę i do niezadeklarowanych zmiennych. Ale po szybkim przejrzeniu nie widzę czegoś takiego Twoim w kodzie. Najbardziej podejrzana byla:

swap(wyniki[h], wyniki[h + 1]);

Wtedy można sobie do tablicy wcisnąć jakieś pozostałości, które stały bezpośrenio za nią jeśli się nie uważa z indeksem tablicy. Niestety nie widzę gdzie mógłby leżeć problem.