Calculatrice gérant les priorétiés, les parenthèses, et les variables.

Description

Voici l'INTEGRALITE du code de ma calculette
Cette calculatrice faite en Visual C++ execute des calculs entrés comme chaine de caracteres en l'analysant.
Le principe utilise bcp la récursivité, donc ca peut etre un peu compliqué a comprendre (enfin... pour moi :-/)
@++
PS : il manque quand meme pas mal de choses, masi bon je le ferai si g le tps un jour...
///////////\\\\\\\\\\\\\\

www.aranor.fr.st


\\\\\\\\\\\//////////////

Source / Exemple :


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int cur=0;
int var[26];

//prototypes
char nextop(char* s);
int numvariable(char* s);
int nextfactor(char *s);
int terme(char* s);
char *epure_str(char *str);
void help();
void tempo();

int effectuer(int val1,char op,int val2)
{
	int res=0;
	printf("effectuer :  calcul de %d %c %d donne ",val1,op,val2);
	switch(op) {
		case '+' : res=(val1+val2); break;
		case '*' : res=(val1*val2); break;
		case '-' : res=(val1-val2); break;
		case '/' :	if (val2==0) {printf("div par 0 !\n");res=999999;}
			else {res=(val1/val2);}; break;
		case ')' : res=val1; break;
		default : printf("effectuer : Opération non reconnue\n");
				}
		printf("%d\n",res);
		return res;
}

void assigner(int val,int numvar)
{
	var[numvar]=val;
	printf("affectation : %c=%d\n",numvar+0x41,val);

}

int nextnombre(char* s) //<=> "(next)opérande"
{	
	int a=0;
	bool neg=false;
	if (s[cur]=='-') {neg=true;cur++;}
	
	a=(s[cur])-48; //49 est le code ASCII de 1
	if (a>=0 && a<=9) //nombre normal
	{
		cur++;
		while (s[cur]>=48 && s[cur]<=58) {a=a*10+(s[cur++])-48;}
	}
	else if (s[cur]>=0x41 && s[cur]<=0x5A) //variable (A..Z)
	{
		a=var[s[cur]-0x41];
		cur++;
	}
	else if (s[cur]=='(') //parenthese
	{
		cur++;
		a=terme(s);
	}

	if (neg) {a=-a;};
	return a;
}

int numvariable(char* s)
{
	int a=0;
	a=s[cur]-0x41; //lettre dans la commande moins ASCII de A
	cur++;
	return a;
}

char nextop(char* s)
{
	char op=s[cur];
	if (op!='+' && op!='*' && op!='-' && op!='/' && op!='='
		&& op!='>' && op!=')') 
	{printf("nextop : op '%c'non reconnue\n",op);tempo();}
	else {cur++;}
	return op;
}

int nextfactor(char *s)
{
	char opcur;
	int a;
	int res=nextnombre(s);
	while (s[cur] !='+' 
		&& s[cur] !='-' 
		&& s[cur] !='\0'
		&& s[cur] !='>'
		&& s[cur] !=')'
		&& s[cur] !='=') {
		
		opcur=nextop(s);
		a=nextnombre(s);
		res=effectuer(res,opcur,a);	

	}

	return res;
}

int terme(char* s)
{
	int a=0;
	char opcur;
	int res=0;

	res=nextfactor(s);
		while ((s[cur]) !='\0' && (s[cur]) !='=' && s[cur]!=')') {
					
			opcur=nextop(s);
			if (opcur=='>') //affectation
			{
				assigner(res,numvariable(s));
			}
			else
			{
				a=nextfactor(s);
				res=effectuer(res,opcur,a);
			}
		}
	if (s[cur]==')') {cur++;}
	return res;
}

void main()
{
	printf("initialisation...\n");
	bool conti=true;
	char* org=(char*)malloc(50*sizeof(char));
	char* s=(char*)malloc(50*sizeof(char));
	//initialisation tableau des variables
	for (int i=0;i<=26;i++){var[i]=0;}
	printf("\n\t******************************\n");
	printf("\t*** AranoR Calculator v1.1 ***\n");
	printf("\t******************************\n");
	printf("'q' pour quitter, '?' pour l'aide\n");
	while(conti) {

	printf("\nEntrer le calcul :\n");
	
	scanf("%s",org);
	s=org;
	
	int res=0;
	if (*s=='q') {conti=false;}
	else if (*s=='?') {help();}
	else {

	cur=0;
	s=epure_str(s);
	res=terme(s);

	printf("Resultat  : %d \n\n",res);
	var[0x52-0x41]=res;
	}
	}
	//liberation mémoire
	printf("Suppression des donnees dynamiques...\n");
	free((void*)org);
	printf("\t*** Programme termine.***\n");
	

}

//made by NaSSin
char *epure_str(char *str)
{
	char *ret;
	int i;
	int j;
	ret = (char*)malloc(strlen(str) + 1);
	for (i = j = 0; str[i]; i++)
	{
		if (str[i] != ' ' && str[i] != '\t')
		ret[j++] = str[i];
	}
	ret[j] = 0;
	return (ret);
}
//fin

void tempo()
{ for(int j=0;j<9999;j++)
	{for(int k=0;k<9999;k++){}}
}

void help()
{
printf("\t<<<AIDE>>>\n");
printf("+,*,-,/\toperations de base\n");
printf("A..Z\tvariables. ex:\n\t15>B affecte 15 a la variable B.\n");
printf("R\tdernier resulat calcule\n");
printf("?\taffiche l'aide\n");
printf("q\tquitte le programme\n");
putchar('\n');
}

Conclusion :


Tous mes autres progs sont sur :
///////////\\\\\\\\\\\\\\

www.aranor.fr.st


\\\\\\\\\\\//////////////
mail : aranor@infonie.fr

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.