Member 12566145 Ответов: 3

Почему моя функция сортировки не работает?


В программе все идет правильно, но массивы не сортируются

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

#include <iostream>

using namespace std;
int price;
int n;
int* p_array=NULL;
int* p_matrix=NULL;

void swap(int *i,int *k)
{
    int j;// js any temperory element
    *i=*k;
    *k=j;
}
void sort(int _array[],int n )
{
    int hole;
    int i;
    hole = i;
    for(int hole=1;hole<n;hole++)>
    {
        if( hole>0 && _array[hole-1]>_array[hole])
        {
            swap(_array[hole],_array[hole-1]);
            hole=hole-1;
        }
    }
}


int main()
{
    p_array=new int[n];
    p_matrix=new int[n];
    cin >> n;
    for(int i=0;i<n;i++)>
    {
        cin >> *(p_array+i) ;
    }
    sort (p_array,n);
    for(int i=0;i<n;i++)>
    {
        *(p_matrix+i)=(*(p_array+i))*(n-i);
    }
    sort(p_matrix,n);
    for(int i=0;i<n;i++)>
    {
         cout << *(p_matrix+i)<< " " ;
         cout << endl;
         cout << *(p_array+i)<< " " ;
    }
}

Andreas Gieriet

Скомпилировать со всеми предупреждениями о!
Напр. n не задан, но вы создаете массив с помощью n элементы...
Почему вы используете арифметику указателей, когда вы могли бы сделать это с гораздо меньшей болью с индексами массива? Напр. cin >> p_array[i];
Овации
Энди

Philippe Mori

- Не используйте глобальные переменные.
- Инициализируйте свои переменные при их объявлении, если известно начальное значение. В противном случае объявите переменную непосредственно перед ее инициализацией.
- Используйте соответствующие интервалы между операторами.
- Не начинайте имя с подчеркивания (зарезервировано для системного использования).
- Удалите выделенную Вами память. А еще лучше использовать std:: vector вместо raw array.
- Предпочитайте нотацию массива нотации указателя.
- Используйте последовательный интервал между функциями (всегда 1 строка или всегда 2 строки).

Кстати, если бы вы написали модульный тест для своей функции swap, вы бы увидели, что она работает не так, как ожидалось. Используя отладчик, вы бы увидели проблему. Но для целей обучения, вероятно, лучше всего использовать карандаш и бумагу.

3 Ответов

Рейтинг:
27

OriginalGriff

Отступы очень помогают, когда вы смотрите на код: это означает, что вы можете видеть, что происходит гораздо более четко...
Но беглый взгляд говорит о том, что функция swap:

void swap(int *i,int *k)
{int j;// js any temperory element
*i=*k;
*k=j;
}
Это не сработает!
Какую ценность вы вкладываете k каждый раз?
Попробуйте изменить его на:
void swap(int *i,int *k)
    {
    int j;
    j = *i;
    *i = *k;
    *k = j;
    }
И это, по крайней мере, будет работать лучше!

В будущем используйте отладчик: он показал бы вам эту проблему за секунды, а не за минуты, которые потребовались вам, чтобы задать здесь вопрос, затем за время, которое вы должны были ждать, пока мы увидим вопрос, а затем за время, которое вы получили по электронной почте, что есть ответ...


Member 12566145

все еще не работает :(

Michael_Davies

Пожалуйста, покажите вывод, который поможет увидеть, что не так, функция swap Griff показывает, что вы должны работать нормально, так что в вашем коде есть что - то еще, почему вы делаете отверстие-1, Если вы меняете местами?

OriginalGriff

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

Member 12566145

Спасибо было 2 ошибки
1 из функции подкачки
2 отверстия=отверстие-1 (вместо отверстия=0 должно быть там)

OriginalGriff

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

Рейтинг:
2

Richard MacCutchan

p_array=new int[n];
p_matrix=new int[n];
cin >> n;

Это никогда не сработает так, как вы ожидаете. Вы выделяете два массива на основе значения переменной n прежде чем вы присвоите ему значение. Вам нужно тщательно просмотреть свой код, чтобы проверить логику.


Рейтинг:
2

Patrice T

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

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