Diskuze: C zpětný výpis

C++ C a C++ C zpětný výpis

Avatar
hurvajs
Člen
Avatar
hurvajs:

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:

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:

ok, díky ;)

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

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):

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:

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

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

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:

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):

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):
/* 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:

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:

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):

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):

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:

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):

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:

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:

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.