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

Файл структур: сортировка по выбираемому пользователем полю - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 20:01     Файл структур: сортировка по выбираемому пользователем полю #1
Имеется файл, состоящий из отдельных строк структуры.
Нужно написать сортировку по выбираемому пользователем полю
В файле 5 полей:
1-Фамилия
2-Имя
3-Отчество
4-Группа
5-Оценка


Помогите плиз)
Заранее спасибо)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
21.01.2012, 22:53     Файл структур: сортировка по выбираемому пользователем полю #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iterator>
 
struct Student
{
    std::string name, surname, patronym, group;
    std::size_t mark;
    friend std::ostream& operator<<(std::ostream& o, const Student& st)
    {
        o << st.surname << '\n' << st.name << '\n' << st.patronym << '\n' << st.group << '\n' << st.mark;
        return o;
    }
};
 
template<typename F>
void Sort(F Student::*, std::vector<Student>& );
 
template<typename F>
struct StudCompare
{
    StudCompare(F Student::* _pField) : pField(_pField){}
    bool operator()(const Student& a, const Student& b) const
    {
        return a.*pField < b.*pField;
    }
private:
    F Student::* pField;
};
 
int main()
{
    std::fstream fs("1.txt");
    if(fs)
    {
        std::vector<Student> v;
        Student tmp;
        while(fs >> tmp.surname >> tmp.name >> tmp.patronym >> tmp.group >> tmp.mark)
        {
            v.push_back(tmp);
        }
        std::cout << "v.size() is " << v.size() << "\n\n";
        std::cout << "Input sort criterion(1 - 5): 1 - surname, 2 - name, 3 - patronym, "
        "4 - group, 5 - mark\n";
        std::size_t crit;
        std::cin >> crit;
        if(crit >= 1 && crit <= 5)
        {
            switch(crit)
            {
                case 1 : Sort(&Student::surname, v); break;
                case 2 : Sort(&Student::name, v); break;
                case 3 : Sort(&Student::patronym, v); break;
                case 4 : Sort(&Student::group, v); break;
                case 5 : Sort(&Student::mark, v); break;
            }
            std::copy(v.begin(), v.end(), std::ostream_iterator<Student>(std::cout, "\n\n"));
        }
        else std::cerr << "Incorrect choice\n";
    }
    else std::cerr << "Can't open file\n";
    fs.close();
    return 0;
}
 
template<typename F>
void Sort(F Student::* pField, std::vector<Student>& v)
{
    StudCompare<F> sc(pField);
    std::sort(v.begin(), v.end(), sc);
}
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:07  [ТС]     Файл структур: сортировка по выбираемому пользователем полю #3
Программа вылетает с ошибкой: "Программа "[6488] CPO.exe: Машинный код" завершилась с кодом 0 (0x0)."
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
21.01.2012, 23:13     Файл структур: сортировка по выбираемому пользователем полю #4
Цитата Сообщение от ishushii Посмотреть сообщение
завершилась с кодом 0 (0x0)
Что-то не похоже на ошибку. По-моему это значит, что всё кончилось хорошо.
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:28  [ТС]     Файл структур: сортировка по выбираемому пользователем полю #5
Прошу прощения с файлом протупил)

А почему после вывода на экран отсортированных данных они тут же пропадают?
можно это как то исправить?
JokerNN
132 / 128 / 36
Регистрация: 29.12.2011
Сообщений: 359
21.01.2012, 23:34     Файл структур: сортировка по выбираемому пользователем полю #6
В конец майна перед return напиши system("PAUSE");
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
21.01.2012, 23:38     Файл структур: сортировка по выбираемому пользователем полю #7
или так: перед return 0; допиши
C++
1
2
std::cin.sync();
std::cin.get();
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:42  [ТС]     Файл структур: сортировка по выбираемому пользователем полю #8
спасибо)
а что нужно ещё дописать для того чтобы после вывода 1 сортировки программа не закрывалась а предлогала выйти или отсордировать по другому полю?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
22.01.2012, 10:42     Файл структур: сортировка по выбираемому пользователем полю #9
зациклить можно так
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iterator>
 
struct Student
{
    std::string name, surname, patronym, group;
    unsigned short mark;
    friend std::ostream& operator<<(std::ostream& o, const Student& st)
    {
        o << st.surname << '\n' << st.name << '\n' << st.patronym << '\n' << st.group << '\n' << st.mark;
        return o;
    }
};
 
template<typename F>
void Sort(F Student::*, std::vector<Student>&);
 
template<typename F>
struct StudCompare
{
    StudCompare(F Student::* _pField) : pField(_pField){}
    bool operator()(const Student& a, const Student& b) const
    {
        return a.*pField < b.*pField;
    }
private:
    F Student::* pField;
};
 
int main()
{
    std::fstream fs("1.txt", std::ios::in);
    if(fs)
    {
        std::vector<Student> v;
        Student tmp;
        while(fs >> tmp.surname >> tmp.name >> tmp.patronym >> tmp.group >> tmp.mark)
        {
            v.push_back(tmp);
        }
        std::cout << "v.size() returns " << v.size() << "\n\n";
        char isContinue;
        unsigned short criterion;
        do
        {
            std::cout << "Input sort criterion(1 - 5): 1 - surname, 2 - name, 3 - patronym, "
            "4 - group, 5 - mark\n";
            std::cin >> criterion;
            if(criterion >= 1 && criterion <= 5)
            {
                switch(criterion)
                {
                    case 1 : Sort(&Student::surname, v); break;
                    case 2 : Sort(&Student::name, v); break;
                    case 3 : Sort(&Student::patronym, v); break;
                    case 4 : Sort(&Student::group, v); break;
                    case 5 : Sort(&Student::mark, v); break;
                }
                std::copy(v.begin(), v.end(), std::ostream_iterator<Student>(std::cout, "\n\n"));
            }
            else std::cerr << "Incorrect choice\n";
            std::cout << "Continue? (y / n) : ";
            std::cin >> isContinue;
            std::cin.sync();
        } while('y' == isContinue || 'Y' == isContinue);
    }
    else std::cerr << "Can't open file\n";
    fs.close();
    return 0;
}
 
template<typename F>
void Sort(F Student::* pField, std::vector<Student>& v)
{
    std::sort(v.begin(), v.end(), StudCompare<F>(pField));
}
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
22.01.2012, 11:18  [ТС]     Файл структур: сортировка по выбираемому пользователем полю #10
что то ничего не изменилось всё равно после первого вывода закрывается(
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
22.01.2012, 11:42     Файл структур: сортировка по выбираемому пользователем полю #11
если VS, то она при наличии ошибок запускает старую версию проги. Добавь include <stdafx.h>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 21:50     Файл структур: сортировка по выбираемому пользователем полю
Еще ссылки по теме:

C++ Сортировка массива (вектора) структур по заданному полю
C++ Сортировка массива структур по заданному полю
C++ Сортировка массива структур по заданному полю

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
22.01.2012, 21:50  [ТС]     Файл структур: сортировка по выбираемому пользователем полю #12
можешь кто нибудь расписать программу что какая строка делает?(просто хочу понимать как это сделанно)))
заранее спасибо
Yandex
Объявления
22.01.2012, 21:50     Файл структур: сортировка по выбираемому пользователем полю
Ответ Создать тему
Опции темы

Текущее время: 10:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru