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

Сортировка массива структур по первым трём цифрам одного из его элементов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:03     Сортировка массива структур по первым трём цифрам одного из его элементов #1
Добрый вечер, снова я. Не могу решить вроде бы простое задание по информатике, перерыл кучу страниц, мануалов и кодов, нигде не могу найти, как же сделать сабж. Задание таково: Описать структуру с именем NOTE <...> в которой записи упорядочены по трём первым цифрам номера телефона.
Собственно, код (задания типа "ввести с клавиатуры, найти по фамилии) работают, проблема только с сортировкой:
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
#include <iostream>
#include <iomanip>
#include <string>
//Допилить сортировку
using namespace std;
 
int main()
{
    struct note{
                  char name[];
                  char thname[];
                  char telnum[];
                  int birthday[3];
               }; 
    note w[9]; //Девятый - БУФЕР
    char temp_array[3], temp_temp_array[3];
    string tname;
    int one_mass, two_mass;
    bool a, b;
    a = false;
    b = true;
    for(int i=1; i<8; i++){ //Ввод данных
            cout << "BBog gaHHblx (uM9l, familia, HOMEP TEJlEfOHA, DeHb Po}|{geHu9l, MeczLL u rog: \n";
                     cin >> w[i].name >> w[i].thname >> w[i].telnum >> w[i].birthday[1] >> w[i].birthday[2] >> w[i].birthday[3];
                       };   
    cout << "BBeguTe faMuJlu}O: \n";
    cin >> tname;
   for(int i=1; i<=8; i++){ //Поиск по фамилии, тут ошибка, но я про неё знаю
                      if(tname == w[i].thname){
                             cout << "uM9l: " << w[i].name << ", familia: " << w[i].thname << ", HOMEH TELEFOHA: " << w[i].telnum << ", gaTa po}|{geHu9l: " << w[i].birthday[1] << "." << w[i].birthday[2] << "." << w[i].birthday[3];
                             a = true;
                              };
                        };
    if(a == false) cout << "3anuceu HE o6Hape}|{eHo! \n";
    return 0;
}
Сделал всё, но не могу отсортировать с**ный массив структур, остальное работает, раздражает страшно! Пробовал писать, как думал - накодил раза в три больше, чем вся программа, и всё равно не работает. Буду очень благодарен за подсказку. Заранее спасибо.

Добавлено через 1 минуту
Пытался отсортировать через вынос первых трёх цифр в отдельный массив с запоминанием индекса структуры и его сортировкой, 6 вложенных условий, но всё равно не пашет. Отсортировывать надо ДО того, как будет производиться поиск по базе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 22:03     Сортировка массива структур по первым трём цифрам одного из его элементов
Посмотрите здесь:

C++ Сортировка массива структур
Сортировка массива структур C++
Сортировка массива структур C++
C++ Сортировка массива структур
Сортировка массива структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:05     Сортировка массива структур по первым трём цифрам одного из его элементов #2
Ну хорошо, но сортировки я у вас не нашел. Выложите ее, пусть даже код неправильный.
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:12  [ТС]     Сортировка массива структур по первым трём цифрам одного из его элементов #3
Адовый бред (перенос первых трёх цифр номера первой структуры в массив temp_temp_array и последующим сравнением всех других номеров с ним, если больше - поменять структуры местами), сам запутался.

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
#include <iostream>
#include <iomanip>
#include <string>
//Допилить сортировку
using namespace std;
 
int main()
{
    struct note{
                  char name[];
                  char thname[];
                  char telnum[];
                  int birthday[3];
               }; 
    note w[9]; //Девятый - БУФЕР
    char temp_array[3], temp_temp_array[3];
    string tname;
    int one_mass, two_mass;
    bool a, b;
    a = false;
    b = true;
   for(int i=1; i<8; i++){ 
             cout << "BBog gaHHblx (uM9l, familia, HOMEP TEJlEfOHA, DeHb Po}|{geHu9l, MeczLL u rog: \n";
                      cin >> w[i].name >> w[i].thname >> w[i].telnum >> w[i].birthday[1] >> w[i].birthday[2] >> w[i].birthday[3];
                      if(b == true){
                     for(int j=1; j<3; j++)temp_temp_array[j] = w[i].telnum[j];
                     one_mass = i;
                               };
                      for(int j=1; j<3; j++){temp_array[j] = w[i].telnum[j]; two_mass = i;}; //Перенос первых трёх цифр номера во временный массив
                      if(b == false){
                     if(temp_array[1] > temp_temp_array[1]){
                                                            w[9] = w[one_mass];
                                                            w[one_mass] = w[i];
                                                            w[i] = w[9];
                                                   };
                    if(temp_array[1] == temp_temp_array[1]){
                                                        if(temp_array[2] > temp_temp_array[2]){
                                                                    w[9] = w[one_mass];
                                                                                 w[one_mass] = w[i];
                                                                    w[i] = w[9];
                                                        };
                                        if(temp_array[2] == temp_temp_array[2]){
                                                        if(temp_array[2] > temp_temp_array[2]){
                                                                               w[9] = w[one_mass];
                                                                               w[one_mass] = w[i];
                                                                               w[i] = w[9];
                                                                              };
                                        if(temp_array[2] == temp_temp_array[2]){
                                                                if(temp_array[2] > temp_temp_array[2]){
                                                                            w[9] = w[one_mass];
                                                                                                          w[one_mass] = w[i];
                                                                            w[i] = w[9];
                                                                                                                           };
                                                                                };                                  
                                    };                                  
                                                                             };
                                          };
     b = false;
                           };   
    cout << "BBeguTe faMuJlu}O: \n";
 
    for(int r=1; r<=8; r++)cout << w[r].telnum[1] << w[r].telnum[2] << w[r].telnum[3] << endl;
    for(int i=1; i<=8; i++){
                           if(tname == w[i].thname){
                                                    cout << "uM9l: " << w[i].name << ", familia: " << w[i].thname << ", HOMEH TELEFOHA: " << w[i].telnum << ", gaTa po}|{geHu9l: " << w[i].birthday[1] << "." << w[i].birthday[2] << "." << w[i].birthday[3];
                                                    a = true;
                                                 };
                        };
    if(a == false) cout << "3anuceu HE o6Hape}|{eHo! \n";
    return 0;
}
Добавлено через 3 минуты
Поправил разметку *
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:16     Сортировка массива структур по первым трём цифрам одного из его элементов #4
Ну и первое что бросилось в глаза
C++
1
for(int i=1; i<8; i++){
будет 7 итераций, хотя массив расчитан на 9, даже если последний буфер, то один неиспользуемый элемент в массиве получается - так и задумано?

Добавлено через 1 минуту
А, ну и у вас типичный выход за границы массива в строке #24. Нумерация начинается с нуля.
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:19  [ТС]     Сортировка массива структур по первым трём цифрам одного из его элементов #5
soon, привычка ещё с Паскаля, надо с нуля, конечно, и желательно ставить не =, а =<

Добавлено через 2 минуты
А, ну и у вас типичный выход за границы массива в строке #24.
Segmentation fault - от него?
Первая программа идеально работала, из-за долбанной сортировки пришлось поставить тип "char", из-за этого появилась проблема с поиском, но с этим я постараюсь разобраться сам, меня сортировка очень сильно напрягает.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:29     Сортировка массива структур по первым трём цифрам одного из его элементов #6
Segmentation fault - от него?
Вполне возможно.
Кстати, у вас в структуре размер массива для имени, фамилии, номера телефона не определен. К своему стыду признаюсь, что я не знаю, повлияет ли это на работоспособность. Но, почему то кажется, что повлияет.
Сейчас, я попробую с нуля переписать.
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:32  [ТС]     Сортировка массива структур по первым трём цифрам одного из его элементов #7
Длина имени-фамилии неизвестна, думаю, на работоспособность не влияет.
Спасибо. Решил все лабы делать сам, но вот сортировка...
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 23:01     Сортировка массива структур по первым трём цифрам одного из его элементов #8
Ну вот, накидал.
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
#include <iostream>
#include <cstring>
 
const int PERSON = 8;
 
struct NOTE
{
    int number;
    std::string firstName;
    std::string secondName;
    std::string phoneNumber;
    std::string birthday;
    void operator=(struct NOTE p)
    {
        number      = p.number;
        firstName   = p.firstName;
        secondName  = p.secondName;
        phoneNumber = p.phoneNumber;
        birthday    = p.birthday;
    }
};
 
void Swap(struct NOTE &p1, struct NOTE &p2)
{
    NOTE tmp = p1;
    p1 = p2;
    p2 = tmp;
}
 
int main()
{
    struct NOTE person[PERSON];
    for(int i = 0; i < PERSON; ++i)
    {
        person[i].number = i;
        std::cout << "Person #" << person[i].number << ". Enter the first and last names, phone number and birthday:" << std::endl;
        std::cin >> person[i].firstName >> person[i].secondName >> person[i].phoneNumber >> person[i].birthday;
    }
    for(int i = 0; i < PERSON - 1; ++i)
    {
        for(int j = i + 1; j < PERSON; ++j)
        {
            if(person[i].phoneNumber[0] > person[j].phoneNumber[0])
                Swap(person[i], person[j]);
            else if(person[i].phoneNumber[0] == person[j].phoneNumber[0])
                if(person[i].phoneNumber[1] > person[j].phoneNumber[1])
                    Swap(person[i], person[j]);
                else if(person[i].phoneNumber[1] == person[j].phoneNumber[1])
                    if(person[i].phoneNumber[2] > person[j].phoneNumber[2])
                        Swap(person[i], person[j]);
        }
    }
    for(int i = 0; i < PERSON; ++i)
        std::cout << "Person #" << person[i].number << ". First & last name: " << person[i].firstName << ' ' << person[i].secondName << ", phone number: " << person[i].phoneNumber << std::endl;
    return 0;
}
Код
soon@coming:~$ g++ tmp.cpp -o tmp
soon@coming:~$ ./tmp
Person #0. Enter the first and last names, phone number and birthday:
a a 123456 lolwhut
Person #1. Enter the first and last names, phone number and birthday:
b b 234567 qwe
Person #2. Enter the first and last names, phone number and birthday:
c c 112111 troll
Person #3. Enter the first and last names, phone number and birthday:
d d 121111 lol
Person #4. Enter the first and last names, phone number and birthday:
e e 121221 grub
Person #5. Enter the first and last names, phone number and birthday:
f f 111112 ios
Person #6. Enter the first and last names, phone number and birthday:
g g 123123 us
Person #7. Enter the first and last names, phone number and birthday:
h h 899898 ru
Person #5. First & last name: f f, phone number: 111112
Person #2. First & last name: c c, phone number: 112111
Person #4. First & last name: e e, phone number: 121221
Person #3. First & last name: d d, phone number: 121111
Person #0. First & last name: a a, phone number: 123456
Person #6. First & last name: g g, phone number: 123123
Person #1. First & last name: b b, phone number: 234567
Person #7. First & last name: h h, phone number: 899898
soon@coming:~$
Только вводит, сортирует и выводит.
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 23:05  [ТС]     Сортировка массива структур по первым трём цифрам одного из его элементов #9
ОГРОМНЕЙШЕЕ спасибо, буду разбираться. А что есть
C++
1
2
3
4
5
6
7
8
    void operator=(struct NOTE p)
    {
        number      = p.number;
        firstName   = p.firstName;
        secondName  = p.secondName;
        phoneNumber = p.phoneNumber;
        birthday    = p.birthday;
    }
?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 23:09     Сортировка массива структур по первым трём цифрам одного из его элементов #10
Хм. Я почему-то подумал, что перегружать оператор присваивания необходимо, для
C++
1
2
NODE p1, p2;
p1 = p2;
Однако g++ опроверг это.
Можете закомментировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 23:25     Сортировка массива структур по первым трём цифрам одного из его элементов
Еще ссылки по теме:

C++ сортировка структур массива
Сортировка элементов массива структур шаблонной функцией C++
Сортировка массива структур через сортировку массива указателей C++

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

Или воспользуйтесь поиском по форуму:
Zoominger
363 / 252 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 23:25  [ТС]     Сортировка массива структур по первым трём цифрам одного из его элементов #11
Отлично, спасибо, буду писать дальше.

Добавлено через 14 минут
PS: надо же, мой ход мысли был верным. Ещё раз огромнейшее спасибо!
Yandex
Объявления
14.11.2011, 23:25     Сортировка массива структур по первым трём цифрам одного из его элементов
Ответ Создать тему

Метки
описать структуру, описать структуру c++, описать структуру note c++, описать структуру note, описать структуру с именем note c++, описать структуру с именем note, структуры данных, структуры данных c++
Опции темы

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