rendered paste body# include<stdio.h>
# include<string.h>
# include <unistd.h>
# include <sys/types.h>
# include <stdio.h>
/*--------------------------------------------- */
/* 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;
}
}