Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
368 / 256 / 65
Регистрация: 22.06.2010
Сообщений: 1,566

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

14.11.2011, 22:03. Показов 5367. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый вечер, снова я. Не могу решить вроде бы простое задание по информатике, перерыл кучу страниц, мануалов и кодов, нигде не могу найти, как же сделать сабж. Задание таково: Описать структуру с именем 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 вложенных условий, но всё равно не пашет. Отсортировывать надо ДО того, как будет производиться поиск по базе.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2011, 22:03
Ответы с готовыми решениями:

Сортировка по первым трем цифрам
Помогите организовать сортировку по первым трем цифрам телефона из 6 цифр void DBase::Show() { cout &lt;&lt;...

Сортировка по трем первым цифрам номера телефона
Здравствуйте, нужна ваша помощь с сортировкой.Всё, сделал кроме неё. (записи должны быть упорядочены по трем первым цифрам номера...

Поиск по первым трем цифрам номера телефона
Помогите пожалуйста доделать поиск по первым трем цифрам номера телефона. Вот кодclass zapis { private String _famil; ...

10
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:05
Ну хорошо, но сортировки я у вас не нашел. Выложите ее, пусть даже код неправильный.
1
368 / 256 / 65
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:12  [ТС]
Адовый бред (перенос первых трёх цифр номера первой структуры в массив 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 минуты
Поправил разметку *
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:16
Ну и первое что бросилось в глаза
C++
1
for(int i=1; i<8; i++){
будет 7 итераций, хотя массив расчитан на 9, даже если последний буфер, то один неиспользуемый элемент в массиве получается - так и задумано?

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

Добавлено через 2 минуты
А, ну и у вас типичный выход за границы массива в строке #24.
Segmentation fault - от него?
Первая программа идеально работала, из-за долбанной сортировки пришлось поставить тип "char", из-за этого появилась проблема с поиском, но с этим я постараюсь разобраться сам, меня сортировка очень сильно напрягает.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 22:29
Segmentation fault - от него?
Вполне возможно.
Кстати, у вас в структуре размер массива для имени, фамилии, номера телефона не определен. К своему стыду признаюсь, что я не знаю, повлияет ли это на работоспособность. Но, почему то кажется, что повлияет.
Сейчас, я попробую с нуля переписать.
1
368 / 256 / 65
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 22:32  [ТС]
Длина имени-фамилии неизвестна, думаю, на работоспособность не влияет.
Спасибо. Решил все лабы делать сам, но вот сортировка...
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 23:01
Ну вот, накидал.
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;
}
Code
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
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:~$
Только вводит, сортирует и выводит.
1
368 / 256 / 65
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 23:05  [ТС]
ОГРОМНЕЙШЕЕ спасибо, буду разбираться. А что есть
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;
    }
?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.11.2011, 23:09
Хм. Я почему-то подумал, что перегружать оператор присваивания необходимо, для
C++
1
2
NODE p1, p2;
p1 = p2;
Однако g++ опроверг это.
Можете закомментировать.
1
368 / 256 / 65
Регистрация: 22.06.2010
Сообщений: 1,566
14.11.2011, 23:25  [ТС]
Отлично, спасибо, буду писать дальше.

Добавлено через 14 минут
PS: надо же, мой ход мысли был верным. Ещё раз огромнейшее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2011, 23:25
Помогаю со студенческими работами здесь

Упорядочить записи структур по 3 первым цифрам телефона
В коде объявлен массив структур и записан в файл. Осталось упорядочить их но у меня просто не выходит. #include &lt;iostream&gt; ...

Сортировка по первым 6 цифрам
Всем привет. Нужно помощь. Есть таблица с номирами телефонов( в одной ячейке 1 номер). Нужно отсортировать если первые 6 цифр совпадают то...

Сортировка массива структур по возрастанию одного из полей
Всем привет, Есть структура struct Taksopark//создание структуры { char vid_avto; int vmestimost; float rashod_topliva; ...

Сортировка txt файла по первым трем символам
Доброго времени суток. Собственно стоит задача такая. Есть txt файл вида: 123 name1 234 name2 873 name3 .............. 396...

Найти сумму всех четных элементов массива, максимальный элемент и его номер, количество элементов, кратных трем
Дан одномерный масив чисел. Найти сумму всех четных элементов массива, максимальный элемент и его номер, количество элементов, ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru