Форум программистов, компьютерный форум, киберфорум
Наши страницы

Шаблон функции сортировки массива структур по разным типам полей - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Верно ли неравенство при заданном значении х http://www.cyberforum.ru/cpp-beginners/thread1138727.html
2 Верно ли неравенство при заданном значении х \(\frac{\left| x-4\right|\sqrt{y-2}} {4\sqrt{10-x}+x-13}\geq 0\)
C++ Почему itog не выводится (нужный код в незаккоментированной части) #include <iostream> #include <cstring> using namespace std; int main() { char str,itog,poditog="";int chet,size; freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); ... http://www.cyberforum.ru/cpp-beginners/thread1138716.html
C++ Определить расстояние, пройденное физическим телом за время t
1. определить расстояние, пройденное физическим телом за время t, если тело движется с постоянным ускорением а и имеет в начальный момент времени скорость V0. Здравствуйте! Помогите решить, сестре...
C++ Списки: добавление i-ого элемента в любое место списка
Дан односвязный список, нужно организовать добавление iого элемента в любое место списка. Проблема в том что первый элемент смещается сразу в конец, независимо от того ввожу я что-то или нет. Как это...
C++ Как найти произведение 3-х последних цифр k-го числа Фибоначчи? http://www.cyberforum.ru/cpp-beginners/thread1138711.html
Как быстро найти произведение 3-х последних цифр k-го числа Фибоначчи?
C++ Строки: является ли текст записью десятичного числа, кратного 4 В заданный непустой текст входят только цифры и буквы. Определить, является ли текст записью десятичного числа, кратного 4. подробнее

Показать сообщение отдельно
don_keyhot
5 / 5 / 2
Регистрация: 02.04.2014
Сообщений: 60

Шаблон функции сортировки массива структур по разным типам полей - C++

04.04.2014, 13:35. Просмотров 2919. Ответов 9
Метки (Все метки)

Делаю лабу.
Вот текст задания.
Считайте все записи из файла "1.dat".
Для чтения каждой отдельной записи осуществите динамический захват памяти.
Предполагается, что к-во записей в файле заранее неизвестно.

Выполните сортировку записей по различным ключам:
· по фамилии (по возрастанию);
· по дате рождения (по возрастанию);
· по окладу (по убыванию).

Для каждого ключа используйте различные алгоритмы сортировки:
· сортировка выбором,
· сортировка вставками,
· сортировка Шелла,
· быстрая сортировка.

Всего сортировка будет выполнена 12 раз, каждый раз сортируется массив в первоначальном состоянии.
Для каждого случая подсчитайте к-во сравнений и перестановок.
Оцените скорость, естественность и устойчивость каждого алгоритма.
Оптимальную организацию функций продумайте самостоятельно.

Неделю уже ломаю голову не могу придумать "Оптимальную организацию" шаблонов функций сортировки (

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct note
{
    char fam[20];   // фамилия
    char name[20];  // имя
    char phone[10]; // телефон
    int  data_r[3]; // дата рождения, массив из трех чисел: год, месяц, день
    int  oklad;     // оклад
};
 
// шаблон сравнения элементов структуры
template <class item> 
void compare_swap (item &a, item &b)
{
    if (b < a) 
        swap(a, b);
}
 
// шаблон обмена элементов структуры
template <class item>
void swap(item&a, item&b)
{
    item temp;
    temp = a;
    a = b;
    b = temp;
}
 
// шаблон сортировки массива структур методом выбора
// вот тут моя наглая попытка передачи сортируемого поля структуры в параметр [B]key[/B], увы НЕ катит (
// а так хотелось передавать сюда по очереди нужные поля: fam, oklad, data_r[3] !
//
template <class T, class item> 
void selection_sort(T a[], [B]item key[/B], int left, int right)
{ 
    for (int i = left+1; i <= right; i++)
        for (int j = i; j > left; j--) 
            compare_swap(a[j-1][B][COLOR="Red"]->key[/COLOR][/B], a[j][B][COLOR="Red"]->.key[/COLOR][/B]);
}
Неужели придется писать отдельную функцию сортировки для каждого поля?
Но это же ужас, на каждое сортируемое поле (3 поля) писать 4 вида функций сортировки, итого 3 * 4 = 12 !!!
Есть ли из моего тупика другой выход?

P.S. Классы, string, перегрузку операторов, алгоритмы из STL и прочие новомодные навороты НЕ предлагать - этого мы еше НЕ проходили.

Добавлено через 2 часа 0 минут
наверное выход есть?
штудирую счас указатели на функции и что-то смутное у меня вырисовывается
типа как работает стандартная функцией qsort()
у нее есть параметр на функцию сравнения, возможно это выход для меня, написать три перегруженные функции сравнения:

C++
1
2
3
int compare_name(note a[], char* name);
int compare_oklad(note a[], int oklad);
int compare_date(note a[], int data_r[3]);
и тогда в функцию сортировки подставлять указатель на конкретную функцию
типа так:
C++
1
compare_swap(a[j-1], a[j], compare_name);
Это будет правильный подход?

Подумал еще и, блин, опять засада:
а что подставить на место параметров функции *(pf_compare)(note a[], ?..) в шаблоне?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// шаблон сравнения элементов структуры
template <class item> 
void compare_swap (item &a, item &b, int *(pf_compare)(note a[], ?..))
{
    if (pf_compare(a, b) < 0) 
        swap(a, b);
}
 
// шаблон обмена элементов структуры
template <class item>
void swap(item&a, item&b)
{
    item temp;
    temp = a;
    a = b;
    b = temp;
}
голова кругом от этих засад!
как жить с такими проблемами!!!
думаю дальше, думаю...............

Добавлено через 4 минуты
у меня пока с указателями БЕДА! каша полная в голове )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru