logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zrozumienie algorytmu zliczającego w tablicy jednowymiarowej C++

karol123 19 Wrz 2007 23:28 2580 16
REKLAMA
  • #1 4301631
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Witam wszystkich mam problem z zrozumieniem takiego algorytmu .Dana jest tablica jednowymiarowa N wymiarów i teraz funkcja ma zliczać ale nie wiem za bardzo co ona zlicza
    Void counter (int n, tab int z);

    ciało funkcji

    Void counter (int n, t a int z)
    {
    int i,z;
    z=10;
    for (i=0;i<z;i++)
    {
    b[i]=0;
    for (i=0;i<n;i++)
    {
    b[a[i]]=b[a[i]]+1;


    }


    }
    Co prawda jest to troszke poskracane bo niema tutaj wyświetlania na ekran przez funkcje ale chodzi mi o sam algorytm niepotrafie sobie tego wyobrazić co powodują podwójne nawiasy kwadratowe.
  • REKLAMA
  • #2 4301999
    NewToN20
    Poziom 12  
    Posty: 31
    Pomógł: 1
    Witam, a czy te podwójne nawiasy kwadratowe nie oznaczają po prostu tego, że tablica b[] jest tablicą tablic ?? Nie pamiętam dokładnie jak to szło, ale postaram się dzisiaj tego poszukać bo pamiętam, że kiedyś coś takiego robiłem.

    --
    Pozdrawiam!
  • #3 4302146
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Wg mnie podwójny nawias oznacza, że z tablicy a odczytujemy jakąś liczbę a potem z tablicy b odczytujemy coś co się znajduje na pozycji odczytanej z tablicy b. Można by to zapisać w ten sposób dla rozjaśnienia:

    poz = a[i];
    b[poz] = b[poz]+1;
  • REKLAMA
  • #4 4302170
    MiL999
    Poziom 26  
    Posty: 1173
    Pomógł: 59
    Ocena: 75
    Troche dziwna konstrukcja. Nie lepiej zrobic tablice dwuwymiarowa? Np. tak:

    tab[i][j]
  • #5 4302465
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    karol123 napisał:
    Witam wszystkich mam problem z zrozumieniem takiego algorytmu .Dana jest tablica jednowymiarowa N wymiarów i teraz funkcja ma zliczać ale nie wiem za bardzo co ona zlicza
    Void counter (int n, tab int z);

    ciało funkcji

    Void counter (int n, t a int z)
    {
    int i,z;
    z=10;
    for (i=0;i<z;i++)
    {
    b[i]=0;
    for (i=0;i<n;i++)
    {
    b[a[i]]=b[a[i]]+1;


    }


    }
    Co prawda jest to troszke poskracane bo niema tutaj wyświetlania na ekran przez funkcje ale chodzi mi o sam algorytm niepotrafie sobie tego wyobrazić co powodują podwójne nawiasy kwadratowe.

    Jeżeli coś przepisujesz, przepisuj dokładnie. Fcja counter którą najpierw deklarujesz a potem definiujesz ma różne argumenty zawarte w (...). a[i] i b[i] są tablicami. Ich rozmiar i charakter muszą być zadeklarowane przed ich użyciem, np
    int b[10], a[10];
    To co napisałeś jest niekompletne. Przed użyciem fcji counter(...) musi być wypełniona zawartość tablicy a[...]. Indeksy tablic zaczynają się od 0. I tak tablica b[] w zakresie od 0 do 9 poprzez pętlę:
    for (i=0;i<z;i++)
    {
    b[i]=0;
    ....}
    początkowo dla danego "i" wypełniona jest zerami. Następna pętla:
    for (i=0;i<n;i++)
    {
    b[a[i]]=b[a[i]]+1;
    .....
    wypełnia tablicę b[...] w indeksie a[i] zawartością zależną od wartości wyrazów tablicy a[...]
    Jednak dokładna analiza jest utrudniona. Nie znamy tablicy a[...].
    Poza tym chyba źle przepisałeś. Albo zmienne w pętlach for muszą być różne np i,j albo brakuje klamry "}" po pierwszym for.
    Program przepisuj zawsze bardzo dokładnie, inaczej prowadzi to do nieprzewidzianych błędów.
  • #6 4303661
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Chodziło mi o wyjaśnienie co się dzieje w tych nawiasach kwadratowych tak jak koledzy napisali tablicy b przypisywana jest zmienna z adresu przykładowo zerowego i dodawana jedynka ale prawdopodobnie coś jest żle w tej funkcji ponieważ miała ona zliczać takie same liczby które są w tablicy np: tab[10]={2,3,4,3,7,12,22,34,3,65,7}
    i tutaj liczba 3 jest trzy razy wienc wypisuje 3
  • #7 4304423
    Dawid.wielun
    Poziom 20  
    Posty: 464
    Pomógł: 10
    Ocena: 13
    Przecież to nie jest nic innego jak tablica z liczby ktora jest na tablicy w drugiej zmiennej...

    Przedstawiam najbardziej banalny program jaki się da żeby zrozumieć

    #include <iostream>
    #include <conio.h>
    using namespace std;

    main()
    {
    short a[2], b[2];
    a[0]=0;
    a[1]=1;
    b[0]=600;
    b[1]=300;

    cout<<b[a[1]]<<"\n"; //wyswietli 300
    cout<<b[a[0]]<<"\n"; //wyswietli 600
    getch();
    }
  • REKLAMA
  • #8 4304514
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Funkcja ta przypomina mi początek z sortowania kubełkowego - w wynikowej tablicy w komórce result[x] będzie liczba komórek tablicy wejściowej, której wartość jest równa x... funkcja zawiera prosty błąd - kasowanie <<b[i]=0;>> jest wykonywane w pętli, ale jest kasowane po jednej komórce przed zliczaniem - może być tak, że komórka o nieznanej wartości zostanie zwiększona kilka razy, zostanie wyzerowana a potem zaś zostanie zwiększona kilka razy... wogóle zliczanie jest namieszane...
    Poprawnie było by coś na wzór tego:
    
    void counter(int n, t a int z) 
    { 
      int i,z; 
      z=10; // czy to czasem nie jest zbędne?
      for (i=0;i<z;i++) 
        b[i]=0; 
      for (i=0;i<n;i++) 
        b[a[i]]++; 
    } 
    
  • REKLAMA
  • #9 4304599
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Z tym programowaniem jest męka nie potrafie czasem zrozumieć wyobrażić co się kryje w danej chwili pod daną zmienną Jestem narazie na poziomie tablic w C++ a co dopiero bendzie z wskażnikami
  • #10 4307017
    Dawid.wielun
    Poziom 20  
    Posty: 464
    Pomógł: 10
    Ocena: 13
    Skoro jesteś na poziome tablic i chcialeś taki program to napisalem ci taki dość prosty podobny, trochę wynik inaczej pewnie wyświetla niż chcesz :P ale ważne żebyś sobie poćwiczył z kodem i zrozumiał ;]

    
    #include <iostream>
    #include <conio.h>
    #include <ctime>
    using namespace std;
    
    main()
    {
    short n, wybor, dl;
    cout<<"Ile liczb chcesz zapisac?\n";
    cin>>n;
    
    short wynik=0, tmp[n], tab[n], tmp2=0, il=0, lp, lp2; 
    cout<<"Chcesz je wylosowac czy wpisac recznie? (1-losuj 0-recznie)\n";
    cin>>wybor;
    
    for(lp=0; lp<n; lp++)
    tab[lp]=0;
    
    
    if(wybor==1)
    {
    cout<<"Do jakiej liczby chcesz szukac?\n";
    cin>>dl;
    
    srand(static_cast<int>(time(NULL)));
    
    for(lp=0; lp<n; lp++)
    tab[lp]=rand() % dl;
    
    cout<<"Wylosowane liczby to: \n";
    for(lp=0; lp<n; lp++)
    cout<<tab[lp]<<", ";
    cout<<"\n";
    }
    
    if(wybor==0)
    {
    
    cout<<"Wprowadz liczby oddzielajac je spacja\n";
    for(lp=0; lp<n; lp++)
    {
    cin>>tab[lp];
    }}
    for(lp=0; lp<n; lp++)
    {
    for(lp2=lp+1; lp2<n; lp2++)
    {
    if(tab[lp]==tab[lp2])
    {
    tmp[tmp2]=tab[lp2];
    wynik+=1;
    tmp2+=1;
    il+=1;
    }}
    }
    cout<<"Jest "<<wynik<<" takich samych liczb\n";
    for(lp=0; lp<il; lp++)
    cout<<tmp[lp]<<", ";
    getch();
    }
    
  • #11 4311494
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Witam wszystkich ponownie na forum pisałem program i natkąłem sie na problem chciałem napisać program kopiujący dane są tablice
    jednowymiarowa
    tab[10]={2,4,56,4,8,98,5,12,1,5,7};
    i dwuwymiarowa
    tabw[10][10];
    chciałem skopiować cały wiersz jednowymiarowej tablicy do pierwszego wiersza tablicy dwuelementowej
    algorytm
    for(i=0;i<10;i++)
    for(j=0;j<10;j++)
    {
    tabw[i][j]=0;
    tabw[i][j]=tab[i];
    cout<<tab[i][j];
    }

    oczywiscie wypisało mi pierwszy wiersz ale np:liczba 2 z tablicy jednowymiarowej była w dziesienciu kolumnach taka sama

    jeszcze mam pytanie co do sposobu wyswietania tablicy
    dwuwymiarowej niemoge zrobić tak żeby tablica na ekranie wyswietlała mi się jako 10 wiersz i 10 kolumn a u mnie jest wszystko zlane
    Pozdrawiam i dzienkuje.
  • #12 4311549
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Więc tak - program robi dokłądnie to co mu każesz. Do pierwszej kolumny kopiuje pierwszy element tablicy 'tab', do drugiej kolumny drugi element itd.


    Co do wyświetlania - sam musisz zadbać o rozdzielanie liczb spacjami, a po wypisaniu całego wiersza msusisz wstawić 'endl' (cout << endl) który przejdzie do nowej linii. W którym miejscu to wstawić? Pomyśl sam :-) Przeanalizuj to co napisałeś a znajdziesz rozwiązanie.
  • #13 4312898
    Dawid.wielun
    Poziom 20  
    Posty: 464
    Pomógł: 10
    Ocena: 13
    Do następnej lini przenosisz: \n
    cout<<"\n";
    możesz też tać tabulator \t
    cout<<"\t";

    Czyli w twoim przypadku:
    cout<<tab[i][j]<<"\n";
  • #14 4314911
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Masz przykład jak wypełnić tablicę tab[10][10] (tab1[i][j]) podaną zawartością tablicy tab[10]. Uwaga: zadeklarowałeś tab[10], ale wpisałeś 11 wartości: tab[10]={2,4,56,4,8,98,5,12,1,5,7}; Musi być 10!
    #include <iostream>
    #include <conio.h>

    using namespace std;

    main()
    {
    int tab[10]={2,4,56,4,8,98,5,12,1,5};
    int tab1[10][10];
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    {
    tab1[i][j]=0;
    tab1[i][0]=tab[i];
    }
    for(int i=0;i<10;i++)
    // for(int j=0;j<10;j++)
    cout<<tab1[i][0]<<" ";
    // cout<<tab1[i][j]<<" ";
    getch();
    }

    Jeżeli usuniesz // zobaczysz zawartość całej tablicy tab1[10[10]; bez usuwania tylko 1 wiersz tab1[0->9][0]
  • #15 4316504
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Witam wszystko ładnie pięknie ale pisząc program chciałem żeby tablica dwuwymiarowa wyświetlała mi się rzeczywiście jako dwuwymiarowa 10 wierszy i 10 kolumn nie wiem gdzie dokładnie wstawić wyświetlanie tablicy słyszałem o funkcji setw z biblioteki #include< iomanip> ale nie wychodziło mi to za dobrze Dzięnki i pozdrawiam
  • #16 4316826
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    
    for(int i=0;i<10;i++) // z kazdedo wiersza
    {
       for(int j=0;j<10;j++)  // wyswietl kazda liczbe
         cout<<tab1[i][j]<<" "; 
      cout << endl; // a po wypisaniu calego wiersza wstaw nowa linie
    }
    
  • #17 4322879
    karol123
    Poziom 16  
    Posty: 228
    Pomógł: 2
    Ocena: 10
    Witam wszystkich ponownie dziękuje za porady bardzo pomocne mam ostatnią jeszcze prośbę ponieważ mam taki program operujący na tablicy dwuwymiarowej nie wiem co robi funkcja counter próbowałem ją analizować jest to nawiązanie do początku postu Tablica tablic po skompilowaniu wychodzą jedynki i zera czy ktoś by mógł mi wyjaśnić co robi po kolei ta funkcja
    #include<cstdlib>
    #include<iostream>
    #include <iomanip>
    using namespace std;

    #define nmax 50
    typedef int t[nmax];
    typedef int t2[nmax][nmax];

    void zerujT2(int n, t2 a);

    /* zaimplementuj funkcje dla tablic dwuwymiarowych (tresc zadan analogiczna jak w zadaniu 1): */
    void drukujT2(int n, t2 a);
    void losujT2(int n, t2 a, int z);
    int sumaT2(int n, t2 a);
    int minT2(int n, t2 a);
    int maxT2(int n, t2 a);
    int minmaxT2(int n, t2 a);
    void countT2(int n, t2 a, int z, t b);
    void drukujT(int n, t2 a, t b);
    void addT2(int n, t2 a, int value);
    void mulT2(int n, t2 a, int value);
    void sumujT2(int n, t2 a, t2 d, t2 c);
    void mnozT2(int n, t2 a, t2 d, t2 c);
    void transponujT2(int n, t2 a); /* zamien w tablicy elementy a[i][j] z a[j][i] */

    int main(void)
    {
    int n, z;
    t2 a, c, d;
    t b;
    n = 2;
    z = 10;
    zerujT2 (n,a);
    losujT2(n,a,z);
    drukujT2(n,a);
    cout<<"suma "<<sumaT2(n,a)<<"\n";
    cout<<"min "<<minT2(n,a)<<"\n";
    cout<<"max "<<maxT2(n,a)<<"\n";
    cout<<"max-min "<<minmaxT2(n,a)<<"\n";
    cout<<"counter\n";
    countT2(n,a,z,b);
    drukujT(n,a,b);


    addT2(n, a, 4);
    cout<<"tablica a \n";
    drukujT2(n,a);
    mulT2(n, a, 2);
    cout<<"tablica a \n";
    drukujT2(n,a);
    losujT2(n,d,z);
    cout<<"tablica d \n";
    drukujT2(n,d);
    sumujT2(n,a,d,c);
    cout<<"tablica a+d \n";
    drukujT2(n,c);
    mnozT2(n,a,d,c);
    cout<<"tablica a*d \n";
    drukujT2(n,c);
    cout<<"transponuj a \n";
    transponujT2(n,a);
    drukujT2(n,a);


    system("pause");
    return 0;
    }

    /** */
    void zerujT2(int n, t2 a)
    {
    int i,j;
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++) { a[i][j] = 0; }
    }

    /** */
    void drukujT2(int n, t2 a)
    {
    int i,j;
    for (i = 0; i < n; i++)
    {
    for (j = 0; j < n; j++)
    {
    cout<<a[i][j]<<setw(3)<<" \t ";
    }
    cout<<endl;
    }}

    void losujT2(int n, t2 a, int z)
    {
    int i,j;
    for ( i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
    a[i][j]=rand () % z;
    }
    }

    int sumaT2(int n, t2 a)
    {
    int i,j, x=0;
    for ( i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
    x+= a[i][j];

    }
    return x;
    }


    int minT2(int n, t2 a)

    {int i,j,x=a[0][0];
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++){
    if(x>a[i][j])

    x=a[i][j];
    }
    return x;
    }


    int maxT2(int n, t2 a)

    {int i,j,x=a[0][0];
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++){
    if(x<a[i][j])

    x=a[i][j];
    }
    return x;
    }


    int minmaxT2(int n, t2 a)
    {
    int x=0;
    x=maxT2(n,a)-minT2(n,a);
    return x;
    }


    void countT2(int n, t2 a, int z, t b)
    {
    int i,j;
    for ( i = 0; i < z; i++) {b[i]=0;}
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
    b[a[i][j]]=b[a[i][j]]+1;}
    }

    void drukujT(int n, t2 a, t b)
    {
    int i,j;
    j=maxT2(n,a);
    for ( i = 0; i <= j; i++) printf("%d ",b[i]);
    cout<<"\n";
    }


    void addT2(int n, t2 a, int value)
    {
    int i,j;
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    a[i][j]=a[i][j]+value;
    }

    void mulT2(int n, t2 a, int value)
    {

    int i,j;
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    a[i][j]=a[i][j]*value;
    }

    void sumujT2(int n, t2 a, t2 d, t2 c)
    {
    int i,j;
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    c[i][j]=a[i][j]+d[i][j];
    }

    void mnozT2(int n, t2 a, t2 d, t2 c)
    {
    int i,j;
    for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    c[i][j]=a[i][j]*d[i][j];
    }


    void transponujT2(int n, t2 a)
    {
    int i,j,x,y;
    for (i = 0; i < n/2; i++)
    for (j = 0; j < n/2; j++)
    {
    x=a[i][j];
    y=a[j][i];
    a[i][j]=y;

    }
    }

