Diskuze: C zpětný výpis
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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().
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...
So štruktúrami vieš pracovať?
To bude asi v tomto:
A.pocet = 3 * sizeof(int)* 8;
To *8 s tým bude súvisieť.
/* 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.
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
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 */
}
}
}
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.
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).
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 */
}
}
}
To uz vypada lip.
ten predchozi kod uz v miste
mez_i = (A.pocet + B.pocet) / (sizeof(int)* 8) + 1;
vypadal podezrele
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
Zobrazeno 18 zpráv z 18.