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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
#1

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

21.01.2012, 20:01. Просмотров 1200. Ответов 11
Метки нет (Все метки)

Имеется файл, состоящий из отдельных строк структуры.
Нужно написать сортировку по выбираемому пользователем полю
В файле 5 полей:
1-Фамилия
2-Имя
3-Отчество
4-Группа
5-Оценка


Помогите плиз)
Заранее спасибо)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Файл структур: сортировка по выбираемому пользователем полю (C++):

Сортировка структур по полю - C++
Здравствуйте всем! Я здесь новичок. Учусь на программиста на 1 курсе, скажу прямо мне очень тяжело.:cry:Мне нужно до 15 мая сдать курсовую,...

Сортировка массива структур по заданному полю - C++
Здравствуйте. Нужна помощь в сортировке. Вот само задание: Составить таблицу, содержащую следующие сведения о сотрудниках кафедры: ...

Сортировка массива структур по одному полю - C++
Приветствую. Задача: отсортировать по возрастанию структуру по одному полю. Вчера поднимал тему:...

Сортировка массива структур по одному полю - C++
Приветствую. Есть задача, практически аналогичная моей: http://www.cyberforum.ru/cpp-beginners/thread1403598.html В этом примере...

Сортировка массива структур по заданному полю - C++
Задание под вариантом такое : Упорядочить список студентов по предмету физика, и вывести весь список. С 1 пунктом я вроде справился, а...

Сортировка массива структур по определенному полю - C++
Всем привет...со структурами проблемка возникла...затупил)Задание состоит в следующем: Ввести структуру Студент с полями...

11
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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);
}
3
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:07  [ТС] #3
Программа вылетает с ошибкой: "Программа "[6488] CPO.exe: Машинный код" завершилась с кодом 0 (0x0)."
0
NoMasters
Псевдослучайный
1762 / 1105 / 73
Регистрация: 13.09.2011
Сообщений: 3,141
21.01.2012, 23:13 #4
Цитата Сообщение от ishushii Посмотреть сообщение
завершилась с кодом 0 (0x0)
Что-то не похоже на ошибку. По-моему это значит, что всё кончилось хорошо.
0
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:28  [ТС] #5
Прошу прощения с файлом протупил)

А почему после вывода на экран отсортированных данных они тут же пропадают?
можно это как то исправить?
0
JokerNN
132 / 128 / 36
Регистрация: 29.12.2011
Сообщений: 359
21.01.2012, 23:34 #6
В конец майна перед return напиши system("PAUSE");
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
21.01.2012, 23:38 #7
или так: перед return 0; допиши
C++
1
2
std::cin.sync();
std::cin.get();
0
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
21.01.2012, 23:42  [ТС] #8
спасибо)
а что нужно ещё дописать для того чтобы после вывода 1 сортировки программа не закрывалась а предлогала выйти или отсордировать по другому полю?
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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));
}
0
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
22.01.2012, 11:18  [ТС] #10
что то ничего не изменилось всё равно после первого вывода закрывается(
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
22.01.2012, 11:42 #11
если VS, то она при наличии ошибок запускает старую версию проги. Добавь include <stdafx.h>
0
ishushii
1 / 1 / 0
Регистрация: 20.01.2012
Сообщений: 41
22.01.2012, 21:50  [ТС] #12
можешь кто нибудь расписать программу что какая строка делает?(просто хочу понимать как это сделанно)))
заранее спасибо
0
22.01.2012, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 21:50
Привет! Вот еще темы с ответами:

Сортировка массива (вектора) структур по заданному полю - C++
Нужно отсортировать массив по полю структуры. Все поля типа string. struct DatabaseData{ std::string aPointOfDeparture;//Пункт...

Сортировка массива(вектора)структур по одному полю - C++
Код:#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; struct Person{ std::string surname,name; ...

HOWTO: сортировка массива структур по произвольному полю - C++
Вот тут товарищ навел на размышления, а как же собственно сортировать по произвольному полю? struct myStruct{ int m1; string m2; ...

Сортировка массива структур через switch по любому полю - C++
Столкнулся с проблемой сортировки массива по любому из полей, а точнее не пойму как реализовать эту сортировку для нескольких &quot;жильцов&quot;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru