Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
dalmatinčica Forumaš(ica)
Pridružen/a: 01. 10. 2011. (18:46:54) Postovi: (AC)16
|
Postano: 19:18 uto, 8. 1. 2013 Naslov: |
|
|
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
edit:
barem ideja za ovo zadnje, pretvaranje oakvog velikog binarnog broja u dekadski
|
|
[Vrh] |
|
Ryssa Forumaš(ica)
Pridružen/a: 18. 12. 2011. (00:10:28) Postovi: (57)16
|
|
[Vrh] |
|
linus Forumaš(ica)
Pridružen/a: 20. 11. 2011. (16:59:13) Postovi: (46)16
Lokacija: subnet mask
|
Postano: 15:44 sri, 16. 1. 2013 Naslov: |
|
|
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] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
aj_ca_volin_te Forumaš(ica)
Pridružen/a: 22. 11. 2011. (20:18:49) Postovi: (6F)16
|
Postano: 18:15 sri, 16. 1. 2013 Naslov: |
|
|
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
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
Zadnja promjena: aj_ca_volin_te; 22:36 sri, 16. 1. 2013; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
malenaa Forumaš(ica)
Pridružen/a: 08. 12. 2010. (13:11:02) Postovi: (21)16
|
Postano: 18:44 sri, 16. 1. 2013 Naslov: BST pomoću polja |
|
|
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] |
|
Gino Forumaš(ica)
Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
malenaa Forumaš(ica)
Pridružen/a: 08. 12. 2010. (13:11:02) Postovi: (21)16
|
Postano: 20:53 sri, 16. 1. 2013 Naslov: |
|
|
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.
Description: |
|
Download |
Filename: |
Riječnik.c |
Filesize: |
6.64 KB |
Downloaded: |
308 Time(s) |
|
|
[Vrh] |
|
Zenon Forumaš(ica)
Pridružen/a: 09. 09. 2011. (19:14:43) Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]
|
Postano: 4:10 čet, 17. 1. 2013 Naslov: |
|
|
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;
} |
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Zenon Forumaš(ica)
Pridružen/a: 09. 09. 2011. (19:14:43) Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]
|
Postano: 7:57 čet, 17. 1. 2013 Naslov: |
|
|
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
|
|
[Vrh] |
|
Leolinus Forumaš(ica)
Pridružen/a: 30. 11. 2012. (16:36:41) Postovi: (10)16
|
Postano: 9:26 čet, 17. 1. 2013 Naslov: |
|
|
[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] |
|
Zenon Forumaš(ica)
Pridružen/a: 09. 09. 2011. (19:14:43) Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]
|
|
[Vrh] |
|
Leolinus Forumaš(ica)
Pridružen/a: 30. 11. 2012. (16:36:41) Postovi: (10)16
|
Postano: 11:26 čet, 17. 1. 2013 Naslov: |
|
|
[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] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 12:07 čet, 17. 1. 2013 Naslov: |
|
|
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.
|
|
[Vrh] |
|
Zenon Forumaš(ica)
Pridružen/a: 09. 09. 2011. (19:14:43) Postovi: (2B1)16
Sarma: -
Lokacija: [tex]\pm\infty[/tex]
|
|
[Vrh] |
|
flux Forumaš(ica)
Pridružen/a: 10. 07. 2013. (17:29:12) Postovi: (7)16
|
Postano: 21:44 pet, 17. 1. 2014 Naslov: definiranje tipova |
|
|
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] |
|
beuler Forumaš(ica)
Pridružen/a: 02. 11. 2012. (14:08:41) Postovi: (16)16
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 15:58 ned, 19. 1. 2014 Naslov: |
|
|
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] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
|
[Vrh] |
|
|