Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <cstdio>
- #include <iomanip>
- #include <conio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <cstdlib>
- #include <stdio.h>
- #include <conio.h>
- #include <allocators>
- struct Stack {
- char info; Stack *next;
- } *begin;
- float mas[256];
- void main()
- {
- Stack* InStack(Stack*, char);
- Stack* OutStack(Stack*, char*);
- int Prior(char);
- double Rezult(char[]);
- char InStr[256], OutStr[256] = " ";
- rand();
- unsigned int i, l = 0;
- srand(time(NULL));
- char ss, a;
- Stack *t; begin = NULL;
- puts("vvedi formulu"); gets_s(InStr);
- // ИЛИ strcpy(InStr,"a+b*(c-d)/e");
- for (i = 0; i<strlen(InStr); i++)
- {
- ss = InStr[i];
- if (ss == '(') begin = InStack(begin, ss);
- if (ss == ')') {
- while ((begin->info) != '(') {
- begin = OutStack(begin, &a); //Считываем элемент из стека
- if (!begin) a = '\0'; OutStr[l++] = a; // Записываем в строку
- }
- begin = OutStack(begin, &a);//Удаляем из стека '(' скобку
- // t=begin; begin=begin->next; free(t);
- }
- // Букву (операнд) заносим в выходную строку
- if (ss >= 'a' && ss <= 'z') OutStr[l++] = ss; // OutStr += ss;
- /* Если знак операции, то переписываем из стека в вых строку все оп-ции с большим или равным приоритетом */
- if (ss == '+' || ss == '-' || ss == '*' || ss == '/')
- {
- while (begin != NULL && Prior(begin->info) >= Prior(ss))
- {
- begin = OutStack(begin, &a); OutStr[l++] = a; //OutStr += a;
- }
- begin = InStack(begin, ss);
- }
- }
- // Если стек не пуст, переписываем все операции в выходную строку
- while (begin != NULL)
- {
- begin = OutStack(begin, &a); OutStr[l++] = a;
- //OutStr += a;
- }
- OutStr[l] = '\0';
- printf("\n OPZ->%s\n", OutStr); // Выводим полученную строку
- puts(OutStr);
- float f = Rezult(OutStr);
- printf(" \nf=%5.2f", f);
- getch();
- }
- //-------- Функция реализации приоритета операций-----------
- int Prior(char a) {
- switch (a) {
- case '^': return 4;
- case '*': case '/': return 3;
- case '-': case '+': return 2;
- case '(': return 1;
- }
- return 0;
- }
- Stack* InStack(Stack *p, char in)
- {
- Stack *t = (Stack*)malloc(sizeof(Stack));
- t->info = in;
- t->next = p;
- return t;
- }
- //
- Stack* OutStack(Stack* p, char *out) {
- Stack *t = p; // Устанавливаем указатель t на вершину p
- *out = p->info;
- p = p->next; // Переставляем вершину p на следующий элемент
- delete t; // Удаляем бывшую вершину t
- return p; // Возвращаем новую вершину p
- }
- double Rezult(char Str[]) {
- char ch, ch1, ch2;
- float op1, op2, rez;
- float a, b, c, d, e, f;
- char chr = 'z' + 1; unsigned ind = 97;
- printf("\na="); scanf("%f", &a); mas[ind] = a;
- printf("\nb="); scanf("%f", &b); mas[ind + 1] = b;
- printf("\nc="); scanf("%f", &c); mas[ind + 2] = c;
- printf("\nd="); scanf("%f", &d); mas[ind + 3] = d;
- printf("\ne="); scanf("%f", &e); mas[ind + 4] = e;
- for (unsigned i = 0; i < strlen(Str); i++)
- {
- ch = Str[i];
- if (ch != '-' && ch != '+' && ch != '*' && ch != '/')
- begin = InStack(begin, ch);
- else {
- begin = OutStack(begin, &ch1);
- begin = OutStack(begin, &ch2);
- op1 = mas[(unsigned)ch1];
- op2 = mas[(unsigned)ch2];
- printf("\n op1=%5.2f, op2=%5.2f, ch=%c \n", op1, op2, ch);
- switch (ch) {
- case '+': rez = op2 + op1; break;
- case '-': rez = op2 - op1; break;
- case '*': rez = op2*op1; break;
- case '/': rez = op2 / op1; break;
- // case '^' : rez=pow(op2,op1); break;
- }
- mas[(unsigned)chr] = rez;
- begin = InStack(begin, chr);
- chr++;
- }
- }
- return rez;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement