36 / 133
Aug 2016

Mam tylko nadzieję, że to nie ja - może kiedyś coś na ten temat napisałem?

Używanie pair zamiast odpowiedniej struktury, na pewno powoduje, że program jest dużo mniej czytelny, ale jest co najmniej jeden powód używania pair i zagnieżdzonych
pair<pair<> >.
Dzięki nim [pair ...], możemy użyć sortowania z STL [sort(....begin(), ..,.end())] bez pisania własnej funkcji porównującej.

W dyskutowanym programie jednak to niestety nie występuje.

Miałem na myśli znajomego z tak zwango reala (tak, posiadam takowych... a przynajmniej takowego :wink:)

Ja lubię jeszcze używać pair reprezentując grafy ważone.

Witam! Problem nad którym się głowie już trochę czasu według SPOJ-a przekraczam dozwolony obszar pamięci(SIGSEGV) . Ale kompletnie nie wiem kiedy. Tablice dynamiczne tworze na początku pętli ilości testów do wykonania a na jej końcu uwalniam obszar pamięci. Dla jednego testu program nie sypie się, natomiast na 2 już tak, sortuje, wypisuje prawidłowo ale jak by miał problem z uwalnianiem pamięci i nie rozumiem tego CRASHA. Prosze o pomoc. Oto moj kod http://ideone.com/yAIlHV15.

porównaj wyniki dla takich dwóch testów, może wyciągniesz właściwy wniosek :slight_smile:

pierwszy test

2
2
A 1 1
B 0 0
2
A 1 1
B 0 0

oraz drugi test

3
2
A 1 1
B 0 0
2
A 1 1
B 0 0
1
X 0 0

Zauważyłem , niepotrzebnie alokowałem pamieć gdy ilość punktów była równa 1. Poprawione. Ale SPOJ dalej to samo SIGSEGV, a robiłem różnorodne testy i wychodzą pozytywnie. Jakieś dalsze wskazówki? Poprawiony kod wraz z testem http://ideone.com/yAIlHV25 .

Witaj. Rozumiem, że jesteś początkujący, ale twój kod jest strasznie nieczytelny i nikt nie będzie miał ochoty go "debugować". Zadanie przekombinowałeś. Spróbuj go napisać bez wskaźników(tutaj na pewno leży błąd) używając klasy std::vector z biblioteki standardowej. Jeżeli wiesz co to programowanie obiektowe, spróbuj połączyć koncepcje w klasy.

26 days later
2 months later

dzień dobry. Ja dość nietypowo bo program jakimś cudem przeszedł mi za pierwszym razem a ja nie rozumiem, jakim prawem. Wydawało mi się, że wczytanie łancucha w sposób jaki to zrobiłem nie powinien działać. Kombinowałem z cin.get(), cin.getline () ale kompilator tego nie przepuszczał, albo po podaniu liczby testów przeskakiwał do wyświetlania tabeli i wypłenią ją zerami.
Ogóle wracam do programowania po ponad roku przerwy. Czy ktoś mógłby rzucić okiem, powiedzieć co można jeszcze usprawnić

W takim razie na razie nie myśl o usprawnieniach tylko myśl jakim prawem :wink:

Na razie nie usprawnienia [może kiedyś, jak już będziesz wiedział jakim prawem] ale takie małe uwagi:

  1. W ideone, można i należy wklejać w okienko input [wejście] dane wejściowe - test, a potem sprawdzać poprawność wyników w okienku stadout [wyjście].
  2. gdy: "..gdzie nazwa jest unikalnym dla każdego testu ciągiem co najwyżej 10 liter.." to zwiększaj tablicę przynajmniej o jeden [na'\0'] a nigdy nie zmniejszaj jej pod żadnym pozorem
  3. cin >> t1[j].ch >> t1[j].x >> t1[j].y; jest tu jak najbardziej poprawne i prawidłowe i można to napisać w jednej instrukcji. Dodatkowo, jest [cin] na tyle inteligentne, że wie samo co i jak zrobić, w przeciwieństwie do niektórych programistów [soryy tak mi się jakoś napisało,mam nadieję, że się nie obrazisz :wink:]
  4. zamiast: t1.odl = sqrt(t1.x*t1.x + t1.y*t1.y);
    można: t1.odl = hypot(t1.x, t1.y); <-- zobacz np w wiki co robi hypot(...)
  5. do sortowania, nie konieczna jest znajomość dokładnej odległości - wystarczy np kwadrat tej wartości - wtedy zamiast na double, można liczyć ją na intach i bez liczenia sqrt. [ani hypot]
  6. sortowanie jakie jest każdy widzi [a może sort z STL?]
  7. structura [klasa] + metoda? [liczenie odległości] - ale to może plany jeszcze nie na dzisiaj.

Ok dzięki.
3. Ok. Ale załóżmy, ze nazwa punktu może być dwuelementowa- oddzielona spacją. Wtedy trzeba użyć cin.getline () albo cin.get(). No ale wtedy program nie działa
6. Tu wiem. Nad qsortem muszę jeszcze trochę posiedzieć. Co do funkcji sort z STL, jasne ze mogłem jej użyć ale sortowanie wydaje mi się na tyle fundamentalnym algorytmem, ze chyba lepiej kilka razy napisać go samemu.

18 days later
1 month later
8 days later

Dopiero zaczynam nauke kodowania, więc mój kod jest bardzo prymitywny, za co przepraszam. Biorę się za zadania powyżej mojego poziomu, ponieważ wierzę że to rozwija praktyczne zrozumienie kodowania. Także bez zbędnego przedłużania, będę bardzo wdzięczny za zerknięcie na mój kod i wyjaśnienie mi, dlaczego C++ uważa że próbuję zrobić w funkcji wskaźniki, mimo że nigdzie mu nic takiego nie sugeruję:

http://ideone.com/0OJKzi17

Błąd przy próbie kompilacji:

error: cannot convert 'float*' to 'float' in return
if (n==0) return odl_mix;

Mile widziane także opinie dot komunikatu:

error: invalid operands of types 'int [liczby]' and 'int [liczby]' to binary 'operator*'
odl[i]= sqrt((x*x)+(y*y));

Mam wrażenie że wynika to z podobnego błędu, ale nie jestem pewny.

Z góry dzięki za wszelką pomoc.

Uważaj, bo równie dobrze może to rozwijać praktyczną umiejętność bezrozumnego kopiowania cudzego kodu :wink: Jeżeli jednak będziesz ostrożny - dobry pomysł.

Masz niezbyt estetyczny kod. Najbardziej razi mnie klamrowanie w mainie - pierwszy for jest bez wcięć.

Masz funkcję float (na SPOJu używaj raczej double, ale mniejsza teraz o to) więc powinieneś zwracać zmienną tego samego typu, np. 3.14. Tymczasem zwracasz return odl_mix, a odl_mix jest tablicą zmiennych, a nie zmienną! Prawidłowy zapis to np. odl_mix[3] czyli zwracasz konkretną liczbę z całej tablicy.

Intuicja Cię nie zawodzi - błąd jest analogiczny. W związku z tym Tobie zostawiam jego poprawienie :slight_smile:

PS
Wszedłem na forum zobaczyć co ciekawego się tutaj dzieje odkąd zniknąłem, ale świat studiów jeszcze przez pewien czas wymusza moją nieobecność więc ewentualne dalsze pytania kieruj do innych. No i powodzenia :wink:

PS2
Nie do końca rozumiem skąd biorą się Twoje trudności.

    if (x[i]<0) x[i]=x[i]*(-1);
    if (y[i]<0) y[i]=y[i]*(-1);
    odl[i]= sqrt((x*x)+(y*y));

Pierwsze dwa ify sugerują, że rozumiesz, iż x oraz y są tablicami. Z pewnością masz jakieś pojęcie o tablicach, czego dowodzi zapis int x[liczby-1]. Domyślam się, że odejmowanie jedności związane jest z numeracją od zera - wielki plus, że o tym pamiętasz. Mimo to pierwiastkując niejako zapominasz, że x i y to tablice i zamiast napisać x[i] oraz y[i] napisałeś x i y...

Bardzo dziękuję za szczegółową odpowiedź,

Nic nie kopiuje, póki nie zrozumiem jak i dlaczego działa, ale dzięki za ostrzeżenie!

To prawda, brak mi jeszcze ogłady. Póki co nie wiem co wysuwać, a co przycinać. Mam nadzieję że to przyjdzie z czasem

Tylko że ta funkcja ma właśnie zwrócić tablicę. Tylko nie wiem jak to zapisać. Zawsze mogę zrobić pętle for dla wszystkich elementów tablicy i zwracać je pojedynczo, ale zgaduję że jest jakiś szybszy i łatwiejszy sposób, żeby funkcja zwracała tablicę?

W takim razie tym bardziej dzięki za poświęcony czas

To akurat błąd pozostały z poprzedniej iteracji, zanim sobie przypomniałem że muszę coutować dane wejściowe, a nie tylko odległość od 0,0, Już poprawiłem, dzięki.

Także teraz pozostaje tylko pytanie jak mogę zapisać funkcję, która ma zwracać tablicę, a nie pojedynczego floata?