Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

7 15ЛР инфа

.docx
Скачиваний:
10
Добавлен:
16.04.2021
Размер:
63.92 Кб
Скачать

Лабораторная работа №15

Стек, дек, очередь

Цель лабораторной работы: изучение способов создания и принципов использования динамических структур данных типа стек, дек, очередь; изучение стандартных средств языка C/C++ для работы с динамической памятью; совершенствование навыков модульного программирования на языке C/C++ при решении задач обработки линейных списков; совершенствование способов разработки многофайловых проектов.

Задание на программирование: используя технологию процедурного программирования разработать программу обработки данных, содержащихся в заранее подготовленном файле, в соответствии с индивидуальным заданием. Применить динамическую структуру указанного в задании вида: стек, очередь или дек.

Порядок выполнения работы:

1) Получить у преподавателя индивидуальное задание.

2) Разработать математическую модель: описать с помощью формул и рисунков вид используемой динамической структуры и процессы её создания и использования.

3) Построить схему алгоритма решения задачи.

4) Использовать функции, реализующие полный набор операций для этой структуры:

- допустимые операции для стека: инициализация, проверка на пустоту, добавление нового элемента в начало, извлечение элемента из начала;

- допустимые операции для очереди: инициализация, проверка на пустоту, добавление нового элемента в конец, извлечение элемента из начала;

- допустимые операции для дека: инициализация, проверка на пустоту, добавление нового элемента в начало, добавление нового элемента в конец, извлечение элемента из начала, извлечение элемента из конца.

5) Составить спецификации функций.

6) Создать многофайловый проект на языке C/C++.

7) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов. Обеспечить одновременный показ на экране содержимого входного и выходного файлов.

8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, спецификации функций, текст программы, контрольные примеры.

Формулировка задания:

(Вариант №16)

Дан текстовый файл. В текстовом файле записана формула следующего вида:

<Формула> ::= <Цифра> | M(<Формула>,<Формула>) | N(Формула>,<Формула>)

< Цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

где буквами обозначены функции:

M – определение максимума, N – определение минимума.

Используя стек, вычислить значение заданного выражения.

Текст программы

#include <iostream>

#include <fstream>

#include "Stack.h"

#include <conio.h>

#include <Windows.h>

using namespace std;

int main(int argc, const char * argv[]) {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

stack* s = NULL;

ifstream file("Input.txt");

if (!file) {

cout << "Ошибка открытия файла" << endl;

_getch();

return 1;

}

cout << "Формула: ";

char ch;

file >> ch;

cout << ch;

while (!file.eof()) {

if (empty(s)) {

s = push(ch, s);

file >> ch;

if (!file.eof()) {

cout << ch;

}

}

else {

if (ch - '0' >= 0 && ch - '0' <= 9) {

if (top(s) - '0' >= 0 && top(s) - '0' <= 9) {

char first = ch;

char second = pop(s);

char function = pop(s);

if (function == 'M') {

ch = first - '0' > second - '0' ? first : second;

}

else {

ch = first - '0' < second - '0' ? first : second;

}

}

else {

s = push(ch, s);

file >> ch;

cout << ch;

}

}

else {

if (ch == '(' || ch == ',' || ch == ')') {

file >> ch;

if (!file.eof()) {

cout << ch;

}

}

else {

s = push(ch, s);

file >> ch;

cout << ch;

}

}

}

}

cout << endl;

ofstream result("Output.txt");

ch = pop(s);

cout << "Результат вычисления формулы: " << ch << endl;

result << ch << endl;

_getch();

return 0;

}

//Заголовочный файл Stack.h

struct stack {

char data;

stack* next;

};

bool empty(stack* first);

stack* push(char e, stack* &first);

char pop(stack* &first);

char top(stack* &first);

//Исходный файл модуля работы со стеком Stack.cpp

#include <iostream>

#include "Stack.h"

using namespace std;

bool empty(stack* first) {

return (first == NULL);

}

stack* push(char e, stack* &first) {

stack* new_elem = new stack;

new_elem->data = e;

new_elem->next = first;

return new_elem;

}

char pop(stack* &first) {

char first_elem_data = first->data;

stack* second = first->next;

if (second != NULL) {

first->data = second->data;

first->next = second->next;

}

else {

first = NULL;

}

delete second;

return first_elem_data;

}

char top(stack* &first) {

char first_elem_data = first->data;

return first_elem_data;

}

Скриншот контрольного примера выполнения программы

Текстовый файл “Input.txt”, содержащий заданное, для вычисления с помощью стека, выражение.

Окно выполненной программы.

Текстовый файл “Output.txt”, содержащий результат выполнения выражения.

Соседние файлы в предмете Основы программирования