Member 12769131 Ответов: 3

Вывод моего массива идет неправильно во время цикла


main()
{
	clrscr();
	int num[5],i,j,temp;

	printf("Enter 5 numbers: \n");
	for(i=0;i<5;i++)
		scanf("%d",&num[i]);

	for(i=0;i<5;i++) {
		for(j=1;j<=5;j++) {
			if(num[i]>num[j]) {
				temp=num[i];
				num[i]=num[j];
				num[j]=temp;
			}
		}
	}

	printf("Sorted Order: ");
	for(i=5;i>0;i--)
		printf("%d ",num[i]);

	getch();
	return 0;
\*Output:
Enter 5 numbers:
1
3
4
2
5
Sorted Order: 2 1 3 4 5
*\
}


Я пытался отсортировать значение внутри num[]. Как вы можете видеть в моем комментарии(в части отсортированного порядка), первое число, которое было введено, было 2 вместо 1. Теперь я спрашиваю себя. Есть ли у меня какие-либо ошибки в коде?

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

Перезапустите приложение Turbo c++. Погугли мою проблему. Перечитайте мой код. Ничего не работает.

[no name]

Как вам уже было сказано, Да, у вас есть по крайней мере одна ошибка в вашем коде. Не видя вашего кода, мы не можем сказать вам, что это такое. Публикация только "#include " не поможет нам помочь вам. Кроме того, публикация и удаление ваших вопросов снова и снова раздражает.

Member 12769131

извините, но я попытался улучшить свой вопрос, и весь код, похоже, не был опубликован. Извини, что заставил тебя чувствовать себя раздраженным. Мне очень жаль

[no name]

Извините, я не раздражен. Я просто игнорирую людей, которые делают такие вещи. Я не понимаю, что такого сложного в копировании/вставке, но людям, похоже, очень трудно просто вставить свой код в текстовое поле.

David_Wimbley

Вам нужно разместить свой вопрос между < pre lang= ' c++'>..ваш код здесь..</pre & gt; теги, чтобы получить ваш код, чтобы показать.

Многие люди делают это на этом сайте ежедневно...я верю в тебя.

Member 12769131

спасибо, что это сработало. Мне очень жаль, что я здесь новичок.

David_Wimbley

Не проблема, похоже, ты все понял.

jeron1

Не знаю, работает ли ваш метод сортировки или нет, но вы пытаетесь получить индекс 5 в массиве размером 5, что делает его недопустимым индексом.

3 Ответов

Рейтинг:
2

Philippe Mori

Очевидно, что ваш индекс в каком-то месте ошибочен. Поскольку размер массива равен 5, то допустимы только индексы от 0 до 4 включительно.

Таким образом, в цикле второго уровня кода сортировки вы останавливаете один элемент до far (индекс 5 вместо индекса 4). Это приводит к переполнению буфера, что обычно может повлиять на другие переменные рядом с этим массивом и вызвать неопределенное поведение.

У вас есть та же проблема, когда вы показываете результат. Вы начинаете и заканчиваете один пункт до максимума. Таким образом, вы печатаете элементы с индексом 5, 4, 3, 2 и 1 вместо 4, 3, 2, 1 и 0.

Как кто-то предположил, использование отладчика было бы хорошей идеей...

Тем не менее, вы должны быть в состоянии понять такие проблемы, читая свой код, если вы хотите написать какой-либо серьезный код, так как вам нужно понять индексацию цикла при написании кода на языке Си... Так что, возможно, вам стоит еще раз прочитать документацию.

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


Рейтинг:
1

Patrice T

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

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

Совет: возьмите лист бумаги и попробуйте сделать это вручную, ваша программа должна использовать ту же процедуру.
Измените начало вашего кода на

int num[6],i,j,temp; // Change
for(i=0;i<6;i++)     // insert
    num[i]= 5;   // insert


И входные значения: 1 3 6 2 7
Если вы получите 5 в результате, вы будете знать, что сортируете вне своего массива.


Рейтинг:
0

OriginalGriff

Разработка кода-это не просто написание кода и его компиляция - после этого наступает самое интересное: заставить его работать!
К счастью, у вас есть инструмент, который поможет вам сделать это - он называется отладчиком.
Я не могу вспомнить, как использовать Turbo C++ (теперь это древняя история), так что вам, вероятно, придется погуглить специфику, но начните с того, что поставьте точку останова в начале функции и запустите свой код в отладчике. Когда он достигнет точки останова, он остановится и позволит вам взять верх.
Пройдите через код (google для "Single step Turbo C++") и посмотрите на переменные. Разработайте перед каждой строкой то, что вы ожидаете, а затем сверьте это с тем, что произошло. Если это то же самое, двигайтесь дальше. Если нет, то почему? Что случилось, что вы не ожидали, или не произошло, что ты сделал? Это должно дать вам хорошее представление о том, что вы сделали неправильно, чтобы вы могли изменить это и попробовать снова.

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