Форум программистов, компьютерный форум CyberForum.ru

Стек: Калькулятор ОБЗ - C++

Восстановить пароль Регистрация
 
VirchKS
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 6
07.06.2013, 17:54     Стек: Калькулятор ОБЗ #1
Написать программу, получающую строку с некоторым выражением, записанным обратной бесскобочной записью и находящую его значение. Использование стека обязательно.
Пример: 1 2 + ! 4 2 / 2 ^ - = 2.
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include <cstdlib>
#include <stack>
#include <cmath>
double const pi=3.141592653589;
double const e=2.718281828459;
std::stack<double>Stk;
int     F1(std::string mSt,int n);
void    F2(std::string mSt,std::string pkSl[],int n,int kSl);
double  F3(std::string pkSl[],int n,int kSl);
double  F4(std::string pkSl);
double  F5(char c);
double  F6(std::stack<double>Stk);//  +
double  F7(std::stack<double>Stk);//  -
double  F8(std::stack<double>Stk);//  *
double  F9(std::stack<double>Stk);//  /
double F10(std::stack<double>Stk);//  !
int    F11(int a,int i);
double F12(std::stack<double>Stk);//  ^
double F13(std::stack<double>Stk);//  yroot
int main()
{
    std::string mSt;
    std::cout<<"..:";
    getline(std::cin,mSt);
    int n=mSt.size(),kSl=F1(mSt,n);
    std::string *pkSl=new std::string[kSl];
    F2(mSt,pkSl,n,kSl);
    system("cls");
    std::cout<<mSt<<" = "<<F3(pkSl,n,kSl);
    delete[] pkSl;
    return 0;
}
int F1(std::string mSt,int n)
{
    int kSl=1;
    for(int i=0;i<n;i++)
        if(mSt[i]==' ') kSl++;
    return kSl;
}
void F2(std::string mSt,std::string pkSl[],int n,int kSl)
{
    int j=-1,k=0;
    for(int i=0;i<n;i++)
    {
        if(mSt[i]==' ')
        {
            std::string pS(mSt,j+1,i-j-1);
            pkSl[k]=pS;
            k++;
            j=i;
        }
        else if(i+1==n)
        {
            std::string pS(mSt,j+1,i-j);
            pkSl[k]=pS;
            k++;
            j=i;
}   }   }
double F3(std::string pkSl[],int n,int kSl)
{
    for(int i=0;i<kSl;i++)
             if(pkSl[i]=="+") {int q=F6(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="-") {int q=F7(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="*") {int q=F8(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="/") {int q=F9(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="!") {int q=F10(Stk);Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="^") {int q=F12(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="yroot") {int q=F13(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="pi") Stk.push(pi);
        else if(pkSl[i]=="e") Stk.push(e);
        else Stk.push(F4(pkSl[i]));
    return Stk.top();
    Stk.pop();
}
double F4(std::string pkSl)
{
    int n=pkSl.size();
    double bd=0.0,bi=0,k=1.0;
    bool b=false;
    for(int i=0;i<n;i++)
    {
        if((pkSl[0]=='-')and(pkSl!="-")) {k=-1.0;i++;}
        if((pkSl[i]==',')or(pkSl[i]=='.'))
        {
            b=true;
            i++;
        }
        if(b==false)
            bi=10*bi+F5(pkSl[i]);
        else
            bd=bd+F5(pkSl[i])/10;
    }
    return (bi+bd)*k;
}
double F5(char c)
{
         if(c=='9')return 9;
    else if(c=='8')return 8;
    else if(c=='7')return 7;
    else if(c=='6')return 6;
    else if(c=='5')return 5;
    else if(c=='4')return 4;
    else if(c=='3')return 3;
    else if(c=='2')return 2;
    else if(c=='1')return 1;
    else if(c=='0')return 0;
}
double F6(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return b+a;
}
double F7(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return b-a;
}
double F8(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return b*a;
}
double F9(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return b/a;
}
double F10(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    return F11(round(a),1);
}
int F11(int a,int i)
{
    while(a!=0)
    {
        i=i*a;
        a--;
    }
    return i;
}
double F12(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return pow(b,a);
}
double F13(std::stack<double>Stk)
{
    double a=Stk.top();
    Stk.pop();
    double b=Stk.top();
    Stk.pop();
    return pow(b,1/a);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 17:54     Стек: Калькулятор ОБЗ
Посмотрите здесь:

Стек C++
C++ Стек
C++ Стек
C++ Стек
C++ Стек!
C++ Стек
C++ Стек
C++ Калькулятор и стек

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
07.06.2013, 22:15     Стек: Калькулятор ОБЗ
  #2

Не по теме:

Цитата Сообщение от VirchKS Посмотреть сообщение
обратной бесскобочной записью
прочитал как "обратная бесконечная запись"

Yandex
Объявления
07.06.2013, 22:15     Стек: Калькулятор ОБЗ
Ответ Создать тему
Опции темы

Текущее время: 15:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru