Как изменить код, в котором мы должны найти элемент Пик? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть задача, в которой я должен кодировать программу, чтобы находил пиковый элемент в массиве . Я написал код, но когда я показал его своему учителю, она сказала мне, что он не точный, даже несмотря на то, что он отлично работает на Dev C ++. Она сказала мне изменить его. Может кто-нибудь сказать мне, что не так с кодом и как мне его изменить.

int main(){
    int arr[50];
    cout<<"Enter size:";
    int n;
    cin>>n;
    cout<<"Elements:";
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    for(int i=0;i<n;i++){
        if(arr[i]>arr[i+1] && arr[i]>arr[i-1]){
            cout<<"PEAK: "<<arr[i]<<endl;
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 22 апреля 2019

Проблема заключается во втором for теле цикла. Как отметил НатанОливер в комментариях, arr[i] > arr[i-1] должен пытаться получить доступ к памяти с недопустимым смещением, когда i равно 0. То же самое относится и к другому условию - arr[i] > arr[i+1] приведет к выходу за пределы - ну, ваш arr может содержать максимум 50 элементов, поэтому, если n меньше 50, вы должны получать доступ только к неинициализированной памяти. Условие нахождения пика может быть переписано как:

for (unsigned i = 0u; i < n; i++){
    bool isPeak = true;
    if (i > 0 && arr[i] < arr[i - 1]){
        isPeak = false;
    }
    if (i < n - 1 && arr[i] < arr[i + 1]){
        isPeak = false;
    }
    if (isPeak){
        std::cout << "PEAK: " << arr[i] << '\n';
    }
}

Это использует короткое замыкание логических операторов - выражения оцениваются слева направо, поэтому - если мы вернемся к условию i > 0 && arr[i] < arr[i - 1] - потенциально опасная проверка (которая может привести к неправильному доступу) не будет происходит, если первое условие (i > 0) ложно.

Что касается самого кода, теперь он проверяет каждую сторону текущего элемента отдельно.

Еще лучше (хотя, вероятно, это не связано с тем, что имеет в виду ваш учитель), было бы использовать std::vector. Код может обрабатывать более 50 элементов.

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