# include # include # include # include # include /*--------------------------------------------- */ /* fonction valcar determine la valeur numerique*/ /* d'un caractere */ /*--------------------------------------------- */ int valcar(char x) { switch (x) { case '0':return( 0); case '1':return( 1); case '2':return( 2); case '3':return( 3); case '4':return( 4); case '5':return( 5); case '6':return( 6); case '7':return( 7); case '8':return( 8); case '9':return( 9); default:return (0); } } /*----------------------------------------------*/ /* fonction verifoper determine si un caractere */ /* est une operateur */ /*--------------------------------------------- */ int verifoper(char x) { switch (x) { case '+' : case '-' : case '*' : case '/' :return( 1); default :return (0); } } /*----------------------------------------------*/ /*----------fonction recusrcive simple----------*/ /*--------------------------------------------- */ int eval1(char* chaine) { char chaine2[100];char chaine1[100]; int lng,oper,stop,i,j,ctl,pos,gauche,operateur,result; int simple,arg1,arg2; simple=0; /* permet de determiner si c'est une expression simple ou non*/ for(i=0;i<=strlen(chaine);i++) { if (verifoper(chaine[i])==1) { simple++; } } /*----------------------------------------------------------------------------*/ /* condition d'arret de la recurcivit�et calcul de l'expression*/ if (simple==0) { arg1=0; for(i=0;i<=strlen(chaine)-1;i++) { arg1=arg1*10+valcar(chaine[i]); } return(arg1); } else{ if (simple==1) { arg1=0;arg2=0;gauche=1; /*construction de l operande gauche et droite et determination de l operateur */ for(i=1;i<=strlen(chaine)-2;i++) { if(verifoper(chaine[i])==1){gauche=0;operateur=chaine[i];} else { if(gauche==1){arg1=arg1*10+valcar(chaine[i]);} if(gauche==0){arg2=arg2*10+valcar(chaine[i]);} } } /*calcul de l expression*/ switch (operateur) { case '+' :arg1=arg1+arg2;break; case '-' :arg1=arg1-arg2;break; case '*' :arg1=arg1*arg2;break; case '/' :arg1=arg1/arg2;break; } printf("sous expression avec simple operande a calculer %s \n",chaine); printf("\t resultat: %d \n",arg1); return(arg1); } /*----------------------------------------------------------------------------*/ /* partie recurcive*/ else { lng=strlen(chaine); stop=0; i=0; ctl=0; while ((stop==0)&&(i<=lng)) { if( chaine[i]=='(') {ctl=ctl+1;} if( chaine[i]==')') {ctl=ctl-1;} oper=0; if (verifoper(chaine[i])==1) { oper=1; } if((oper==1)&&(ctl==1)) { stop=1; pos=i; } i++; } j=0; for(i=1;i<=pos-1;i++) { chaine1[j]=chaine[i]; chaine1[j+1]='\0'; j++; } j=0; for(i=pos+1;i<=lng-2;i++) { chaine2[j]=chaine[i]; chaine2[j+1]='\0'; j++; } printf("sous expression gauche %s \n",chaine1); printf("sous expression droite %s \n",chaine2); switch (chaine[pos]) { case '+' :result=eval1(chaine1)+eval1(chaine2);printf("\t resultat: %d \n",result);break; case '-' :result=eval1(chaine1)-eval1(chaine2);printf("\t resultat: %d \n",result);break; case '*' :result=eval1(chaine1)*eval1(chaine2);printf("\t resultat: %d \n",result);break; case '/' :result=eval1(chaine1)/eval1(chaine2);printf("\t resultat: %d \n",result);break; } return(result); } } } /*----------------------------------------------*/ /*----------fonction recusrcive 2 fils----------*/ /*--------------------------------------------- */ int eval2(char* chaine) { char chaine2[100];char chaine1[100]; int lng,oper,stop,i,j,ctl,pos,gauche,operateur,result; int simple,arg1,arg2; int pid1; int pid2; simple=0; /* permet de determiner si c'est une expression simple ou non*/ for(i=0;i<=strlen(chaine);i++) { if (verifoper(chaine[i])==1) { simple++; } } /*----------------------------------------------------------------------------*/ /* condition d'arret de la recurcivit�et calcul de l'expression*/ if (simple==0) { arg1=0; for(i=0;i<=strlen(chaine)-1;i++) { arg1=arg1*10+valcar(chaine[i]); } return(arg1); } else{ if (simple==1) { arg1=0;arg2=0;gauche=1; /*construction de l operande gauche et droite et determination de l operateur */ for(i=1;i<=strlen(chaine)-2;i++) { if(verifoper(chaine[i])==1){gauche=0;operateur=chaine[i];} else { if(gauche==1){arg1=arg1*10+valcar(chaine[i]);} if(gauche==0){arg2=arg2*10+valcar(chaine[i]);} } } /*calcul de l expression*/ switch (operateur) { case '+' :arg1=arg1+arg2;break; case '-' :arg1=arg1-arg2;break; case '*' :arg1=arg1*arg2;break; case '/' :arg1=arg1/arg2;break; } printf("sous expression avec simple operande a calculer %s \n",chaine); printf("\t resultat: %d \n",arg1); return(arg1); } /*----------------------------------------------------------------------------*/ /* partie recurcive*/ else { lng=strlen(chaine); stop=0; i=0; ctl=0; while ((stop==0)&&(i<=lng)) { if( chaine[i]=='(') {ctl=ctl+1;} if( chaine[i]==')') {ctl=ctl-1;} oper=0; if (verifoper(chaine[i])==1) { oper=1; } if((oper==1)&&(ctl==1)) { stop=1; pos=i; } i++; } j=0; for(i=1;i<=pos-1;i++) { chaine1[j]=chaine[i]; chaine1[j+1]='\0'; j++; } j=0; for(i=pos+1;i<=lng-2;i++) { chaine2[j]=chaine[i]; chaine2[j+1]='\0'; j++; } printf("sous expression gauche %s \n",chaine1); printf("sous expression droite %s \n",chaine2); pid1 = fork(); if (pid1 == 0) { /*sleep (rand()%4);*/ arg1=eval2(chaine1); return(arg1); } pid2 = fork(); if (pid2 == 0) { /*sleep (rand()%4);*/ arg2=eval2(chaine2); return(arg2); } waitpid (pid1, NULL, 0); waitpid (pid2, NULL, 0); switch (chaine[pos]) { case '+' :result=arg1+arg2;printf("\t resultat: %d \n",result);break; case '-' :result=arg1-arg2;printf("\t resultat: %d \n",result);break; case '*' :result=arg1*arg2;printf("\t resultat: %d \n",result);break; case '/' :result=arg1/arg2;printf("\t resultat: %d \n",result);break; } return(result); } } } /*----------------------------------------------*/ /*----------fonction recusrcive 1 fils----------*/ /*--------------------------------------------- */ int eval3(char* chaine) { char chaine2[100];char chaine1[100]; int lng,oper,stop,i,j,ctl,pos,gauche,operateur,result; int simple,arg1,arg2; int pid; simple=0; /* permet de determiner si c'est une expression simple ou non*/ for(i=0;i<=strlen(chaine);i++) { if (verifoper(chaine[i])==1) { simple++; } } /*----------------------------------------------------------------------------*/ /* condition d'arret de la recurcivit�et calcul de l'expression*/ if (simple==0) { arg1=0; for(i=0;i<=strlen(chaine)-1;i++) { arg1=arg1*10+valcar(chaine[i]); } return(arg1); } else{ if (simple==1) { arg1=0;arg2=0;gauche=1; /*construction de l operande gauche et droite et determination de l operateur */ for(i=1;i<=strlen(chaine)-2;i++) { if(verifoper(chaine[i])==1){gauche=0;operateur=chaine[i];} else { if(gauche==1){arg1=arg1*10+valcar(chaine[i]);} if(gauche==0){arg2=arg2*10+valcar(chaine[i]);} } } /*calcul de l expression*/ switch (operateur) { case '+' :arg1=arg1+arg2;break; case '-' :arg1=arg1-arg2;break; case '*' :arg1=arg1*arg2;break; case '/' :arg1=arg1/arg2;break; } printf("sous expression avec simple operande a calculer %s \n",chaine); printf("\t resultat: %d \n",arg1); return(arg1); } /*----------------------------------------------------------------------------*/ /* partie recurcive*/ else { lng=strlen(chaine); stop=0; i=0; ctl=0; while ((stop==0)&&(i<=lng)) { if( chaine[i]=='(') {ctl=ctl+1;} if( chaine[i]==')') {ctl=ctl-1;} oper=0; if (verifoper(chaine[i])==1) { oper=1; } if((oper==1)&&(ctl==1)) { stop=1; pos=i; } i++; } j=0; for(i=1;i<=pos-1;i++) { chaine1[j]=chaine[i]; chaine1[j+1]='\0'; j++; } j=0; for(i=pos+1;i<=lng-2;i++) { chaine2[j]=chaine[i]; chaine2[j+1]='\0'; j++; } printf("sous expression gauche %s \n",chaine1); printf("sous expression droite %s \n",chaine2); pid = fork(); if (pid == 0) { sleep (rand()%4); arg1=eval3(chaine1); printf("test1: %d \n",arg1); return(arg1); } printf("test1: %d \n",arg1); arg2=eval3(chaine2); waitpid (pid, NULL, 0); switch (chaine[pos]) { case '+' :result=arg1+arg2;printf("\t resultat: %d \n",result);break; case '-' :result=arg1-arg2;printf("\t resultat: %d \n",result);break; case '*' :result=arg1*arg2;printf("\t resultat: %d \n",result);break; case '/' :result=arg1/arg2;printf("\t resultat: %d \n",result);break; } return(result); } } } int main() { char t[100];int choix; printf("BIENVENUE DANS LE PROGRAMME \r\n"); printf("donner moi l'expression a calculer\n"); scanf("%s",&t); printf("Quelle methode voudriez vous essayez\n"); printf("Tapez 1 pour une execution avec un seul processus\n"); printf("Tapez 2 pour une execution avec deux processus fils\n"); printf("Tapez 3 pour une execution avec un seul processus fils\n"); scanf("%d",&choix); switch (choix) { case 1 :printf("le resultat du calucul de votre expression est %d \n",eval1(t));;break; case 2 :printf("le resultat du calucul de votre expression est %d \n",eval2(t));;break; case 3 :printf("le resultat du calucul de votre expression est %d \n",eval3(t));;break; } }