40 / 133
Sep 2016

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?

2 months later

Dla przykładowych testów z zadania program działa prawidłowo.

AC

Mimo to spoj wywala błąd. Nie jestem w stanie sam go znaleźć.

Edit: wystarczyło zmienić tryb danych na double

Policz na kalkulatorze te odległości, wyświetl sobie twoją tablicę 'wyniki' i porównaj te liczby. Popróbuj też z innymi testami.

3 months later

https://ideone.com/5hAyct10

Nie wiem dlaczego SPOJ nie zalicza. Czy mógłby ktoś pokazać przykłady testów których nie przechodzi i ew. dać wskazówke co poprawić? Jestem początkującym i wszelkie uwagi będą mile widziane.

Twój program nie działa nawet dla przykładowego wejścia. https://ideone.com/AKkXce11

Przed proszeniem o pomoc na forum stwórz program, co do którego istnieje chociaż szansa, że jest poprawny, a nie program, który wywala się już na teście podanym w treści zadania.

W moim kompilatorze wyniki, które uzyskuje przy powyższym kodzie są poprawne, nie wiem dlaczego na ideone są inne.

to pomyśl - bo nikt za ciebie myśleć nie będzie, co najwyżej może ci zwrócić uwagę na coś, co przeoczyłeś, lub podać przykład dla którego program nie działa

Tylko nie kompilatorze, proszę wyrażaj się i nie obrażaj swojego kompilatora.

[local] int tmp;
tworzy lokalną zmienną, o nazwie tmp i o nie określonej wartości. Dlatego twój program raz zadziała a raz nie.

PS

  1. niestaranne formatowanie kodu.
  2. nieuzasadnione "zawyżone" typy zmiennych
  3. nie korzystanie z możliwości testowania na ideone [stdin is empty]

PS 2
Dwa pytania kontrolne:

  1. Czy aby nie jesteś absolwentem "sławetnego" kursu wideo pana Z?
  2. Czy aby nie napisałeś komentarza pod którymkolwiek zadanniem? Jeżeli tak, to radzę Ci jak najszybciej go przemyśleć i ewentualnie skasować, bo mam zamiar to sprawdzać [a wierz mi, mimo często brakujących tam loginów, jestem w stanie to sprawdzić] i tworzyć czarną listę osób nie przestrzegających zaleceń [4 pkt pod komentarzami] i wtedy zero podpowiedzi na forum dla spamerów.
    Jeżeli nie dotyczy Ciebie, to poprostu zignoruj to.

PS 3
Oczywiście u Ciebie zmienna tmp, o którą chodzi nazywa się inaczej.

Dzięki za pomoc, wszystko działa. Tak, korzystałem z kursu pana Z, jak również z kursu zamieszczonego na cpp0x. Czy to zły wybór? Nie pisałem żadnych komentarzy pod zadaniami, jest to także moja pierwsza aktywność na tym forum.

Bardzo zły. Uczy samych brzydkich technik. Kup jakiś poważniejszy kurs lub książkę.

PS.
Odniosłem się do kursu "pana Z", a nie cpp0x.

I bez tego się obejdzie. Dokumentacja, intensywne googlowanie, realizowanie własnych pomysłów itd. Sporo już źródeł i metod podano na forum :wink: