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.

Jak policzyć ilość i rodzaj wystąpień w tabeli nieznanych z góry wartości?

Xaveri 09 Maj 2011 00:07 2333 13
  • #1 09 Maj 2011 00:07
    Xaveri
    Poziom 17  

    Mam dzisiaj totalne zaćmienie umysłu, a "wujek google" wcale mi nie pomógł, więc pytam...

    Mam tabelę 1 wymiarową w której znajdują się liczby losowe (w tym przypadku dodatnie) z dowolnie dużego zakresu np. taką:
    {1,3,1360,3,6050,21,6,1,19760,5,...}

    Potrzebuję teraz wypisać, że:
    1 występuje 2x na pozycjach 0 i 7
    3 występuje 2x na pozycjach 1 i 3
    1360 występuje 1x ...
    itd.

    Programuję w języku podobnym do C w który nie ma niestety tablic wielowymiarowych.

    0 13
  • #2 09 Maj 2011 00:46
    D214d3k
    Poziom 39  

    No to raczej nie ma wyjścia trzeba brać pierwszą z brzegu i porównywać z każdą kolejną do końca wypisując pozycje kiedy się równają. Po przebiegnięciu pętli wypisanie liczby, ilości powtórzeń i pozycji. Można by je wywalać z tabeli żeby się skracała. Po przejściu pętli pętla zewnętrzna zwiększa index o 1.
    Można też inaczej posortować liczby z zachowaniem pozycji i odejmować kolejne. Jeśli wynik różny od zera wypisanie liczby i pozycji jeśli równy zero (takie same liczby) kolejne wejścia do pętli aż wynik będzie różny od zera.

    0
  • #3 09 Maj 2011 00:53
    Xaveri
    Poziom 17  

    To mam na razie...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jako wynik mam tablicę o takim samym wymiarze jak tablica pierwotna i w każdej komórce ilość wystąpień odpowiadającej liczby z tabeli pierwotnej. Jak to dalej pociągnąć?

    Tabela napisał:
    20, 20, 20, 20, 15, 20, 15, 20, 15, 81, 81, 81, 81, 81, 81, 81, 81, 10, 10, 10

    Wynik napisał:
    6 6 6 6 3 6 3 6 3 8 8 8 8 8 8 8 8 3 3 3

    1
  • #4 09 Maj 2011 01:24
    D214d3k
    Poziom 39  

    Pogubiłeś pozycje.
    Wywalaj z tabeli powtarzające się liczby wynik będzie bez powtórzeń.

    0
  • #5 09 Maj 2011 13:36
    ed-ek
    Poziom 34  

    Możesz tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #6 09 Maj 2011 15:26
    Xaveri
    Poziom 17  

    Po przerobieniu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wniosek - działać na kopii tablicy bo zamazuje.

    No to jeszcze wypisywanie pozycji dodać...

    0
  • #7 09 Maj 2011 20:20
    szel
    Poziom 20  

    Do kodu ed-ek-a można jeszcze dodać sortowanie i policzenie cyfr niepowtórzonych oraz wyświetlenie liczb posortowanych.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #8 10 Maj 2011 11:20
    ed-ek
    Poziom 34  

    Do problemu można podejść z innej strony. Powtarzające się liczby można eliminować przesuwając zawartość tablicy, jednocześnie zmniejszając pojemność (wielkość) tablicy. Oczywiście można to robić na kopii lub oryginale tablicy. Jednak użycie tablic dynamicznych jest wskazane, szczgólnie gdy często zmienia się wielkość tablicy.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #9 11 Maj 2011 23:11
    Xaveri
    Poziom 17  

    Da się jakoś uprościć to dzielenie uwzględniając to, że funkcja round w ULP (język wewn. programu Eagle) nie ma żadnych opcji formatowania wyniku? Zależy mi aby funkcja zaokrąglała wynik z dokładnością do 0.05

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 12 Maj 2011 07:59
    ed-ek
    Poziom 34  

    Xaveri napisał:
    Da się jakoś uprościć to dzielenie uwzględniając to, że funkcja round w ULP (język wewn. programu Eagle) nie ma żadnych opcji formatowania wyniku? Zależy mi aby funkcja zaokrąglała wynik z dokładnością do 0.05

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Robisz kompletny bałagan na Forum. Jak cytowany post ma się do pierwotnego tematu założonego na forum? Poza tym dobrym obyczajem jest odniesienie się do postów odpowiadających na podany temat. Co do powyższego tematu: niejasno opisałeś o co chodzi. Podajesz liczba=18512; a spodziewasz się wyniku 1.85. Wobec tego przejdź z liczbą 18512 na string i go zmodyfikuj.

    0
  • #11 12 Maj 2011 21:11
    Xaveri
    Poziom 17  

    Jest napisane wyraźnie o co chodzi - Zaokrąglanie z dokładnością do 0.05.
    08192 -> 0.80
    08536 -> 0.85
    18356 -> 1.80
    18536 -> 1.85

    Za podanie powyższych sposobów przeliczania dziękuję.

    Zmodyfikowałem jednak kod - użyłem gotowej funkcji sortowania i parę spraw mi odpadło.
    Niemniej jednak na pewno przyda się to początkującym, bo jak szukałem w google o liczeniu wystąpień w tabeli to znajdywałem jedynie tematy gdzie szukane wartości były z góry znane, albo ich zakres ograniczony np. do samych liter - wtedy jest nieco łatwiej.

    0
  • #12 13 Maj 2011 10:10
    ed-ek
    Poziom 34  

    Xaveri napisał:
    Jest napisane wyraźnie o co chodzi - Zaokrąglanie z dokładnością do 0.05.
    08192 -> 0.80
    08536 -> 0.85
    18356 -> 1.80
    18536 -> 1.85

    Za podanie powyższych sposobów przeliczania dziękuję.

    Zmodyfikowałem jednak kod - użyłem gotowej funkcji sortowania i parę spraw mi odpadło.
    Niemniej jednak na pewno przyda się to początkującym, bo jak szukałem w google o liczeniu wystąpień w tabeli to znajdywałem jedynie tematy gdzie szukane wartości były z góry znane, albo ich zakres ograniczony np. do samych liter - wtedy jest nieco łatwiej.

    Piszesz, że przedstawione rozwiązania mogą komuś pomóc, przedstaw więc swoje, zobaczymy czy ono spełnia warunki jakie założyłeś i może komuś się to przyda.
    Co do zaokrąglenia liczb. Przykład który podałeś chyba tylko Ty rozumiesz. Poza tym to nie jest zaokrąglenie tylko przekształcenie liczby.
    Napisałeś:
    liczba = 18512 //czyli 1.8512 mm, spodziewany wynik - 1.85 [mm]
    Wynika z tego że to liczba całkowita, ale czy nie powinno być 18.512 mm? Z postu wynika, że przedstawione liczby są liczbami które wyświetla Eagle na ekranie. Czy chcesz ingerować w wewnętrzny program Eagle, czy w np C++ te dane poddawać obróbce. A czy może być liczba 00012?

    0
  • #13 13 Maj 2011 12:59
    Xaveri
    Poziom 17  

    Te liczby są rozmiarami wierteł. W programie otwory pod układy w obudowach DIP/DIL mają średnicę 0.8128 mm (32 mils) i chcę aby po przeliczeniu na mm i zaokrągleniu do 2 miejsc po przecinku podawało to jako wiertło 0.80 a nie 0.81mm.

    Piszę skrypt w wewnętrznym języku Eagle'a czyli w ULP.

    0
  • #14 07 Cze 2011 14:00
    szel
    Poziom 20  

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0