У меня есть вопрос о пузырьковой сортировке в c

#c

#c

Вопрос:

Я написал простую программу для пузырьковой сортировки по возрастанию. Я использовал для этого функцию. Она будет собрана и присвоит массиву числа и сначала напечатает числа. но когда я выбираю ‘y’, это ничего не делает. Я использовал функцию print в своей программе в функции «bubblesort», но она ничего не показывает. Я не знаю, в чем моя проблема. вот мой код :

 #include <iostream>

using namespace std;

void print(int a[],int amount);
void bubblesort(int a[],int amount);
void change(int,int);


int main()
{
    int amount;
    cout << "enter amount " << endl;
    cin >> amount;

    int *p = new int;

    for(int i = 0; i < amount; i  )
    {
        cout << "enter " << i   1 << " number" << endl;
        cin >> p[i];
    }
    print(p,amount);

    int choosebubble;
    cout << "do you want to do bubblesort? y " << endl;
    cin >> choosebubble;
    if(choosebubble == 'y' || choosebubble == 'Y')
           bubblesort(p,amount);

    return 0;
}

void print(int a[],int amount)
{
   for(int i = 0; i < amount; i  )
   {
       cout << "number " << i   1 << " is : " << a[i] << endl;
   }
}

void change(int *x,int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

void bubblesort(int a[],int amount)
{
    for(int i = 0; i < amount-1; i  )
    {
        for(int j = 0; j < amount-1; j  )
        {
            if(a[j] > a[j 1])
                change(a j ,a   j   1);

        }
    }
    print(a,amount);
}
  

Комментарии:

1. Вы объявили choosebubble as int , затем вы указываете пользователю вставить y или Y .

2. Почему вы динамически выделяете одно целое число p ? В C вам не нужно динамически выделять переменную (если только вы не занимаетесь такими вещами, как создание связанных списков).

3. Не используйте массивы. Используйте std::vector . Вы выделяете память для одного целого числа и при этом сохраняете больше целых чисел за пределами расположения с одним целым числом. В большинстве языков программирования вы либо выделяете массив для множества целых чисел, либо используете динамический контейнер.

Ответ №1:

Здесь две ошибки:

Первый:

 int *p = new int;
  

выделит ровно одно целое число в куче, а не массив. Любой доступ к p , который использует индекс, отличный от 0, приводит к неопределенному поведению. Вы имели в виду

 int *p = new int[amount];
  

И вот обязательное примечание, которое std::vector<int> должно быть предпочтительным 😉

Во-вторых:

 int choosebubble;
cin >> choosebubble;
  

попытаюсь прочитать int , но вам нужен char , объявите его как таковой:

 char choosebubble;
cin >> choosebubble;
  

Ответ №2:

Вы должны проверить свои типы. choosebubble это int , но вам нужен char параметр, поэтому используйте char (см. Также std::istream::operator>> ).

По умолчанию получение числа преобразует входные данные в число. Если вы этого не хотите, используйте std::string .

Ответ №3:

 int choosebubble;
cin >> choosebubble;
if(choosebubble == 'y' || choosebubble == 'Y')
           bubblesort(p,amount);
  

Знаете, чтобы это сработало, вам пришлось бы ввести ASCII-код буквы «y» (121 или 89 для заглавных букв). Вероятно, вы хотите объявить choosebubble как char (или std::string , но затем сравнить с "y" или "Y" ).

Ответ №4:

Как сказал Энрико Мария Де Анджелис в комментариях, вы объявили, что choosebubble должно быть int , но затем вы присваиваете ему character y или Y . Итак, когда вы используете, cin чтобы поместить что-то в int , но вы даете ему что-то несовместимое (a character ), он, по-видимому, помещает 0 в вашу переменную int ( choosebubble ) и просто устанавливает failbit из cin потока ( cin.fail() ). Вот почему bubblesort никогда не вызывается.