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

Объясните смысл задачи "3 конвейера" - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Задача:Ряд суммы http://www.cyberforum.ru/cpp-beginners/thread956438.html
В общем в задании сказано что при проверке разница cos(X) ,с моей функцией будет не более eps. Однако у меня при выводе погрешность больше eps. Просьба помочь найти ошибку или объяснить почему так выводит?Не надо пинать на алгоритм решения. Задача: Определение: вычислить бесконечную сумму с точностью ε означает выполнять суммирование, пока выполнено условие |an| > ε. Дано вещественное...
C++ Хочу постичь дзен, необходима консультация В массиве целых чисел найти непрерывный подмассив, сумма элементов которого максимальна. Необходимо вывести получившуюся сумму и два индекса - номера начального и конечного элементов массива. Все элементы пронумерованы попорядку, начиная с 0. (это условие) Объясните пожалуйста как работает сам поиск? Если есть возможность добавьте комментарии пожалуйста. Сам текст программы. #include... http://www.cyberforum.ru/cpp-beginners/thread956437.html
C++ Создать класс прямоугольников
Помогите, пожалуйста, а то я дуб дубом:( Создайте класс прямоугольников, описав в нём все необходимые свойства, подобрав им понятные имена и правильные типы данных. Опишите в классе конструктор, позволяющий при создании нового объекта явно задать все его свойства. Если это необходимо, то проверьте допустимость их значений в конструкторе (например, в классе обыкновенных дробей нельзя создавать...
Что это в коде?не сображу C++
Доброго дня!! Подскажите пожалуста, разясните что это за две строки в коде? Я еще е очень освоился с темой, и ак-то не пойму, что это. Строки три-четыре и 42. И напомните пожалуста, что значит enum? intintboolfalsetrue это что за выраженьице? Листинг. Итоги первой недели 1: #include <iostream.h> 2: intintboolfalsetrue 3: enum CHOICE { DrawRect = 1, GetArea,
C++ Lua и C++. Как наследовать классы? http://www.cyberforum.ru/cpp-beginners/thread956410.html
Возможно ли в Lua наследовать классы из C++ кода? И вообще что лучше использовать для связки C++ и Lua?
C++ G++/Gcc передача define в аргументах Можно ли каким-то ключом gcc/g++ создать define-переменную? Т.е. можно-ли сделать так: g++ -<ключь> <название define переменной> <значение> src/dosomthing.cpp -o bin/exout и если да то каким ключом? подробнее

Показать сообщение отдельно
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
21.09.2013, 14:44  [ТС]     Объясните смысл задачи "3 конвейера"
Вот мое решение, вдруг кому пригодится. Только пришлось самому писать классы для работы со списком и очередью, т.к. преподаватель не любит, когда используются стандартные классы в лабораторных
main.cpp
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <climits>
 
#include "queue.h"
 
/* Задача:
  Пусть имеется 3 конвейера. Конвейеры работают независимо друг от друга.
  Изначально на первом конвейере располагаются детали N типов, а второй
  и третий - пусты. Время обработки каждого типа с каждого конвейера
  задается матрицей [1..N, 1..3]. После обработки с конвейера k она поступает
  на конвейер k+1. Назовем обработанную деталь с третьего конвейера изготовленной.
  Требуется по начальному расположению деталей на первом конвейере определить
  время, через которое все детали будут изготовлены.
*/
 
/* Формат входного файла:
   На первой строке число различных типов деталей (N)
   Дальше идет матрица времени обработки конвейеров деталей
   Дальше кол-во деталей(=detailsCount) на первом конвейере на момент начала работы
   Дальше detailsCount записей с типом очередной детали
   (тип детали в пределах от 1 до N включительно)
*/
 
/* функция проверяет, являются ли все очереди в массиве очередей пустыми.
   возвращает true, если все очереди в массиве пустые, иначе false */
template <class T>
bool allQueueIsEmpty(const Queue<T> queueArr[], int N);
 
int main()
{
    int N = 0; // кол-во типов деталей
    int detailsCount = 0; // общее число деталей
    unsigned int totalTime = 0; // время, затраченное на изготовление всех деталей
    const int CONVEYER_NUM = 3; // число конвейеров
    Queue<int> queueArr[CONVEYER_NUM]; // массив очередей для каждого конвейера
    int detailTime[CONVEYER_NUM]; // время изготовления очередной детали для каждого конвейера
    int **conveyerMatrix = NULL; // матрица времени изготовления детали каждого типа на каждом конвейере
    std::ifstream fin("input.txt");
 
    fin >> N;
 
    conveyerMatrix = new int*[N];
    for (int i = 0; i < N; ++i)
        conveyerMatrix[i] = new int[CONVEYER_NUM];
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < CONVEYER_NUM; ++j)
        {
            int tmp;
 
            fin >> tmp;
            conveyerMatrix[i][j] = tmp;
        }
 
    fin >> detailsCount;
    for (int i = 0; i < detailsCount; ++i)
    {
        int curDetailType;
 
        fin >> curDetailType;
        // по умолчанию все детали помещаются в первый конвейер
        queueArr[0].push_back(curDetailType - 1);
    }
 
    totalTime = 0;
    std::fill(detailTime + 1, detailTime + CONVEYER_NUM, 0);
    detailTime[0] = conveyerMatrix[queueArr[0].front()][0];
 
    while (!allQueueIsEmpty(queueArr, CONVEYER_NUM))
    {   // пока есть хотя бы одна деталь на каком-либо конвейере.
        // минимальное время обработки текущей детали на всех непустых конвейерах
        int minTime = INT_MAX;
 
        for (int i = 0; i < CONVEYER_NUM; ++i)
        {
            if (!queueArr[i].empty() && detailTime[i] < minTime)
                minTime = detailTime[i];
        }
 
        for (int i = CONVEYER_NUM - 1; i >= 0; --i)
        {
            /* обратный обход нужен, чтобы при переходе детали на следующий
               конвейер, если он был пуст, то он не будет обрабатываться в цикле
               на следующих итерациях, т.к. был обработан ранее
             */
            if (!queueArr[i].empty())
            {
                detailTime[i] -= minTime; // вычитаем минимальное время обработки из всех непустых конвейеров
                if (!detailTime[i])
                {
                    if (i != CONVEYER_NUM - 1) // если это не последний конвейер
                    {
                        if (queueArr[i+1].empty())
                            detailTime[i+1] = conveyerMatrix[queueArr[i].front()][i+1];
                        queueArr[i + 1].push_back(queueArr[i].front());
                    }
                    queueArr[i].pop_front();
                    if (!queueArr[i].empty()) // если в конвейере после удаления остались детали
                        detailTime[i] = conveyerMatrix[queueArr[i].front()][i];
                    else
                        detailTime[i] = 0;
                }
            }
        }
 
        totalTime += minTime;
    }
 
 
    std::cout << "time: " << totalTime << std::endl;
 
 
    return 0;
}
 
template <class T>
bool allQueueIsEmpty(const Queue<T> queueArr[], int N)
{
    for (int i = 0; i < N; ++i)
        if (!queueArr[i].empty())
            return false;
    return true;
}

list.h
Кликните здесь для просмотра всего текста
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#ifndef LIST_H
#define LIST_H
 
#include <new>
 
#ifndef NULL
#define NULL 0
#endif
 
typedef unsigned int uint;
 
template <class T>
struct Node
{
    T data;
    Node<T> *next;
};
 
template <class T>
class List
{
public:
    List();
    List(const List<T>& x);
    bool push_front(const T& x);
    bool push_back(const T& x);
    bool empty() const { return list_size == 0; }
    uint size() const {return list_size; }
    T front() const { return first->data; }
    T back() const { return last->data; }
    void pop_front();
    void pop_back();
    void clear();
    bool remove(const T& value);
    bool remove(const Node<T> * const node);
    void push_front();
    virtual ~List();
    List<T>& operator=(const List<T>& x);
private:
    Node<T> *first;
    Node<T> *last;
    uint list_size;
};
 
template <class T>
List<T>::List()
{
    first = last = NULL;
    list_size = 0;
}
 
template <class T>
bool List<T>::push_back(const T& x)
{
    Node<T> *newNode = new (std::nothrow) Node<T>;
 
    if (newNode) // Если выделение памяти произошло успешно
    {
        newNode->data = x;
        newNode->next = NULL;
        if (!empty())
            last->next = newNode;
        else
            first = newNode;
        last = newNode;
        ++list_size;
 
        return true;
    }
    else
        return false;
}
 
template <class T>
bool List<T>::push_front(const T& x)
{
    Node<T> *newNode = new (std::nothrow) Node<T>;
 
    if (newNode)
    {
        newNode->data = x;
        newNode->next = first;
        if (empty())
            last = newNode;
        first = newNode;
        ++list_size;
 
        return true;
    }
    else
        return false;
}
 
template <class T>
void List<T>::pop_front()
{
    if (!empty())
    {
        Node<T> *tmp = first->next;
 
        delete first;
        --list_size;
        first = tmp;
        if (!list_size)
            last = NULL;
 
    }
}
 
template <class T>
void List<T>::pop_back()
{
    if (!empty())
    {
        Node<T> *prevLast = NULL;
 
        for (Node<T> *i = first; i != last; prevLast = i, i = i->next);
        delete last;
        --list_size;
        last = prevLast;
        if (empty())
            first = NULL;
    }
}
 
template <class T>
bool List<T>::remove(const Node<T> * const node)
{
    Node<T> *prev = NULL;
    Node<T> *i = first;
 
    for (; i != NULL && i != node; prev = i, i = i->next);
    if (i)
    {
        if (!prev)
        {
            Node<T> *tmp = first->next;
 
            delete first;
            --list_size;
            first = tmp;
            if (!list_size)
                last = NULL;
        }
        else if (i == last)
        {
            delete last;
            --list_size;
            last = prev;
            if (empty())
                first = NULL;
        }
        else
        {
            prev->next = i->next;
            delete i;
            --list_size;
        }
 
        return true;
    }
    else
        return false;
 
}
 
template <class T>
bool List<T>::remove(const T& value)
{
    Node<T> *prev = NULL;
    Node<T> *i = first;
 
    for (; i != NULL && i->data != value; prev = i, i = i->next);
    if (i)
    {
        if (!prev)
        {
            Node<T> *tmp = first->next;
 
            delete first;
            --list_size;
            first = tmp;
            if (!list_size)
                last = NULL;
        }
        else if (i == last)
        {
            delete last;
            --list_size;
            last = prev;
            if (empty())
                first = NULL;
        }
        else
        {
            prev->next = i->next;
            delete i;
            --list_size;
        }
 
        return true;
    }
    else
        return false;
 
}
 
template <class T>
List<T>::~List()
{
    clear();
}
 
template <class T>
List<T>& List<T>::operator=(const List<T>& x)
{
    clear();
 
    for (Node<T> *i = x.first; i != NULL; i = i->next)
        push_back(i->data);
 
    return *this;
}
 
template <class T>
void List<T>::clear()
{
    Node<T> *next;
 
    for (Node<T> *i = first; i != NULL; i = next)
    {
        next = i->next;
        delete i;
    }
    first = last = NULL;
    list_size = 0;
}
 
#endif // LIST_H

queue.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef QUEUE_H
#define QUEUE_H
 
#include "list.h"
 
template <class T>
class Queue
{
public:
    Queue(){}
    T front() const { return list.front(); }
    T back() const { return list.back(); }
    bool push_back(const T& x) { return list.push_back(x); }
    void pop_front() { list.pop_front(); }
    bool empty() const {return list.empty(); }
private:
    List<T> list;
};
 
#endif // QUEUE_H

input.txt(пример)
Кликните здесь для просмотра всего текста
2
1 1 10
10 10 10
2
1 2
 
Текущее время: 19:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru