0 / 0 / 0
Регистрация: 08.07.2014
Сообщений: 39
1

Стек: реализация алгоритма с вычислением значения введенного выражения

07.12.2016, 16:51. Показов 932. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Адаптировать код чтобы эти условия правильно выполнялись


6) R=(a+b)*(c-d)/e a=1 b=4 c=8 d=6 e=4, R=2.5

7) R=a*(b-c)/(d+e) a=2 b=5 c=6 d=1 e=2, R=-0.666


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2016, 16:51
Ответы с готовыми решениями:

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

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

Составить схему алгоритма и программу для вычисления значения выражения
Необходимо составить схему алгоритма и программу для вычисления значений Y F для заданных значений...

Трудности с вычислением выражения
Добрый вечер. Тут внезапно нарисовали предмет &quot;Интерфейсы периферийных устройств&quot; с преподом,...

1
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
07.12.2016, 17:36 2
Я не знаю, что у тебя там за код (нет желания разбираться), но я на днях писал алгоритм ОПН. Могу поделиться кодом, если надо. Реализованы только бинарные операторы: +, -, *, /, ^ и ()
0
07.12.2016, 17:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2016, 17:36
Помогаю со студенческими работами здесь

Определить значение выражения с вычислением максимума
Определить значения z=max(a,2b)*max(2a-b,b) где max(x,y) есть максимальное из чисел x,y.При решении...

затруднение с вычислением выражения с помощью процедур
здравствуйте. помогите пожалуйста. вот задача: Вычислить z=(S1+S)/2 , где S1 - сумма положительных...

Задача. Составить блок-схемы алгоритма и программу для вычисления значения выражения, вводя переменную x клавиатуры
-3x+9, если x&lt;=7(меньше или ровно если не понятно :) ) Y={ 1/(x-7), если x&gt;0

Во всех строках таблицы обновить значения с математическим вычислением
В таблице user много строк. В строке есть ячейка temp и num Можно ли с помощью одного обращения...

Создание формулы с вычислением среднего значения диапазона ячеек
Здравствуйте уважаемые Форумчане. Помогите пожалуйста в решении следующей задачи. В результате...

Блок-схема для алгоритма нахождения факториала введенного числа
Здравствуйте очень нужна помощь,готовлюсь к сесии,а как блок схему составить не могу понять в этой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru