0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
1

Проблемы с sort

07.05.2021, 14:34. Показов 2672. Ответов 14
Метки нет (Все метки)

Ребят, привет. В общем, я тут уже несколько тем создал насчёт программы, но всё никак не могу сделать. В общем, суть такая: есть детали с времени обработкой t1 и t2 соответственно. Мне нужно отсортировать их так, чтобы в один массив шли детали по минимуму t1, в другой - по минимуму t2. А потом мне нужно эти два массива объединить в один, при этом сначала идёт массив с t1, а потом с t2 в обратном порядке.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <iomanip>
#include <time.h>
#include <vector>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
ofstream fout("res.txt", ios::trunc);
 
// ============================================================
struct Item
{
    int id{};
    int t1{};
    int t2{};
    bool operator< (const Item& p) const
    {
        return min (t1,p.t2) <= min (p.t1,t2);
    }
};
 
// ============================================================
void printInformation(const std::vector<Item>& data)
{
    for (auto& i:data)
    {
        cout << "\nНомер детали:"                 << setw(3)<< i.id;
        cout << "\nВремя обработки на 1 станке: " << setw(3)<< i.t1;
        cout << "\nВремя обработки на 2 станке: " << setw(3)<< i.t2;
        cout << '\n';
 
        fout << "\nНомер детали:"                 << setw(3)<< i.id;
        fout << "\nВремя обработки на 1 станке: " << setw(3)<< i.t1;
        fout << "\nВремя обработки на 2 станке: " << setw(3)<< i.t2;
        fout << '\n';
    }
}
 
// ============================================================
void Sort(vector<Item>& data, int amount)
{
    sort(data.begin(), data.end());
    vector <Item> a;
    vector <Item> b;
    for (int i{}; i < amount; ++i) {
        if (data[i].t1 <= data[i].t2)
            a.push_back(data[i].t1);
        else
            b.push_back(data[i].t2);
    }
    data().clear;
    data.insert(a.end(), b.rbegin(), b.rend());
}
 
// ============================================================
void Chrono(vector<Item>& data, int amount)
{
 
    int ch1 {},
        ch2 {};
 
    for ( int i {}; i < amount; ++i ) {
        ch1 = data[i].t1;
        ch2 = ch1;
        break;
    }
 
    for ( int i {}; i + 1 < amount; ++i ) {
        if ( data[i+1].t1 >= data[i].t2 )
            ch2 += (data[i+1].t1 - data[i].t2);
    }
 
    cout << ch2;
    cout << '\n';
 
    fout << endl;
    fout << "Время простоя до/после: " << setw(3) << ch2;
    fout << '\n';
}
 
// ============================================================
int main()
{
    setlocale (0,"rus");
    std::srand(unsigned(time(0)));
 
    cout << "Введите количество деталей: ";
    int amount {};
    cin >> amount;
    vector<Item> data(amount);
 
    cout << "==================================="
         << "\nВыберите способ генерации данных: "
         << "\n1 - вручную "
         << "\n2 - случайным образом "
         << "\n================================="
         << endl;
 
    int choice;
    cin >> choice;
 
    switch ( choice ) {
    case 1: {
        cout << "Введите данные:\n ";
        int new_id=1;
        for (auto& i:data){
            cin >> i.t1;
            cin >> i.t2;
            i.id = new_id;
            new_id++;
        }
        break;
    }
    case 2: {
        int new_id=1;
        for (auto& i:data){
            i.t1 = std::rand() %10 +1;
            i.t2 = std::rand() %10 +1;
            i.id = new_id;
            new_id++;
        }
        break;
    }
    }
 
    printInformation(data);
    cout << "\n===========================================";
    cout << "\nВремя простоя 2 станка до сортировки: ";
    Chrono(data,amount);
    Sort(data,amount);
    cout << "\nВремя простоя 2 станка после сортировки: ";
    Chrono(data,amount);
    cout << "\n===========================================";
    cout << "\nПорядок обработки деталей: ";
    printInformation(data);
    fout.close();
}
Добавлено через 15 минут
Я не понимаю, почему не работает push_back.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2021, 14:34
Ответы с готовыми решениями:

Отсортировать массив методами Bubble Sort, Selection Sort и Insertion Sort
Дан одномерный массив из 10 целых чисел. Заполните массив автоматически случайными числами...

Проблемы с sort()
В #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;algorithm&gt; using namespace...

Упорядочить элементы массивы по увеличению если Sort=0 и по уменьшению про Sort=1
Обработка массива данных. Const m - наибольшее колличество елементво в массиве TELement - тип...

Сортировка двумерного массива Quick Sort и Selection Sort
В чем состоит задание . Отсортировать двумерный массив не переделывая его в одномерный. Те мы НЕ...

