Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > нужно разобраться


Автор: DuftPunk 2.10.2012, 19:36
Здравствуйте.Пожалуйста прокомментируйте код , я не совсем понимаю что здесь к чему.то нужно добавить что бы считывало данные из консоли вводимые пользователем и считало их.Спасибо.

---- Задача :
 - вводятся цифры и знаки , например 7+4*5(6*4)/8 
программа производит действия по порядку ,если есть скобки то с начала то что в скобках потом все остальное , считает пока не будет введен знак =, после знака = выводит результат. 
Использовать - группировка объектов,рекурсия,scanner in,string builder buffer.парсинг. Предусмотреть exception ввода букв или знаков не имеющих отношения к выполнению. 

код
 
Код

package Calculytor;
import java.util.LinkedList;
import java.util.Scanner;

public class Calc {
    static boolean isDelim(char c) {
        return c == ' ';
    }
    static boolean isOperator(char c) {
        return c == '+' || c == '-' || c == '*' || c == '/' || c == '%';
    }
    static int priority(char op) {
        switch (op) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
            case '%':
                return 2;
            default:
                return -1;
        }
    }
    static void processOperator(LinkedList<Integer> st, char op) {
        int r = st.removeLast();
        int l = st.removeLast();
        switch (op) {
            case '+':
                st.add(l + r);
                break;
            case '-':
                st.add(l - r);
                break;
            case '*':
                st.add(l * r);
                break;
            case '/':
                st.add(l / r);
                break;
            case '%':
                st.add(l % r);
                break;
        }
    }
    public static int eval(String s) {
        LinkedList<Integer> st = new LinkedList<Integer>();
        LinkedList<Character> op = new LinkedList<Character>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (isDelim(c))
                continue;
            if (c == '(')
                op.add('(');
            else if (c == ')') {
                while (op.getLast() != '(')
                    processOperator(st, op.removeLast());
                op.removeLast();
            } else if (isOperator(c)) {
                while (!op.isEmpty() && priority(op.getLast()) >= priority(c))
                    processOperator(st, op.removeLast());
                op.add(c);
            } else {
                String operand = "";
                while (i < s.length() && Character.isDigit(s.charAt(i)))
                    operand += s.charAt(i++);
                --i;
                st.add(Integer.parseInt(operand));
            }
        }
        while (!op.isEmpty())
            processOperator(st, op.removeLast());
        return st.get(0);
    }
    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        String i = in.next() ;
        String exp = "7+(5*2)";
        while(i== "="){
        eval(exp);
        }
        System.out.println(eval(exp));
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)