[ Rato iks de @ 20.03.2013. 18:23 ] @
Izvinjavam se u naprijed što sam nekonkretno nazvao temu ali biće ovde još nekih stvari koje će me buniti i koje ću pitati pa sam se zato odlučio na ovaj naziv teme.

Zadatak kaže, pod uslovom da se za memorisanje tipa int koristi 2 bajta, odrediti izlaz programa.
Imamo sledeći kod:
Code:

#include <stdio.h>
main()

unsigned int p1=0125252, p2=0052525;
p1&=~(0xF<<8); p2|=p1>>8;
printf("%o",~(~p1^~p2));
}


Ne radi se u nekom okruženju nego na papiru. Iskusni će se možda sjetiti o čemu se radi i zašto baš ovakvi problemi ;) :)

Promjenjiva p1 = 43690 (dekadno), binarno je 1010 1010 1010 1010. Ovo sam vidio u debageru. E sad, kako da dođem do ovih brojeva, šta zanči 0 ispred broja u p1?
Dalje je lako raditi sa operacijama a ista priča je i za p2.

Sledeći problem.
Citat:
Funkcija kreira binarno stablo za pretraživanje na osnovu sljedeceg niza prirodnih brojeva
14 17 6 13 2 9 7 13 20 18
Odrediti ukupan broj lijevih podstabala u datom binarnom stablu.


Ja koliko sam shvatio to bi trebalo da izgleda ovako. Binarno stablo
14 je korijen i tako dalje.
I to je 5 podstabala.

To je za početak, biće ovde još nekih stvari ali dok dođem do toga. :)
[ X Files @ 20.03.2013. 21:51 ] @
Citat:
Promjenjiva p1 = 43690 (dekadno), binarno je 1010 1010 1010 1010. Ovo sam vidio u debageru. E sad, kako da dođem do ovih brojeva, šta zanči 0 ispred broja u p1?

To je OKTALNA notacija broja u C/C++ jezicima. Slično kao 0x ispred broja za HEKSADECIMALNE brojeve. Dakle, za zapisivanje oktalnih brojeva možeš koristiti cifre 0,1,2,3,4,5,6 i 7.

Kada testiraš programe sa fiksnom dužinom bita, kao što je definisano u zadatku:
Citat:

[...] za memorisanje tipa int koristi 2 bajta [...]

... zna da bude korisno osigurati da UNSIGNED promenljiva bude stvarno širine 2 bajta. Na primer:
Code:

// ...
#include <stdint.h>
// ...
uint16_t x=NEKA_VREDNOST;
// ...

(uint16, UINT16, ... kakokoji kompajler)

Dalje, vežbe radi, najlakše je kod (koji si pokazao) razložiti u delove i ispisivati jedan po jedan međurezultat, na primer:
Code:

/* PRVI MEDJUREZULTAT */
uint16_t x=0xF;
printf("%u\n",x<<8);


Još bolje ako imaš i neku Helper funkciju, pa sve to prikazivati binarno i pratiti kako se situacija razvija:
Code:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

void dec2bin(int number)
{
    int remainder;
    if (number <= 1)
    {
        printf("%d", number);
        return;
    }

    remainder = number%2;
    dec2bin(number >> 1);
    printf("%d", remainder);
}

int main()
{
    /* PRVI MEDJUREZULTAT */
    uint16_t x=0xF;

    dec2bin(x);
    printf("\n");

    dec2bin(x<<8);
    printf("\n");


    /* DRUGI MEDJUREZULTAT */
    /* ... */

    return 0;
}



Naravno, Debugger je majka. Može i tako, sve je stvar ukusa.
[ Rato iks de @ 20.03.2013. 22:37 ] @
E jao kako sam to skroz slabo predvidio. Ovaj prvi kod mi je jasan.

Interesuje me samo sledeća sitvacija:
Code:

void a01(char d)  //d = 32, na primjer
{
static int r;
printf("%d ", r+=b01(d));
if (k-->0) a01(d>>=1);
}
main() { a01(32);}


Šta funkcija b01 radi nije bitno. Ovde se prvo ispiše 0 od r pa onda ide funkcija b01. To da nisam kompajlirao nikad ne bih vidio.
Interesuje me zašto? Zašto se prvo ispisuje 0 pa zatim ide poziv funkcije?

E to što si razložio je jako super i bilo bi najbolje ali ne vjerujem da ću imati vremena da se bavim time kad budem radio ovo.

[ Picsel @ 21.03.2013. 09:50 ] @
Citat:
Rato iks de:
Sledeći problem.
Citat:
Funkcija kreira binarno stablo za pretraživanje na osnovu sljedeceg niza prirodnih brojeva
14 17 6 13 2 9 7 13 20 18
Odrediti ukupan broj lijevih podstabala u datom binarnom stablu.


Ja koliko sam shvatio to bi trebalo da izgleda ovako. Binarno stablo
14 je korijen i tako dalje.
I to je 5 podstabala.

To je za početak, biće ovde još nekih stvari ali dok dođem do toga. :)


Ovo nije binarno stablo za pretrazivanje za ovu sekvencu brojeva.
Funkcija za ubacivanje u stablo je ovako nekako:
Code:
Ubaci(trenutni cvor, vrednost)
  Ako je trenutni cvor NULL (ne postoji), napravi novi cvor sa vrednoscu koju ubacujes i zavrsi
  Ako je vrednost koju ubacujes manja od vrednosti trenutnog cvora, Ubaci(levo dete od trenutnog cvora, vrednost)
  Ako je vrednost koju ubacujes veca ili jednaka od vrednosti trenutnog cvora, Ubaci(desno dete od trenutnog cvora, vrednost)


Na ovom linku mozes da simuliras sekvencu i vidis korak po korak kako se vrsi ubacivanje http://people.ksp.sk/~kuko/bak/
[ Rato iks de @ 23.03.2013. 16:24 ] @
Citat:
Rato iks de:

Interesuje me samo sledeća sitvacija:
Code:

void a01(char d)  //d = 32, na primjer
{
static int r;
printf("%d ", r+=b01(d));
if (k-->0) a01(d>>=1);
}
main() { a01(32);}


Šta funkcija b01 radi nije bitno. Ovde se prvo ispiše 0 od r pa onda ide funkcija b01.


E ovde sam propisno promašio ali sam skonto čitav kod od ovoga problema. Nije ni bitno. Imam sledeći problem.

Imamo sledeći kod:
Code:

#include <stdio.h>

union DATA 

    short data;
    int d:5;
    unsigned short m:4; 
} x;

main()

    x.data = 51;
    printf("%d%d", sizeof(x), x.d>>x.m );



d ima opseg od 5 bitova i to označenih, m:4 od 2 bajta samo mu se daje 4 bita na raspolaganje. E sad
x.d = -13 i x.m = 3, kako?

Jasno mi je zašto je d negativan jer je označen i prvi bit je 1 i na zadnja dva bita su po 1. Nije mi jasno kako se i zašto to tako incijalizuje. Za m isto tako ispade da je m(dek) = 0011.
[ Rato iks de @ 23.03.2013. 16:26 ] @
Citat:
Picsel: Ovo nije binarno stablo za pretrazivanje za ovu sekvencu brojeva.
Funkcija za ubacivanje u stablo je ovako nekako:
Code:
Ubaci(trenutni cvor, vrednost)
  Ako je trenutni cvor NULL (ne postoji), napravi novi cvor sa vrednoscu koju ubacujes i zavrsi
  Ako je vrednost koju ubacujes manja od vrednosti trenutnog cvora, Ubaci(levo dete od trenutnog cvora, vrednost)
  Ako je vrednost koju ubacujes veca ili jednaka od vrednosti trenutnog cvora, Ubaci(desno dete od trenutnog cvora, vrednost)


Na ovom linku mozes da simuliras sekvencu i vidis korak po korak kako se vrsi ubacivanje http://people.ksp.sk/~kuko/bak/


Hvala puno, nisam znao za ovaj link. :)