Задать вопрос
Ответы пользователя по тегу Android
  • Почему stack оказывается пустым?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Ошибка была в неправильном парсинге постфиксной нотации. У меня сначала была проверка на то, что итерируемый элемент - число, а стоило мне поменять местами эти проверки (сначала проверяю итерируемый элемент на оператор) - всё заработало.

    Вот незначительная правка кода:
    private void parse() {
            String currentElement = "";
            String[] elements = regular.split(" ");
            double number1, number2, interAns;
    
            for (int i = 0; i < elements.length; i++) {
                currentElement = elements[i];
    
                // Check if current element is operator
              	if (isOperator(currentElement)) {
                  	if (stack.size() > 1 && !currentElement.equals("")) {
                      	 number2 = stack.pop();
                       	 number1 = stack.pop();
    
                       	 // Make calculations
                       	 if (currentElement.equals("+"))
                            interAns = number1 + number2;
                       	 else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                      	 else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                       	 else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                       	 else interAns = 0;
    
                        stack.push(interAns);
                    }
                } else {
                  	try {
                   		double element = Double.parseDouble(currentElement);
                    	stack.push(element);
                    } catch (NumberFormatException e) {
                      	System.out.println("Hmm...");
                    }
                }
              
              
              /*
                try {
                    double element = Double.parseDouble(currentElement);
                    stack.push(element);
                } catch (NumberFormatException e) {
                    if (!currentElement.equals("")) {
                        number2 = stack.pop();
                        number1 = stack.pop();
    
                        // Make calculations
                        if (currentElement.equals("+"))
                            interAns = number1 + number2;
                        else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                        else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                        else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                        else interAns = 0;
    
                        stack.push(interAns);
                    }
                }*/
            }
            interAns = stack.pop();
            result = interAns;
        }
    
    // Новая функция
    private boolean isOperator(String s) {
            return s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/");
    }


    Раньше мой код не мог парсить вот такие выражения: infix: 12 - 5 * 2 + 16 / 4 - 50 / 10 (postfix is 12 5 2 * - 16 4 / + 50 10 / -) - не совсем понимаю почему, но стоило мне поменять местами сравнения, так всё сразу заработало!

    5a2919e977bb5940625141.png

    Ну и ещё стоит отметить то, как отметил Денис Загаевский , что надо добавить доп.проверку на пустоту стека ( if (stack.size() > 1) ...).
    Ответ написан
    Комментировать
  • Почему приложение не работает при запуске apk файла?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Дело было в другом.

    Сбой разметки и как следствие ничего не работало
    Ответ написан
    Комментировать
  • Почему происходит шибка при создании БД (SQLite)в Android приложении?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    В общем-то проблема была в моей криворукости.

    При создании таблицы я написал вот это:
    String create_products_table = "CREATE TABLE " + TABLE_PRODUCTS + " (" +
                    COLUMN_ID + " INTEGER PRIMARY KEY, " + COLUMN_PRODUCTNAME + " TEXT," +
                    COLUMN_COAST + " INTEGER, " + COLUMN_INCOME + "INTEGER)";


    И я сам не заметил, но на выходе получил не совсем то, что нужно:
    CREATE TABLE products (_id INTEGER PRIMARY KEY, productname TEXT, coast INTEGER, incomeInteger TEXT);


    Т.е я забыл поставить пробел между COLUMN_INCOME и "INTEGER); и SQLite автоматически определил это как текст.

    126cd13f0c4d46369b67602b96f9cc1e.png
    Ответ написан