Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 18:16 ned, 16. 1. 2011 Naslov: Zadaci za vježbu |
|
|
u zadacima za vježbu http://web.math.hr/nastava/spa/files/zadaci_za_vjezbu_kolokvij2.pdf
u 4.zadatku,kako da se krećem kroz npr.domenu? jel ok pretpostavit da je domena polje,pa for petljom?
i kako kroz kodomenu? dobim li npr.M(d) tako da pozovem funkciju M(za koju pretpostavimo da je napisana),ili je MAPPING struktura? ali onda neznam je li polje struktura,ili vezana lista itd..?
5.zadatak,njega uopće neznam riješiti neovisno o implementaciji,pa ako netko može napisati rješenje? uopće ne vidim da bi mi neka funkcija iz a.t.p.RELATION bila korisna..
i 6.zad isto?
hvala! :D
u zadacima za vježbu http://web.math.hr/nastava/spa/files/zadaci_za_vjezbu_kolokvij2.pdf
u 4.zadatku,kako da se krećem kroz npr.domenu? jel ok pretpostavit da je domena polje,pa for petljom?
i kako kroz kodomenu? dobim li npr.M(d) tako da pozovem funkciju M(za koju pretpostavimo da je napisana),ili je MAPPING struktura? ali onda neznam je li polje struktura,ili vezana lista itd..?
5.zadatak,njega uopće neznam riješiti neovisno o implementaciji,pa ako netko može napisati rješenje? uopće ne vidim da bi mi neka funkcija iz a.t.p.RELATION bila korisna..
i 6.zad isto?
hvala!
|
|
[Vrh] |
|
pbakic Forumaš(ica)
Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol:
|
Postano: 22:19 ned, 16. 1. 2011 Naslov: |
|
|
Pa bas ti kaze da je (ko)domena skup malih slova eng. abecede tak da ti ne treba polje, dovoljno je for(i='a'; i<='z'; ++i)
ako zelis izracunat f(x) za neki x, onda to radis sa COMPUTE
5. zadatak:
[code:1]
int tranzitivna(RELATION R, int n){
int i,j;
SET pom1,pom2,slika,prazan;
SET_MAKE_NULL(&prazan);
for(i=1; i<=n; ++i){
SET_MAKE_NULL(&pom1);
SET_MAKE_NULL(&slika); //ovdje cuvamo sve elemente s kojima je i u relaciji
COMPUTE2(R,i,&pom1);
UNION(prazan,pom1,&slika); //kopiramo "pom1" u "slika" jer ga moramo cuvati
while(!SUBSET(pom1,prazan)){ //ovako provjerimo jel pom1 prazan
SET_MAKE_NULL(&pom2);
j=MIN(pom1); //za svaki element u skupu "pom1"
COMPUTE2(R,j,&pom2); //pogledamo skup svih koji su u relaciji s njim
if(!SUBSET(pom2,slika)) return 0; //i je li taj skup podskup od onih koji su u relaciji s i.
DELETE(j,&pom1); //Ako nije, R nije tranzitivna
}
}
return 1;
}
[/code:1]
b) zadatak: samo ides po nekom skupu u kojem cuvas domain1 i radis COMPUTE2. ispises dobiveni skup, a iz onog skupa u kojem cuvas domain1 obrises ispisane elemente
6) malo kompliciraniji za natipkat, al na slican nacin se kreces po skupovima...
Pa bas ti kaze da je (ko)domena skup malih slova eng. abecede tak da ti ne treba polje, dovoljno je for(i='a'; i⇐'z'; ++i)
ako zelis izracunat f(x) za neki x, onda to radis sa COMPUTE
5. zadatak:
Kod: |
int tranzitivna(RELATION R, int n){
int i,j;
SET pom1,pom2,slika,prazan;
SET_MAKE_NULL(&prazan);
for(i=1; i<=n; ++i){
SET_MAKE_NULL(&pom1);
SET_MAKE_NULL(&slika); //ovdje cuvamo sve elemente s kojima je i u relaciji
COMPUTE2(R,i,&pom1);
UNION(prazan,pom1,&slika); //kopiramo "pom1" u "slika" jer ga moramo cuvati
while(!SUBSET(pom1,prazan)){ //ovako provjerimo jel pom1 prazan
SET_MAKE_NULL(&pom2);
j=MIN(pom1); //za svaki element u skupu "pom1"
COMPUTE2(R,j,&pom2); //pogledamo skup svih koji su u relaciji s njim
if(!SUBSET(pom2,slika)) return 0; //i je li taj skup podskup od onih koji su u relaciji s i.
DELETE(j,&pom1); //Ako nije, R nije tranzitivna
}
}
return 1;
}
|
b) zadatak: samo ides po nekom skupu u kojem cuvas domain1 i radis COMPUTE2. ispises dobiveni skup, a iz onog skupa u kojem cuvas domain1 obrises ispisane elemente
6) malo kompliciraniji za natipkat, al na slican nacin se kreces po skupovima...
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 19:04 uto, 19. 11. 2013 Naslov: |
|
|
Ako ima tko volje, da mi kaže gdje griješim, ne mogu više vremena izgubiti na traženje greške :)
Program treba napraviti sljedeće: izraz u infixu prebaciti u postfix. Pri tome sam ja napravila da ne izbacuje elemente po redu na ekran, nego da ih sprema u stog S, te ga kasnije preokrenem u stogu O i ispisujem. Problem je što ignorira operatore, dakle, ispisuje samo operande. Eto, to je to :)
[code:1]
#include<stdio.h>
#include<stdlib.h>
typedef char elementtype;
typedef struct celltag{
elementtype element;
struct celltag *next;
}celltype;
typedef celltype *Stack;
void StMakeNull(Stack *S){
*S=NULL;}
int StEmpty(Stack S){
if(S==NULL) return 1;
else return 0;}
void StPush(elementtype x, Stack *S){
celltype *temp;
temp=*S;
*S=(celltype*)malloc(sizeof(celltype));
(*S)->element=x;
(*S)->next=temp;
}
void StPop(Stack *S){
if(StEmpty(*S)) return(202);
else{
celltype *temp;
temp=*S;
*S=(*S)->next;
free(temp);}}
elementtype StTop(Stack S){
if(StEmpty(S)) exit(202);
else return S->element;}
int prior(char c){
if(c=='+' || c=='-') return 1;
if(c=='(') return 0;
if(c=='*' || c=='/') return 2;
if(c=='p') return 3;
}
int main(){
Stack S, P, O;
elementtype x;
StMakeNull(&S);
StMakeNull(&O);
StMakeNull(&P);
char zn;
do{
printf("Upisi clan:\n");
scanf(" %c", &x);
if(x<='Z' && x>='A') StPush(x,&S);
else {
if(StEmpty(P) || x=='(')
StPush(x,&P);
else if(!StEmpty(P) && x==')'){
while(StTop(P)!='('){
StPush(StTop(P),&S);
StPop(&P);
} StPop(&P);}
else if(!StEmpty(P) && prior(x)>=prior(StTop(P)))
StPush(x,&P);
else if(!StEmpty(P) && prior(x)<=prior(StTop(P))){
while(!StEmpty(P) && prior(StTop(P)>=prior(x))){
StPush(StTop(P),&S);
StPop(&P);}
StPush(x,&S);}
}
printf("Zelis li dalje? d:n\n");
scanf(" %c", &zn);
}while(zn=='d');
while(!StEmpty(S)){
StPush(StTop(S),&O);
StPop(&S);
}
while(!StEmpty(O)){
printf("\n%c\n", StTop(O));
StPop(&O);
}
return 0;}[/code:1]
Ako ima tko volje, da mi kaže gdje griješim, ne mogu više vremena izgubiti na traženje greške
Program treba napraviti sljedeće: izraz u infixu prebaciti u postfix. Pri tome sam ja napravila da ne izbacuje elemente po redu na ekran, nego da ih sprema u stog S, te ga kasnije preokrenem u stogu O i ispisujem. Problem je što ignorira operatore, dakle, ispisuje samo operande. Eto, to je to
Kod: |
#include<stdio.h>
#include<stdlib.h>
typedef char elementtype;
typedef struct celltag{
elementtype element;
struct celltag *next;
}celltype;
typedef celltype *Stack;
void StMakeNull(Stack *S){
*S=NULL;}
int StEmpty(Stack S){
if(S==NULL) return 1;
else return 0;}
void StPush(elementtype x, Stack *S){
celltype *temp;
temp=*S;
*S=(celltype*)malloc(sizeof(celltype));
(*S)->element=x;
(*S)->next=temp;
}
void StPop(Stack *S){
if(StEmpty(*S)) return(202);
else{
celltype *temp;
temp=*S;
*S=(*S)->next;
free(temp);}}
elementtype StTop(Stack S){
if(StEmpty(S)) exit(202);
else return S->element;}
int prior(char c){
if(c=='+' || c=='-') return 1;
if(c=='(') return 0;
if(c=='*' || c=='/') return 2;
if(c=='p') return 3;
}
int main(){
Stack S, P, O;
elementtype x;
StMakeNull(&S);
StMakeNull(&O);
StMakeNull(&P);
char zn;
do{
printf("Upisi clan:\n");
scanf(" %c", &x);
if(x<='Z' && x>='A') StPush(x,&S);
else {
if(StEmpty(P) || x=='(')
StPush(x,&P);
else if(!StEmpty(P) && x==')'){
while(StTop(P)!='('){
StPush(StTop(P),&S);
StPop(&P);
} StPop(&P);}
else if(!StEmpty(P) && prior(x)>=prior(StTop(P)))
StPush(x,&P);
else if(!StEmpty(P) && prior(x)<=prior(StTop(P))){
while(!StEmpty(P) && prior(StTop(P)>=prior(x))){
StPush(StTop(P),&S);
StPop(&P);}
StPush(x,&S);}
}
printf("Zelis li dalje? d:n\n");
scanf(" %c", &zn);
}while(zn=='d');
while(!StEmpty(S)){
StPush(StTop(S),&O);
StPop(&S);
}
while(!StEmpty(O)){
printf("\n%c\n", StTop(O));
StPop(&O);
}
return 0;} |
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 23:46 uto, 19. 11. 2013 Naslov: |
|
|
Znam da mi se kodovi čine dugački, ali tako je samo zbog implementacije, bitna je samo jedna funkcija i main :D
Nego, xD ovdje me muči sljedeće:
program radi: Ubacuje usmjeren graf na način da za svaki vrh zapisuje u koji vrh ide, tako da napravi polje vrhova, u svako polje ubacuje red vrhova (nije tako komplicirano). I treba napisati duljinu između dva vrha koja ja ubacim. Problem je što nekada mi da točnu duljinu, a nekada ju smanji za jedan (ali samo za jedan). Gdje je problem?
[code:1]
#include<stdio.h>
#include<stdlib.h>
#define max 1000
typedef double elementtype ;
typedef struct{
elementtype elements[max];
int front, rear;
} Queue;
int addone(int i){
return ((i+1)%max);}
void QuMakeNull(Queue *Q){
Q->front=0;
Q->rear=max-1;}
int QuEmpty(Queue Q){
if(addone(Q.rear)==Q.front) return 1;
else return 0;}
void QuEnqueue(elementtype x, Queue *Q){
if(addone(addone(Q->rear))==Q->front) exit(301);
else{
Q->rear=addone(Q->rear);
Q->elements[Q->rear]=x;}}
void QuDequeue(Queue *Q){
if(QuEmpty((*Q))) exit(302);
else Q->front=addone(Q->front);}
elementtype QuFront(Queue Q){
if(QuEmpty(Q)) exit(302);
else return Q.elements[Q.front];}
int duljina(Queue G[], int p, int z){
int bio[max];
int i, dulj=-1;
Queue Q;
QuMakeNull(&Q);
if(p==z) return 0;
for(i=0; i<max; i++)
bio[i]=0;
QuEnqueue(p,&Q); bio[p]=1;
while(!QuEmpty(Q)){
int vrh=QuFront(Q);
++dulj;
while(!QuEmpty(G[vrh])){
int susjed=QuFront(G[vrh]);
QuDequeue(&G[vrh]);
if(!bio[susjed]){
QuEnqueue(susjed,&Q);
bio[susjed]=1;
if(susjed==z) return dulj;}}
QuDequeue(&Q);
}
}
int main(){
int n, i, x, p, z;
Queue *graf;
Queue G;
graf=(Queue*)malloc(n*sizeof(Queue));
char zn;
printf("Upisi duljinu:\n");
scanf("%d", &n);
for(i=0; i<n; i++){
QuMakeNull(&G);
do{
printf("Upisi cvorove u koje ide vrh %d:\n", i);
scanf("%d", &x);
QuEnqueue(x,&G);
printf("Jos?\n");
scanf(" %c", &zn);
}while(zn=='d');
graf[i]=G; }
printf("Duljina izmedu koja dva vrha:\n");
scanf("%d%d", &p,&z);
printf("\nje jednaka: %d\n", duljina(graf,p,z));
return 0;}
[/code:1]
Znam da mi se kodovi čine dugački, ali tako je samo zbog implementacije, bitna je samo jedna funkcija i main
Nego, xD ovdje me muči sljedeće:
program radi: Ubacuje usmjeren graf na način da za svaki vrh zapisuje u koji vrh ide, tako da napravi polje vrhova, u svako polje ubacuje red vrhova (nije tako komplicirano). I treba napisati duljinu između dva vrha koja ja ubacim. Problem je što nekada mi da točnu duljinu, a nekada ju smanji za jedan (ali samo za jedan). Gdje je problem?
Kod: |
#include<stdio.h>
#include<stdlib.h>
#define max 1000
typedef double elementtype ;
typedef struct{
elementtype elements[max];
int front, rear;
} Queue;
int addone(int i){
return ((i+1)%max);}
void QuMakeNull(Queue *Q){
Q->front=0;
Q->rear=max-1;}
int QuEmpty(Queue Q){
if(addone(Q.rear)==Q.front) return 1;
else return 0;}
void QuEnqueue(elementtype x, Queue *Q){
if(addone(addone(Q->rear))==Q->front) exit(301);
else{
Q->rear=addone(Q->rear);
Q->elements[Q->rear]=x;}}
void QuDequeue(Queue *Q){
if(QuEmpty((*Q))) exit(302);
else Q->front=addone(Q->front);}
elementtype QuFront(Queue Q){
if(QuEmpty(Q)) exit(302);
else return Q.elements[Q.front];}
int duljina(Queue G[], int p, int z){
int bio[max];
int i, dulj=-1;
Queue Q;
QuMakeNull(&Q);
if(p==z) return 0;
for(i=0; i<max; i++)
bio[i]=0;
QuEnqueue(p,&Q); bio[p]=1;
while(!QuEmpty(Q)){
int vrh=QuFront(Q);
++dulj;
while(!QuEmpty(G[vrh])){
int susjed=QuFront(G[vrh]);
QuDequeue(&G[vrh]);
if(!bio[susjed]){
QuEnqueue(susjed,&Q);
bio[susjed]=1;
if(susjed==z) return dulj;}}
QuDequeue(&Q);
}
}
int main(){
int n, i, x, p, z;
Queue *graf;
Queue G;
graf=(Queue*)malloc(n*sizeof(Queue));
char zn;
printf("Upisi duljinu:\n");
scanf("%d", &n);
for(i=0; i<n; i++){
QuMakeNull(&G);
do{
printf("Upisi cvorove u koje ide vrh %d:\n", i);
scanf("%d", &x);
QuEnqueue(x,&G);
printf("Jos?\n");
scanf(" %c", &zn);
}while(zn=='d');
graf[i]=G; }
printf("Duljina izmedu koja dva vrha:\n");
scanf("%d%d", &p,&z);
printf("\nje jednaka: %d\n", duljina(graf,p,z));
return 0;}
|
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
|
[Vrh] |
|
Studoš Forumaš(ica)
Pridružen/a: 07. 05. 2012. (15:14:14) Postovi: (11)16
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 21:07 sri, 20. 11. 2013 Naslov: |
|
|
@Studoš...
dok prolaziš kroz graf, ti želiš zapravo za jedan čvor ispisati u koje čvorove on može ići. naravno, neki se mogu i ponavljati, recimo da imaš G[0]=(1,2) i G[1]=(0) tada bi beskonačno za 0 išao u 1 pa u 0 pa u 1 pa u 0...uglavnom, u bio[i]=0 ili 1 bilježiš jesi li već prolazio tim čvorom. ako jesi, zapišeš 1, tako se nećeš dovesti u ovu situaciju...
@Studoš...
dok prolaziš kroz graf, ti želiš zapravo za jedan čvor ispisati u koje čvorove on može ići. naravno, neki se mogu i ponavljati, recimo da imaš G[0]=(1,2) i G[1]=(0) tada bi beskonačno za 0 išao u 1 pa u 0 pa u 1 pa u 0...uglavnom, u bio[i]=0 ili 1 bilježiš jesi li već prolazio tim čvorom. ako jesi, zapišeš 1, tako se nećeš dovesti u ovu situaciju...
|
|
[Vrh] |
|
Studoš Forumaš(ica)
Pridružen/a: 07. 05. 2012. (15:14:14) Postovi: (11)16
|
|
[Vrh] |
|
|