Member 13970073 Ответов: 3

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


То что я пытаюсь сделать это получить массив чисел вместе с некоторыми тестовыми случаями я пытаюсь вернуть счетчик пар с максимальной суммой поэтому я беру входные данные в первой строке тестового случая затем я беру массив в качестве входных данных и после сортировки массива я возвращаю счетчик пар используя логику которая в отсортированном массиве как в тестовом случае
8 7 7 5 4 3
там будет две максимальные суммы и я начинаю с индекса 1 и пока следующий индекс равен предыдущему я увеличиваю счетчик

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

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,counter=1,in=1;
        cin>>n;
        vector<int> arr;
        for(int i=0;i<arr.size();i++)
        {
            cin>>arr[i];
        }
        sort(arr.begin(),arr.end(),greater<int>());
        while(arr[in]==arr[in+1])
        {
            counter++;
            in++;
        }
       cout<<counter<<endl;
    }
}

3 Ответов

Рейтинг:
6

Patrice T

Цитата:
При запуске этой программы на онлайн компиляторе я получаю ошибку сегментации

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

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.

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

Вы должны довольно быстро найти, что не так.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
26

Rick York

Внутри цикла while вы объявляете вектор целых чисел. Изначально он пуст, поэтому его размер будет равен нулю в цикле for, поэтому в него ничего не будет вводиться, независимо от значения in. Я бы предположил, что он ошибается при сравнении содержимого массива в цикле while. Цикл for должен перейти к n, а не к arr.size().


Рейтинг:
15

OriginalGriff

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

3 4 5 7 7 8
Поэтому, когда вы пытаетесь получить доступ к данным, первое, что делает ваш цикл, - это сравнивает второй элемент с третьим:
int n,counter=1,in=1;
...
while(arr[in]==arr[in+1])

while(arr[1]==arr[1+1])

while(4==5)
Что, очевидно, ложно, поэтому ваш цикл никогда не вводится. И вы никогда не смотрите на первый элемент вообще, так что если ваши данные
1 1 2 3 4
вы никогда не найдете совпадение вообще - и это означает, что ваш цикл никогда не выйдет, или даст вам ошибку незаконного доступа и сбой.

Если вы хотите подсчитать пары, вам нужно использовать цикл for, начинающийся с нуля и заканчивающийся an (количество элементов - 1) и считающий его arr[i] и arr[i + 1] одинаковыми.

Попробуйте сделать это на бумаге, и вы поймете, что я имею в виду.