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

Вычисление значений математических выражений с рациональными числами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 5.00
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
12.10.2010, 18:14     Вычисление значений математических выражений с рациональными числами #1
Доброго времени суток.
Задача состоит в: пользователь вводит выражение (пример: 3,25+6,42*2-12,11/8 и т.д.) , а программа его считает. Просто, как веник. Выражение произвольной длинны. Защита от дурака на уровне проверки введеных символов (0-9,знаки,запятая). Выражение хранить по элементно в одном массиве (число,действие,число,действие)
Решение получилось, конечно, страшное.
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
#include<iostream>
using namespace std;
class Base
{
public:
    virtual double getN()=0;
    virtual char getC()=0;
    virtual void print()=0;
    virtual void setN(double x)=0;
};
class Num:public Base
{
private:
    double N;
public:
    Num():N(0){};
    Num(double NN):N(NN){};
    double getN(){return N;}
    char getC(){return 'E';}
    void print(){cout << N;}
    void setN(double x){N=x;}
};
class Oper:public Base
{
private:
    char C;
public:
    Oper():C('U'){};
    Oper(char CC):C(CC){};
    char getC(){return C;}
    double getN(){return 0;}
    void print(){cout << C;}
    void setN(double x){}
};
bool test(char Str[],int n)
{
    char testmas[15]={'1','2','3','4','5','6','7','8','9','0','-','+','*','/',','};
    bool f1,f=true;
    for(int i=0;i<n;i++)
    {
        f1=false;
        for(int j=0;j<15;j++)if(testmas[j]==Str[i])f1=true;
        if(f1==false)f=false;
    }
    return f;
};
char Str[200];
Base *B[100];
int Bi[100];
int current=0,Max,last=0,Mcurrent=0;
char *scur;
int ALL=0,xp,xm;
void Run(char c)
{
    for(int i=Mcurrent-1;i>=0;i-=2){if(Bi[i]==1){xm=i;break;}}
    for(int i=Mcurrent+1;i<Max;i+=2){if(Bi[i]==1){xp=i;break;}}
    if(c=='*')B[xm]->setN((B[xm]->getN())*(B[xp]->getN()));
    if(c=='/')B[xm]->setN((B[xm]->getN())/(B[xp]->getN()));
    if(c=='-')B[xm]->setN((B[xm]->getN())-(B[xp]->getN()));
    if(c=='+')B[xm]->setN((B[xm]->getN())+(B[xp]->getN()));
    Bi[Mcurrent]=0;
    Bi[xp]=0;
}
int main()
{
    setlocale(LC_ALL,"Russian");
    cout << "Введите пример\n=";
    cin.get(Str,200);
    cin.sync();
    if(test(Str,strlen(Str)))
    {
        cout << "Пример коррекный\n";
        while(Str[current]!='\0')
        {
            if((Str[current]=='+')||(Str[current]=='-')||(Str[current]=='*')||(Str[current]=='/'))
            {
                scur=new char[current-last];
                for(int i=0;i<(current-last);i++)*(scur+i)=Str[last+i];
                scur[current-last]='\0';
                B[Mcurrent]=new Num(atof(scur));
                Bi[Mcurrent]=1;
                Mcurrent++;
                B[Mcurrent]=new Oper(Str[current]);
                Bi[Mcurrent]=1;
                Mcurrent++;
                last=current+1;
            }
            current++;
        }
        scur=new char[current-last];
        for(int i=0;i<(current-last);i++)*(scur+i)=Str[last+i];
        scur[current-last]='\0';
        B[Mcurrent]=new Num(atof(scur));
        Mcurrent++;
        Max=Mcurrent;
        Bi[Max-1]=1;
        //Массив сформирован, необходимо начинать вычисления
        for(int i=0;i<Max;i++)if(Bi[i]==1)ALL++;
        while(ALL>=2)
        {
            ALL=0;
            for(int i=0;i<Max;i++)if(Bi[i]==1)ALL++;
            Mcurrent=1;
            while(Mcurrent<Max)
            {
                xm=Mcurrent-1;
                xp=Mcurrent+1;
                if((B[Mcurrent]->getC()=='*')&&(Bi[Mcurrent]==1))Run('*');
                if((B[Mcurrent]->getC()=='/')&&(Bi[Mcurrent]==1))Run('/');
                Mcurrent+=2;
            }
            Mcurrent=1;
            while(Mcurrent<Max)
            {
                xm=Mcurrent-1;
                xp=Mcurrent+1;
                if((B[Mcurrent]->getC()=='+')&&(Bi[Mcurrent]==1))Run('+');
                if((B[Mcurrent]->getC()=='-')&&(Bi[Mcurrent]==1))Run('-');
                Mcurrent+=2;
            }   
        }   
        cout << "Ответ:";
        for(int i=0;i<Max;i++)if(Bi[i]==1)B[i]->print();
        cout << endl;
    }
    else cout << "Введеный пример не корректный\n";
    return EXIT_SUCCESS;
}
Мб кто по проще подскажет\
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2010, 18:14     Вычисление значений математических выражений с рациональными числами
Посмотрите здесь:

Разбор математических выражений C++
Вычисление математических выражений C++
Вычисление значений выражений по заданным формулам C++
Вычисление значений выражений C++
Описать функции для работы с рациональными числами A и B C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
12.10.2010, 18:20     Вычисление значений математических выражений с рациональными числами #2
Цитата Сообщение от LineStown Посмотреть сообщение
Мб кто по проще подскажет\
использовать ОПН
http://ru.wikibooks.org/wiki/Язык_Си...льской_нотации
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
12.10.2010, 18:46     Вычисление значений математических выражений с рациональными числами #3
А если так
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
#include <iostream>
#include <conio.h>
#include <cmath>
#define _USE_MATH_DEFINES
using namespace std; 
 
float number()
{
      int res = 0;
      for(;;)
      {
             char c = cin.get();
             if(c >= '0' && c <= '9')
                res = res * 10 + c - '0';
             else
             {
                 cin.putback(c);
                 return res;
             }   
      }
}
 
float expr();
 
float ckobki()
{
      char c = cin.get();
      if(c == '(')
      {  
           float x = expr();
           cin.get();
           return x;
      }
      else 
      {
           cin.putback(c);
           return number();
      }
}
 
float factor()
{
      int x = ckobki();
      for(;;)
      {
      char c = cin.get();
      switch(c)
      {
               case '*':
                    x *= ckobki();
                    break;
               case '/':
                    x /= ckobki();
                    break;
               default:
                    cin.putback(c);
                    return x;             
      }
   }
}
 
float expr()
{
      int x = factor();
      for(;;)
      {
      char c = cin.get();
      switch(c)
      {
               case '+':
                    x += factor();
                    break;
               case '-':
                    x -= factor();
                    break;
               default:
                    cin.putback(c);
                    return x;             
      }
   }
}
 
int main()
{
    cout << "Bedute Bupawehue: ";
    float res = expr();
    cout << "Pezyltat = " << res << endl;
    getch();
    return 0;
}
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
12.10.2010, 18:55  [ТС]     Вычисление значений математических выражений с рациональными числами #4
Цитата Сообщение от Asics^ Посмотреть сообщение
А если так
Может и проще, сейчас попробую разобраться в коде.
Только вот так не соблюдено условие:
Цитата Сообщение от LineStown Посмотреть сообщение
Выражение хранить по элементно в одном массиве (число,действие,число,действие)
Yandex
Объявления
12.10.2010, 18:55     Вычисление значений математических выражений с рациональными числами
Ответ Создать тему
Опции темы

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