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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевод из Basic на язык С. http://www.cyberforum.ru/cpp-beginners/thread175533.html
Помогите пожалуйста кто-нибудь, переведите с Basic на язык С READ n, x DIM p(20), z(20) m0=0: m1=0: m2=0: m3=0 PRINT "s1 s2 s3 s4" FOR i = 1 TO n READ p(1) z( i ) = ( 1-p( i ) ) * x m0 = m0 + z( i )
C++ Выход из <do-while> Вот цикл: int Ni1=1, i1=1; float Sinc1; do { Sinc1=pow(flX,i1)/(i1+2); S1=S1+Sinc1; i1=i1+4; Ni1=Ni1+2; } while(Ni1<=n); Возникла необходимость выйти из него на 1 шаг раньше, но .... не получается. Если прибавляю единицу в условии: <while(Ni1<=n+1)>, то цикл закончится на шаг позже (что очевидно). Но вот когда отнимаю единицу (да хоть 100 единиц): while(Ni1<=n-1)... http://www.cyberforum.ru/cpp-beginners/thread175527.html
C++ Найти в каждом числе сумму четных цифр
Вводится последовательность из N целых чисел. Найти в каждом числе сумму четных цифр (функцией оформить определение суммы четных цифр числа).
C++ Оптимальный раскрой
Убийственная задача, которую я не только не могу решить, я её даже понять не могу)) Тема циклы, т.е. нужно использовать при решении только их... Оптимальный раскрой Даны натуральные числа a и b, которые определяют стороны прямоугольника. На сколько квадратов, стороны которых выражены также натуральными числами, можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат...
C++ Объясните почему так http://www.cyberforum.ru/cpp-beginners/thread175509.html
#include <iostream> using namespace std; #define MAT(a,b) a/b; int main() { cout<<2*MAT(2+5,3); return 0; } В тестах был вопрос, что будет на экране, я начал смотреть код и вот как понял его: 2+5 будет 7, разделить это все на 3 будет 2.333333, умножить на 2 будет 4.6666 но правильный ответ 5, подскажите почему так?
C++ Полином Лежандра первого рода. Run-Time error =( Доброго времени суток. Требовалось написать программу, для вычисления полинома Лежандра первого рода - рекурсивно и итерационно. Саму программу написал,при компиляции ошибок нет, но когда начинаю вводить данные, выходит RunTime error, будто переменная вызывается без определения, хотя она определена, посмотрите, пожалуйста, где ошибка :) Заранее спасибо :) Сам полином вычисляется по... подробнее

Показать сообщение отдельно
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1

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

12.10.2010, 18:14. Просмотров 2278. Ответов 3
Метки (Все метки)

Доброго времени суток.
Задача состоит в: пользователь вводит выражение (пример: 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;
}
Мб кто по проще подскажет\
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru