Хелпикс

Главная

Контакты

Случайная статья





Поляков Павел 2/11ИП. Задание №2



Поляков Павел 2/11ИП

Задание №2

Реализовать структуру и указанные функции:

struct Post

{

string input;

string output;

}

1) Функцию InputS(string s, Post*A) – отвечающая за заполнение поля input соответствующей переданной переменной типа структура, значением s.

2) Функцию OutputS(Post*A) преобразующую данные хранимые в поле input переданной переменной типа структура по следующим правилам

В постфиксной форме сначала записываются операнды, а затем знак операции.

Пример:

Обычная запись. Постфиксная запись

3+4 34+

(5-4) +2 54-2+

2*(3+4) *5 234+*5*

И помещающую результат преобразование в поле output.

Функцию Display(Post*A) выводящую значения input и output соответствующей переданной переменной типа структура
Код программы:

#include < iostream> //библиотека потоков ввода и вывода

#include < string> //библиотека, подключающая строки

#include < stack> //библиотека, подключающая стеки

#include < windows. h> //библиотека для подключения русской кодировки в консоли, а также команд " system"

#define chchoice selstr. find_last_not_of (" 1234" ) //проверка выбора варианта действий

using namespace std; //объявление пространства имён

 

 

struct Post //структура для хранения вводимого примера и его преобразования в постфиксную форму

{

string input;

string output;

}A;

 

bool Postgixing = false; //переменная предназначенная для проверки (Введен пример или нет)

bool Out = false; //переменная предназначенная для проверки (Преобразован пример в постфиксную форму или нет)

void InputPost(string s) //функция ввода примера в переменную input структуры c именем Post и объявленной как A

{

A. input = s; //передаём значение переменной s(ранее введённой с клавиатуры) в переменную структуры input

Postgixing = true; //переменная Post(bool)принимает значение true для того, чтобы можно было преобразовывать пример в постфиксную форму

}

bool CheckBraces(string a) //функция, проверяющая пример на правильность ввода скобок

{

string buff; //переменная, которая будет хранить в себе скобки(Проверка на правильность расстановки скобок)

for (int i = 0; i < a. size(); i++) //цикл прохода по всей строке примера

{

   if (a[i] == '(' & & a[i + 1] == ')') //возвращение функцией false, если подряд идёт 2 скобки(пустые скобки)

   {

       return false;

   }

   else //если подряд не идут 2 скобки, то будет соблюдаться это условие

   {

       if (buff. size() == 2) //если буфер, который заполняется ниже, будет в себе содержать 2 скобки, то выполнится это условие

       {

           if (buff == " ()" ) //если скобки стоят правильно-сначала открывающая, потом закрывающая-буфер почиститься и будем проверять следующие скобки

           {

               buff. clear();

           }

           if (buff == " )(" ) //если скобки стоят неверно-сначала идёт закрывающая, а потом открывающая-функция вернёт false

           {

               return false;

           }

       }

       if (a[i] == '(' || a[i] == ')') //заполнение буфера скобками, если такие встретятся

       {

           buff. push_back(a[i]);

       }

   }

 

}

if (buff. size()! = 2 & & buff. size()! = 0) //если в буфере окажется не 0 и не 2 скобки(к примеру-1), то функция вернёт false

{

   return false;

}

return true; //если все скобки были введены правильно и их количество было кратно двум-функция вернёт true

}

 

bool CheckInput(string a) //функция проверки существования хотя бы одного оператора действия во введённом примере

{

string operators = " +-*/"; //операторы. Один из которых должен присутствовать в примере хотя бы 1 раз

string buffopers; //переменная для хранения операторов в примере(нужен будет для того, чтобы узнать количество операторов)

for (int i = 0; i < a. size(); i++) //цикл для прохода по всей строке примера

   for (int j = 0; j < operators. size(); j++) //цикл для прохода по всем оператором из переменной operators

   {

       if (isdigit(a[i])) //если текущий символ примера будет числом-он просто пропуститься

       {

           continue;

       }

       if (a[i] == '(' || a[i] == ')') //если текущий символ примера будет являться открывающей/закрывающей скобкой-он просто пропуститься

       {

           continue;

       }

       if (a[i] == operators[j]) //если текущий символ является каким-либо символом оператора-он будет проверяться дальше

       {

           buffopers. push_back(a[i]); //добавление оператора из примера в перменную

           if (a[i + 1]! = operators[j] || isdigit(a[i + 1])) //если следующий символ после оператора будет представим десятичным числом/не является оператором-функция вернёт true

           {

               return true;

           }

       }

   }

if (buffopers. size() == 0) //если количество операторов в примере будет равно 0-функция вернёт false

{

   return false;

}

else //если в примере будет хотя бы 1 оператор действия-функция вернёт true

{

   return true;

}

}

 

string Postfiks(string str) //функция для преобразования инфикса в постфикс

{

string PostfiksStr; //преобразованная строка, которую позже вернём этой функцией

stack< char> stack; //стек для хранения операторов и скобок

for (int i = 0; i < str. size(); i++) //цикл для прохода по строке с примером в инфиксной форме

{

   if (isdigit(str[i])) //если символ является цифрой-добавим его в строку постфиксной формы примера

       PostfiksStr += str[i];

 

   if (str[i] == '(') //если символ является открывающей скобкой-добавим его в стек

       stack. push(str[i]);

 

   if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') //если оператор символ является оператором-он будет проходить следующую проверку

   {

       if (stack. empty() || stack. top() == '(') //добавим оператор в стек, если стек пуст/в стеке 1-ый элемент является открывающей скобкой

       {

           stack. push(str[i]);

       }

       else //если стек не пустой или же 1-ый элемент стека не является открывающей скобкой:

       {

           PostfiksStr += stack. top(); //добавим 1-ый элемент стека в постфиксную строку

           stack. pop(); //удалим 1-ый элемента в стеке

           stack. push(str[i]); //добавим текущий оператор инфиксной строки в стек

       }

   }

 

   if (str[i] == ')') //если текущий элемент инфиксной строки является закрывающей скобкой:

   {

       while (stack. top()! = '(') //будем добавлять символы из стека в постфиксную строку, пока не встретим открывающую скобку

       {

           PostfiksStr += stack. top();

           stack. pop(); //будем удалять каждый элемент стека, который добавили в постфиксную строку

       }

       if (stack. top() == '(') //удалим открывающуюся скобку из стека

           stack. pop();

   }

}

while (! stack. empty()) //после завершения прохода по инфиксной строке-добавим оставшуюся часть стека в строку, пока стек не опустошится

{

   PostfiksStr += stack. top(); //добавим оператор из стека в постфиксную строку и удалим его строчкой ниже

   stack. pop();

}

return PostfiksStr; //вернём значение постфиксной строки

}

 

void OutputPost() //функция преобразования инфиксной строки в постфиксную

{

if (Postgixing) //если функция введения строки произошла успешно

{

   A. output = Postfiks(A. input); //переменная структуры output принимает значение переменной input, преобразованной с помощью функции Postfiks, в постфиксной форме

   cout < < " Пример преобразован! " < < endl;

   Out = true; //переменная Out(bool) принимает значение true для того, чтобы можно было перейти в функцию по выводу обоих примеров в консоль(вывести оба примера в консоли)

}

else //если функция введения строки не произошла

{

   cout < < " Сначала нужно ввести пример! " < < endl;

}

}

 

void display() //функция для вывода обоих примеров (инфиксного и постфиксного) в консоль

{

if (Postgixing & & Out) //если функции введения и преобразования примера в постфиксную форму прошли успешно-выведем оба примера

{

   cout < < " Изначальный пример: " < < A. input < < endl;

   cout < < " Пример в постфиксной форме: " < < A. output < < endl;

}

else //если обе функций по вводу примера и преобразованию его в постфиксную форму не прошли:

{

   cout < < " Сначала нужно ввести пример и преобразовать его в постфиксную форму! " < < endl;

}

}

void mendeistv() //функция mendeistv для выбора действия, которое хочет сделать пользователь

{

string input; //строковая переменная для ввода инфиксного примера

string selstr; //строковая переменная на ввод для выбора действия, которое хотим совершить

int sel; //целочисленная переменная на ввод для выбора действия. Строковая переменная строчкой раньше будет преобразована в переменную данного типа данных

cout < < " 1) Нажмите клавишу 1 и введите число, которое хотите преобразовать в постфиксную форму. " < < endl;

cout < < " 2) Нажмите клавишу 2 для преобразования вашего числа в постфиксную форму. " < < endl;

cout < < " 3) Нажмите клавишу 3 для вывода числа в постфиксной форме. " < < endl;

cout < < " 4) Нажмите клавишу 4 для выхода из программы. " < < endl;

do

{

   cout < < " Выберете один из пунктов для продолжения: ";

   getline(cin, selstr); //ввод переменной на выбор действия

 

} while (chchoice! = -1); //цикл ввода переменной будет выполняться пока в нём не будет соблюдена директива, описанная в начале кода

sel = atoi(selstr. c_str()); //преобразование строковой переменной выбора в целочисленную для выбора case'а в операторе switch

switch (sel)

{

case 1: //1-ый вариант выбора

{

   system(" cls" ); //очистка консоли

   cout < < " Введите пример инфиксной формы: ";

   do

   {

       do

       {

           getline(cin, input); //ввод инфиксной строки

           if (CheckInput(input) & & CheckBraces(input)) //проверка инфиксной строки на правильность ввода. Если всё введено верно, делаем следующее

           {

               InputPost(input); //переход в функцию ввода инфиксной строки в переменную из структуры

               cout < < " Пример принят и следует на обработку! " < < endl;

               system(" pause" ); //выход из функции по нажатию клавиши после её завершения

               system(" cls" ); //очистка консоли

               mendeistv(); //возврат в функцию mendeistv

               break; //выход из оператора switch

           }

           else

           {

               cout < < " Введён неверный пример, попробуйте ещё раз: ";

           }

       } while (! CheckInput(input)); //цикл по вводу переменной, пока в примере не будет хотя бы одного оператора

   } while (! CheckBraces(input)); //цикл по вводу переменной, пока в примере не будут правильно расставлены скобки

 

 

}

case 2: //2-ой вариант выбора

{

   system(" cls" ); //отчистка консоли

   OutputPost(); //переход в функцию для преобразования примера в постфиксную форму

   system(" pause" ); //выход из функции по нажатию клавиши после её завершения

   system(" cls" ); //очистка консоли

   mendeistv(); //возврат в функцию mendeistv

   break; //выход из оператора switch

}

case 3: //3-ий вариант выбора

{

   system(" cls" ); //очистка консоли

   display(); //вывод инфиксного и постфиксного примера в консоль

   system(" pause" ); //выход из функции по нажатию клавиши после её завершения

   system(" cls" ); //очистка консоли

   mendeistv(); //возврат в функцию mendeistv

   break; //выход из оператора switch

}

case 4: //4-ый вариант выбора

{

   exit(0); //выход из программы

}

default: //вариант выбора, не соответствующий не одному из вышеперечисленных

{

   cout < < " Не жми 2 клавиши одновременно!!!!! " < < endl;

   Sleep(2000); //" замораживает" надпись выше на 2 секунды

   system(" cls" ); //очистка консоли

   mendeistv(); //возврат в функцию mendeistv

}

}

}

int main()

{

SetConsoleCP(1251); //устанавливает русскую кодировку вывода на консоль

SetConsoleOutputCP(1251); //устанавливает русскую кодировку ввода из консоли и редактора кода

mendeistv(); //переход в функцию mendeistv

}

Описание кода программы:

Программа состоит из следующий пунктов:

1) Подключенные библиотеки, директива для защиты ввода выбора действия, объявление пространства имён, а также 2-х глобальных переменных

2) Функция CheckBraces(string a)

3) Функция CheckInput(string a)

4) Структура Post

5) Функция InputPost(string s)

6) Функция Postfiks(string str)

7) Функция OutputPost()

8) Функция Display()

9) Функция mendeistv()

10) Главная функция main()

 

Полное описание пунктов программ:

1) В данной программе подключены такие библиотека, как: iostream-для потоков ввода вывода, string-для использования строк в коде, stack-для использование стеков в коде, а также windows. h-для того, чтобы можно было установить русскую кодировку ввода/вывода на консоль, а также использовать команды system. Директива chchoice нужна для защиты ввода выбора действия пользователем. Также объявлено пространство имён и 2 глобальных переменных Postgixing и Out для того, чтобы пользователь не мог зайти в функции Postfiks до того, как ввёл пример и в функцию OutputPost до того, как ввёл пример и преобразовал его в постфиксную форму

2) Функция CheckBraces(string a) нужна для проверки на правильность ввода открывающих и закрывающих скобок в примере. В функции объявлена строковая переменная buff для того, чтобы хранить в себе 2 скобки. Сам алгоритм работы функции таков: цикл for используется для прохода по каждому символу их строки, которую мы передаём в функцию. Если текущий проверяемый символ будет являться открывающей скобкой, а последующий символ будет закрывающей скобкой (будут пустые скобки)-функция вернёт false. Если же пустых скобок не встретится-будет проверка следующих случаев:

3) Функция CheckInput(string a) проверяет наличие хотя бы одного оператора действия (+-*/) во вводимой инфиксной строке. Объявлены такие переменные, как: строковая operators, которая содержит в себе символы “+-*/” (переменная нужна для проверки того-является ли какой-либо символ во вводимой строке оператором) и строковая переменная buffopers являющаяся счётчиком количества операторов в строке. Алгоритм работы: по каждому символу из вводимой строки проходится цикл, проверяющий символ на оператор. Существует 3 случая проверки символа строки:

4) Структура Post объявленная именем A содержит в себе 2 строковые переменные input и output. InputPost содержит в себе инфиксную форму примера, а OutputPost постфиксную форму.

5) Функция InputPost(string s) нужна для передачи значения (примера) из передающей строки в эту функцию в переменную структуры input. Также в этой функции переменная Postgixing принимает значение true-это нужно для того, чтобы обозначить, что данная функция пройдена и можно использовать функцию OutputPost().

6) Функция Postfiks(string str) нужна для преобразования инфиксной формы примера в постфиксную. Сама функция является типа string, а значит мы сможем вернуть значение переменной, созданной в самой функции, что и будет происходить позже. Переменные, объявленные в данной функции следующие: строковая PostfiksStr-будет в себе содержать готовый постфиксный пример, и переменная типа stack< char> stack-которая будет в себе содержать операторы и скобки из примера.

Сам алгоритм функции таков: циклом for мы будем проходить по каждому элементы инфиксной строки (саму инфиксную строку мы передаём в функцию) и проходить одну из четырёх условных конструкций if:

7) Функция OutputPost() нужна для преобразования инфиксной строки в постфиксную. Данная функция будет выполняться если переменная Postgixing имеет значение true (те пример в инфиксной форме введён). В самой функции мы передаём значение переменной input, которая прошла преобразование в

функции Postfiks, в переменную output и меняем значение переменной Out (bool) на true-показатель того, что мы можем вывести оба примера

8) Функция display() используется для вывода обоих примеров (и инфиксного и постфиксного) в консоль. Сама функция сработает если обе переменные и Postgixing и Out имеют значение true (те был введён пример в инфиксной форме и он же был преобразован в постфиксную форму)

9) Функция mendeistv() является “основной”, с которой работает пользователь. В ней осуществляется ввод номера действия, которое хочет совершить пользователь с программой. Сам ввод действия реализован двумя переменными. Изначально пользователь вводит номер действия в переменную selstr, которая является строковой переменной, а затем данные этой переменной преобразуются в целочисленный тип данных int для того, чтобы можно было осуществить выбор действия оператором switch. В каждом из вариантов выбора действия, кроме 1-ого варианта действия, switch’а указана чистка консоли командой system(“cls”), функция, на которую перейдёт программа, команда system(“pause”)-для того, чтобы после завершения выполнения функции пользователь мог выйти из ней по нажатию любой клавиши, ещё раз команда system(“cls”)-для того, чтобы вся консоль отчистилась после завершения соответствующей функции, а также переход обратно к функции menu(). 4-ый вариант выбора в операторе switch будет выходить из команды полностью, а вариант выбора команды, номер которой не существует будет сообщать об ошибки выбора и возвращаться к функции menu().

1-ый вариант действия будет изначально чистить всю консоль командой system(“cls”), затем запрашивать ввод примера в инфиксной форме с проверкой на хотя бы 1 оператор и правильностью ввода скобок (функции CheckBraces(input) и CheckInput(input)). Если все проверки пройдены успешно-выполняется функция InputPost(input), используется команда system(“pause”), отчищается консоль командой system(“cls”), и идёт переход в функцию mendeistv().

10) Главная функция main() будет делать всего 3 действия: устанавливать русскую кодировку вывода из консоли, устанавливать русскую кодировку ввода из консоли и из редактора кода, а также переход к функции mendeistv().

Блок схемы всей программы по пунктам:

1)Блок-схема main():

2. Блок-схема CheckBraces(string a):

3. Блок-схема CheckInput(string a):

4. Блок-схема display():

5. Блок-схема InputPost(string s):

6. Блок-схема OutputPost():

7. Блок-схема Postfiks(string str):

8. Блок-схема функции mendeistv():



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.