Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2013, 14:49   #1
ne_znaika
Новичок
Джуниор
 
Регистрация: 15.11.2012
Сообщений: 2
По умолчанию Найти значение заданного выражения C++

Дано числовое выражение, содержащее числа, знаки действий +, -, * и круглые скобки (), например 10-(3+6). Найти значение заданного выражения.
Это код программы, который переводит выражение в постфиксную форму. Нужно добавить функцию для вычисление выражения
Код:
//----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------------------------
const int maxsize=50;
char opr[maxsize];
int top=0;
bool empty()                          
     {
      if (top==0) return true;
         else return false;
     }

void push(char c)                    
     {
      if (top==maxsize) ShowMessage("превышает размер стека");
         else opr[top++]=c;
     }

void pop(char &c)                       
     {
      if (empty()) ShowMessage("стек пуст");
         else c=opr[--top];
     }

//-------------------------------------------------------------------------
void PostFix(char *in, char *res)
{
int i=0;
int n_r=0;
char c, temp;

push('%');
while (in[i]!='%')
      {
       c=in[i++];

       if (c=='(') {push(c); }

       if (c==')')
          {
           pop(temp);
           while (temp!='(')
             {
              res[n_r++]=temp;
              pop(temp);
             }
           continue;
          } 

       if (c=='+'||c=='-')
          {
           pop(temp);
           if (temp=='%'||temp=='(')
              {
               push(temp);
               push(c);
              }
           else if (temp=='+'||temp=='-'||temp=='*')
              {
               res[n_r++]=temp;
               push(c);
              }
           continue;
          }
       if (c=='*')
          {
           pop(temp);
           if (temp=='%'||temp=='('||temp=='+'||temp=='-')
              {
               push(temp);
               push(c);
              }
           if (temp=='*')
              {
               res[n_r++]=temp;
               push(c);
              }
           continue;
          }
       else res[n_r++]=c;
      }
pop(temp);
while (temp!='%')
      {
       res[n_r++]=temp;
       pop(temp);
      }
}
//------------------------------------------------------------------------
//эту часть программы нужно изменить
void calculate (char *resultat, char resultat)
{
   int resul, res, n1, n2;
    int n=strlen(resultat);
    for (int i=0;i<n;++i)
       {
          if((resultat[i]>=0)&& (resultat[i]<=9))
             push(resultat[i]);
          else {
             n1=pop();
             n2=pop();
           switch(resultat[i])
           {
           case '+': res=n1+n2; break;
           case '-': res=n1-n2; break;
           case '*': res=n1*n2; break;
           }
             push(res);
               }
       }
}
//------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char formula[50]="";
char resultat[50]="";
int  b=0, k, i=0;

Edit1->GetTextBuf(formula, 50);
while (formula[i]!=NULL)
      {
       if (formula[i]=='(') b++;
       if (formula[i]==')') b--;
       k=i;
       i++;
      }
if (b!=0) ShowMessage("Ошибка при входе!");
else
    {
formula[k+1]='%';

PostFix(formula, resultat);
Edit2->Text=resultat;
     }
}
//-------------------------------------------------------------------------

Последний раз редактировалось Stilet; 10.07.2013 в 18:09.
ne_znaika вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа в паскале для вычисления заданного выражения мариясаб Паскаль, Turbo Pascal, PascalABC.NET 5 27.04.2013 23:25
одномерный массив - найти сумму отрицательных меньше заданного числа и количество положительных больше заданного числа ALEXXELA Паскаль, Turbo Pascal, PascalABC.NET 2 02.12.2012 20:13
Найти значение арифметического выражения (напишите листинг программы на ассемблере) POMOGIteMNE Помощь студентам 2 02.12.2011 17:37
Вывести значение логического выражения, заданного в виде строки Алиночка Климова Паскаль, Turbo Pascal, PascalABC.NET 13 22.06.2011 09:07
Найти значение выражения при х=[1..10] EThread Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.12.2008 07:25