Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ - Sprawdzanie powtarzania w wierszach tablicy 2-wymiarowej

Abnormal696 07 Sty 2013 15:29 1419 8
  • #1 07 Sty 2013 15:29
    Abnormal696
    Poziom 9  

    Witam, chciałem do tablicy 2 wymiarowej wprowadzić drogą losową liczby z przedziału 1-5 i sprawdzać żeby nie powtarzały się w wierszach(w kolumnach mogą), ale przy próbie uruchomienia pokazuje mi tylko czarne okno konsoli.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 8
  • #2 07 Sty 2013 15:46
    kitor
    Poziom 34  

    Zerknij na to. Nie do końca rozumiałem wewnętrzną pętlę for bez trzeciego parametru - mam wrażenie że szła w nieskończoność (choć debugera nie uruchamiałem)
    No i, przynajmniej u mnie, brakowało nagłówków stdio/stdlib.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #3 07 Sty 2013 16:10
    Abnormal696
    Poziom 9  

    Brak zwiększenia licznika w 2 pętli for jest po to aby, zwiększyć go dopiero wtedy gdy sprawdzimy czy liczby w wierszach się nie powtórzyły.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Po komentowałem może teraz:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    No tak 2 pętla idzie w nieskończoność ale jak to zmienić?

    0
  • Pomocny post
    #4 07 Sty 2013 16:26
    kitor
    Poziom 34  

    Cóż, zobacz mój kod, ja zawsze inkrementuję, a gdy wykryję powtórzenie - dekrementuję. IMO jest to czytelniejsze.

    Druga sprawa

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Przenieś o jedną pętlę wcześniej (poza najbardziej zagłębiony "for"), tak jak jest w moim kodzie - i będzie działać.

    0
  • #5 07 Sty 2013 16:34
    Abnormal696
    Poziom 9  

    Okej jest tak jak mówisz, tylko teraz jeśli będziemy mieli np. tysiąc elementów w wierszu to będzie lecieć po wszystkich a nam wystarczy kiedy tylko raz się powtórzy. Powtarzającym elementem będzie 2 a i tak pozostałe 998 pętla będzie sprawdzać. Jak rozwiązać to bez konieczności sprawdzania wszystkich, tzn przerwanie działania gdy trafimy na przynajmniej 1 taki element??

    0
  • #6 07 Sty 2013 16:41
    kitor
    Poziom 34  

    Teraz zauważyłem instrukcję break. Nie powinno się jej używać.
    Po prostu przypisz w momencie wykrycia powtórki taką wartość licznikom odpowiednich pętli, aby się zakończyły.

    0
  • #7 07 Sty 2013 17:08
    Abnormal696
    Poziom 9  

    Nie bardzo rozumiem, jeśli nastąpi powtórka wartość powtórki mam wpisać pod aktualne liczniki pętli?

    0
  • Pomocny post
    #8 07 Sty 2013 17:18
    kitor
    Poziom 34  

    Cóż, teraz widzę że nie zrozumiałem do końca.
    Zostaw break jak był, teraz doczytałem że nie stosowanie break to mit, którego zresztą zostałem nauczony w szkole...

    A wracając do twojego pytania, zapoznaj się z debugerem to zrozumiesz dokładnie jak to działa. Break tak czy siak powinien przerwać pętlę for w obrębie której jest zagnieżdżony, a dopiero po jej zakończeniu (lub przerwaniu) sprawdzasz warunek !PowtarzaSie. Więc dopiero teraz jest wszystko dobrze.

    Po prostu stosując instrukcję break, przerywałeś całą pętlę for, co oznacza że

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    nie było wykonywane - tu właśnie pętla była wywoływana w nieskończoność.

    0
  • #9 07 Sty 2013 17:30
    Abnormal696
    Poziom 9  

    Wielkie dzięki za pomoc, po modyfikacji wygląda to tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    I wszystko działa, czyli tak jak piszesz break przerywał mi blok pętli for i nie dochodziło do skutku inkrementowanie j.

    0