Podsumowanie tematu

✨ Dyskusja dotyczy zrozumienia działania algorytmu w języku C++ zliczającego wystąpienia wartości w jednowymiarowej tablicy. Problemem jest interpretacja podwójnych nawiasów kwadratowych w wyrażeniu b[a[i]], które oznaczają indeksowanie tablicy b pod indeksem wskazanym przez wartość z tablicy a. Algorytm ma na celu zliczenie, ile razy każda liczba pojawia się w tablicy a, poprzez inkrementację odpowiednich elementów tablicy b. Wskazano błędy w oryginalnym kodzie, takie jak niepoprawne zerowanie tablicy b wewnątrz pętli oraz niejednoznaczne deklaracje zmiennych i tablic. Zaproponowano poprawioną wersję funkcji, gdzie najpierw zeruje się całą tablicę b, a następnie w pętli zlicza wystąpienia wartości z tablicy a. Dodatkowo omówiono kwestie kopiowania danych z tablicy jednowymiarowej do dwuwymiarowej oraz prawidłowego wyświetlania tablic dwuwymiarowych w formacie wierszy i kolumn, z użyciem pętli zagnieżdżonych i funkcji cout wraz z endl lub znakami tabulacji. Wskazano także na użycie biblioteki i funkcji setw do formatowania wyjścia. W końcowej części pojawiła się prośba o wyjaśnienie działania funkcji countT2 operującej na tablicach dwuwymiarowych, która zlicza wystąpienia wartości w tablicy dwuwymiarowej i zapisuje wyniki w tablicy jednowymiarowej. Całość dyskusji skupia się na podstawach operacji na tablicach w C++, indeksowaniu, zliczaniu elementów oraz poprawnym formatowaniu i wyświetlaniu danych tablicowych.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA