Member 13468675 Ответов: 3

Может ли кто-нибудь объяснить этот вывод? (JAVA-КОД)


public class Foo {
 private int[] arr;
 public Foo(int i) {
 arr = new int[i];
 for(int j = 0; j < i; j++) {
 arr[j] = j*3;
 }

 }
 public void h() {
 for(int j = arr.length-2; j >= 0; j--) {
 arr[j] = arr[j+1] + 3;
 }
 }

 public static void main(String[] args) {
 Foo f = new Foo(5);
 f.h();
 for(int j = 0; j < 5; j++) {
 System.out.println( f.arr[j] );
 }
 }
}


Каков вывод следующего кода? (Ответ должен быть 12,15,18,21,24)

Что я уже пробовал:

Я попытался решить этот код на бумаге, и хотя я получаю кратное 3, в отличие от (12,15,18,21,24), я получаю (3,9,12,15,18)? Что я делаю не так?

3 Ответов

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
Foo f = new Foo(5);

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!


Рейтинг:
0

Patrice T

Цитата:
Я попытался решить этот код на бумаге, и хотя я получаю кратное 3, в отличие от (12,15,18,21,24), я получаю (3,9,12,15,18)? Что я делаю не так?

Используйте отладчик, и вы увидите, как строится массив.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

Mohibur Rashid

Вы не поймете, даже если мы попытаемся объяснить. Вам лучше попробовать отладить.
Какой Редактор вы используете?
Почти все стандартные API поддерживают легкую отладку. Я могу предложить Вам Eclipse; есть также несколько других редакторов, которые поддерживают простую отладку. Вы также можете отлаживать из командной строки с помощью "jdb", но это немного сложно;

вот как обрабатывается ваша функция h

0 3 6 9 12
when j=3
 0   3  6 15 12              -- since you are adding arr[3+1]+3 and putting at arr[3]
when j=2
 0   3 18 15 12              -- since you are adding arr[2+1]+3 and putting at arr[2]
when j=1
 0  21 18 15 12              -- since you are adding arr[1+1]+3 and putting at arr[1]
when j=0
24  21 18 15 12              -- since you are adding arr[0+1]+3 and putting at arr[0]


Есть ли в этом смысл?