Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Język C, Niewłaściwie działająca pętla

Lanetti16 29 May 2016 12:36 768 6
  • #1
    Lanetti16
    Level 2  
    Mam problem z takim oto programem.
    Chcę żeby pobrał ode mnie konkretną liczbę liczb i posortował je, a następnie wyświetlił je tylko bez duplikatów, czyli z 1,2,3,4,4,7,2 powinien wyświetlić 1,2,3,4,7.
    Problem jest taki, że aktualnie program pobiera ode mnie o 1 liczbę za dużo, jeśli się bawię i to próbuję naprawić to zazwyczaj zapomina ostatniej liczby i przyjmuje dla niej losową liczbę.
    Code: c
    Log in, to see the code
  • #2
    Dżyszla
    Level 42  
    E... Nie wierzę... Podajesz np. 2 i pobiera trzy liczby?

    BTW - eliminację duplikatów zrobiłbym zupełnie inaczej. Skoro jest już tablica posortowana, to wyświetlając wystarczy pamiętać ostatnio wyświetloną cyfrę. Jeśli bieżąca jest identyczna, to już jej nie wyświetlać. Jeśli nie, to wyświetlić i zapisać do tej ostatnio wyświetlanej nową wartość. Znacznie szybsze niż szukanie i zastępowanie 0 (odpada niepotrzebny przebieg, a i dopuścisz wpisywanie 0).
  • #3
    dedito
    Level 39  
    Wkradła ci się spacja przy pobieraniu a[i]. Powinno być:
    Code: c
    Log in, to see the code

    Proponuję dopisać podgląd indeksu tablicy:
    Code: c
    Log in, to see the code

    Ten program jeszcze nie działa tak jak to sobie założyłeś.
  • #4
    Krzysztof Gustaw
    Level 23  
    Witam!
    Na początek: Już masz błąd w deklaracjach i definicjach. W języku C przy definiowaniu tablic o n elementach (arr[n]), ilość elementów (tu: n) musi być stałą bądź wyrażeniem stałym, a nie zmienną.
    Prawidłowo powinno być np tak:

    Code: c
    Log in, to see the code
    Jeśli chcesz dynamicznie tworzyć tablice, to musisz zadeklarować tablicę jako wskaźnik a potrzebną pamięć przydzielić funkcją np malloc, a przy zakończeniu programu zwolnić tę pamięć funkcją free.
    Pozdrawiam
    KG
  • #5
    JacekCz
    Level 39  
    Krzysztof Gustaw wrote:
    Witam!
    Na początek: Już masz błąd w deklaracjach i definicjach. W języku C przy definiowaniu tablic o n elementach (arr[n]), ilość elementów (tu: n) musi być stałą bądź wyrażeniem stałym, a nie zmienną.


    w kwestii formalnej: w bardzo nowych wersjach C++ to już może być, gdy wartość zmiennej jest znana na wejściu do bloku (zwłaszcza parametr).
    Choć nie gonię za każdymi nowościami, mogę się mylić.

    Tak jak piszesz, bo zasadniczo słusznie piszesz, by skutkowało błędem kompilacji, może kolega to kompiluje w jakiś "nowoczesnych" opcjach. Pisze, że program się wykonuje choć nieprawidłowo
  • #7
    Krzysztof Gustaw
    Level 23  
    Witam!
    Do Kol Grko - Owszem, standard C99 wprowadził tablice o zmiennym rozmiarze (VLA), jednak w późniejszym (C11) wycofano się z tego rakiem określając tablice VLA jako opcjonalne dla implementacji.

    Ale wracając do problemu Autora to sortowanie zrobiłbym tak:
    Code: c
    Log in, to see the code
    bo dalsze sprawdzanie i porównywanie posortowanej już tablicy nie ma sensu, a eliminację powtarzających się wierszy a potem ostateczne wyświetlenie zawartości tablicy tak:
    Code: c
    Log in, to see the code
    Zero też jest liczbą, zwłaszcza, że matematycy w końcu rozstrzygnęli spór i ostatecznie ustalili, że zawiera się w zbiorze liczb naturalnych, więc dobrze by było ją też brać pod uwagę.
    Pozdrawiam
    KG