Modalna - funkcja nie zwraca poprawnego wyniku

Modalna - funkcja nie zwraca poprawnego wyniku
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

Witam, mam pewien problem dotyczacy funkcji na modalną. Nie moglem sobie sam poradzic z napisaniem takiej funkcji a wiec skorzystalem z informacji na tej stronie: http://mwzsw.cal.pl/lekcje_i/lider.html z kodu na lidera zbioru. Dopasowałem kod do własnych zmiennych etc i niestety nie dziala tak jak nalezy. Otóż powinno zwrocic z tablicy modalna a niestety zwraca "-1"

Tak wyglada moj kod:

Kopiuj
double modalna(int ilosc, double *tablica)
{
    double moda=tablica[0];
    int licznik=1;
    for (int i=0;i<ilosc;i++)
    {
        if (licznik==0)
        {
            moda=tablica[i];
            licznik=1;
        }
        else
            if (moda==tablica[i]) licznik++;
        else licznik--;
    }
    int ile=0;
    if (licznik>0)
    {
        for (int i=0;i<ilosc;i++)
        {
            if (tablica[i]==moda) ile++;
        }
    }
    if (ile>(ilosc/2)) return moda;
    else return -1;
}

Gdzie ilosc-rozmiar tablicy jednowymiarowej, *tablica - wskaznik do tablicy jednowymiarowej zawartej w klasie.
Niestety nie potrafie dojsc do tego dlaczego funkcja nie dziala.
Czy bylby ktos w stanie pomoc?

edytowany 2x, ostatnio: ulQuiorra
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Podejrzewam że jest tak dla tego że nie potrafisz tej funkcji poprawnie wywołać. Pokaż jak wywołujesz.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
szweszwe
Serio to nie zwraca zawsze '-1' tak jak pisał autor?
ulQuiorra
szweszwe niewiem jak w wypadku innych danych, ale na podstawie moich tablic nawet jesli probowalem nieco je pozmieniac zawsze pokazywalo -1. nie mam pojecia dlaczego ;/
_13th_Dragon
Serio, tylko że ilość nie ilość tylko ostatni element. I oczywiście musi być ponad połowę: double Tb[]={7,333,333,3,333,4,333}; cout&lt;&lt;modalna(6,Tb)&lt;&lt;endl;
szweszwe
Rzeczywiście, ostatni element zauważyłem, połowy już nie. :]
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

Właśnie nie w tym jest problem bo na pewno dobrze wywoluje ale wywoluje w ten sposob: modalna(N,czas_doj.tab_Zaklad1) - czyli jak kazda inna funkcje.
Ale udało mi sie już to zrobić innym sposobem.
Tak teraz wyglada funkcja ktora juz dziala poprawnie:

Kopiuj
void modalna(int ilosc, double *tablica)
{
    double ile = 0;
    double moda_kandydat,licznik,moda;
    for(int i=0;i<ilosc;i++)
    {
        moda_kandydat = tablica[i];
        licznik = 0;
        for(int j=0;j<ilosc;j++)
            if(tablica[j] == moda_kandydat) licznik++;
        if(licznik>ile)
        {
            ile=licznik;
            moda=moda_kandydat;
        }
    }
    cout<<"Modalna: "<<moda<<" wystepuje "<<ile<<" razy.";
}

I teraz mam takie pytanie. Modalna to wartosc najczesciej wystepujaca. W jednej tablicy pokazuje wartosc 27 ktora wystepuje 4 razy. Jest jednak jeszcze jedna wartosc =29 ktora takze wystepuje 4 razy. Chcialbym wiedziec w jaki sposob mozna wypisac obie te wartosci ?

Resident
  • Rejestracja:ponad 15 lat
  • Ostatnio:około rok
  • Postów:195
1

Tak najprościej to

  • policzyć ile_razy występuje każda liczba, zapamiętać max (to wtedy jest to ilość wystąpień modalnej w zbiorze).
  • sprawdzić, każdą liczbę, ile razy występuje, jeśli tyle co max to znaczy, że jest modalna.
    Niestety kiepsko z wydajnością.

...
edytowany 2x, ostatnio: Resident
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Najprościej zrobić zliczanie za pomocą mapy a potem wypisać elementy które maja maksymalny licznik. Średni czas dla unordered_map to O(n) dla tego algorytmu.
BTW: pierwszy kod ci nie działał bo nie umiesz czytać. Algorytm który zaimplementowałeś szukał lidera ciągu - wartości która występuje ponad połowę razy w danym ciągu. To jest dominanta, to fakt, ale są też ciągi gdzie nie ma lidera zbioru (bo ciąg ma 10 elementów ale żaden nie występuje więcej niż 5 razy) a dominante ma...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Na 100% źle wywołujesz.
modalna(N,czas_doj.tab_Zaklad1)
pokaż deklaracje tab_Zaklad1 oraz jak wyliczasz to N.
Czy wiesz że w C/C++ jeżeli tablica ma rozmiar N to indeksacja jest od 0 do N-1 ?
Sądząc po kodu tego nie wiesz.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ulQuiorra
odnosnie indeksowania wiem, zapomnialem poprawic na samo "<". N jest to rozmiar tablicy zadeklarowany przed programem glownym, sa 2 rozne rozmiary N i M dla obu tablic. deklaracje tablicy mam na 100% poprawna.
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

Temat wlasciwie mozna juz zamknac bo problem rozwiazalem stosujac nieco inna funkcje podana wyzej.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
ulQuiorra napisał(a):

Temat wlasciwie mozna juz zamknac bo problem rozwiazalem stosujac nieco inna funkcje podana wyzej.

Funkcja podana wyżej to jakiś bubel tymczasowy, działa ona w czasie O(N2)
W bardzo prosty sposób można zrobić funkcje działającą w czasie O(N*log(N)), sortujemy a dalej liniowo.
@Shalom wyżej podał algorytm działający (przynajmniej teoretycznie) w czasie O(N).

Więc nie nazwałbym to rozwiązaniem problemu, co najwyżej załataniem dziury.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

Fajnie, ale działa więc problem rozwiązany.

_13th_Dragon
Z takim podejściem lepiej rzuć informatykę i pomyśl o dziennikarstwie.
ulQuiorra
z takim podejsciem sam to rzuc. chlopie ja sie dopiero ucze nie jestem programista, skoro na chwile obecna ucza mnie tego to wg tego robie co mnie uczyli a nie wg tego co tobie sie podoba. to ze ty jestes programista nie znaczy ze kazdy na tym forum musi nim byc a z twojego zachowania to wlasnie wynika. zastanow sie troche nad soba.
_13th_Dragon
Ciebie uczą programować a nie sklecić byle co i byle jak aby dla niewielkich danych jakoś zadziałało. Jak się uczysz na odwal się to tak się nauczysz.
ulQuiorra
wybacz wielki programisto ze jeszcze nie mialem czegos takiego jak "mapy" i nawet niewiem co to jest to moze z laski swojej wytlumaczysz mi co to i jak sie to stosuje to wtedy zrobie kod wg twoich zalecen. nie ucza mnie sklejac byle co tylko ucza mnie krok po kroku a nie czlowiek jeszcze czegos na oczy nie widzial i maja mi kazac to robic? idz zbuduj odrzutowiec mimo ze niewiesz jak to zrobic.
ulQuiorra
mowilem o wytlumaczeniu nie kopiowaniu :) widze ze nadal nie mamy o czym rozmawiac. nastepnym razem nie komentuj glupio bo nie bede wybiegal poza material bo ty tak sobie zyczysz :)
Shalom
@_13th_Dragon to nie pierwszy raz kiedy kolega wykazuje się taką ignorancją. Myślę że po prostu nie warto odpisywać w jego tematach i tyle ;) Skoro on i tak sam wie najlepiej ;]
_13th_Dragon
No tak, całkowita racja, przecież powiedziano: - "Nie rzucajcie pereł przed wieprzy".
ulQuiorra
warto odpisywac na temat a wy ewidentnie piszecie nie na temat :)
ulQuiorra
nastepnym razem odpisuj zgodnie z tematem a nie wg tego co ci sie podoba. to nie jest forum dla programistow z wieloletnim stazem dla ktorych napisanie programu to kilka linii kodu. no chyba ze jednak jest to forum dla takich ludzi to powinno byc tu conajmniej 3/4 uzytkownikow mniej :)
_13th_Dragon
No proszę, miesiąc na forum i już decyduje dla kogo ten forum ma być. Dla tablicy w milion elementów twoja funkcja będzie milion razy wolniejsza od tego co zaproponował @Shalom oznacza to że zamiast sekundy będzie działać prawie 12 dni, rzecz jasna że po godzinie pracy funkcji prawie każdy stwierdzi że funkcja niczego nie zwraca czy jakoś tak. Więc to jest dokładnie na temat.
ulQuiorra
jestem moze tydzien na forum :) i tak mowie bo taka prawda zachowujesz sie jakby kazdy byl tu asem. mnie nie interesuje dla miliona danych w tablicy czlowieku ty zamiast prgoramowac idz na nauke "rozumowania" bo nawet nierozumiesz tego o czym do ciebie mowie. zlozonoscia obliczeniowa bede sie martwil pozniej kiedy do tego dojdziemy na zajeciach teraz mnie interesuje wylacznie zrobienie tego co mi zadano wg tego co do tej pory mielismy na zajeciach. pomysl troche czlowieku POMYSL.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)