#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
asint
, затем вы указываете пользователю вставить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
никогда не вызывается.