Avatar
hurvajs
Člen
Avatar
hurvajs:25.4.2014 17:45

Zdravím, řeším takový problém, v c-čku programuju množiny a když ji potřebuju vytiskount danou množinu, tiskne se mi pozpátku
Nevíte, jak prvně vytisknout poslední prvek v dané množině ?
Zde je můj kod:

void vypis(mnozina* mnozina){
        if (mnozina->x){
                printf("%d, ", mnozina->x);
                if (mnozina->dalsi){
                        vypis(mnozina->dalsi);
                }
        }
        else{
                printf("\n");
        }
}
 
Odpovědět 25.4.2014 17:45
Avatar
coells
Redaktor
Avatar
Odpovídá na hurvajs
coells:25.4.2014 18:06

Vzhledem k tomu, že množina je neuspořádaná skupina prvků, tak v množině žádný první ani poslední prvek není.

Co se týká toho tvého kódu, tak printf() dej až za rekurzivní volání funkce vypis().

 
Nahoru Odpovědět 25.4.2014 18:06
Avatar
hurvajs
Člen
Avatar
hurvajs:25.4.2014 18:33

ok, díky ;)

 
Nahoru Odpovědět 25.4.2014 18:33
Avatar
hurvajs
Člen
Avatar
hurvajs:28.4.2014 19:07

Abych nezakládal nové téma, dostali jsme za úkol práci s množinami v bitových polích a vůbec si s tím nevím rady... Našel by se tu někdo, kdo by mě nasměroval jak s tím pracovat, dostali jsme i předpřipravený kód.. http://www.itnetwork.cz/dev-lighter/369

Předem říkám, že nechci abyste mi to naprogramovali, jde mi jen o vysvětlení jak to pracuje a jak přistupovat k jednotlivým prvkům v poli...

 
Nahoru Odpovědět 28.4.2014 19:07
Avatar
Odpovídá na hurvajs
Libor Šimo (libcosenior):29.4.2014 19:05

Najprv napíš čomu tam nerozumieš.

Nahoru Odpovědět 29.4.2014 19:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
hurvajs
Člen
Avatar
hurvajs:29.4.2014 19:06

upřímně všemu... Nějak to celkově nepobírám..

 
Nahoru Odpovědět 29.4.2014 19:06
Avatar
Libor Šimo (libcosenior):29.4.2014 19:11

So štruktúrami vieš pracovať?

Nahoru Odpovědět 29.4.2014 19:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
hurvajs
Člen
Avatar
hurvajs:29.4.2014 19:28

jo, s tím vím jak se dá pracovat, ale mě jde tady o nějakou masku a binární čísla, vůbec nevím

 
Nahoru Odpovědět 29.4.2014 19:28
Avatar
Odpovídá na hurvajs
Libor Šimo (libcosenior):29.4.2014 19:36

To bude asi v tomto:

A.pocet = 3 * sizeof(int)* 8;

To *8 s tým bude súvisieť.

Editováno 29.4.2014 19:37
Nahoru Odpovědět 29.4.2014 19:36
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na hurvajs
Libor Šimo (libcosenior):29.4.2014 19:39
/* vytvoreni mnoziny A */
        A.prvky = (int *)malloc(3 * sizeof(int));
        A.prvky[0] = 43;
        A.prvky[1] = 55;
        A.prvky[2] = 42351;
        A.pocet = 3 * sizeof(int)* 8;

V poli sú 3 prvky, ale počet intov je 3 * 8.

Nahoru Odpovědět 29.4.2014 19:39
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
hurvajs:29.4.2014 20:39

3 prvky po 8 bitech ?... já abych se přiznal, c-čko nemám rád, ale máme ho bohužel jako povinný předmět

 
Nahoru Odpovědět 29.4.2014 20:39
Avatar
hurvajs
Člen
Avatar
hurvajs:29.4.2014 21:15

pohrál jsem si s tím sjednocením, ale vypisuje to nějak moc čísel

mnozina sjednoceni(mnozina A, mnozina B)
{
        mnozina X;
        long maska;
        int index;
        int i, j;
        int mez_i;

        index = 0;

        /* vypocet meze cyklu */
        mez_i = (A.pocet + B.pocet) / (sizeof(int)* 8) + 1;

        /* cyklus pres cisla typu int */
        for (i = 0; i < mez_i; i++) {

                /* vypocet meze cyklu */
                int mez_j = (i < mez_i - 1) ? sizeof(int)* 8 : ((A.pocet + B.pocet) % (sizeof(int)* 8));

                /* posun masky na zacatek */
                maska = 1;

                /* cyklus pres jednotlive bity */
                for (j = 0; j < mez_j; j++) {

                        /* pokud je prvek v mnozine - bit 1 pod maskou,
                        * tak vypiseme odpovidajici index
                        */
                        if (A.prvky[i] & maska || B.prvky[i] & maska)
                                printf("%i, ", index);
                        maska *= 2;             /* posun masky */
                        index++;                /* posun indexu */
                }
        }

}
 
Nahoru Odpovědět 29.4.2014 21:15
Avatar
Odpovídá na hurvajs
Luboš Běhounek (Satik):29.4.2014 21:21

Pro pochopeni musis znat reprezentaci cisel v binarni soustave a zakladni operace - & | (and, or) apod.

Prunik je takovy prvek, ktery obsahuji obe mnoziny - tady to bude jeden cyklus, kde vysledkem X[i] bude vysledek operace
A[i] & B[i].

Rozdil A-B pak budou vsechny prvky mnoziny A, od kterych jeste odeberes prvky, co jsou v mnozine B.

Maska ti slouzi k rychlemu zjisteni, jestli je vybrany bit nenulovy.
Pouziva se k tomu operace & (AND).

Na miste, kde mas v masce 1, ti pak ve vysledku taky zbyde 1. A pokud jsi takto testoval jen jeden bit, tak vysledek je budto 0 a nebo maska (=vybrany bit byl 1)

Napr. maska 8 (bin 001000) a cislo 26 (bin 011010):
001000 &
011010 =
001000

aby se ti maska menila timto stylem:
000001 (1 dec)
000010 (2 dec)
000100 (4 dec)
atd., staci ti to cislo jen nasobit dvema.

Nahoru Odpovědět 29.4.2014 21:21
:)
Avatar
Odpovídá na hurvajs
Luboš Běhounek (Satik):29.4.2014 21:23

Myslim, ze jsi to sjednoceni pochopil spatne.
Mel bys projet obe mnoziny a do vysledku zapsat jen ty bity, ktere jsou v jedne mnozine nebo ve druhe.
Melo by ti tady stacit projet vsechny prvky a pouzit na ne operaci | (nebo).

Nahoru Odpovědět 29.4.2014 21:23
:)
Avatar
hurvajs
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
hurvajs:29.4.2014 21:23

samozřejmě binární logiku a reprezentaci znám..
kod jsem ještě upravil a sjednocení mi funguje

mnozina sjednoceni(mnozina A, mnozina B)
{

        long maska;
        int index;
        int i, j;
        int mez_i;

        index = 0;

        /* vypocet meze cyklu */
        mez_i = A.pocet / (sizeof(int)* 8) + 1;

        /* cyklus pres cisla typu int */
        for (i = 0; i < mez_i; i++) {

                /* vypocet meze cyklu */
                int mez_j = (i < mez_i - 1) ? sizeof(int)* 8 : (A.pocet % (sizeof(int)* 8));

                /* posun masky na zacatek */
                maska = 1;

                /* cyklus pres jednotlive bity */
                for (j = 0; j < mez_j; j++) {

                        /* pokud je prvek v mnozine - bit 1 pod maskou,
                        * tak vypiseme odpovidajici index
                        */
                        if (A.prvky[i] & maska || B.prvky[i] & maska)
                                printf("%i, ", index);
                        maska *= 2;             /* posun masky */
                        index++;                /* posun indexu */
                }
        }

}
 
Nahoru Odpovědět 29.4.2014 21:23
Avatar
Odpovídá na hurvajs
Luboš Běhounek (Satik):29.4.2014 21:31

To uz vypada lip.

ten predchozi kod uz v miste

mez_i = (A.pocet + B.pocet) / (sizeof(int)* 8) + 1;

vypadal podezrele :)

Nahoru Odpovědět 29.4.2014 21:31
:)
Avatar
hurvajs
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
hurvajs:29.4.2014 21:36

Jojo, akorát nevím, jak na rozdíl
protože co jsem našel, tak platí že, A-B vypíše prvky co se nachází v množině A, kde daný prvek nesmí být v množině B

 
Nahoru Odpovědět 29.4.2014 21:36
Avatar
hurvajs
Člen
Avatar
hurvajs:29.4.2014 21:49

Tak už to mám hotové, díky za rady ;)

 
Nahoru Odpovědět 29.4.2014 21:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.