Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

diferenciranje izraza sa vise promenljivih-pomoc

[es] :: C/C++ programiranje :: C/C++ za početnike :: diferenciranje izraza sa vise promenljivih-pomoc

[ Pregleda: 2721 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

lady-blue
student

Član broj: 209076
Poruke: 1
*.adsl-a-2.sezampro.yu.



Profil

icon diferenciranje izraza sa vise promenljivih-pomoc19.01.2009. u 20:28 - pre 184 meseci
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]
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: diferenciranje izraza sa vise promenljivih-pomoc

[ Pregleda: 2721 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.