Нужна помощь с указателями

234
13 марта 2018, 03:09

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

for (int *Sarr=b; Sarr < myArr + x - 1; Sarr++) *Sarr = *(Sarr++)

Но вот только разобраться не могу, глуп наверное для этого! Помогите, кто знает, пожалуйста.

int Sum(int myArr[], int x) {
    int min, sum=0, *b = nullptr;
    for (int i = 0; i < 2; i++) {
        min = *myArr;
        for (int *Parr = myArr + 1; Parr < myArr + x; Parr++) {
            if (*Parr < min) {
                min = *Parr;
                b = Parr;
            }
        }
        for (int *Sarr=b; Sarr < myArr + x - 1; Sarr++) *Sarr = *(Sarr++);
        x--;
        sum += min;
    }
    return sum;
}
int main()
{
    int const N = 10;
    int Arr[N] = { -10,3,8,5,-19,23,-1,6,12,-8 };
    cout << "The sum of 2 minimal elements is: " << Sum(Arr, N) << endl;
    return 0;
}

OUTPUT:

The sum of 2 minimal elements is: -38

Answer 1
int Sum(int myArr[], int x) {
    int* p1 = myArr,  *p2 = p1 + 1, *p = p2;
    for (; p != myArr + x; ++p) {
        if(*p < *p1) {
            p2 = p1;
            p1 = p;
        }
        else if(*p < *p2) // обработаем случай, когда первый элемент окажется
            p2 = p;       // наименьшим, тогда нужно найти второй наименьший
    }
    return *p1 + *p2;
}

будут вопросы, спросите, а то поленился написать комментарии(вернее времени мало)

Answer 2

Что-то не могу понять, что вы такое делаете с этим Sarr...

Словом, вы не хотите переписать функцию вот так:

int Sum(int myArr[], int N)
{
    if (N < 2) return 0;
    int min0, min1;
    min0 = myArr[0];
    min1 = myArr[1];
    if (min0 > min1)
    {
        int tmp = min0;
        min0 = min1;
        min1 = tmp;
    }
    for (int i = 2; i < N; i++)
    {
        if (min0 > myArr[i])
        {
            min1 = min0;
            min0 = myArr[i];
        }
        else if (min1 > myArr[i])
        {
            min1 = myArr[i];
        }
    }
    return min0 + min1;
}
Answer 3
   int main()
{
    int const N = 10;
    int Arr[N] = { -10,3,8,5,-19,23,-1,6,12,-8 };
    std::partial_sort(Arr, &Arr[2], &Arr[N]); // сортируем до arr[2]
    cout << "The sum of 2 minimal elements is: " << Arr[0] + Arr[1] <<endl;
    return 0; 
}`

Это если вам нужно просто найти эту сумму, а не самому писать альгоритм Ну а Arr, &Arr[2] и &Arr[N] явлются указательями, так что требования не нарушены...

Answer 4

У Тебя в sum идёт два меньших числа, вот только после первого прохода Ты никак не проверяешь на одинаковые значения. В итоге у Тебя всегда идёт не сложение, а умножение самого маленького на два. Сделай проверку на предыдущее самое маленькое и будет Тебе счастье.

Ну или, как писали выше - сделай всё за раз. просто найди два меньших за один проход.

READ ALSO
Замена значений в документе

Замена значений в документе

Есть документ следующего содержания:

194
C++ Входит ли точка в прямоугольник

C++ Входит ли точка в прямоугольник

Не могу решить задачу на C++

244
Как проверить, что строка - число?

Как проверить, что строка - число?

В программе вводится переменная float (конечно же должны вводиться числовые значения), но интерфейс программы так построен, что пользователь...

195