[ lady-blue @ 19.01.2009. 20:28 ] @
za seminarski sam dobila temu "diferenciranje i bezzagradni izrazi", kod koji imam ispravno radi(postavlja zagrade i diferencira uneti izraz), osim jednog dela: sta ako izraz u sebi ima vise razlicitih promenljivih? kako da u tom slucaju bude diferenciranje pravilno? pocetnik sam u svemu ovome i ne snalazim se bas najbolje, a hitno mi je potrebno da resim problem... puno puno puno bi mi znacilo ako iko moze da mi pomogne unapred hvala a evo i koda: Code: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <alloc.h> #define novid(x) x = (struct drvo *)malloc(sizeof(struct drvo)) #define novil(x) x = (struct lista *)malloc(sizeof(struct lista)) struct drvo{ char *glava; struct drvo *levi; struct drvo *desni; }; struct lista{ struct drvo *glava; struct lista *rep; }; struct drvo *koren,*difkoren; char setac; struct drvo *uradi(void); struct drvo *dif(struct drvo *); struct drvo *sklop(struct drvo *,char *,struct drvo *); struct drvo *ponovi(struct drvo *); void ispis(struct drvo *); int op(char); main(){ printf("\n Unesi regularni izraz bez zagrada\n"); setac=getchar(); koren=uradi(); ispis(koren); printf("\n\n"); difkoren=dif(koren); ispis(difkoren); } struct drvo *uradi() { struct drvo *clan,*d,*o,*l; struct lista *kontrol,*poc; int i,prioritet=0; char ch[10]; novid(clan); novil(kontrol); kontrol->rep=NULL; kontrol->glava=clan; poc=kontrol; if(setac=='('){ setac=getchar(); kontrol->glava=uradi(); setac=getchar(); } else{ if(isdigit(setac)){ i=0; while(isdigit(setac)){ ch[i]=setac; setac=getchar(); i++; } ch[i]='\0'; } else{ ch[0]=setac; ch[1]='\0'; setac=getchar(); i=1; } clan->glava=(char *)malloc(i+1); strcpy(clan->glava,ch); clan->levi=NULL; clan->desni=NULL; } while(setac!=')' && setac!='\n'){ if( op(setac) && (prioritet==1) ){ d=poc->glava;poc=poc->rep; o=poc->glava;poc=poc->rep; l=poc->glava; poc->glava=o; o->levi=l; o->desni=d; } novil(kontrol);novid(clan); kontrol->glava=clan;kontrol->rep=poc; poc=kontrol; if(setac=='*'||setac=='/')prioritet=1; else if(setac=='+'||setac=='-')prioritet=0; if(setac=='('){ setac=getchar(); kontrol->glava=uradi(); setac=getchar(); } else{ if(isdigit(setac)){ i=0; while(isdigit(setac)){ ch[i]=setac; setac=getchar(); i++; } ch[i]='\0'; } else{ ch[0]=setac; ch[1]='\0'; setac=getchar(); i=1; } } clan->glava=(char *)malloc(i+1); strcpy(clan->glava,ch); clan->levi=NULL; clan->desni=NULL; } while(poc->rep){ d=poc->glava;poc=poc->rep; o=poc->glava;poc=poc->rep; l=poc->glava; poc->glava=o; o->levi=l; o->desni=d; } return(poc->glava); } int op(char a){ if((a=='+')||(a=='*')||(a=='/')||(a=='-'))return 1; else return 0; } struct drvo *dif(struct drvo *b){ struct drvo *b1,*b2,*b3,*b4,*c; if(isdigit(b->glava[0])){ novid(c); c->glava=(char *)malloc(2); strcpy(c->glava,"0"); c->levi=NULL; c->desni=NULL; } if(isalpha(b->glava[0])){ novid(c); c->glava=(char *)malloc(2); strcpy(c->glava,"1"); c->levi=NULL; c->desni=NULL; } if((!(strcmp(b->glava,"+")))||(!(strcmp(b->glava,"-")))) if((!strcmp(b->levi,b->desni))) {b1=sklop(dif(b->levi),b->glava,ponovi(b->desni)); b2=sklop(ponovi(b->levi),b->glava,dif(b->desni)); c=sklop(b1,b->glava,b2);} else { b1=dif(b->levi); b2=dif(b->desni); c=sklop(b1,b->glava,b2); } if(!(strcmp(b->glava,"*"))) {if(!(strcmp(b->levi,b->desni))) b1=sklop(dif(b->levi),"*",ponovi(b->desni)); b2=sklop(ponovi(b->levi),"*",dif(b->desni)); c=sklop(b1,"+",b2); } if(!(strcmp(b->glava,"/"))) { if(!(strcmp(b->levi,b->desni))) b1=sklop(dif(b->levi),"*",ponovi(b->desni)); b2=sklop(ponovi(b->levi),"*",dif(b->desni)); b3=sklop(b1,"-",b2); b4=sklop(ponovi(b->desni),"*",ponovi(b->desni)); c=sklop(b3,"/",b4); } return c; }; struct drvo *sklop(struct drvo *b1,char *op,struct drvo *b2){ struct drvo *b; novid(b); b->glava=(char *)malloc(strlen(op)); strcpy(b->glava,op); b->levi=b1; b->desni=b2; return b; } void ispis(struct drvo *b){ if(b->levi != NULL){ printf("("); ispis(b->levi); printf("%s",b->glava); ispis(b->desni); printf(")"); } else printf("%s",b->glava); } struct drvo *ponovi(struct drvo *b){ struct drvo *b1,*b2,*c; if(isdigit(b->glava[0])||(isalpha(b->glava[0]))) { novid(c); c->glava=(char *)malloc(strlen(b->glava)); strcpy(c->glava,b->glava); c->levi=NULL; c->desni=NULL; } if(op(b->glava[0])) { b2=ponovi(b->desni); b1=ponovi(b->levi); novid(c); c->glava=(char *)malloc(2); strcpy(c->glava,b->glava); c->levi=b1; c->desni=b2; } return c; }; EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to: [code] int main ( int argc, char *argv[] ) { // ... return 0; } [/code] [Ovu poruku je menjao X Files dana 19.01.2009. u 21:44 GMT+1] |