2016-02-09 3 views
1

Я написал эту программу:Распечатка массива Java

public class FunctionEvaluator { 
    public static Scanner console = new Scanner(System.in); 

    public static void main(String[] args) { 
     int degree; 
     System.out.print("What degree would you like your polynomial to be? "); 
     degree = console.nextInt(); 
     int a[] = new int[degree + 1]; 
     int coefficient; 

     for (int i = 0; i <= degree; i++) { 
      System.out.print("Coefficient of the x^" + (degree - i) + " term: "); 
      coefficient = console.nextInt(); 

      a[i] = coefficient; 
     } 

     System.out.print("f(x) = "); 

     for (int i = 0; i < degree + 1; i++) { 
      System.out.print(a[i] + "x^" + (degree - i)); 

      if (a[i] == degree) { 
       System.out.println(" "); 
      } else if (a[i + 1] >= 0 && a[i + 1] < degree) { 
       System.out.print(" + "); 
      } else if (a[i] < 0) { 
        System.out.print(" - "); 
      } else { 
        System.out.print(" "); 
      } 
     } 

     System.out.println(); 

     int x; 
     int yN = 0; 
     double fOfX = 0; 
     double sum1; 

     do { 
      System.out.print("Give a value for x: "); 
      x = console.nextInt(); 
      int deg = degree; 
      for (int i = 0; i <= degree; i++) { 
       sum1 = a[i] * Math.pow(x, deg); 
       deg--; 
       fOfX = fOfX + sum1; 
      } 

      System.out.println("f(" + x + ") = " + fOfX); 

      System.out.print("Do you want to go again (1 for yes and 0 for no)? "); 
      yN = console.nextInt(); 
     } while (yN == 1); 

     System.out.println("Done."); 

    } 

И есть проблема с этим кодом:

System.out.print("f(x) = "); 

     for (int i = 0; i < degree + 1; i++) { 
      System.out.print(a[i] + "x^" + (degree - i)); 

      if (a[i] == degree) { 
       System.out.println(" "); 
      } else if (a[i + 1] >= 0 && a[i + 1] < degree) { 
       System.out.print(" + "); 
      } else if (a[i] < 0) { 
        System.out.print(" - "); 
      } else { 
        System.out.print(" "); 
      } 
     } 

Основной код должен спросить пользователя о степени полинома и коэффициенты, а затем выполнить некоторую математику. Если я прокомментирую вышеприведенный сегмент кода, программа работает нормально. Однако, когда я оставляю код выше (он должен распечатать функцию), программа вылетает из строя. Я подозреваю, что это имеет какое-то отношение к ограничениям цикла for, но независимо от того, что я изменяю или изменяю, программа по-прежнему падает. Может ли кто-нибудь сказать мне, что случилось, и почему программа не будет работать? IntelliJ говорит мне, что проблема заключается в первом else, если строка или вложенный оператор if в цикле for, если это помогает.

+0

Какое исключение вызывает сбой? – ostrichofevil

+3

И в какой строке – Gavriel

+0

ArrayIndexOutOfBoundsException я бы догадался. a [i] - это самое высокое, что вы можете сделать. – GoGoCarl

ответ

2

Вы индексируете a[i+1], но a is int [degree + 1], поэтому в конце цикла вы находитесь пытаясь достичь [степени + 1], и нет такого пункта, последний является [степень]

Возможно вам понадобится:

} else if (i < degree && a[i + 1] >= 0 && a[i + 1] < degree) { 

BTW у вас есть другие нелогичные части вашего кода. Например:

if (a[i] == degree) { 

Вы сравниваете [i] со степенью, но это не имеет никакого отношения к степени. Вы, вероятно, захотите сравнить i == degree. См. Этот пример:

degree = 2 
a[0] = 7, a[1] = 2, a[2] = 3 // 7 * x^2 + 2 * x + 3 

Как вы видите, вы должны сравнить степень с индексом, а не со значением элемента массива.

Я бы предложил вам переписать код со следующим советом: попробуйте использовать индексы в массиве, а не «в обратном порядке». Это будет гораздо более естественным, и каждый индекс будет exacty показатель:

a[2] = 7, a[1] = 2, a[0] = 3 // note: 3 * x^0 = 3 * 1 = 3 

Так как вы в любом случае заполнения всех элементов в массиве, это не имеет значения, если вы петля на ней в порядке убывания ,

+0

Вот что я понял, но я не могу найти другой способ распечатать функцию, потому что я заказал коэффициенты назад в массиве, т. Е. Если это квадратичная функция, коэффициент при х^4 находится в точке 0, х^3 в точке 1 и так далее. – ch1maera

+1

Затем просто добавьте i Gavriel

0
else if (a[i + 1] >= 0 && a[i + 1] < degree) 

Это, кажется, ваша проблема. Вы будете иметь размер массива + 1. Мое предположение будет вашей ошибкой: ArrayIndexOutOfBoundsException

+0

Да, ошибка ArrayIndexOutOfBoundsException: 5 – ch1maera

+0

Вам придется переосмыслить, как вы это делаете для цикла. Всякий раз, когда вы используете + 1 или - 1 в массиве, вы должны принять дополнительные меры предосторожности, чтобы убедиться, что у вас нет исключения ArrayIndexOutOfBoundsException. –

+0

Хорошо, спасибо. Я попытаюсь проверить, могу ли я переписать его, чтобы избежать ошибки. – ch1maera

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