Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему неправильно работает qsort(), Не понимаю что не так в моей проге... 
:(
    Опции темы
AntZ
  Дата 11.9.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.6.2007

Репутация: нет
Всего: нет



Вот код моей проги:
Код
#include <stdio.h>
#include <stdlib.h>

int mycmp(const void *a, const void *b)
{
    return *(long *)a > *(long *)b;
}

int main(int argc, char *argv[])
{
    long mas[10001], n, i;

    scanf("%li", &n);
    for (i = 0; i < n; i++)
        scanf("%li", &mas[i]);

    qsort(mas, n, sizeof(long), mycmp);

    printf("\n");
    for (i = 0; i < n; i++)
        printf("%li ", mas[i]);

    return 0;
}
Она считыает N - количество элементов, а затем считывает каждый поочереди и запоминает в массив MAS. После сортировки программа выводит все элементы массива по порядку.

Все бы ничего, но например на этих наборах данных она сортирует... НЕПРАВИЛЬНО!!! У меня уже голова трещит - не пойму.....  smile 

Вот эти входные данные  smile 
10
1
2
4
8
16
32
64
128
256
512


На выводе печатает:

32 2 4 8 16 1 64 128 256 512

Проверял дебагером, в нем было видно что после qsort(mas, n, sizeof(long), mycmp) порядок становится именно такой. Но что интересно, порядок устанавливается такой изначально, еще до первого изпользования функции mycmp(). Почему сортировка работает неправильно?

Прошу помочь всех кто может. И если причина тривиальна, то плизз не пинайте меня слишком больно...  smile 
PM MAIL ICQ   Вверх
apook
Дата 11.9.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Код

#include <stdio.h>
#include <stdlib.h>

int mycmp(const void *a, const void *b)
{
int n1=*(int*)a, n2=*(int *)b;
/*
if(n1 < n2)      
    return -1;
else if(n1 == n2)
    return 0;
else
    return 1;
*/
return( n1 < n2 ) ? -1 : ( ( n1 == n2) ? 0 : 1 );
}


int main( int argc, char *argv[] )
{
int mas[10001]={ 1,5,8,10,89,32,6,85 }, n, i;

n=10;

for( i = 0; i < n; i++ )
    printf("%li ", mas[i]);

qsort( mas, n, sizeof(int), mycmp );

printf("\n");

for( i = 0; i < n; i++ )
    printf("%li ", mas[i]);

return 0;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
archimed7592
Дата 11.9.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(apook @  11.9.2007,  11:48 Найти цитируемый пост)
return( n1 < n2 ) ? -1 : ( ( n1 == n2) ? 0 : 1 );

Аналогичный результат можно получить намного более простым выражением:
Код
return n1 - n2;



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
apook
Дата 11.9.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"
Цитата

Код

Задача 7.3 Функция сравнения


int cmp(const void *a, const void *b)
{
 return *(int *)a - *(int *)b;
}

казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?





--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
DjoNIK
Дата 11.9.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



smile 
Цитата

Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"

А нет такой же по плюсяам?

Добавлено через 1 минуту и 6 секунд
archimed7592, поздравляю 777 сообщения smile


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
apook
Дата 11.9.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата(DjoNIK @  11.9.2007,  12:58 Найти цитируемый пост)
А нет такой же по плюсяам?
 Однако есть где-то в нэте встречал, но у меня нету


Цитата(apook @  11.9.2007,  12:33 Найти цитируемый пост)
Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"Цитатакод C++1:2:3:4:5:6:7:Задача 7.3 Функция сравненияint cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}highlightSyntax('cpp_YTk4Yj','cpp');highlightSyntax('cpp_YTk4Yj','cpp');казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?

Хотел бы я знать ответ на этот вопрос дело в том что в книжке ответ не дается тока вопрос...



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
AntZ
  Дата 11.9.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.6.2007

Репутация: нет
Всего: нет



блин! smile вот я даю... все дело было в функции сравнения. что-то я стареть начал smile 
бывает вот так заклинит, а ведь сортировке надо было знать что число может быть не только меньше или больше, но и равно ли одно число другому.

 smile спасибо всем за ответ!

Цитата
Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"
Цитата

Код

Задача 7.3 Функция сравнения


int cmp(const void *a, const void *b)
{
 return *(int *)a - *(int *)b;
}

казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?

Может эта функция опасна, если сравниваются числа, при которых может произойти переполнение в этом типе данных...
Например, (-30000 - 30000) - при сравнении чисел -30000 и 30000, при размере типа int в 2 байта.

Это сообщение отредактировал(а) AntZ - 11.9.2007, 17:56
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.