Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
1

Прокомментировать код, работающий с очередью и стеком

07.10.2015, 12:03. Просмотров 345. Ответов 12
Метки нет (Все метки)

Доброго времени суток.
Есть код, работающий с очередью и стеком. Я не могу понять как он работает, и работает ли правильно.

Код - решение вот этой задачи:
система состоит из трех процессоров P1, P2, P3, очереди F, стека S и распределителя задач R. В систему поступают запросы на выполнение задач трёх типов – T1, T2 и T3, каждая для своего процессора.

Поступающие запросы ставятся в очередь. Если в начале очереди находится задача Ti и процессор Pi свободен, то распределитель R ставит задачу на выполнение в процессор Pi, а если процессор Pi занят, то распределитель R отправляет задачу в стек и из очереди извлекается следующая задача. Если в вершине стека находится задача, процессор которой в данный момент свободен, то эта задача извлекается и отправляется на выполнение.

Программа должна быть со статическими очередью и стеком.

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
#include <iostream>
 
using namespace std;
 
const int num = 3;
 
struct Stack {
    int top;
    int size;
    int *stack;
    int *time;
};
 
struct Queue {
    int head;
    int tail;
    int size;
    int maxsize;
    int *queue;
    int *time;
};
 
void push_stack(Stack *, int, unsigned int);
int pop_stack(Stack *, unsigned int *);
void push_queue(Queue *, int, unsigned int);
int pop_queue(Queue *, unsigned int *);
bool cpu_clear(unsigned int **);
 
int main() {
    setlocale(LC_ALL, "russian");
 
    Stack *s = NULL;
    Queue *q = NULL;
    unsigned int **cpu = NULL;
    int task, current_task, time;
    unsigned int *current_time = NULL;
 
    s = new Stack;
    s->stack = new int[num];
    s->time = new int[num];
    q = new Queue;
    q->queue = new int[num];
    q->time = new int[num];
    q->maxsize = num;
 
    cpu = new unsigned int*[3];
    for (int i = 0; i < 2; i++) {
        cpu[i] = new unsigned int[2];
    }
 
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            cpu[i][j] = 0;
        }
    }
 
    q->head = num;
    q->size = q->tail = s->size = s->top = 0;
 
    for (int i = 0; i < num; i++) {
        q->time[i] = q->queue[i] = s->time[i] = s->stack[i] = 0;
    }
 
    for (int i = 0; i < num; i++) {
        cout << "Введите номер задачи\n";
        cin >> task;
        cout << "Введите время выполнения задания\n";
        cin >> time;
        push_queue(q, task, time);
    }
    for (int i = 0; i < num; i++) {
        cout << i << ": Время " << " = " << q->time[i] << "; Задача = " << q->queue[i] << endl;
    }
 
    while (s->size != 0 || q->size != 0 || cpu_clear(cpu)) {
 
        current_task = pop_queue(q, current_time);
        cout << "Время = " << current_time;
 
        cout << "проверка\n";
        for (int i = 0; i < 3; i++) {
            if (cpu[i][2] > 0) {
                cpu[i][2]--;
                if (cpu[i][2] == 0) {
                    cpu[i][1] = 0;
                }
            }
        }
 
        for (int i = 0; i < 3; i++) {
            if (current_task == i) {
                if (cpu[i][1] == 0) {
                    cpu[i][1] = 1;
                    cpu[1][2] = *current_time;
                }
                else {
                    push_stack(s, current_task, *current_time);
                }
            }
        }
 
        current_task = pop_stack(s, current_time);
 
        for (int i = 0; i < 3; i++) {
            if (current_task == i) {
                if (cpu[i][1] == 0) {
                    cpu[i][1] = 1;
                    cpu[1][2] = *current_time;
                }
                else {
                    push_stack(s, current_task, *current_time);
                }
            }
        }
 
        cout << "Очередь:\n";
        for (int i = 0; i < q->size; i++) {
            cout << q->queue[(i + q->head) % q->maxsize] << " ";
        }
 
        cout << endl;
 
        cout << "Стек:\n";
        for (int i = s->top; i >= 0; --i) {
            cout << s->stack[i] << " ";
        }
 
        cout << endl;
        for (int i = 0; i < 3; i++) {
            cout << "Процессор " << i << (cpu[i][1] == 0) ? " свободен\n" : "Выполнение задачи\n";
        }
 
        char c = getchar();
    }
 
    cout << "проверка";
    delete s;
    delete q;
    for (int i = 0; i < 3; i++) {
        delete[]cpu[i];
    }
    system("pause");
    return 0;
}
 
void push_stack(Stack* s, int value, unsigned int time) {
    s->size++;
    s->stack[s->top++] = value;
    s->time[s->top] = time;
}
 
 
int pop_stack(Stack *s, unsigned int *time) {
    s->size--;
    *time = s->time[s->top--];
    return s->stack[s->top];
}
 
void push_queue(Queue *q, int value, unsigned int time) {
    q->size++;
    q->tail = q->tail % q->maxsize;
    q->queue[q->tail] = value;
    q->time[q->tail] = time;
    q->tail++;
}
 
int pop_queue(Queue *q, unsigned int *time) {
    q->size--;
    q->head++;
    q->head = (q->head) % (q->maxsize + 1);
    *time = q->time[q->head];
    return q->queue[q->head];
}
 
bool cpu_clear(unsigned int **cpu) {
    bool res = true;
 
    for (int i = 0; i < 3; i++) {
        if (cpu[i][1] == 1) {
            res = false;
        }
    }
 
    return res;
}
Код не компилируется. Выдает окно с предупреждением "Необработанное исключение по адресу 0x00DD5E31 в ConsoleApplication21.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000"
и ошибку "Ошибка 1 error LNK1168: не удается открыть c:\users\123\documents\visual studio 2013\Projects\ConsoleApplication21\Debug\ConsoleApplication21.exe для записи c:\Users\123\documents\visual studio 2013\Projects\ConsoleApplication21\ConsoleApplication21\LINK ConsoleApplication21
".
Заранее спасибо.

Добавлено через 10 часов 6 минут
Тема актуальна
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2015, 12:03
Ответы с готовыми решениями:

Работа со стеком и очередью
Вот такое вот задание: Система состоит из процессора P, трёх очередей F0, F1, F2 и стека S. В...

Реализовать абстрактный класс "Список" стеком/очередью
Доброго времени суток, форумчане! Нужно реализовать абстрактный класс &quot; Список &quot; и выполнить две...

Нужны задачки для упражнения в работе со списком, стеком, очередью и двусвязным списком
Недавно научился строить список, стек, очередь, двусвязный список в С++, что бы закрепить навыки...

Код, работающий в VS2003, перестаёт работать в VS2008
#include &quot;stdafx.h&quot; #include &lt;complex&gt; #include &lt;iostream&gt; #include &quot;math.h&quot; #include...

Привести матрицу к треугольному виду Гауссом (не могу найти работающий код)
Нужен код для приведения матрицы к треугольному виду (матрица статическая, целочисленная). ...

12
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 15:03 2
Зачем столько динамических объектов?
Стек и очередь нормальные сделай для начала, что-то типа такого:
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
class Stack
{
    int top;
    int stack[1000];
    int time[1000];
public:
    int size;
    Stack(): size(0) {}
 
    void push(int value, int tvalue)
    {
        top = size;
        stack[size] = value;
        time[size++] = tvalue;
    }
 
    int pop()
    {
        if (size == 0) return 0;
        --size;
        --top;
        return stack[top + 1];
    }
};
 
class Queue
{
    int tail;
    int queue[1000];
    int time[1000];
public:
    int size;
 
    Queue(): size(0) {}
 
    void push(int value, int tvalue)
    {
        tail = size;
        queue[size] = value;
        time[size++] = tvalue;
    }
 
    int pop()
    {
        if (size == 0) return 0;
        int value = queue[0];
        for (int i = 1; i < size; ++i) queue[i - 1] = queue[i];
        --size;
        --tail;
        return value;
    }
};
 
// создание
Stack s();
Queue q();
А может, просто готовые из STL использовать?
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
07.10.2015, 18:17  [ТС] 3
nmcf, код не мой, мне его для примера дали. Готовые пользовать нельзя. И по идее, если стек и очередь статические, то они должны быть реализованы в виде матрицы.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 18:19 4
Если они статические, то почему везде new?
Программа перегружена лишним, нормальные классы не реализованы, из-за этого сложно вообще понять что там происходит.
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
07.10.2015, 18:23  [ТС] 5
Классы здесь и не используются. С new - это, видимо,был такой пример реализации списков с помощью массивов.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 18:28 6
Список и стек единичные - s и q. Зачем было их создавать динамически? Внутри также расширение не предусмотрено, можно было просто массивы сделать.
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
07.10.2015, 18:47  [ТС] 7
Разве они тут единичные? Мне кажется, они здесь вообще выполнены в виде списков, хоть и заявлены, как статические. И как здесь сделать обычный массив, если в стек должны постепенно добавляться новые элементы? На глаз задать большую размерность?
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 18:49 8
Нет здесь никаких списков. stack, queue и time - просто массивы, только динамические.
Размер и так задан константой:
C++
1
const int num = 3;
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
07.10.2015, 18:53  [ТС] 9
Цитата Сообщение от Старый Посмотреть сообщение
struct Stack {
* * int top;
* * int size;
* * int *stack;
* * int *time;
};
А это для чего?
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 19:06 10
Просто объединено в структуру. Само содержимое - в массиве stack.
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
07.10.2015, 19:38  [ТС] 11
Скажите, а этот код у вас компилируется? У меня он выдает ошибку.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
07.10.2015, 23:53 12
Я не проверял вообще-то.
0
Старый
2 / 2 / 0
Регистрация: 24.01.2012
Сообщений: 96
08.10.2015, 23:45  [ТС] 13
Ммм, а можете?

Добавлено через 34 минуты
Выдает все ту же ошибку. Онлайн-интерпретатор, судя по всему, тоже:
Введите номер задачи
Введите время выполнения задания
Введите номер задачи
Введите время выполнения задания
Введите номер задачи
Введите время выполнения задания
0: Время = 134542069; Задача = 134541920
1: Время = 134542069; Задача = 134541920
2: Время = 134542069; Задача = 134541920

Segmentation fault

Добавлено через 23 часа 13 минут
Тема актуальна
0
08.10.2015, 23:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2015, 23:45

Прокомментировать код
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void sort(int* m, int n); ...

прокомментировать код
Прокомментируйте пожалуйста код: for ( IntList::iterator i = numberK.begin(); i !=...

Прокомментировать код
нужно описать что делают строки готовой программы #include &lt;iostream&gt; #include &lt;string&gt; #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru