dmitry_dev33
@dmitry_dev33

В чём различие между i++ и i+1, когда речь идёт в о массивах?

Почему в цикле, когда я меняю if (p[i] < p[i+1]) на if (p[i] < p[i++]) программа перестаёт работать корректно?
int main()
{
	setlocale(LC_ALL, "RUSSIAN");
	int i;
	short p[N + 1];
	for (i = 1; i <= N; i++)
	{
		printf("\n Введите элемент массива p[i] = ");
		scanf_s("%d", &p[i]);
	}

	for (i = 1; i <= N; i++)
		printf("%5d ", p[i]);

	for (i = 1; i <= N; i++) //Тот самый цикл!
	{
		if (p[i] < p[i+1])
		{
			printf("\n Элементы массива - возрастающая последовательность");
			printf("\n");
			exit(0);
		}
		else
		{
			printf("\n Элементы массива - не возрастающая последовательность");
			printf("\n");
			exit(0);
		}
	}
	getchar();
}

b2dbbcfc91884565aa38fa5f76b51dab.jpg1af4ad8c28d04c2c9d60d12e077b1dac.jpg
  • Вопрос задан
  • 6089 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
i+1 - возвращает значение i+1.
i++ - увеличивает значение i на 1, возвращает значение i до увеличения.
++i - увеличивает значение i на 1, возвращает новое значение i.
Ответ написан
15432
@15432
Системный программист ^_^
А давайте я укажу на все ошибки в вашей программе?

1) for(int i = 1 ...)
Самое бросающееся в глаза. Индексация массивов начинается с нуля. Соответственно, условие в цикле должно быть
for(int i = 0; i < N; ++i)
(И не придется заводить массив на N+1 элементов)

2) exit(0)
Любая ваша проверка сразу же приведет к завершению программы. Поэтому ваша программа изначально работает некорректно - происходит сравнение только двух первых элементов

3) пресловутый i++
Рассмотрим полную команду
if (p[i] < p[i++])
По приоритетам, первой выполнится "i++", после чего значение i увеличится на единицу, в результате чего итоговое сравнение будет эквивалентно
i += 1;
if (p[i] < p[i]) ...
Более того, даже если не учитывать неправильное сравнение и выход в первой же проверке, за один цикл for значение i оказывается увеличенным дважды (i++ в конце цикла и i++ в условии), что тоже далеко не нормально.

4) мелочи вроде
-printf(\n);
вместо того, чтобы дописать \n в конец прошлого текста
-использование short, когда эффективнее использовать int

В общем, тренируйтесь, познавайте принцип работы команд, совершенствуйте знание языка и впредь старайтесь избегать подобных ошибок :)

как можно быстро исправить эту программу:

int main()
{
  setlocale(LC_ALL, "RUSSIAN");
  int i;
  int p[N];
  for (i = 0; i < N; ++i) //вводим все числа
  {
    printf("\n Введите элемент массива p[i] = ");
    scanf_s("%d", &p[i]);
  }

  for (i = 0; i < N; ++i) //печатаем, что ввели - для проверки
    printf("%5d ", p[i]);

  for (i = 0; i < N - 1; ++i) //проходимся по всем числам до предпоследнего
  { //потому что последнее не с чем сравнивать, за ним дальше чисел нет
    if (p[i] >= p[i+1]) //проверяем только случай, когда условие возрастания не выполняется
    {
      printf("\n Элементы массива - НЕ возрастающая последовательность\n");
      exit(0); //сразу же выходим из программы, т.к. определили невозрастание
    } //иначе продолжаем сравнивать элементы!
  }
//мы до сих пор не вышли из программы, значит, последовательность всё же возрастающая
  printf("\n Элементы массива - возрастающая последовательность");
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
stainless_steelrat
@stainless_steelrat
Д'Артаньян
Может быть по тому, что постфиксный инкремент так работает?
Сначала подставляется значение переменной в выражение, а только после инкрементируется.
Используйте префиксную форму, т.е. ++i, она работает наоборот, сначала увеличивается значение, потом подставляется.
Ответ написан
@bkosun
Запись вида i++ добавляет +1, но возвращает старое значение переменной

Запись вида i+1 идентична записи ++i добавляет +1, и возвращает новое значение переменной

То же самое касается декримента, и это работает для других ЯП

$a = 0;
$b = 0;
$c = 0;

var_dump($a++); // int(0) 
var_dump($b+1); // int(1) 
var_dump(++$c); // int(1)


UPD: в вашем случае запись if (p[i] < p[i+1]) НЕ меняет значение переменной i, а if (p[i] < p[i++]) - меняет, поэтому работа цикла нарушается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект