Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package core;
- //Requier Java 1.5+
- import java.util.Scanner;//Lecture d'un flux sur base d'expressions régulières
- import java.util.Stack;//Une pile
- public class NpiEvaluator {
- final static String[] ops={"+","-","*","/","mod","max","min"};//Liste des opérateurs
- public static void main(String[] arg){
- Scanner clavier=new Scanner(System.in);//permet la lecture d'une saisie utilisateur
- System.out.println("Entrez une expression NPI ou \"q\" pour quitter");//Affichage d'un message sur stdout
- System.out.print(">");
- String calc=clavier.nextLine(); // Récupération de la ligne suivante sur stdin
- while(!calc.equals("q")){
- System.out.print("le résultat est : ");
- System.out.println(evaluate(calc)); // Appel à la fonction d'évaluation, fonction principale du programme !
- System.out.println("Entrez une expression NPI ou \"q\" pour quitter");
- System.out.print(">");
- calc=clavier.nextLine();
- }
- System.out.println("Au revoir :-)"); // Notifier l'utilisateur que le programme est terminé.
- }
- public static int evaluate(String calc){
- Stack<String> op=new Stack<String>(); // Une pile, elle sera utilisé comme une pile LIFO
- String[] tabOp=calc.split(" ");//Retourne le tableau de chaine des élléments séparés par " " (espace blanc Ascii(20))
- for(int i=0;i<tabOp.length;i++){
- if(isOperande(tabOp[i])){//Si on est sur un opérateur, alors, on POP.
- int op1=Integer.parseInt(op.pop());
- int op2=Integer.parseInt(op.pop());
- op.push(doOperande(tabOp[i], op1, op2));//On effectue l'opération
- }else{
- op.push(tabOp[i]);//On est sur un opérande, on le stocke sur la pile
- }
- }
- return Integer.parseInt(op.pop());//On travail avec des chaines, il faut les convertir en entier.
- }
- public static boolean isOperande(String op){//Fonction wrap, elle permet de donner un sens à une ligne de code (Abstraction).
- return isIn(op,ops);
- }
- public static boolean isIn(String what,String[] where){//Vérifie la présence d'une chaine dans un tableau de chaine
- for(int i=0;i<where.length;i++){
- if(where[i].equals(what))return true;
- }
- return false;
- }
- public static String doOperande(String op,int op1,int op2){//Execute une opration, retourne 0 si l'opération est inconnue.(risque d'effets de bord, vous DEVEZ implémenter une exeption)
- if(op.equals("+")){
- return ""+(op1+op2);
- }else if(op.equals("-")){
- return ""+(op2-op1);
- }else if(op.equals("*")){
- return ""+op1*op2;
- }else if(op.equals("/")){
- return ""+op2/op1;
- }else if(op.equals("mod")){
- return ""+op2%op1;
- }else if(op.equals("max")){
- return ""+(op1>op2?op1:op2);
- }else if(op.equals("min")){
- return ""+(op1>op2?op2:op1);
- }
- return "0";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement