В подпрограмме sort неизвестен тип
В подпрограмме sort неизвестен тип сортируемых объектов; известно только их число (размер массива), размер каждого элемента и функция, которая может сравнивать объекты. Мы выбрали для функции sort() такой же заголовок, как у qsort() - стандартной функции сортировки из библиотеки С. Эту функцию используют настоящие программы. Покажем, как с помощью sort() можно отсортировать таблицу с такой структурой:
struct user { char* name; // имя char* id; // пароль int dept; // отдел };
typedef user* Puser;
user heads[] = { "Ritchie D.M.", "dmr", 11271, "Sethi R.","ravi", 11272, "SZYmanski T.G.", "tgs", 11273, "Schryer N.L.", "nls", 11274, "Schryer N.L.", "nls", 11275 "Kernighan B.W.", "bwk", 11276 };
void print_id(Puser v, int n) { for (int i=0; i<n; i++) cout << v[i].name << '\t' << v[i].id << '\t' << v[i].dept << '\n'; }
Чтобы иметь возможность сортировать, нужно вначале определить подходящие функции сравнения. Функция сравнения должна возвращать отрицательное число, если ее первый параметр меньше второго, нуль, если они равны, и положительное число в противном случае:
int cmp1(const void* p, const void* q) // сравнение строк, содержащих имена { return strcmp(Puser(p)->name, Puser(q)->name); }
int cmp2(const void* p, const void* q) // сравнение номеров разделов { return Puser(p)->dept - Puser(q)->dept; }
Следующая программа сортирует и печатает результат:
int main() { sort(heads,6,sizeof(user),&cmp1); print_id(heads,6); // в алфавитном порядке cout << "\n"; sort(heads,6,sizeof(user),&cmp2); print_id(heads,6); // по номерам отделов }
Допустима операция взятия адреса и для функции-подстановки, и для перегруженной функции.
Отметим, что неявное преобразование указателя на что-то в указатель типа void* не выполняется для параметра функции, вызываемой через указатель на нее. Поэтому функцию
int cmp3(const mytype*, const mytype*);
нельзя использовать в качестве параметра для sort(). Поступив иначе, мы нарушаем заданное в описании условие, что cmp3() должна вызываться с параметрами типа mytype*. Если вы специально хотите нарушить это условие, то должны использовать явное преобразование типа.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий