Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21

Сортировка структуры по полям

26.05.2018, 13:55. Показов 1827. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно было сделать базу данных контактов и сделать сортировку по фамилиям и номеру телефону.
Базу я сделал ,используя шаблон стек. Но вот сортировку как сделать не знаю, подскажите как ее реализовать.
Код ,который я написал :
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include <iomanip>
#include <stack>
 
using namespace std;
struct Data
{
    char name[30];
    char city[30];
    char street[30];
    char house[30];
    char apartment[30];
    char phone[30];
    
}*p;
 
stack <Data> dx;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Нажмите Enter, чтобы продолжить";
    char m;
    cin.get(m);
    system("cls");
    Data Data2;
    for (;;)
    {   
        cout << "1. Ввести данные о человеке" << endl;
        cout << "2. Показать всю информацию" << endl;
        cout << "3. Удаление записи" << endl;
        cout << "4. Выход из программы" << endl;
        cout << "Номер команды >> ";
        int a;
        cin >> a;
        switch (a)
        {
        case 1:
            cout << "\n \t\t Введите информацию о человеке" << endl;
            cin.ignore();
            cout << " Имя: ";
            cin.getline(Data2.name,30);
            //..............................
            cout << "\n Город:";
            cin.getline(Data2.city,30);
            //..............................
            cout << "\n Улица:";
            cin.getline(Data2.street,30);
            //..............................
            cout << "\n Дом:";
            cin.getline (Data2.house,30);
            //..............................
            cout << "\n Номер квартиры: ";
            cin.getline(Data2.apartment,30);
            //..............................
            cout << "\n Номер телефона:";
            cin.getline(Data2.phone,30);
            dx.push(Data2);
            cout << "\n Данные введены \n" << endl;
            break;
        case 2:
            if (dx.empty())
            {
                cout << "\n Вы еще не ввели данных \n" << endl;
            }
            else
            {
                cout << "\n\t\t Текущая информация \n" << endl;
                cout << "Имя\t" << setw(15) << " Город\t" << "Улица\t\t" << "Дом\t" << setw(7) << "Квартира\t" << setw(10) << "Номер телефона\t" << endl;
                cout << "================================================================================" << endl;
                while (!dx.empty())
                {
                    cout << dx.top().name << '\t' << setw(15) << dx.top().city << '\t' << dx.top().street <<'\t'<< setw(6) << dx.top().house << '\t'
                        << setw(7) << dx.top().apartment << "\t\t" <<setw(15) << dx.top().phone << endl;
                    dx.pop();
                }
            }
            cout << endl;
            break;
        case 3:
            if (dx.empty())
            {
                cout << "\n Вы еще не ввели данных \n" << endl;
            }
            else
            {
                dx.pop();
                cout << "\n Запись удалена \n " << endl;
            }
            break;
        case 4:
            exit(0);
        }
    }
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2018, 13:55
Ответы с готовыми решениями:

Сортировка по полям структуры
Необходимо сортировать параграфы по возрастанию. Структура имеет вид: struct gloss { char term; bool flag; int nom; } ...

Sort vector, сортировка по двум полям структуры
Поскажите как отсортировать если: struct DATA{ string fir; string sec; double sm; }; vector &lt;DATA&gt; vec; ...

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры)
Есть у меня вот такая структура, например struct Subject { int cost; int Volume; }; Потом создаю экземпляр, Subject G; ...

18
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.05.2018, 14:19
И зачем ты взял стек? Он не предназначен для сортировок. Выгружай всё в vector и там сортируй, или сразу vector используй.
0
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 11:02  [ТС]
Вы не могли бы написать примерный код, если все в вектор перекинуть? Еще не работал с классов vector
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2018, 11:12
Да то же самое, только push_back() и pop_back() использовать.
0
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 12:00  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Да то же самое, только push_back() и pop_back() использовать.
Спасибо за совет , уже переделал. Но вот не могу сортировку по полю Фамилия сделать , не поможете с ней?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 12:06
BananaSlamJama, можно использовать функцию sort из библиотеки algorithm и лямбдо-функции. Например вот так:
C++
1
sort(dx.begin(), dx.end(), [](Data& _Left, Data& _Right){ return _Left.*имя поля* > _Right.*имя поля*; });
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2018, 12:06
Здесь в 8-й строке показано: Сортировка прямым выбором в алфавитном порядке (Структуры)
Только переделай под свой контейнер и структуру.
1
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 13:20  [ТС]
Cortas, Таким способом у меня не получается почему-то сортировать
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 15:33
BananaSlamJama, почему именно?
Могу предположить, что вы пытаетесь сравнить две строки типа const char*, что простым выражением сделать нельзя. Но можно сделать следующие:

C++
1
2
3
4
5
6
7
8
9
bool lsmtrs(const char* s1, const char* s2)//пишем функцию сравнения строк
{
    int i = 0;
    while(s1[i] != '\0' && s1[i] == s2[i])//Чтобы правильно упорядочить строки типа "Hello, mister!" и "Hello, miss!"
        i++;
    return s1[i] > s2[i];//сравниваем уже различные элементы, либо два '\0' эл., если дошли до конца
}
//...
sort(dx.begin(), dx.end(), [](Data& _Left, Data& _Right){ return lsmtrs(_Left.*имя строкового поля* > _Right.*имя строкового поля*); });
0
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 16:57  [ТС]
Cortas, Вы не могли бы сказать поконкретнее ,куда я должен это вставить и что написать в *имя строкового поля* , я только начал изучать си++ и не очень хорошо понимаю,что делать с вашим кодом
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 17:05
BananaSlamJama, в место, где вы планируете сортировать вектор по тому или иному критерию (имя, город, улица и т.д.) вставляете тот код, который я вам кинул, только функцию lsmtrs вынесите за main.
Цитата Сообщение от BananaSlamJama Посмотреть сообщение
что написать в *имя строкового поля*
Ну, если вы хотите отсортировать по имени, то пишите _Left.name, если по улице, то _Left.street и т.д.
0
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 18:39  [ТС]
Cortas, выдается ошибка "аргумент типа bool несовместим с параметром типа const char* , в этом месте :
_Left.*имя строкового поля* > _Right.*имя строкового поля*); });
и после _Right.name пишет ,что мало аргументов вызове функции
Надеюсь понятно описал проблему.
в имени строкового поля писал name.

Добавлено через 17 минут
Cortas, сейчас ошибку исправил, все работает, однако возник новый вопрос , как сделать сортировку по алфавиту данного поля?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 18:42
BananaSlamJama, эмм, а как она сортирует его?
0
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 18:54  [ТС]
Cortas, ну чем больше строка с именем,тем выше она находится , сейчас еще протестирую
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 18:56
BananaSlamJama, можешь скрин кинуть?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2018, 18:57
А зачем вообще такие сложности с поиском? Строки обычным способом сравниваются.
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 19:02
nmcf, согласен, можно использовать и strcmp, почему нет.
1
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 21
27.05.2018, 19:03  [ТС]
Cortas, я условие чуток поменял в функции да все заработало. Так что спасибо Вам большое!!!!!
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.05.2018, 19:04
BananaSlamJama, та хрень, которую я тебе кинул, то работает правильно, только сортирует в обратном алфавитном порядке (если хочешь в просто алфавитном поменяй > на <, либо используй strcmp).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2018, 19:04
Помогаю со студенческими работами здесь

Не очевидное смещение к полям структуры
Доброе время суток! Столкнулся с непонятным мне вопросом... у меня есть структура: struct A { uint16_t x; uint32_t y; }

Доступ к полям структуры по номерам
Как можно присвоить полям структуры номера и организовать к ним доступ по этому номеру? Видел где-то идею сделать внутри структуры функцию,...

Получить доступ к полям структуры
здравствуйте,если свести проблему к локальному контексту, то есть код примерно такой: struct zeus { template&lt;typename...

Присвоить значения полям структуры
Фрагмент программы. не могу присвоить значения полям структуры.почему??? ошибка Lvalue required class laba { int...

В цикле пройти по полям структуры
Доброго времени суток! Имеется структура данных struct Rules { public: std::string left; std::string...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru