Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Пузырьковая Сортировка в C/C++

Автор: Andrewshkovskii 23.12.2007 23:07

Объясните пожалуйста,почему не сортируются элементы??
вроде де бы все верно в коде..
*n=макс. размерность массива.
buf= временная переменная для хранения элемента массива.


while(is)
{
is=0;
for (i=*n;i<=0;i--)//пробывал ставить --,не помогло...
if (tabl1[i].sball<tabl1[i-1].sball)
{
buf=tabl1[i];
tabl1[i]=tabl1[i-1];
tabl1[i-1]=buf;
is=1;
}
}

Автор: Тёмный Эльф 23.12.2007 23:21

Если я не ошибаюсь, то вместо is=1 надо поставить is=is+1;

Автор: volvo 23.12.2007 23:22

Вот при таком коде минимум 2 раза произойдет выход за пределы массива: на первой итерации - при i = *n и попытке обратиться к tabl1[ i ] (индексы элементов массива меняются от 0 до n - 1), и на последней - при i = 0 и попытке чтения tabl1[i -1].

Приведи описания массива и заголовок функции сортировки...

Автор: Andrewshkovskii 23.12.2007 23:22

для чего??)))там же цикл не по количественному значению,а по 0 или 1...

Добавлено через 2 мин.


struct my_s {
char FIO[max_name];
char prim[max_prim];
int vball;
int ekz[5];
int zach[3];
float sball;
};
my_s tabl1[max_s];
int* n=new int ;

описание массива.Эм,массив структур глобальный.Внутри одной функции определяется размерность этого массива в (*n).
Заголовок функции
 void output_w(int *n,my_s tabl1[]).

внутри определяю переменную my_s buf.
она ничего не возвращает,лишь обрабатывает глобальную переменную по заданию..

Автор: Тёмный Эльф 23.12.2007 23:25

Цитата
там же цикл не по количественному значению,а по 0 или 1

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

Автор: volvo 23.12.2007 23:28

В таком случае нельзя менять местами элементы структур так, как ты показал. Это не Паскаль, где записи можно без последствий присваивать друг другу, а С, где для этого надо использовать memcpy (или переопределять конструктор копирования/операцию присваивания для C++)...

Автор: Andrewshkovskii 23.12.2007 23:31

хм..и как же мне написать сортировку?..

Автор: volvo 23.12.2007 23:52

Не совсем понятно, зачем собственно ты выделяешь n динамически, что тебе это даст? Но если сделать n обычной переменной, то:

...
int n = ...;

int is = 1;
while(is) {
is = 0;
for (int i = n - 1; i > 0; i--)
if (tabl1[i].sball < tabl1[i-1].sball) {

my_s buf;
memmove((void*)(&buf), (void*)(&tabl1[i]), sizeof(my_s));
memmove((void*)(&tabl1[i]), (void*)(&tabl1[i - 1]), sizeof(my_s));
memmove((void*)(&tabl1[i - 1]), (void*)(&buf), sizeof(my_s));

is=1;
}
}
...