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.

Programowanie C++ Tablice ,algorytm

karol123 19 Wrz 2007 23:28 1938 16
  • #1 19 Wrz 2007 23:28
    karol123
    Poziom 16  

    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.

    0 16
  • #2 20 Wrz 2007 07:48
    NewToN20
    Poziom 11  

    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!

    0
  • #3 20 Wrz 2007 09:08
    maciek_slon
    Poziom 29  

    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;

    0
  • #4 20 Wrz 2007 09:15
    MiL999
    Poziom 26  

    Troche dziwna konstrukcja. Nie lepiej zrobic tablice dwuwymiarowa? Np. tak:

    tab[i][j]

    0
  • #5 20 Wrz 2007 11:02
    ed-ek
    Poziom 34  

    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.

    0
  • #6 20 Wrz 2007 17:25
    karol123
    Poziom 16  

    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

    0
  • #7 20 Wrz 2007 20:45
    Dawid.wielun
    Poziom 20  

    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();
    }

    0
  • #8 20 Wrz 2007 21:03
    BoskiDialer
    Poziom 34  

    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:

    Code:

    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]]++;
    }

    0
  • #9 20 Wrz 2007 21:20
    karol123
    Poziom 16  

    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

    0
  • #10 21 Wrz 2007 17:44
    Dawid.wielun
    Poziom 20  

    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ł ;]

    Code:

    #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();
    }

    0
  • #11 23 Wrz 2007 10:48
    karol123
    Poziom 16  

    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.

    0
  • #12 23 Wrz 2007 11:07
    maciek_slon
    Poziom 29  

    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.

    0
  • #13 23 Wrz 2007 18:03
    Dawid.wielun
    Poziom 20  

    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";

    0
  • #14 24 Wrz 2007 10:17
    ed-ek
    Poziom 34  

    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]

    0
  • #15 24 Wrz 2007 20:13
    karol123
    Poziom 16  

    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

    0
  • #16 24 Wrz 2007 21:16
    maciek_slon
    Poziom 29  

    Code:

    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
    }

    0
  • #17 26 Wrz 2007 21:12
    karol123
    Poziom 16  

    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;

    }
    }

    0