Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2017, 12:38   #1
Кристина1998
Форумчанин
 
Регистрация: 01.11.2016
Сообщений: 110
По умолчанию Стек и очередь

Стек – статический; очередь – статическая
Система состоит из процессора P, трѐх очередей F0, F1, F2 и стека S.
В систему поступают запросы на выполнение задач.Поступающие запросы ставятся в соответствующие приоритетам
очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста,
можно обрабатывать задачи из очереди F1. Если и она пуста, то можно
обрабатывать задачи из очереди F2. Если все очереди пусты, то система
находится в ожидании поступающих задач (процессор свободен), либо в
режиме обработки предыдущей задачи (процессор занят). Если поступает
задача с более высоким приоритетом, чем обрабатываемая в данный момент,
то обрабатываемая помещается в стек, если она выполнена менее чем на
половину по времени, и может обрабатываться тогда и только тогда, когда
все задачи с более высоким приоритетом уже обработаны.(Необходимо наличие, как автоматического генератора задач, так и возможность ручного добавления задач, с указанием их параметров,Для каждой задачи из списка входных задач должно быть определено время поступления,Вывод на экран состояния моделируемой системы на каждой итерации работы (содержимое стека(ов), очереди(ей), процессора)
ПОСМОТРИТЕ ПРАВИЛЬНО ЛИ Я НАПИСАЛА КОД ДЛЯ стека-статического, очереди-статической:
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;


struct Zadacha {
string name;//имя
int prioritet; //приоритет
int vremya; //время выполнения
int time; //время когда начать выполнять процесс
};

int add_spisok(Zadacha *task) {
int count;
ifstream file_in("in.txt", ios:: in );

if (!file_in) {
cerr<<"Ошибка открытия файла"<<endl;
return 0;
}
//Добавляем задачи в генератор задач
for (count = 0; !file_in.eof(); count++) {
file_in >> task[count].name;
file_in >> task[count].prioritet;
file_in >> task[count].vremya;
file_in >> task[count].time;
}
return count;
};

void sdvig(Zadacha *F, int &iF){
//сдвигаем очередь на 1
for (int i = 0; i < iF; i++)
F[i] = F[i+1];
iF--;
};


int main () {
setlocale(LC_ALL,"rus");
Zadacha F0[100], F1[100], F2[100], //3 очереди
stack[100], //стек
task[300], //генератор задач (из файла добавляются)
CPU; //процессор для выполнения задач
int iF0 = 0, iF1 = 0, iF2 = 0, iS = 0;
int timer = 0, count = 0;
bool newTask = false;

//Добавляем задачи
count = add_spisok(task);
CPU.name = "";

for (int i = 0; i < count ; timer++) {
//генератор задач
do {
newTask = false;
if (task[i].time == timer) {
if (iF0 == 100) iF0 = 0;
if (iF1 == 100) iF1 = 0;
if (iF2 == 100) iF2 = 0;
switch (task[i].prioritet) {
case 0: {F0[iF0] = task[i]; iF0++; break;}
case 1: {F1[iF1] = task[i]; iF1++; break;}
case 2: {F2[iF2] = task[i]; iF2++; break;}
}
i++; //проверим нет ли еще задачи
newTask = true;
}
} while (newTask);
//Работа процессора
if (CPU.name != "") {
CPU.vremya--;
if (CPU.vremya <= 0) {
CPU.name = "";
CPU.prioritet = 4;
if (iS > 0) {
CPU = stack[iS-1];
iS--;
}
}
}
//Обработка очереди 0
if (iF0 > 0) {
if (CPU.name != "") {
if (CPU.prioritet > F0[0].prioritet) { //если приоритет круче то добавить в стек
stack[iS] = CPU;
iS++;
CPU = F0[0];
sdvig(F0, iF0);
}
} else {
CPU = F0[0];
sdvig(F0, iF0);
}

}
//Обработка очереди 1
if (iF1 > 0) {
if (CPU.name != "") {
if (CPU.prioritet > F1[0].prioritet) {
stack[iS] = CPU;
iS++;
CPU = F1[0];
sdvig(F1, iF1);
}
} else {
CPU = F1[0];
sdvig(F1, iF1);
}
}
//Обработка очереди 2
if (iF2 > 0) {
if (CPU.name != "") {

if (CPU.prioritet > F2[0].prioritet) {
stack[iS] = CPU;
iS++;
CPU = F2[0];
sdvig(F2, iF2);
}
} else {
CPU = F2[0];
sdvig(F2, iF2);
}
}

cout << "Timer " << setw(2) << timer << " CPU=" << setw(1) << CPU.name;
cout << " \tF0=";
for (int i = 0; i < iF0; i++) cout << F0[i].name << ",";
cout << "\t F1=";
for (int i = 0; i < iF1; i++) cout << F1[i].name << ",";
cout << "\t F2=";
for (int i = 0; i < iF2; i++) cout << F2[i].name << ",";
cout << " \t S=";
for (int i = 0; i < iS; i++) cout << stack[i].name << ",";
cout << endl;
}

system("pause");
return 0;
}
Кристина1998 вне форума Ответить с цитированием
Старый 05.10.2017, 12:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А где же очередь? А где же стек? Пока только массивы и видно...
p51x на форуме Ответить с цитированием
Старый 05.10.2017, 12:47   #3
Кристина1998
Форумчанин
 
Регистрация: 01.11.2016
Сообщений: 110
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А где же очередь? А где же стек? Пока только массивы и видно...
т.е реализация неверна?
Кристина1998 вне форума Ответить с цитированием
Старый 05.10.2017, 12:52   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы в курсе, что такое очередь и стек?
p51x на форуме Ответить с цитированием
Старый 05.10.2017, 12:56   #5
Кристина1998
Форумчанин
 
Регистрация: 01.11.2016
Сообщений: 110
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы в курсе, что такое очередь и стек?
по определениям в курсе, но в реализации не очень
Кристина1998 вне форума Ответить с цитированием
Старый 05.10.2017, 12:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну и где это? Возьмем, стек - чем он отличается от простого массива? Почему у вас нет это различия?
p51x на форуме Ответить с цитированием
Старый 05.10.2017, 18:31   #7
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

http://www.cplusplus.com/reference/queue/queue/
http://www.cplusplus.com/reference/stack/stack/

И не морочте голову велосипедами, если препод сильно злой - откройте эти же исходники, поставляемые с компиляторм и почитайте. Можно тупо скопировать себе. Можно взять за основу интерфейс (набор функций и их поведения) и реализовать свой.

Последний раз редактировалось alexzk; 05.10.2017 в 18:38.
alexzk вне форума Ответить с цитированием
Старый 05.10.2017, 19:46   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Не-не, тут явно задача на структуры данных и за готовые классы полуит от ворот-поворот.
p51x на форуме Ответить с цитированием
Старый 06.10.2017, 18:10   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не-не, тут явно задача на структуры данных и за готовые классы полуит от ворот-поворот.
Ну так

> Можно взять за основу интерфейс (набор функций и их поведения) и реализовать свой.

Там на сайте хоть нормально интерфейс расписан, если реализовать по описанию - все станет понятно и просто дальше.

Можно, как вариант, реализовать из стандартных, а потом заменять их по чуть и добиваться, чтоб прога так же само работала.
alexzk вне форума Ответить с цитированием
Старый 06.10.2017, 18:10   #10
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не-не, тут явно задача на структуры данных и за готовые классы полуит от ворот-поворот.
Ну так

> Можно взять за основу интерфейс (набор функций и их поведения) и реализовать свой.

Там на сайте хоть нормально интерфейс расписан, если реализовать по описанию - все станет понятно и просто дальше.

Можно, как вариант, реализовать из стандартных, а потом заменять их по чуть и добиваться, чтоб прога так же само работала.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек и очередь. Задачи никогда не попадают в стек - Delphi Exxodus Помощь студентам 1 05.04.2016 14:12
Стек и очередь Кротяка Общие вопросы C/C++ 1 12.08.2014 18:51
Стек и очередь SsAn Паскаль, Turbo Pascal, PascalABC.NET 1 05.01.2014 13:24
списки стек очередь slavnayanata Помощь студентам 0 23.05.2011 21:04