Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

2.domaća zadaća
WWW:
Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće
Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
dalmatinčica
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 10. 2011. (18:46:54)
Postovi: (AC)16
Sarma = la pohva - posuda
= 10 - 4

PostPostano: 19:18 uto, 8. 1. 2013    Naslov: Citirajte i odgovorite

pozdrav,
imam problem sa zadatkom iz 2. zadaće

Napišite program koji će učitati dva stringa duljine max. 100. Ti stringovi predstavljaju zapise prirodnih brojeva x i y u bazi 10. Program treba te brojeve pretvoriti u binarne brojeve i treba pomoću algoritma za množenje n-bitnih brojeva izračunati x · y. Rezultat korisniku vratite u dekadskom obliku.

Ulazni podaci: dva stringa duljine max. 100.
Izlazni podaci: brojevi x i y u bazi 2, te njihov umnožak u bazi 2 i u bazi 10.
Na primjer, za ulazne podatke:
1099511627776 3
treba ispisati:
x u bazi 2: 10000000000000000000000000000000000000000
y u bazi 2: 11
x*y u bazi 2: 110000000000000000000000000000000000000000
x*y u bazi 10: 3298534883328

problem je što ga neznam riješiti.
pa ako ima neka dobra duša koja ima kakvu pametnu ideju da barem natukne kako bi se ovaj zadatak rješavao.
pokušavala sam ja ispisivati nekakve funkcije za potrebne operacije, ali se uvijek zapetljam i shvatim da zapravo nemogu tako riješiti...
hvala unaprijed
:D


edit:
barem ideja za ovo zadnje, pretvaranje oakvog velikog binarnog broja u dekadski
pozdrav,
imam problem sa zadatkom iz 2. zadaće

Napišite program koji će učitati dva stringa duljine max. 100. Ti stringovi predstavljaju zapise prirodnih brojeva x i y u bazi 10. Program treba te brojeve pretvoriti u binarne brojeve i treba pomoću algoritma za množenje n-bitnih brojeva izračunati x · y. Rezultat korisniku vratite u dekadskom obliku.

Ulazni podaci: dva stringa duljine max. 100.
Izlazni podaci: brojevi x i y u bazi 2, te njihov umnožak u bazi 2 i u bazi 10.
Na primjer, za ulazne podatke:
1099511627776 3
treba ispisati:
x u bazi 2: 10000000000000000000000000000000000000000
y u bazi 2: 11
x*y u bazi 2: 110000000000000000000000000000000000000000
x*y u bazi 10: 3298534883328

problem je što ga neznam riješiti.
pa ako ima neka dobra duša koja ima kakvu pametnu ideju da barem natukne kako bi se ovaj zadatak rješavao.
pokušavala sam ja ispisivati nekakve funkcije za potrebne operacije, ali se uvijek zapetljam i shvatim da zapravo nemogu tako riješiti...
hvala unaprijed
Very Happy


edit:
barem ideja za ovo zadnje, pretvaranje oakvog velikog binarnog broja u dekadski


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Ryssa
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 12. 2011. (00:10:28)
Postovi: (57)16
Sarma = la pohva - posuda
= 4 - 1

PostPostano: 16:01 ned, 13. 1. 2013    Naslov: Citirajte i odgovorite

Zna li netko kako je najlakše učitavati m sortiranih listi(veze pomoću kursora) i pamtiti koji je element iz koje liste?
Zna li netko kako je najlakše učitavati m sortiranih listi(veze pomoću kursora) i pamtiti koji je element iz koje liste?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
linus
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 11. 2011. (16:59:13)
Postovi: (46)16
Sarma = la pohva - posuda
= 2 - 2
Lokacija: subnet mask

PostPostano: 15:44 sri, 16. 1. 2013    Naslov: Citirajte i odgovorite

Nije mi jasan zadatak
Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika: [tex]X^{(r)}=(x_1^{(r)},...,x_n^{(r)}), r=1,..,m.[/tex]
Dal su ovi brojevi u eksponentu potencija ili indeks pojedinog vektora/elementa?

mozda je glupo pitanje, ali nisam siguran jer svaka koordinata ima index dolje zapisan
Nije mi jasan zadatak
Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika: [tex]X^{(r)}=(x_1^{(r)},...,x_n^{(r)}), r=1,..,m.[/tex]
Dal su ovi brojevi u eksponentu potencija ili indeks pojedinog vektora/elementa?

mozda je glupo pitanje, ali nisam siguran jer svaka koordinata ima index dolje zapisan


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3560)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 16:32 sri, 16. 1. 2013    Naslov: Citirajte i odgovorite

Gornji index znaci "koji" (od [tex]m[/tex]) vektora; donji oznacava koja je to komponenta tog vektora. Ponekad se tako oznacava da se izbjegne konfuzija izmedju razlicitih indexa (jednog za vektor i drugi za element), recimo, da ne izgleda kao da je u igri matrica (sto bi se desilo da su oba indexa dolje).
Gornji index znaci "koji" (od [tex]m[/tex]) vektora; donji oznacava koja je to komponenta tog vektora. Ponekad se tako oznacava da se izbjegne konfuzija izmedju razlicitih indexa (jednog za vektor i drugi za element), recimo, da ne izgleda kao da je u igri matrica (sto bi se desilo da su oba indexa dolje).



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
aj_ca_volin_te
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 22. 11. 2011. (20:18:49)
Postovi: (6F)16
Sarma = la pohva - posuda
20 = 22 - 2

PostPostano: 18:15 sri, 16. 1. 2013    Naslov: Citirajte i odgovorite

moze mi itko ukazati na pogresku, problem je u tome sto mi u rijecnik ne unose ove rijeci iz maina, a kada ih unosim preko funkcije ''dodatno ucitavanje'' unose se bez problema :/

[code:1]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define B 1000
#define EMPTY "0"
#define DELETED "-1"

typedef char elementtype[21];
typedef elementtype DICTIONARY[B];

void MAKE_NULL (DICTIONARY *Ap){
int i;
for(i=0; i<B; i++) strcpy((*Ap)[i],EMPTY);
}

int h(elementtype x){
int i, sum=0;
for(i=0;i<20;i++) sum += x'[i]';
return sum%B;
}

int locate(elementtype x, DICTIONARY A){
int initail, i;
initail=h(x);
i=0;
while((i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0) ++i;

return ((initail+i)%B);
}

int locate1(elementtype x, DICTIONARY A){
int initail, i;
initail=h(x);
i=0;
while( (i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0 && strcmp(A[(initail+i)%B],DELETED)!=0) ++i;

return ((initail+i)%B);
}

int MEMBER(elementtype x, DICTIONARY A)
{
if(strcmp(A[locate(x,A)],x)==0) return 1;

else return 0;
}

void INSERT(elementtype x, DICTIONARY *Ap)
{
int bucket;
if(MEMBER(x,*Ap)) return;
bucket = locate1(x,*Ap);
if(strcmp((*Ap)[bucket],EMPTY)==0 || strcmp((*Ap)[bucket],DELETED)==0){
strcpy((*Ap)[bucket],x);
}
else{
printf("error-table is full");
exit(1);
}

}

void DELETE(elementtype x, DICTIONARY *Ap)
{
int bucket;
bucket=locate(x,*Ap);
if(strcmp((*Ap)[bucket],x)==0) strcpy((*Ap)[bucket], DELETED);
}

void dodatno_ucitavanje(DICTIONARY *A){

while(1){

elementtype operacija, string;

scanf("%s", operacija);
scanf("%s", string);

if(strcmp(operacija,"UNESI")==0){
INSERT(string,A);
}
else if(strcmp(operacija,"OBRISI")==0){
DELETE(string,A);
}
else if(strcmp(operacija,"JELICLAN")==0){
if(MEMBER(string,*A)){
printf("%s: DA!\n", string);
}
else{
printf("%s: NE!\n", string);
}
}
else break;
}
}


int main(void)
{

DICTIONARY A;

MAKE_NULL(&A);

INSERT("auto",&A); INSERT("break",&A); INSERT("case",&A) ;INSERT("char",&A); INSERT("const",&A) ;INSERT ("continue",&A);
INSERT("do",&A); INSERT("double",&A) ;INSERT("default",&A); INSERT("else",&A); INSERT("enum",&A); INSERT("extern",&A); INSERT("float", &A);
INSERT("for",&A); INSERT("goto",&A); INSERT("if",&A); INSERT("int",&A); INSERT("long",&A); INSERT("register",&A);INSERT("return",&A);INSERT("short",&A);INSERT ("signed", &A);INSERT ("sizeof", &A);INSERT ("static", &A);
INSERT("struct",&A);INSERT("switch",&A);INSERT("typedef",&A);INSERT("union",&A);INSERT("void",&A);INSERT("volatile",&A);
INSERT("while",&A);

dodatno_ucitavanje(&A);

return 0;
}[/code:1]

NETREBA HVALA, RIJESENO! ispraviti cu gore u implementaciji pa ako ikome bude trebala neka ima :D
moze mi itko ukazati na pogresku, problem je u tome sto mi u rijecnik ne unose ove rijeci iz maina, a kada ih unosim preko funkcije ''dodatno ucitavanje'' unose se bez problema Ehm?

Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define B 1000
#define EMPTY "0"
#define DELETED "-1"

typedef char elementtype[21];
typedef elementtype DICTIONARY[B];

void MAKE_NULL (DICTIONARY *Ap){
    int i;
    for(i=0; i<B; i++) strcpy((*Ap)[i],EMPTY);
}

int h(elementtype x){
    int i, sum=0;
    for(i=0;i<20;i++) sum += x'[i]';
    return sum%B;
}

int locate(elementtype x, DICTIONARY A){
    int initail, i;
    initail=h(x);
    i=0;
    while((i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0) ++i;

    return ((initail+i)%B);
}

int locate1(elementtype x, DICTIONARY A){
    int initail, i;
    initail=h(x);
    i=0;
    while( (i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0 && strcmp(A[(initail+i)%B],DELETED)!=0) ++i;

    return ((initail+i)%B);
}

int MEMBER(elementtype x, DICTIONARY A)
{
    if(strcmp(A[locate(x,A)],x)==0) return 1;

    else return 0;
}

void INSERT(elementtype x, DICTIONARY *Ap)
{
    int bucket;
    if(MEMBER(x,*Ap)) return;
    bucket = locate1(x,*Ap);
    if(strcmp((*Ap)[bucket],EMPTY)==0 || strcmp((*Ap)[bucket],DELETED)==0){
       strcpy((*Ap)[bucket],x);
    }
    else{
        printf("error-table is full");
        exit(1);
    }

}

void DELETE(elementtype x, DICTIONARY *Ap)
{
    int bucket;
    bucket=locate(x,*Ap);
    if(strcmp((*Ap)[bucket],x)==0) strcpy((*Ap)[bucket], DELETED);
}

void dodatno_ucitavanje(DICTIONARY *A){

    while(1){

    elementtype operacija, string;

    scanf("%s", operacija);
    scanf("%s", string);

    if(strcmp(operacija,"UNESI")==0){
        INSERT(string,A);
    }
    else if(strcmp(operacija,"OBRISI")==0){
        DELETE(string,A);
    }
    else if(strcmp(operacija,"JELICLAN")==0){
        if(MEMBER(string,*A)){
            printf("%s: DA!\n", string);
        }
        else{
            printf("%s: NE!\n", string);
        }
    }
    else break;
}
}


int main(void)
{

    DICTIONARY A;

    MAKE_NULL(&A);

    INSERT("auto",&A); INSERT("break",&A); INSERT("case",&A) ;INSERT("char",&A); INSERT("const",&A) ;INSERT ("continue",&A);
    INSERT("do",&A); INSERT("double",&A) ;INSERT("default",&A); INSERT("else",&A); INSERT("enum",&A); INSERT("extern",&A); INSERT("float", &A);
    INSERT("for",&A); INSERT("goto",&A); INSERT("if",&A); INSERT("int",&A); INSERT("long",&A); INSERT("register",&A);INSERT("return",&A);INSERT("short",&A);INSERT ("signed", &A);INSERT ("sizeof", &A);INSERT ("static", &A);
    INSERT("struct",&A);INSERT("switch",&A);INSERT("typedef",&A);INSERT("union",&A);INSERT("void",&A);INSERT("volatile",&A);
    INSERT("while",&A);

    dodatno_ucitavanje(&A);

    return 0;
}


NETREBA HVALA, RIJESENO! ispraviti cu gore u implementaciji pa ako ikome bude trebala neka ima Very Happy




Zadnja promjena: aj_ca_volin_te; 22:36 sri, 16. 1. 2013; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
malenaa
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 12. 2010. (13:11:02)
Postovi: (21)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 18:44 sri, 16. 1. 2013    Naslov: BST pomoću polja Citirajte i odgovorite

Zapela sam na implementaciji binarnog stabla traženja pomoću polja (u zadatku je riječnik tako implementiran), točnije na funkciji DELETE. Naime, nikako ne mogu zaključiti kako pomicati čvorove kada se neki čvor nadomješta svojim djetetom. U tu svrhu sam napisala funkciju PREPISI, međutim mislim nije točna jer neki onda nestanu, a koji ne bi trebali. Može li mi netko pomoći?

[code:1]
void PREPISI (int i, int j, DICTIONARY *Dp) {
strcpy(Dp->elements[i], Dp->elements[j]);
if (2*j+1 < MAXSIZE) PREPISI (2*i+1, 2*j+1, Dp);
else if (2*j+2 < MAXSIZE) PREPISI (2*i+2, 2*j+2, Dp);

}

void DELETE (elementtype x, DICTIONARY *Dp)
{
int i=0, j;
//trazimo x
while ( i < MAXSIZE )
{
if ( strcmp(Dp->elements[i], x) == 0 ) break;
else if ( strcmp(Dp->elements[i], x) > 0) i=2*i+1;
else i=2*i+2;
}

if ( i < MAXSIZE )
{
//x je u listu
if ( ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE)) )
{
strcpy(Dp->elements[i], "PRAZNO");

}

//x ima samo desno dijete
else if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE))
PREPISI(i, 2*i+2, Dp);

//x ima samo lijevo dijete
else if ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))
PREPISI(i, 2*i+1, Dp);

//x ima oba djeteta
else
{
elementtype y = OBRISI_NAJMANJI(2*i+2, Dp); //brisemo najmanji cvor iz desnog podstabla
strcpy(Dp->elements[i], y);
}
}
if ( i > MAXSIZE ) printf("\nNema %s u rijecniku.\n", x);

}

elementtype OBRISI_NAJMANJI (int i, DICTIONARY *Dp)
{
elementtype mini;
elementtype brisi;

if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) //i je najmanji
{
strcpy (mini,Dp->elements[i]);
if((strcmp(Dp->elements[2*i+2], "PRAZNO") != 0) && (2*i+2 < MAXSIZE)) //i ima desno dijete
PREPISI(i, 2*i+2, Dp);

else if(((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))) //i je list
strcpy(Dp->elements[i], "PRAZNO");

}
//i ima lijevo dijete
else if((strcmp(Dp->elements[2*i+1], "PRAZNO") != 0) || (2*i+1 < MAXSIZE))
strcpy(mini, OBRISI_NAJMANJI(2*i+1, Dp));
return mini;
}
[/code:1]
Zapela sam na implementaciji binarnog stabla traženja pomoću polja (u zadatku je riječnik tako implementiran), točnije na funkciji DELETE. Naime, nikako ne mogu zaključiti kako pomicati čvorove kada se neki čvor nadomješta svojim djetetom. U tu svrhu sam napisala funkciju PREPISI, međutim mislim nije točna jer neki onda nestanu, a koji ne bi trebali. Može li mi netko pomoći?

Kod:

void PREPISI (int i, int j, DICTIONARY *Dp) {
     strcpy(Dp->elements[i], Dp->elements[j]);
    if (2*j+1 < MAXSIZE) PREPISI (2*i+1, 2*j+1, Dp);
     else if (2*j+2 < MAXSIZE) PREPISI (2*i+2, 2*j+2, Dp);
 
}

void DELETE (elementtype x, DICTIONARY *Dp)
{
     int i=0, j;
     //trazimo x
     while ( i < MAXSIZE )
     {
           if ( strcmp(Dp->elements[i], x) == 0 ) break;
           else if ( strcmp(Dp->elements[i], x) > 0) i=2*i+1;
            else i=2*i+2;
     }

     if ( i < MAXSIZE )
     {
            //x je u listu
           if ( ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE)) )
                {
                           strcpy(Dp->elements[i], "PRAZNO");

                }

            //x ima samo desno dijete
           else if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE))
                                PREPISI(i, 2*i+2, Dp);
   
            //x ima samo lijevo dijete
            else if ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))
                       PREPISI(i, 2*i+1, Dp);
                 
            //x ima oba djeteta
            else
                   {
                        elementtype y = OBRISI_NAJMANJI(2*i+2, Dp); //brisemo najmanji cvor iz desnog podstabla
                         strcpy(Dp->elements[i], y);
                    }
         }
        if ( i > MAXSIZE ) printf("\nNema %s u rijecniku.\n", x);

     }

elementtype OBRISI_NAJMANJI (int i, DICTIONARY *Dp)
{
    elementtype mini;
    elementtype brisi;

    if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) //i je najmanji
    {
        strcpy (mini,Dp->elements[i]);
        if((strcmp(Dp->elements[2*i+2], "PRAZNO") != 0) && (2*i+2 < MAXSIZE)) //i ima desno dijete
            PREPISI(i, 2*i+2, Dp);

        else if(((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))) //i je list
                      strcpy(Dp->elements[i], "PRAZNO");

    }
    //i ima lijevo dijete
    else if((strcmp(Dp->elements[2*i+1], "PRAZNO") != 0) || (2*i+1 < MAXSIZE))
          strcpy(mini, OBRISI_NAJMANJI(2*i+1, Dp));
    return mini;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Gino
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 11. 09. 2008. (10:54:06)
Postovi: (370)16
Sarma = la pohva - posuda
-29 = 108 - 137
Lokacija: Pula

PostPostano: 20:19 sri, 16. 1. 2013    Naslov: Citirajte i odgovorite

Puno bi pomoglo znati(=vidjeti kod) sto je DICTIONARY.
Puno bi pomoglo znati(=vidjeti kod) sto je DICTIONARY.



_________________
Mario Berljafa
[Vrh]
Korisnički profil Pošaljite privatnu poruku
malenaa
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 12. 2010. (13:11:02)
Postovi: (21)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 20:53 sri, 16. 1. 2013    Naslov: Citirajte i odgovorite

evo definicije:
[code:1]
#define MAXSIZE 100 //najveci dopusteni broj rijeci
#define elementtype char*

typedef struct {
elementtype elements[MAXSIZE];
} DICTIONARY;
[/code:1]
Dakle, radi se o atp DICTIONARY koji je implementiran pomoću binarnog stabla trazenja, gdje je binarno stablo prikazano pomocu polja. Funkcija koja mi je "problematična" za napisati je funkcija DELETE (gore navedena u kodu). Ja sam za tu implementaciju iskoristila prikaz potpunog binarnog stabla pomoću polja tj lijevo dijete čvora i je 2*i+1, a desno 2*i+2. Dok sam one čvorove koji ne sadrže oznaku označila sa "PRAZNO"
U prilog sam stavila i cijeli kod ako je potreban.
evo definicije:
Kod:

#define MAXSIZE 100 //najveci dopusteni broj rijeci
#define elementtype char*

typedef struct {
        elementtype elements[MAXSIZE];
} DICTIONARY;

Dakle, radi se o atp DICTIONARY koji je implementiran pomoću binarnog stabla trazenja, gdje je binarno stablo prikazano pomocu polja. Funkcija koja mi je "problematična" za napisati je funkcija DELETE (gore navedena u kodu). Ja sam za tu implementaciju iskoristila prikaz potpunog binarnog stabla pomoću polja tj lijevo dijete čvora i je 2*i+1, a desno 2*i+2. Dok sam one čvorove koji ne sadrže oznaku označila sa "PRAZNO"
U prilog sam stavila i cijeli kod ako je potreban.





Riječnik.c
 Description:

Download
 Filename:  Riječnik.c
 Filesize:  6.64 KB
 Downloaded:  308 Time(s)

[Vrh]
Korisnički profil Pošaljite privatnu poruku
Zenon
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 09. 2011. (19:14:43)
Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]

PostPostano: 4:10 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Može li mi itko reći zašto moja funkcija unesi_stablo ne unosi stablo pravilno? Ideja je da unese korijen pa njegovu djecu s desna na lijevo pa to isto za prvo, drugo, ... , nto dijete itd. Kod je ogroman, no ono što je relevantno za moje pitanje i nije. Inače, to je implementacija stabla preko polja uz vezu čvor -> (roditelj, dijete, idući potomak). Unaprijed hvala!
[code:1]#include<stdio.h>



#define max 100

typedef int node;

typedef struct{
char label;
node mama, brat, sin;
}TREE;

node MAKE_ROOT(char l, TREE* tree){
node i;
tree->label = l;
tree->mama = -1;
tree->brat = -1;
tree->sin = -1;
for(i = 1; i < max; i++){
(tree + i)->label = '\0';
(tree + i)->mama = -1;
(tree + i)->brat = -1;
(tree + i)->sin = -1;
}

return 0;
}



node INSERT_CHILD(char l, node i, TREE* tree){
if(i >= max || tree->label == '\0') return -1;

node j;

for(j = 1; j < max; j++)
if((tree + j)->label == '\0') break;

if(j >= max) return -1;

(tree + j)->label = l;
(tree + j)->mama = i;
(tree + j)->brat = (tree + i)->sin;
(tree + j)->sin = -1;

return j;
}



node INSERT_SIBLING(char l, node i, TREE* tree){
if(i >= max || tree->label == '\0' || i == 0) return -1;

node j, k;

for(j = 1; j < max; j++)
if((tree + j)->label == '\0') break;

if(j >= max) return -1;

for(k = 1; k < max; k++)
if((tree + k)->label == '\0') break;

if(k >= max) return -1;
(tree + j)->label = l;
(tree + j)->mama = (tree+i)->mama;
(tree + j)->brat = (tree + i)->brat;
(tree + i)->brat = j;
(tree + j)->sin = -1;

return j;
}



void DELETE(node i, TREE* tree){
if(i >= max || tree->label == '\0' || i == 0 || (tree + i)->sin != -1) return;

if((tree + i)->brat != -1){
if((tree + (tree + i)->mama)->sin == i)(tree + (tree + i)->mama)->sin = (tree + i)->brat;

else{
node j;
j == (tree + (tree + i)->mama)->sin;
while((tree + j)->brat != i)
j = (tree + j)->brat;

(tree + j)->brat = (tree + i)->brat;

}
}

(tree + i)->label = '\0';
(tree + i)->mama = -1;
(tree + i)->brat = -1;
(tree + i)->sin = -1;
}



node ROOT(TREE* tree){
return 0;
}



node FIRST_CHILD(node i, TREE* tree){
if(i >= max || tree->label == '\0') return -1;

return (tree + i)->sin;
}



node NEXT_SIBLING(node i, TREE* tree){
if(i >= max || tree->label == '\0') return -1;

return (tree + i)->brat;
}



node PARENT(node i, TREE* tree){
if(i >= max || tree->label == '\0') return -1;

return (tree + i)->mama;
}



char LABEL(node i, TREE* tree){
if(i >= max || tree->label == '\0') return '\0';

return (tree + i)->label;
}



void CHANGE_LABEL(char l, node i, TREE* tree){
if(i >= max || tree->label == '\0') return;

(tree + i)->label = l;
}



int broj_potomaka(node i, TREE* tree){
if(i >= max || LABEL(ROOT(tree), tree) == '\0' || i == -1) return 0;

int suma = 0;
node j;

j = FIRST_CHILD(i, tree);
while(j != -1){
suma = suma + 1 + broj_potomaka(j, tree);
j = NEXT_SIBLING(j, tree);
}

return suma;
}



void unesi_stablo(TREE* tree, node i){
int n, k;
char c;
node j;

if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree));
else{
printf("Unesite ime korijena: ");
scanf("%c", &c);
CHANGE_LABEL(c, ROOT(tree), tree);
}
printf("Unesite broj djece cvora: ");
scanf("%d", &n);
if(n == 0) return;

for(k = 0; k < n; k++){
printf("Unesite ime %d. djeteta: ", k+1);
scanf(" %c", &c);
INSERT_CHILD(c, i, tree);
}

for(k = 0; k < n; k++){
if(k == 0) j = FIRST_CHILD(i, tree);
else j = NEXT_SIBLING(j, tree);
unesi_stablo(tree, j);
}
}

int main(void){
TREE T[max];
node i;
int n, m;

MAKE_ROOT('\0', T);
unesi_stablo(T, ROOT(T));
printf("%c ", LABEL(ROOT(T), T));
CHANGE_LABEL('\0', ROOT(T), T);

while(FIRST_CHILD(ROOT(T), T) != -1){
i = ROOT(T);

while(FIRST_CHILD(i, T) != -1){
if(LABEL(i, T) != '\0'){
printf("%c ", LABEL(i,T));
CHANGE_LABEL('\0', i, T);
i = NEXT_SIBLING(i, T);
}
}

if(LABEL(i, T) != '\0'){
printf("%c ", LABEL(i,T));
CHANGE_LABEL('\0', i, T);
}

DELETE(i, T);
}

return 0;
}[/code:1]
Može li mi itko reći zašto moja funkcija unesi_stablo ne unosi stablo pravilno? Ideja je da unese korijen pa njegovu djecu s desna na lijevo pa to isto za prvo, drugo, ... , nto dijete itd. Kod je ogroman, no ono što je relevantno za moje pitanje i nije. Inače, to je implementacija stabla preko polja uz vezu čvor → (roditelj, dijete, idući potomak). Unaprijed hvala!
Kod:
#include<stdio.h>



#define max 100

typedef int node;

typedef struct{
   char label;
   node mama, brat, sin;
}TREE;

node MAKE_ROOT(char l, TREE* tree){
   node i;
   tree->label = l;
   tree->mama = -1;
   tree->brat = -1;
   tree->sin = -1;
   for(i = 1; i < max; i++){
      (tree + i)->label = '\0';
      (tree + i)->mama = -1;
      (tree + i)->brat = -1;
      (tree + i)->sin = -1;
   }

   return 0;
}



node INSERT_CHILD(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   node j;

   for(j = 1; j < max; j++)
      if((tree + j)->label == '\0') break;

   if(j >= max) return -1;

   (tree + j)->label = l;
   (tree + j)->mama = i;
   (tree + j)->brat = (tree + i)->sin;
   (tree + j)->sin = -1;

   return j;
}



node INSERT_SIBLING(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0' || i == 0) return -1;

   node j, k;

   for(j = 1; j < max; j++)
      if((tree + j)->label == '\0') break;

   if(j >= max) return -1;

   for(k = 1; k < max; k++)
      if((tree + k)->label == '\0') break;

   if(k >= max) return -1;
   (tree + j)->label = l;
   (tree + j)->mama = (tree+i)->mama;
   (tree + j)->brat = (tree + i)->brat;
   (tree + i)->brat = j;
   (tree + j)->sin = -1;

   return j;
}



void DELETE(node i, TREE* tree){
   if(i >= max || tree->label == '\0' || i == 0 || (tree + i)->sin != -1) return;

   if((tree + i)->brat != -1){
      if((tree + (tree + i)->mama)->sin == i)(tree + (tree + i)->mama)->sin = (tree + i)->brat;

      else{
         node j;
         j == (tree + (tree + i)->mama)->sin;
         while((tree + j)->brat != i)
            j = (tree + j)->brat;

         (tree + j)->brat = (tree + i)->brat;

      }
   }

   (tree + i)->label = '\0';
   (tree + i)->mama = -1;
   (tree + i)->brat = -1;
   (tree + i)->sin = -1;
}



node ROOT(TREE* tree){
   return 0;
}



node FIRST_CHILD(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->sin;
}



node NEXT_SIBLING(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->brat;
}



node PARENT(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->mama;
}



char LABEL(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return '\0';

   return (tree + i)->label;
}



void CHANGE_LABEL(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return;

   (tree + i)->label = l;
}



int broj_potomaka(node i, TREE* tree){
   if(i >= max || LABEL(ROOT(tree), tree) == '\0' || i == -1) return 0;

   int suma = 0;
   node j;

   j = FIRST_CHILD(i, tree);
   while(j != -1){
      suma = suma + 1 + broj_potomaka(j, tree);
      j = NEXT_SIBLING(j, tree);
   }

   return suma;
}



void unesi_stablo(TREE* tree, node i){
   int n, k;
   char c;
   node j;

   if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree));
   else{
      printf("Unesite ime korijena: ");
      scanf("%c", &c);
      CHANGE_LABEL(c, ROOT(tree), tree);
   }
   printf("Unesite broj djece cvora: ");
   scanf("%d", &n);
   if(n == 0) return;

   for(k = 0; k < n; k++){
      printf("Unesite ime %d. djeteta: ", k+1);
      scanf(" %c", &c);
      INSERT_CHILD(c, i, tree);
   }

   for(k = 0; k < n; k++){
      if(k == 0) j = FIRST_CHILD(i, tree);
      else j = NEXT_SIBLING(j, tree);
      unesi_stablo(tree, j);
   }
}

int main(void){
   TREE T[max];
   node i;
   int n, m;

   MAKE_ROOT('\0', T);
   unesi_stablo(T, ROOT(T));
   printf("%c ", LABEL(ROOT(T), T));
   CHANGE_LABEL('\0', ROOT(T), T);

   while(FIRST_CHILD(ROOT(T), T) != -1){
      i = ROOT(T);

      while(FIRST_CHILD(i, T) != -1){
         if(LABEL(i, T) != '\0'){
            printf("%c ", LABEL(i,T));
            CHANGE_LABEL('\0', i, T);
            i = NEXT_SIBLING(i, T);
         }
      }

      if(LABEL(i, T) != '\0'){
         printf("%c ", LABEL(i,T));
         CHANGE_LABEL('\0', i, T);
      }

      DELETE(i, T);
   }

   return 0;
}



_________________
It's a wonderful, wonderful life!
[tex]\heartsuit \ \mathcal{PMF-MO} \ \heartsuit[/tex]
[tex]\mathbb Z\Sigma\mathbb N\emptyset\mathbb N[/tex]
[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3560)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 4:25 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Ne bi li u [tt]INSERT_CHILD()[/tt] trebalo postaviti sina od mame (tj. [tt]i[/tt]-tog cvora)?
Ne bi li u INSERT_CHILD() trebalo postaviti sina od mame (tj. i-tog cvora)?



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Zenon
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 09. 2011. (19:14:43)
Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]

PostPostano: 7:57 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda [tt]if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); [/tt] mi ispiše samo [tt]Promatramo cvor [/tt] i ne razumijem zašto. Nikada ne ispiše label čvora. :S
Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); mi ispiše samo Promatramo cvor i ne razumijem zašto. Nikada ne ispiše label čvora. :S



_________________
It's a wonderful, wonderful life!
[tex]\heartsuit \ \mathcal{PMF-MO} \ \heartsuit[/tex]
[tex]\mathbb Z\Sigma\mathbb N\emptyset\mathbb N[/tex]
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Leolinus
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2012. (16:36:41)
Postovi: (10)16
Sarma = la pohva - posuda
= 6 - 5

PostPostano: 9:26 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

[quote="Zenon"]Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda [tt]if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); [/tt] mi ispiše samo [tt]Promatramo cvor [/tt] i ne razumijem zašto. Nikada ne ispiše label čvora. :S[/quote]

Možda zato što u label stavljaš int 1, koji se casta u char 00000001 što je u ASCII-ju SOH znak.

'\0' je doslovno NUL karakter, vrijednost dekadska mu je 0, to nije znamenka 0. '0' i '1' su znamenke.
Možda ti želiš da ti je to int vrijednost, onda jednostavno umjesto %c u ispisu stavi %d.
Zenon (napisa):
Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); mi ispiše samo Promatramo cvor i ne razumijem zašto. Nikada ne ispiše label čvora. :S


Možda zato što u label stavljaš int 1, koji se casta u char 00000001 što je u ASCII-ju SOH znak.

'\0' je doslovno NUL karakter, vrijednost dekadska mu je 0, to nije znamenka 0. '0' i '1' su znamenke.
Možda ti želiš da ti je to int vrijednost, onda jednostavno umjesto %c u ispisu stavi %d.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Zenon
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 09. 2011. (19:14:43)
Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]

PostPostano: 11:19 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.
Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.



_________________
It's a wonderful, wonderful life!
[tex]\heartsuit \ \mathcal{PMF-MO} \ \heartsuit[/tex]
[tex]\mathbb Z\Sigma\mathbb N\emptyset\mathbb N[/tex]
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Leolinus
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2012. (16:36:41)
Postovi: (10)16
Sarma = la pohva - posuda
= 6 - 5

PostPostano: 11:26 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

[quote="Zenon"]Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.[/quote]

Char je tip podataka, a u C-u sadrži 8 bitova. Ti, ako ideš spremiti 1 u char. To je integer po defaultu. Automatski se 1 cast-a u char tako da se uzme zadnjih 8 bitova zapisa 0000 0000 0000 0000 0000 0000 0000 0001.

Nakon toga ti spremaš 0000 0001 u svoju varijablu label, a 0000 0001 nije binarni zapis ZNAKA 1, nego znaka SOH (start of header) u ASCII-ju.
Ako želiš da ti bude ZNAK 1, onda ćeš upisati char c = '1', a ne = 1.

Isto tako '\0' je znak za NUL karakter koji ima binarni zapis 0000 0000. To će ti na ekranu ispisati ništa. Ako želiš ispisati nulu, onda trebaš zapisati znak '0'(char c = '0')

EDIT: Sorry, tek sad vidio da ono nije 1 nego 'l' (L).
Zenon (napisa):
Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.


Char je tip podataka, a u C-u sadrži 8 bitova. Ti, ako ideš spremiti 1 u char. To je integer po defaultu. Automatski se 1 cast-a u char tako da se uzme zadnjih 8 bitova zapisa 0000 0000 0000 0000 0000 0000 0000 0001.

Nakon toga ti spremaš 0000 0001 u svoju varijablu label, a 0000 0001 nije binarni zapis ZNAKA 1, nego znaka SOH (start of header) u ASCII-ju.
Ako želiš da ti bude ZNAK 1, onda ćeš upisati char c = '1', a ne = 1.

Isto tako '\0' je znak za NUL karakter koji ima binarni zapis 0000 0000. To će ti na ekranu ispisati ništa. Ako želiš ispisati nulu, onda trebaš zapisati znak '0'(char c = '0')

EDIT: Sorry, tek sad vidio da ono nije 1 nego 'l' (L).


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3560)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 12:07 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Zenone, previse copy/paste-a:

[code:1]void CHANGE_LABEL(char l, node i, TREE* tree){
if(i >= max || tree->label == '\0') return;

(tree + i)->label = l;
}[/code:1]

Po defaultu, [tt]tree->label[/tt] je uvijek jednak [tt]'\0[/tt] (v. fju [tt]MAKE_ROOT()[/tt] i njen poziv u [tt]main()[/tt]). Nadalje, funkcije koje rade s [tt]tree + i[/tt] provjeravaju
[tt]if(i >= max || tree->label == '\0')[/tt],
dakle ne "ima li [tt]tree[i][/tt] praznu labelu", nego "ima li korijen praznu labelu" (a to je uvijek istina).
Zenone, previse copy/paste-a:

Kod:
void CHANGE_LABEL(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return;

   (tree + i)->label = l;
}


Po defaultu, tree→label je uvijek jednak '\0 (v. fju MAKE_ROOT() i njen poziv u main()). Nadalje, funkcije koje rade s tree + i provjeravaju
if(i >= max || tree→label == '\0'),
dakle ne "ima li tree[i] praznu labelu", nego "ima li korijen praznu labelu" (a to je uvijek istina).



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Zenon
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 09. 2011. (19:14:43)
Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]

PostPostano: 12:15 čet, 17. 1. 2013    Naslov: Citirajte i odgovorite

Hvala Vam puno! You're a life saver! :thankyou: :thankyou: :thankyou: Sada funkcija napokon radi.
Hvala Vam puno! You're a life saver! Thank you Thank you Thank you Sada funkcija napokon radi.



_________________
It's a wonderful, wonderful life!
[tex]\heartsuit \ \mathcal{PMF-MO} \ \heartsuit[/tex]
[tex]\mathbb Z\Sigma\mathbb N\emptyset\mathbb N[/tex]
[Vrh]
Korisnički profil Pošaljite privatnu poruku
flux
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 10. 07. 2013. (17:29:12)
Postovi: (7)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 21:44 pet, 17. 1. 2014    Naslov: definiranje tipova Citirajte i odgovorite

na satu nam je dan kod za funkciju MaCompute implementiranu pomoću sortiranog polja

[code:1]
int MaCompute(Mapping *M, domain d, range r)
{
int l=0, m, n=M->last;
domain dm;
while (l<=n)
{
m=(l+n)/2;
dm= M->pairs[m].domainelement;
if (dm==d) {*r=M->pairs[m].rangeelement;
return 1;}
else if (dm<d) l=m+1;
else n=m-1;
}
return 0;
}[/code:1]

e sad ja sam napisala i sve ostale funkcije iz implementacije ali me muči kako da definiram tip domain
u zadatku kaže "Pretpostavite da je domena skup imena duljine max. 20 slova, a kodomena skup telefonskih brojeva (cijeli brojevi). "

e sad ja sam to napisala ovako
[code:1]
#define Max 100
#define burek 20

typedef long range;
typedef struct
{
char ime[burek];
}domain;

typedef struct
{
domain domainelement;
range rangeelement;
}celltype;

typedef struct
{
celltype pairs[Max];
int last;
}Mapping;[/code:1]
ali onda mi javlja grešku kod macompute i maassigne kod if (dm==d) i sličnog jer (logično) ne želi tako uspoređivati stringove
dal moram u svakoj if naredbi pisati funkcije koje uspoređuju strignove?
makar bi koliko sam ja shvatila funkcije macompute maassign i te moraju bit iste za sve domain tipove
na satu nam je dan kod za funkciju MaCompute implementiranu pomoću sortiranog polja

Kod:

int MaCompute(Mapping *M, domain d, range r)
{
    int l=0, m, n=M->last;
    domain dm;
    while (l<=n)
    {
        m=(l+n)/2;
        dm= M->pairs[m].domainelement;
        if (dm==d) {*r=M->pairs[m].rangeelement;
                    return 1;}
        else if (dm<d) l=m+1;
        else n=m-1;
    }
    return 0;
}


e sad ja sam napisala i sve ostale funkcije iz implementacije ali me muči kako da definiram tip domain
u zadatku kaže "Pretpostavite da je domena skup imena duljine max. 20 slova, a kodomena skup telefonskih brojeva (cijeli brojevi). "

e sad ja sam to napisala ovako
Kod:

#define Max 100
#define burek 20

typedef long range;
typedef struct
{
    char ime[burek];
}domain;

typedef struct
{
    domain domainelement;
    range rangeelement;
}celltype;

typedef struct
{
    celltype pairs[Max];
    int last;
}Mapping;

ali onda mi javlja grešku kod macompute i maassigne kod if (dm==d) i sličnog jer (logično) ne želi tako uspoređivati stringove
dal moram u svakoj if naredbi pisati funkcije koje uspoređuju strignove?
makar bi koliko sam ja shvatila funkcije macompute maassign i te moraju bit iste za sve domain tipove


[Vrh]
Korisnički profil Pošaljite privatnu poruku
beuler
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 02. 11. 2012. (14:08:41)
Postovi: (16)16
Sarma = la pohva - posuda
= 5 - 1

PostPostano: 20:33 sub, 18. 1. 2014    Naslov: Citirajte i odgovorite

moze pomoc, kako dodati novi element u potpuno binarno stablo (definirano pointerima) ?



(zadatak je sortirat listu pomocu hrpe definirane pointerima)


edit:
smislio sam nesto, izbrojat lijevo stablo i desno pa gledat jesu li oblika i=i+2*K


nakon mukotrpnih modificiranja koda, uspio sam doci do verzije koja actually i radi
ako kome treba : http://pastebin.com/g117J3cx
u ovoj verziji sortira intove iz liste pomocu hrpe (oboje prikazano pomocu pointera)
moze pomoc, kako dodati novi element u potpuno binarno stablo (definirano pointerima) ?



(zadatak je sortirat listu pomocu hrpe definirane pointerima)


edit:
smislio sam nesto, izbrojat lijevo stablo i desno pa gledat jesu li oblika i=i+2*K


nakon mukotrpnih modificiranja koda, uspio sam doci do verzije koja actually i radi
ako kome treba : http://pastebin.com/g117J3cx
u ovoj verziji sortira intove iz liste pomocu hrpe (oboje prikazano pomocu pointera)



_________________
Sumnjam, dakle možda jesam.


Zadnja promjena: beuler; 17:44 ned, 19. 1. 2014; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
nuclear
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 11. 2011. (17:40:12)
Postovi: (74)16
Spol: žensko
Sarma = la pohva - posuda
10 = 20 - 10

PostPostano: 15:58 ned, 19. 1. 2014    Naslov: Citirajte i odgovorite

Već je bio ovaj zadatak kao pitanje, ali nitko nije dao odgovor. U vezi zadatka:

Implementirajte atp Mapping pomoću sortiranog polja. Elementi domene su uređeni parovi oblika (a,b), a,b € {0,1,2...n}, a kodomena skup {0,1,2...n}. Svako ovakvo preslikavanje f je binarna operacija f(a,b)=a*b za neku operaciju *.....

dalje nije bitno. Muči me (kao i moje prethodnike) domena. Napisala sam sljedeće, ali ne znam kako onda konstruirati Mapping:

[code:1]#define max 100
typedef int range;

typedef struct{
int a;
int b;
} domain;

typedef struct {
range elements[max];
int last;
} Mapping;[/code:1]

je li uopće dobro postavljati u Mapping umjesto elementtype range? i kako to sad sa domenom uskladiti?
Već je bio ovaj zadatak kao pitanje, ali nitko nije dao odgovor. U vezi zadatka:

Implementirajte atp Mapping pomoću sortiranog polja. Elementi domene su uređeni parovi oblika (a,b), a,b € {0,1,2...n}, a kodomena skup {0,1,2...n}. Svako ovakvo preslikavanje f je binarna operacija f(a,b)=a*b za neku operaciju *.....

dalje nije bitno. Muči me (kao i moje prethodnike) domena. Napisala sam sljedeće, ali ne znam kako onda konstruirati Mapping:

Kod:
#define max 100
typedef int range;

typedef struct{
    int a;
    int b;
    } domain;

typedef struct {
    range elements[max];
    int last;
    } Mapping;


je li uopće dobro postavljati u Mapping umjesto elementtype range? i kako to sad sa domenom uskladiti?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
nuclear
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 11. 2011. (17:40:12)
Postovi: (74)16
Spol: žensko
Sarma = la pohva - posuda
10 = 20 - 10

PostPostano: 18:12 ned, 19. 1. 2014    Naslov: Citirajte i odgovorite

Evo ovo mi funkcionira, bi li se ovo priznalo kako su tražili?

[code:1]#define max 100
typedef int range;

typedef struct{
int a;
int b;
} domain;

typedef struct {
domain d;
range r;
} element;

typedef struct{
element polje[max];
int last;
} Mapping;[/code:1]
Evo ovo mi funkcionira, bi li se ovo priznalo kako su tražili?

Kod:
#define max 100
typedef int range;

typedef struct{
    int a;
    int b;
    } domain;

typedef struct {
    domain d;
    range r;
    } element;

typedef struct{
    element polje[max];
    int last;
    } Mapping;


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi Vremenska zona: GMT + 01:00.
Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće
Stranica 6 / 8.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan