Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
1

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

12.10.2010, 18:14. Показов 3188. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Задача состоит в: пользователь вводит выражение (пример: 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;
}
Мб кто по проще подскажет\
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2010, 18:14
Ответы с готовыми решениями:

Вычисление математических выражений
Всем привет, я пишу этот пост в связи с тем что, мне дали это задание не обьяснив как её правильно...

Вычисление математических выражений
Как сделать чтобы программа сначала решала выражение в скобках ?? Напрмер такой 2 + 6 * (4 + 6-9)...

Вычисление математических выражений
A *b-45. Если a&gt;b X= 18 если a=b 2a+2b. Если a&lt;b X-lg(x). При...

Расчет таблицы значений заданных математических выражений
Лабораторная работа № 1 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ ПРОЦЕССОВ Цель работы: Получить навыки...

3
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
12.10.2010, 18:20 2
Цитата Сообщение от LineStown Посмотреть сообщение
Мб кто по проще подскажет\
использовать ОПН
http://ru.wikibooks.org/wiki/Я... ой_нотации
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
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;
}
0
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
12.10.2010, 18:55  [ТС] 4
Цитата Сообщение от Asics^ Посмотреть сообщение
А если так
Может и проще, сейчас попробую разобраться в коде.
Только вот так не соблюдено условие:
Цитата Сообщение от LineStown Посмотреть сообщение
Выражение хранить по элементно в одном массиве (число,действие,число,действие)
0
12.10.2010, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2010, 18:55
Помогаю со студенческими работами здесь

Вычисление выражений. Арифметика (+ - * /). С числами и переменными A-D
это тема моего курсовика, в qt работаем с начала семестра, не сильно шарю. У меня есть окно, в...

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка...

Вычисление значений выражений
Здравствуйте, дорогие форумчане! Хочу попросить вас помочь мне с решением задач, так как я...

Вычисление значений выражений


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

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