14
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
07.05.2021, 14:46 2
Qrote, как минимум в строках 49 и 51, вы пытаетесь добавить в вектор обьектов структур переменную самого обьекта структур.
А 53 строка должна выглядеть как-то так:
C++
1
data.clear();
А в 49 и 51 возможно так:
C++
1
2
a.push_back(data[i]);
b.push_back(data[i]);
Добавлено через 4 минуты
Цитата Сообщение от stdin Посмотреть сообщение
переменную самого обьекта структур
Поле самого обьекта структуры*
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 14:56  [ТС] 3
stdin, исправил, программа работает, но выдаёт это.
Не хочет считать время после сортировки.
Миниатюры
Проблемы с sort  
0
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
07.05.2021, 15:18 4
Qrote, А что вы в sort этим хотите сделать?
C++
1
data.insert(a.end(), b.rbegin(), b.rend());
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 15:34  [ТС] 5
stdin, вставить в массив data сначала массив a, затем массив б в обратном порядке
0
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
07.05.2021, 15:53 6
Лучший ответ Сообщение было отмечено Qrote как решение

Решение

Qrote, вот так:
C++
1
2
data.insert(data.end(), a.begin(), a.end());
data.insert(data.end(), b.rbegin(), b.rend());
Также судя по всему у вас компаратор для std::sort плохо прописан и выдает исключения. Исправлять компаратор не стал, ибо не знаю как он у вас должен сравнивать.
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 16:07  [ТС] 7
stdin, теперь выдаёт какие-то 0 детали. Я думаю, может вообще убрать компаратор? Потому что, получается по сути, что я же провожу самостоятельно сортировку второй раз через
Цитата Сообщение от Qrote Посмотреть сообщение
if (data[i].t1 <= data[i].t2)
Миниатюры
Проблемы с sort  
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 16:26  [ТС] 8
stdin, я так понимаю, это те 0 элементы, которыми массив заполнился при создании и их надо как-то удалить.

Добавлено через 7 минут
stdin, в принципе, я исправил ошибку, хотя почему-то сортировка до сих пор неправильная. Спасибо вам большое.
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,869
07.05.2021, 18:09 9
Цитата Сообщение от Qrote Посмотреть сообщение
хотя почему-то сортировка до сих пор неправильная
Цитата Сообщение от Qrote Посмотреть сообщение
C++
1
2
3
4
bool operator< (const Item& p) const
    {
        return min (t1,p.t2) <= min (p.t1,t2);
    }
Что за порядок вы тут пытались получить мне не ясно, но сразу же очевидно: применение сравнения <= в предикате < - грубая ошибка. Этот компаратор неработоспособен.

Цитата Сообщение от Qrote Посмотреть сообщение
не нужно отсортировать их так, чтобы в один массив шли детали по минимуму t1, в другой - по минимуму t2.
Невозможно понять, о чем тут идет речь. Что это значит?

Цитата Сообщение от Qrote Посмотреть сообщение
C++
1
void Sort(vector<Item>& data, int amount)
В чем глубинный смысл передачи с вектором еще и размера этого вектора? Вектор и так сам знает свой размер.

Причем в функцию printInformation вы размер вектора решили не передавать. Что за мешанина?
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
07.05.2021, 18:22 10
Лучший ответ Сообщение было отмечено Qrote как решение

Решение

Qrote, насколько я понял из текстовой части Алгоритм Джонсона для двух станков и ссылки на алгоритм Джонсона.

Ошибки поправил. Вроде работает.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <iomanip>
#include <time.h>
#include <vector>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
ofstream fout("res.txt", ios::trunc);
 
// ============================================================
struct Item
{
    int id{};
    int t1{};
    int t2{};
    bool operator< (const Item &p) const
    {
        return min(t1, t2) < min(p.t1, p.t2);
    }
};
 
// ============================================================
void printInformation(const std::vector<Item> &data)
{
    for (auto &i : data)
    {
        cout << "\nНомер детали:" << setw(3) << i.id;
        cout << "\nВремя обработки на 1 станке: " << setw(3) << i.t1;
        cout << "\nВремя обработки на 2 станке: " << setw(3) << i.t2;
        cout << '\n';
 
        fout << "\nНомер детали:" << setw(3) << i.id;
        fout << "\nВремя обработки на 1 станке: " << setw(3) << i.t1;
        fout << "\nВремя обработки на 2 станке: " << setw(3) << i.t2;
        fout << '\n';
    }
}
 
// ============================================================
void Sort(vector<Item> &data, int amount)
{
    sort(data.begin(), data.end());
    vector <Item> a;
    vector <Item> b;
    for (int i{}; i < amount; ++i)
    {
        if (data[i].t1 <= data[i].t2)
            a.push_back(data[i]);
        else
            b.push_back(data[i]);
    }
    data = a;
    data.insert(data.end(), b.rbegin(), b.rend());
}
 
// ============================================================
void Chrono(vector<Item> &data)
{
    int tm1 = 0, tm2 = 0;
    int ch2 = 0;
 
    for (int i = 0; i < data.size(); ++i)
    {
        tm1 += data[i].t1;
        if (tm1 > tm2)
        {
            ch2 += tm1 - tm2;
            tm2 = tm1;
        }
        tm2 += data[i].t2;
    }
 
    cout << ch2;
    cout << '\n';
 
    fout << endl;
    fout << "Время простоя до/после: " << setw(3) << ch2;
    fout << '\n';
}
 
// ============================================================
int main()
{
    setlocale(0, "rus");
    std::srand(unsigned(time(0)));
 
    cout << "Введите количество деталей: ";
    int amount{};
    cin >> amount;
    vector<Item> data(amount);
 
    cout << "==================================="
        << "\nВыберите способ генерации данных: "
        << "\n1 - вручную "
        << "\n2 - случайным образом "
        << "\n================================="
        << endl;
 
    int choice;
    cin >> choice;
 
    switch (choice)
    {
        case 1: {
            cout << "Введите данные:\n ";
            int new_id = 1;
            for (auto &i : data)
            {
                cin >> i.t1;
                cin >> i.t2;
                i.id = new_id;
                new_id++;
            }
            break;
        }
        case 2: {
            int new_id = 1;
            for (auto &i : data)
            {
                i.t1 = std::rand() % 10 + 1;
                i.t2 = std::rand() % 10 + 1;
                i.id = new_id;
                new_id++;
            }
            break;
        }
    }
 
    printInformation(data);
    cout << "\n===========================================";
    cout << "\nВремя простоя 2 станка до сортировки: ";
    Chrono(data);
    Sort(data, amount);
    cout << "\nВремя простоя 2 станка после сортировки: ";
    Chrono(data);
    cout << "\n===========================================";
    cout << "\nПорядок обработки деталей: ";
    printInformation(data);
    fout.close();
}
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 19:19  [ТС] 11
TheCalligrapher, ну я её использую, чтобы счётчик for работал.
L0M, но почему-то на многие пишут про такую сортировку. Я правда не знаю, что она подразумевает под собой.
L0M, я так понимаю, в моём варианте я ещё и неправильно считал простойку второго станка?
Изображения
 
0
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 19:31  [ТС] 12
L0M, можете тогда, пожалуйста, объяснить строчки 66 - 72.
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
07.05.2021, 20:57 13
Лучший ответ Сообщение было отмечено Qrote как решение

Решение

Цитата Сообщение от Qrote Посмотреть сообщение
в моём варианте я ещё и неправильно считал простойку второго станка?
Да, и это тоже. Вообще в нескольких местах пришлось править. Большинство вам уже указали.

Цитата Сообщение от Qrote Посмотреть сообщение
можете тогда, пожалуйста, объяснить строчки 66 - 72.
tm1 - суммарное время для первого станка. tm2 - суммарное время для второго станка. ch2 - простои второго станка.

Тут идея такая. Первый станок работает непрерывно. Второй начинает работать, когда первый закончил первую деталь. Второй станок работает непрерывно, пока есть детали, обработанные первым станком, иначе он простаивает в ожидании детали от первого станка.

Начинаем цикл по деталям (64). В tm1 добавили время обработки детали (66). Если время работы второго станка меньше времени работы первого (67), значит он ждёт деталь. Если второй станок простаивал, разницу времени добавляем ко времени простоя (69) и корректируем время второго станка (70): он начнёт работать, когда получит деталь от первого. С этого момента запускаем второй станок (72).

Получается вот такая штука:
Код
№   Ai  Bi
------------
1    4   5
2    4   1
3   30   4
4    6  30
5    2   3

                       4    4                30                  6    2
Первый станок       |----|----|------------------------------|------|--|
                            5   1                               4                30                  3
Второй станок            |-----|-|                           |----| |------------------------------|---|
==========================================================================================================
Простой 2 станка      4                     28                     2

tm1                   4    8                 38                 44    46
ch2                   4         4                              32  34             34
tm2                   9        10                              42                 74                  77
1
0 / 0 / 0
Регистрация: 23.04.2021
Сообщений: 27
07.05.2021, 21:10  [ТС] 14
L0M, огромнейшее Вам спасибо!!!
0
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 1
08.05.2021, 09:53 15
Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2021, 09:53
Помогаю со студенческими работами здесь

Ошибка 500 в менеджере модулей Joomla - Out of sort memory, consider increasing server sort buffer size
Привет! Подскажите что делать , когда такая проблема ?

Sort(), третий параметр: как sort() выбирает аргументы из переданной последовательности для переданной функции?
Вот sotr() 2 параметра - итераторы, а третий функцию. Допустим, моя функция сортирует список по...

Sort()
Страуструп в своей книге вызывает эту функцию без всяких дополнительных библиотек. У меня же такая...

sort()
пожалуйста напишите несколько примеров,с перегруженными версиями sort? vector&lt;int&gt; vec;...

Sort
U menya nabor recordsetov nazvaniye 'transmitals' ABR-4 ABR-6 ABR-3 ABR-33 ABR-13 kak mne...

<=> и sort!
Вообще не понимаю - вот у нас есть массив: a = и вот так: a.sort! { |x,y| y &lt;=&gt; x } #=&gt; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru