Форум программистов, компьютерный форум CyberForum.ru

Шаблон функции сортировки массива структур по разным типам полей - 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); cin>>str>>chet;size=strlen(str); //if(chet>0) http://www.cyberforum.ru/cpp-beginners/thread1138716.html
C++ Определить расстояние, пройденное физическим телом за время t
1. определить расстояние, пройденное физическим телом за время t, если тело движется с постоянным ускорением а и имеет в начальный момент времени скорость V0. Здравствуйте! Помогите решить, сестре дали задачи и она не может сделать, помогите просто плохо знает !С++ буду благодарен
C++ Списки: добавление i-ого элемента в любое место списка
Дан односвязный список, нужно организовать добавление iого элемента в любое место списка. Проблема в том что первый элемент смещается сразу в конец, независимо от того ввожу я что-то или нет. Как это исправить? #include <iostream> #include <fstream> using namespace std; struct Node {
C++ Как найти произведение 3-х последних цифр k-го числа Фибоначчи? http://www.cyberforum.ru/cpp-beginners/thread1138711.html
Как быстро найти произведение 3-х последних цифр k-го числа Фибоначчи?
C++ Строки: является ли текст записью десятичного числа, кратного 4 В заданный непустой текст входят только цифры и буквы. Определить, является ли текст записью десятичного числа, кратного 4. подробнее

Показать сообщение отдельно
don_keyhot
 Аватар для don_keyhot
4 / 4 / 2
Регистрация: 02.04.2014
Сообщений: 60
04.04.2014, 13:35     Шаблон функции сортировки массива структур по разным типам полей
Делаю лабу.
Вот текст задания.
Считайте все записи из файла "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 минуты
у меня пока с указателями БЕДА! каша полная в голове )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru