C ++ локальная переменная меняет значение - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть следующая функция c ++, которая пытается найти максимальную сумму подмассива в массиве отрицательных и положительных целых чисел

int  MaxSubArray::find_max_subarray(void) {
  int maxsofar =0 ;
  int maxendinghere = 0;
  for(int i = 0;i <= arr_size; i++) {
    cout << "maxending here is: " << maxendinghere << endl;
    cout << "maxsofar is: " << maxsofar << endl;
    maxendinghere += array[i];
    maxendinghere = max(0,maxendinghere);
    maxsofar = max(maxendinghere,maxsofar);
  }
  int retvalue = maxsofar;
  cout << "Max so far final is" << maxsofar << endl;
  cout << "Max ending here is " << maxendinghere << endl;
  return retvalue;

}

Для массива, который содержит 10,20,30, -50, 50 Я получаю следующий вывод

maxending here is: 0
maxsofar is: 0
maxending here is: 10
maxsofar is: 10
maxending here is: 30
maxsofar is: 30
maxending here is: 60
maxsofar is: 60
maxending here is: 10
maxsofar is: 60
maxending here is: 60
maxsofar is: 60
Max so far final is135205
Max ending here is 135205
Max sub array is 135205

Может кто-нибудь сказать мне, почему переменная maxsofar меняет значение на 135205 вне цикла for.Заранее спасибо

Ответы [ 9 ]

4 голосов
/ 02 сентября 2011

Не должно ли быть:

for(int i = 0; i < arr_size; i++)

Обратите внимание, что вы изменили maxsofar в последней итерации цикла после того, как вы напечатали , поэтому вы видите разницу - вы, вероятно, добавляете значение мусора на этой последней итерации, потому что ваших смещенных петель.

Надеюсь, вам понравится Программирование жемчужин .

2 голосов
/ 02 сентября 2011

Это

for(int i = 0;i <= arr_size; i++)

должно быть

for(int i = 0; i < arr_size; i++)
                ^^^

Вы превышаете границы массива.

1 голос
/ 02 сентября 2011

Это потому, что вы прочитали мусор за пределами массива:

for(int i = 0;i <= arr_size; i++) { // should be i < arr_size
1 голос
/ 02 сентября 2011

Из-за ограничения цикла:

for(int i = 0;i <= arr_size; i++)

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

Должно быть:

for(int i = 0;i < arr_size; i++)
1 голос
/ 02 сентября 2011

Предполагая, что arr_size на самом деле является размером массива, ваш оператор <= заставил вас запустить его с конца, добавив мусор к сумме.

1 голос
/ 02 сентября 2011
for(int i = 0;i <= arr_size; i++) {

Конечно, это не должно быть <? Размер означает, что от 0 до size-1 является допустимым индексом для этого массива.

 for(int i = 0;i < arr_size; i++) {

Это может быть причиной перезаписи массива и записи в другую переменную стека.

0 голосов
/ 02 сентября 2011

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

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

Идиоматический способ перебора массива:

for (int i = 0; i < length; ++i)
{
   // do Stuff
}
0 голосов
/ 02 сентября 2011
i <= arr_size

Должно быть

i < arr_size
0 голосов
/ 02 сентября 2011

Ваш переполнен размер вашего массива в цикле. Цикл for должен выглядеть следующим образом:

for(int i = 0;i < arr_size; i++)

Обратите внимание на разницу между <= в вашем коде и < выше. Сделайте соответствующее изменение, и вы не переполните свой массив. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...