Загрузка данных
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAX_SIZE = 100;
struct Stack {
int data[MAX_SIZE];
int top; // индекс вершины (-1 = пустой)
Stack() : top(-1) {}
bool isEmpty() { return top == -1; }
bool isFull() { return top == MAX_SIZE - 1; }
void push(int val) {
if (!isFull()) data[++top] = val;
}
int pop() {
if (!isEmpty()) return data[top--];
return -1; // стек пуст
}
int peek() {
if (!isEmpty()) return data[top];
return -1;
}
};
struct Queue {
int data[MAX_SIZE];
int head; // индекс начала
int tail; // индекс конца
int size;
Queue() : head(0), tail(0), size(0) {}
bool isEmpty() { return size == 0; }
bool isFull() { return size == MAX_SIZE; }
void enqueue(int val) {
if (!isFull()) {
data[tail] = val;
tail = (tail + 1) % MAX_SIZE; // кольцевой буфер
size++;
}
}
int dequeue() {
if (!isEmpty()) {
int val = data[head];
head = (head + 1) % MAX_SIZE;
size--;
return val;
}
return -1; // очередь пуста
}
int front() {
if (!isEmpty()) return data[head];
return -1;
}
};
struct Deque {
int data[MAX_SIZE];
int head;
int tail;
int size;
Deque() : head(0), tail(0), size(0) {}
bool isEmpty() { return size == 0; }
bool isFull() { return size == MAX_SIZE; }
// Добавить спереди
void pushFront(int val) {
if (!isFull()) {
head = (head - 1 + MAX_SIZE) % MAX_SIZE;
data[head] = val;
size++;
}
}
// Добавить сзади
void pushBack(int val) {
if (!isFull()) {
data[tail] = val;
tail = (tail + 1) % MAX_SIZE;
size++;
}
}
// Удалить спереди
int popFront() {
if (!isEmpty()) {
int val = data[head];
head = (head + 1) % MAX_SIZE;
size--;
return val;
}
return -1;
}
// Удалить сзади
int popBack() {
if (!isEmpty()) {
tail = (tail - 1 + MAX_SIZE) % MAX_SIZE;
size--;
return data[tail];
}
return -1;
}
int peekFront() {
if (!isEmpty()) return data[head];
return -1;
}
int peekBack() {
if (!isEmpty()) return data[(tail - 1 + MAX_SIZE) % MAX_SIZE];
return -1;
}
};
// 2
string studentNames[] = {
"Леха", "Маша", "Ваня", "Аня", "Даня",
"Оля", "Серега", "Наташа", "Андрей", "Егор",
"Паша", "Юля", "Миша", "Света", "Артем"
};
string ticketNames[] = {
"Билет №1 (Массивы)", "Билет №2 (Списки)", "Билет №3 (Деревья)",
"Билет №4 (Графы)", "Билет №5 (Сортировки)", "Билет №6 (Рекурсия)",
"Билет №7 (ООП)", "Билет №8 (Паттерны)",
};
string taskNames[] = {
"Задача А: написать BFS", "Задача Б: реализовать стек",
"Задача В: обойти дерево", "Задача Г: найти минимум",
"Задача Д: написать сортировку", "Задача Е: найти цикл в графе",
};
const int NUM_TICKETS = 8;
const int NUM_TASKS = 6;
const int NUM_NAMES = 15;
// Очередь студентов на пересдачу [i]
Queue waitingQueue;
// Очередь студентов,которые взяли билет и отвечают
Queue answeringQueue;
// Дек билетов у преподавателя
Deque ticketDeque;
// Стопка задач штек
Stack taskStack;
int nextStudentId = 0;
string studentList[MAX_SIZE];
int studentTicket[MAX_SIZE]; // индекс билета
int studentTask[MAX_SIZE]; // индекс задачи
int studentAttempts[MAX_SIZE];
int passedCount = 0;
// Добавить нового студента в очередь на пересдачу
void addNewStudent() {
if (nextStudentId >= MAX_SIZE) return;
int id = nextStudentId++;
studentList[id] = studentNames[id % NUM_NAMES];
studentAttempts[id] = 0;
waitingQueue.enqueue(id);
cout << "Новый студент пришёл на пересдачу: "
<< studentList[id] << " (ID=" << id << ")\n";
}
// Студент берёт билет и задачу, переходит в очередь отвечающих
void studentTakesTicket() {
if (waitingQueue.isEmpty()) {
cout << "Очередь на пересдачу пуста.\n";
return;
}
if (ticketDeque.isEmpty() || taskStack.isEmpty()) {
cout << "Нет билетов или задач!\n";
return;
}
int id = waitingQueue.dequeue();
studentAttempts[id]++;
// Берём билет из дека (чётные попытки — снизу, нечётные — сверху)
int ticketIdx;
if (studentAttempts[id] % 2 == 1) {
ticketIdx = ticketDeque.popFront(); // сверху
cout << " --> " << studentList[id]
<< " берёт билет СВЕРХУ: " << ticketNames[ticketIdx] << "\n";
}
else {
ticketIdx = ticketDeque.popBack(); // снизу
cout << " --> " << studentList[id]
<< " берёт билет СНИЗУ: " << ticketNames[ticketIdx] << "\n";
}
// Берём задачу из стека (сверху)
int taskIdx = taskStack.pop();
cout << " --> " << studentList[id]
<< " берёт задачу: " << taskNames[taskIdx] << "\n";
studentTicket[id] = ticketIdx;
studentTask[id] = taskIdx;
answeringQueue.enqueue(id);
}
// Студент отвечает: 60% шанс сдать
void studentAnswers() {
if (answeringQueue.isEmpty()) {
cout << "Очередь отвечающих пуста.\n";
return;
}
int id = answeringQueue.dequeue();
int ticketIdx = studentTicket[id];
int taskIdx = studentTask[id];
bool passed = (rand() % 10) < 6; // 60% вероятность сдать
cout << studentList[id]
<< " отвечает на " << ticketNames[ticketIdx]
<< " + " << taskNames[taskIdx] << "\n";
// Возвращаем билет и задачу обратно
ticketDeque.pushBack(ticketIdx);
taskStack.push(taskIdx);
cout << " Билет и задача возвращены.\n";
if (passed) {
passedCount++;
cout << " [СДАЛ] " << studentList[id]
<< " успешно сдал экзамен! (попытка " << studentAttempts[id] << ")\n";
}
else {
cout << " [НЕ СДАЛ] " << studentList[id]
<< " не сдал. Возвращается в очередь. (попытка "
<< studentAttempts[id] << ")\n";
waitingQueue.enqueue(id); // обратно в конец очереди
}
}
// Инициализация билетов и задач
void initTicketsAndTasks() {
// Заполняем дек билетами
for (int i = 0; i < NUM_TICKETS; i++)
ticketDeque.pushBack(i);
// Заполняем стек задачами
for (int i = 0; i < NUM_TASKS; i++)
taskStack.push(i);
}
// Вывод состояния симуляции
void printState(int step) {
cout << "\n=== Состояние после шага " << step << " ===\n";
cout << " Ожидают пересдачи: " << waitingQueue.size << " студ.\n";
cout << " Отвечают сейчас: " << answeringQueue.size << " студ.\n";
cout << " Билетов в деке: " << ticketDeque.size << "\n";
cout << " Задач в стопке: " << taskStack.top + 1 << "\n";
cout << " Сдали экзамен: " << passedCount << " студ.\n";
}
int main() {
setlocale(LC_ALL, "RU");
srand((unsigned)time(nullptr));
cout << "СИМУЛЯЦИЯ ПЕРЕСДАЧИ ЭКЗАМЕНОВ\n";
// Инициализация
initTicketsAndTasks();
// Добавляем первых 5 студентов
cout << "<<< Начальное заполнение очереди >>>\n";
for (int i = 0; i < 5; i++)
addNewStudent();
// Симуляция: 10 шагов
for (int step = 1; step <= 10; step++) {
cout << "\n<<< Шаг >>>" << step << " ---\n";
// Иногда добавляем нового студента (40% шанс)
if (rand() % 10 < 4)
addNewStudent();
// Студент из очереди берёт билет и задачу
cout << "[Берут задание]\n";
studentTakesTicket();
// Студент из очереди отвечающих отвечает
cout << "[Отвечают]\n";
studentAnswers();
printState(step);
}
cout << "\n========================================\n";
cout << " ИТОГ: сдали экзамен " << passedCount << " студентов.\n";
cout << " Ещё в очереди: " << waitingQueue.size + answeringQueue.size << " студентов.\n";
cout << "========================================\n";
return 0;
}