AbdelrahmanNassar Ответов: 3

Что не так с этим java кодом


он не показывает никаких выходных данных, и я не знаю причины.

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

например; если у меня есть этот массив {1,3,4,5,0} и пользователь хочет добавить {2}, массив должен быть обновлен до {1,2,3,4,5}.

но на самом деле происходит то, что он дает неправильный результат, который равен {1,3,4,2,0}

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

public class TTTTTTEEESST {

	public static void main(String[] args) {
		
		int[] a = new int[5];
		int cap = -1 ;
		a[0]=1;
		cap++;
		a[1]=3;
		cap++;
		a[2]=4;
		cap++;
		a[3]=5;
		cap++;
		TTTTTTEEESST t = new TTTTTTEEESST();
		for(int e=0; e<=4; e++)
			System.out.println(a[e]);
		System.out.println("");
		t.add(2, a, cap);
		}
	
	public void add(int el, int[] arr, int c) {
		int i=c;
		while( i <= c ) {
			if( arr[i] >= el && arr[i] != 0 ) {		
				arr[i++] = arr[i];
				i--;
			}		
			else {	
				arr[i++]=el;
			}
		}
		for(int e=0; e<=4; e++)
			System.out.println(arr[e]);
	}
}

ZurdoDev

Все, что вам нужно сделать, это отладить его, чтобы узнать. Вы знаете, как отлаживать?

Это не похоже на то, что вы когда-либо вызываете add, если только t не является экземпляром класса, в котором есть add.

AbdelrahmanNassar

к сожалению я не умею отлаживать

Методом " add " я грешу тем же классом, где находится основная функция. Вот почему я стал объектом этого класса. он называется в строке 11.

ZurdoDev

Извините, я пропустил объявление об этом.

Отладка-это самый важный навык, которым вы можете обладать как разработчик, поэтому вы должны научиться этому в первую очередь. Это зависит от того, какую IDE вы используете, поэтому читайте документы в IDE.

В принципе, вы помещаете точку останова в свой код и запускаете ее, а затем можете шаг за шагом проходить через нее и точно видеть, что происходит.

AbdelrahmanNassar

Большое спасибо.

3 Ответов

Рейтинг:
2

Richard MacCutchan

while( i >= 0 ) {
    if( arr[i] >= el ) {
        arr[i+1]=arr[i];
        i--;
    }		
    else {
        arr[++i]=el;
    }
}

То if предложение начнется с того, что будет ложным, так как i является 10 а у тебя только есть 4 элементы в вашем массиве. Таким образом, он просто отойдет от конца массива и продолжит работу, пока не столкнется с какой-нибудь ошибкой доступа к памяти.


AbdelrahmanNassar

хорошо, я изменил переменную i на 3, но она все равно дает мне неправильный вывод.

Richard MacCutchan

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

AbdelrahmanNassar

i=4; **

AbdelrahmanNassar

Вопрос и код обновляются.

Richard MacCutchan

Посмотрите на следующие две строки в тексте: add метод:

arr[i++] = arr[i]; // copies arr[i] to arr[i] - that is does nothing. Then increments i by 1.
i--;               // decrements i by 1 so it goes back to its previous value.

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

AbdelrahmanNassar

Итак, я изменил первую строку и написал ее так::
int r = arr[i];
arr[++i] = r;

но как насчет следующего?
если он стал i-=2; будет ошибка

Richard MacCutchan

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

AbdelrahmanNassar

Сэр, вы даже не представляете, как я вам благодарен. Ваш совет действительно помог мне, и я, наконец, решил эту проблему. Большое спасибо🙌.

Richard MacCutchan

Добро пожаловать, и вы молодец, что сами решили эту проблему.

Рейтинг:
1

Patrice T

Цитата:
он не показывает никаких выходных данных, и я не знаю причины.

Как программист, ваша задача-переводить алгоритмы в код, создавать код, представляя, как он будет работать.
Но иногда ваш код работает не так, как ожидалось, но когда ваш код запускается, это черный ящик, вы можете только представить, что он делает.
Именно здесь в игру вступает отладчик, он превращает ваш запущенный код в белый ящик, вы можете видеть, что происходит внутри вашего приложения, вы можете замедлить его и проверить все, что находится внутри приложения.
Дайте попробовать отладчик, вторичный эффект, это невероятный инструмент обучения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


AbdelrahmanNassar

Как мне его отладить ?

Patrice T

Детали различаются в зависимости от вашей IDE, немного Google должен дать правильный ответ.

Рейтинг:
0

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;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!