2014-02-05 2 views
0

В настоящее время я занимаюсь базовым курсом программирования. Учитель отказывается смотреть на мой код и пытается угадать вопрос, который я задаю, и затем ответить на этот (неверный) вопрос. Основой этого является то, что он должен принимать уравнение, такое как 5 * 6, и вывод «Пять раз шесть равен 30», причем ответ просто является числом. Код у меня прямо сейчас, как, например:Простой математический калькулятор

package mainPackage; 
import java.util.*; 


public class Main 
{ 
public static void main(String[]args) 
{ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter the equation"); 
    String input = scan.nextLine(); 

    String space = " "; 

    int firstSpace = 0; 
    int secondSpace = 0; 

    int numInt1 = 0; 
    int numInt2 = 0; 

    String a = "0"; 
    char b = 'a'; 
    String c = "0"; 

    firstSpace = input.indexOf(space); 


    String sub = input.substring((firstSpace + 1), input.length()); 

    secondSpace = sub.indexOf(space); 

    a = input.substring(firstSpace--); 
    b = input.charAt(firstSpace++); 
    c = input.substring(secondSpace++); 

    numInt1 = Integer.parseInt(a); 
    numInt2 = Integer.parseInt(c); 


    String num1 = ""; 
    String op = ""; 
    String num2 = ""; 

    switch (numInt1) 
    { 
     case 0: 
     { 
      num1 = "Zero"; 
     } 

     case 1: 
     { 
      num1 = "One"; 
     } 

     case 2: 
     { 
      num1 = "Two"; 
     } 

     case 3: 
     { 
      num1 = "Three"; 
     } 

     case 4: 
     { 
      num1 = "Four"; 
     } 

     case 5: 
     { 
      num1 = "Five"; 
     } 

     case 6: 
     { 
      num1 = "Six"; 
     } 

     case 7: 
     { 
      num1 = "Seven"; 
     } 

     case 8: 
     { 
      num1 = "Eight"; 
     } 

     case 9: 
     { 
      num1 = "Nine"; 
     } 
    } 

    System.out.println(a); 
    System.out.println(b); 
    System.out.println(c); 

} 
} 

Она рассказала нам, что между каждым номером и операндом, она поместит пространство. Таким образом, вместо 5/6 это будет 5/6, и нам нужно сделать это только с 0 до 9, но все же нужно определить, добавляет ли она двузначный номер и печатает неверный номер. Эта часть, которую я знаю, как это сделать. Проблема возникает, когда я пытаюсь запустить это. Никакие ошибки не обнаруживаются в линиях, но когда я запускаю его, я получаю это:

Exception in thread "main" java.lang.NumberFormatException: For input string: " * 6" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at mainPackage.Main.main(Main.java:44) 

Это заканчивает тем, что эта линия:

numInt1 = Integer.parseInt(a); 

При удалении их, код печатает что-то вроде это:

"5 
* 6 
* 6" 

Кто-нибудь знает, почему это происходит? Мне кажется, что это что-то больно очевидное, что я пропустил.

EDIT: Спасибо вам большое за ваши быстрые ответы. Она никогда не учила нас методу разделения. Еще раз спасибо!

+0

привет, добро пожаловать на сайт. Вы пробовали отладку? Если вы используете Eclipse, вы можете запустить его в режиме отладки, установить точки останова и шаг за шагом выполнить шаг за шагом. – ashes999

+0

'a = input.substring (firstSpace -);' должно быть 'a = input.substring (0, firstSpace -);' – Phylogenesis

ответ

0

Это можно сделать с помощью функции String.split(String regex)

String arr[] = input.split("\\s+");// splitting input by space 

numInt1 = Integer.parseInt(arr[0]);//5 
numInt2 = Integer.parseInt(arr[2]);//6 
char b = arr[1].charAt(0);//* 
+0

Это сработало отлично, я так рад, что вы упомянули этот метод разделения. Никогда не слышал об этом, никогда его не учили, но он отлично работает для некоторых вещей, с которыми я столкнулся и в других программах. – Makaires

0

Если вы знаете, что ввод представляет собой число, пробел, оператор, пробел и число, то это означает, что длина ввода составляет пять символов. Ничего другого, кроме этого, неверно. Затем вы также можете проверить, соответствуют ли эти пять символов данному формату.

В общем, вы всегда должны проверять ввод пользователя, прежде чем передавать его методам, ожидающим определенного ввода. Пользователь может ввести что угодно, и это зависит от вашей программы, чтобы убедиться, что вход соответствует желаемому формату.

+0

Я выбрал if (input.length> 5) System.exit (0); там, спасибо за это. – Makaires

0

Ваша проблема, скорее всего, в этих строках.

a = input.substring(firstSpace--); 
b = input.charAt(firstSpace++); 

Есть две проблемы, которые я вижу. Сначала использование - и ++ фактически меняет значение firstSpace. Похоже, что b будет содержать пространство вместо арифметического оператора. Вы можете помочь себе выяснить, что происходит, посылая некоторые сообщения System.out.println(), чтобы увидеть, что происходит с вашими индексными переменными.

Во-вторых, метод подстроки с одним параметром создает подстроку из данного индекса в конец строки. Я думаю, вы можете действительно хотите сделать что-то вроде:

a = input.substring(0, firstSpace-1); 

Это даст вам подстроку с начала ввода в символ до первого пробела.

+0

Ах, это было от индекса до конца? По какой-то причине я предположил, что это был именно тот индекс, спасибо! – Makaires

1

Прежде всего, я думаю, вам следует ознакомиться с отладчиком.Это очень полезно, и почти невозможно запрограммировать программу размером более 20 строк без необходимости;)

Теперь примите во внимание две вещи: подстрока (beginIndex) возвращает подстроку, начинающуюся с этого индекса (На основе 0) до конца строки. Вот почему "5 * 6".substring(1) вернет " * 6" (1 - это «позиция»/индекс первого пробела в строке «5 * 6», потому что он основан на 0). Вот почему вы получаете выражение, выражающее выражение в значение Integer. Другое дело, что firstSpace ++ или firstSpace-- увеличивают и уменьшают значение firstSpace, соответственно, и будут делать это ПОСЛЕ остальной части команды. Так на самом деле:

a = input.substring(firstSpace--); 
b = input.charAt(firstSpace++); 
c = input.substring(secondSpace++); 

эквивалентно что-то вроде этого:

a = input.substring(firstSpace); 
firstSpace = firstSpace - 1; 
b = input.charAt(firstSpace); 
firstSpace = firstSpace + 1; 
c = input.substring(firstSpace); 
firstSpace = firstSpace - 1; 

И вы потеряли то, что вы хотите достичь. Существует несколько решений ваших проблем. Некоторые из них предлагаются выше. Некоторые используют инструменты, которые немного более продвинутые, но вы также можете решить проблемы без использования других методов помощи (более длинные и уродливые, но все равно будут работать). Мой совет привык к использованию отладчика, он может помочь вам быстро найти проблему в этой ситуации.

+0

Я не могу поверить, что забыл, что он добавляет один к переменной, а не только для метода. Спасибо, что упомянули об этом! – Makaires

Смежные вопросы