Calculette

Contenu du snippet

Calculette mode texte qui respecte l' ordre des multiplications et divisions, ne gère pas encore les parenthèses.

Source / Exemple :


import java.io.*;

public class calculette
{
	public static void main (String [] args)
	{
		String line="";
		char C = '\0';
		try
		{
        	while ((C=(char) System.in.read()) !='\n')
        	{
         		if (C != '\r')  line = line+C;
			}
		}
		catch (IOException e){}
		calculette c = new calculette(line);
	}
	
	public calculette(String chaine)
	{
		analyse(chaine);	
	}
		
	public void analyse(String chaine)
	{
		if(chaine.indexOf("+")!=-1 || chaine.indexOf("-")!=-1|| chaine.indexOf("*")!=-1|| chaine.indexOf("/")!=-1)
		{
			char multdivC;
			char AddSous;
			int i=0;
			boolean b = true;
			if(chaine.indexOf("*")!=-1 || chaine.indexOf("/")!=-1)//On resoud les * et / en premier
			{
				while(b==true)
				{
					multdivC = chaine.charAt(i);
					switch(multdivC)
					{
						case '*': multdiv(i,multdivC, chaine);b=false;
							break;
						case '/': multdiv(i, multdivC, chaine);b=false;
							break;
						default:
						
					}
					i++;
				}
			}
			else // si il n' y a plus ou pas de * ou / on resoud les additions et soustractions
			{
				i=0;
				b = true;
				while(b==true)
				{
					AddSous = chaine.charAt(i);
					switch(AddSous)
					{
						case '+': addSous(i,AddSous, chaine);b=false;
							break;
						case '-': addSous(i, AddSous, chaine);b=false;
							break;
						default:
					
					}
					i++;
				}
			}
		}
		else // plus d' operateur, on affiche la chaine
		{
			System.out.println("\t= "+chaine);
		}
			
	}
	public void multdiv(int pos, char op, String str)
	{
		int posOpP = recherchePosOpP(pos,str);//position de l' operateur qui précède op
		int posOpS = recherchePosOpS(pos,str);//position de l' operateur qui suit op
		String pre = str.substring(posOpP,pos);
		String Suivant = str.substring(pos+1, posOpS);
		double value1 = Double.parseDouble(pre);
		double value2 = Double.parseDouble(Suivant);
		double value = 0.0;
		switch(op)
		{
			case '*': value = value1*value2;
				break;
			case '/': value = value1/value2;
				break;
			default: 
				break;	
		}
		String New = str.substring(0,posOpP)+String.valueOf(value)+str.substring(posOpS);
		analyse(New);
		
	}
	public void addSous(int pos,char op, String str)
	{
		int posPM = recherchePosOpS(pos,str);// on s' occupe seulement de la position de l' opérateur qui suit op
		String P = str.substring(0,pos);
		String S = str.substring(pos+1,posPM);
		double valueP = Double.parseDouble(P);
		double valueS = Double.parseDouble(S);
		double result = 0.0;
		switch(op)
		{
			case '+': result = valueP+valueS;
				break;
			case '-': result = valueP-valueS;
				break;
			default: 
				break;		
		}
		String newStr = String.valueOf(result)+str.substring(posPM);
		analyse(newStr);
	}
	public int recherchePosOpP(int p,String str2)
	{
		String cut = str2.substring(0,p);
		if(cut.indexOf("+")!=-1 || cut.indexOf("-")!=-1)
		{
			int i = p-1;
			boolean b = true;
			while(b==true)
			{
				char opPre = str2.charAt(i);
				switch(opPre)
				{
					case '+': p=i+1;b=false;
						break;
					case '-': p=i+1;b=false;
						break;
					case '.': i--;
						break;
					default : i--;
						break;
				}
			}
		}
		else
			p=0;
		return p;
		
	}
	public int recherchePosOpS(int p2,String str3)
	{
		String cut = str3.substring(p2+1,str3.length());
		if(cut.indexOf("+")!=-1 || cut.indexOf("-")!=-1 || cut.indexOf("/")!=-1 || cut.indexOf("*")!=-1)
		{
			int i = p2+1;
			boolean b = true;
			while(b==true)
			{
				char opSuivant = str3.charAt(i);
				switch(opSuivant)
				{
					case '+': p2=i;b=false;
						break;
					case '-': p2=i;b=false;
						break;
					case '*': p2=i;b=false;
						break;
					case '/': p2=i;b=false;
						break;
					case '.': i++;
						break;
					default : i++;
						break;
				}
			}
		}
		else
			p2=str3.length();
		return p2;
	}
}

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.