Удаление оператора cout, вызывающего изменение значения переменной - PullRequest
0 голосов
/ 13 сентября 2018

В следующем коде, когда я удаляю оператор cout (строка после // ******), он вызывает изменение значения «i».Я использовал 32-разрядную версию TDM-GCC 4.9.2 и компиляторы TDM-GCC 5.1.0.Я запустил этот код на codechef, и там он работает нормально, и оператор cout не влияет на значение «i».

#include<iostream>

using namespace std;
int subset(int [], int);
int main()
{
    int size,i,ans;
    cout<<"size of array : ";
    cin>>size;
    int arr[size];
    for(i = 0 ; i<size;i++)
    {
        cin>>arr[i];
    }

    ans = subset(arr,size);
    cout<<"ans = "<<ans;

    return 0;

}
int subset(int arr[], int size)
{
    int i,j, tsum=0, completed=0;
    for(i = 0 ;i<size;i++)
        tsum = tsum + arr[i];

    int carr[tsum+1],temp;
    for(i=0;i<size;i++)
    {
        temp = arr[i];
        carr[temp] = 1;
        for(j=i+1;j<size;j++)
        {
            temp = temp + arr[j];
            carr[temp] = 1;
        }
    }
    for(i=1;i<=tsum;i++)
    {
        if(carr[i]!=1)
        {
            //************************************
            cout<<"i : "<<i<<endl; 
            break;
        }
    }

    return i;

}

Пример ввода: размер массива: 3

1 2 5

пример вывода без оператора cout:

ans = 6

пример вывода с оператором cout:

i: 4

ans =4

Фактический ответ 4 для ввода.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Для решения проблем, как указано Некоторые программисты Dude и melpomene , т. Е. Массивы переменной длины не являются стандартными C ++, а carr неинициализирован. Используйте векторы с ++ и правильно их инициализируйте. Это будет выглядеть примерно так:

#include <iostream>
#include <vector>

using namespace std;
int subset(const std::vector<int>, const int);
int main()
{
    int size, i, ans;
    cout << "size of array : ";
    cin >> size;
    std::vector<int> arr(size);
    for (i = 0; i < size; i++)
    {
        cin >> arr[i];
    }

    ans = subset(arr, size);
    cout << "ans = " << ans;

    return 0;

}
int subset(const std::vector<int> arr, const int size)
{
    int i, j, tsum = 0, completed = 0;
    for (i = 0; i < size; i++)
        tsum = tsum + arr[i];

    std::vector<int> carr(tsum + 1, 0);
    int temp;
    for (i = 0; i < size; i++)
    {
        temp = arr[i];
        carr[temp] = 1;
        for (j = i + 1; j < size; j++)
        {
            temp = temp + arr[j];
            carr[temp] = 1;
        }
    }
    for (i = 1; i <= tsum; i++)
    {
        if (carr[i] != 1)
        {
            //************************************
            cout << "i : " << i << endl;
            break;
        }
    }

    return i;

}
0 голосов
/ 13 сентября 2018

Основная проблема заключается в том, что carr неинициализирован.

Он объявлен как

int carr[tsum+1]

без инициализатора.

Позже некоторые элементыустановить, но всегда на 1:

    carr[temp] = 1;

В последнем цикле проверяется carr:

    if(carr[i]!=1)

Это условие не имеет смысла.Либо было установлено значение carr[i], тогда оно гарантированно равно 1, либо оно не инициализировано, и в этом случае это сравнение имеет неопределенное поведение.


Обратите внимание, что массивы переменной длины не являются стандартнымиC ++.

...