All pastes #368320 Raw Edit

Unnamed

public text v1 · immutable
#368320 ·published 2007-02-22 23:59 UTC
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&#65533;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&#65533;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&#65533;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;
		}



}