Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Виртуальные функции, ошибка в коде парсера 
:(
    Опции темы
observateur
Дата 23.10.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



У меня одна длинная упражнение. Я не хочу его описать здесь. Прошу  помочь мне найти ошибку. Заранее благодарю,
Код

#include "stdafx.h"
#include <iostream>
using namespace std;
class Token
{
public: virtual void getnum(char)=0;
        virtual void getop(char)=0;
        virtual int returnnum()=0;
        virtual char returnch()=0;
        virtual void alnum(int)=0;
};
///////////////////////////////////////
class Number:public Token
{
private: int num;

public: void getnum(char);
        void getop(char t){}//--//
        int returnnum(){return num;}
        char returnch(){return't';}//--//
        void alnum(int n){num=n;}

};
/////////////////////////////////////////
class Operator:public Token
{
private: char ch;

public: void getop(char);
        void getnum(char){}//--//
        char returnch(){return ch;}
        int returnnum(){return 5;}//--//;
        void alnum(int n){}
};
////////////////////////////////////////
class express
{
private: Token*    pstr[40];
         int        n;    
         Token* temp;

public: express(char []);
        void plus()
        {
            temp->alnum(pstr[0]->returnnum()+pstr[2]->returnnum());
        }
        void show()
        { cout<<temp->returnnum()<<endl;}

};
//////////////////////////////////////
int main(int argc, char* argv[])
{
    char str[40];
    cout<<"emeliyyat: ";    cin>>str;
    express exp(str);
    exp.plus();

    exp.show();
    return 0;
}

///////////////////////////
void Number::getnum(char n)
{ num=n;}
///////////////////////
void Operator::getop(char c)
{ ch=c; }
///////////////////////
express::express(char str[])
    {
    int len=strlen(str);
    for(int i=0;i<len; i++)
    {
        pstr[i]=new Number;
        pstr[i]->getnum(str[i++]);
        pstr[i]=new Operator;
        pstr[i]->getop(str[i++]);
    }    
    
    }


PM MAIL   Вверх
Дрон
Дата 23.10.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 93



Ошибки нет. Всё нормально компилируется smile

А больше ничего сказать нельзя, т.к. ты задачу описать "не хочешь" smile

Можешь попробовать попросить модератора перенести тему в Центр помощи. Вдруг помогут.

Это сообщение отредактировал(а) Дрон - 23.10.2006, 17:24


--------------------
Да. Именно так.
PM   Вверх
JackYF
Дата 23.10.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



В чем ошибка заключается-то?
Что должно быть и что выдает?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 23.10.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Назови предназначение программы и только тогда, может быть, мы сможем решить твою проблему smile


--------------------
user posted image  
PM MAIL   Вверх
observateur
Дата 23.10.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Упражнения у меня такая.
Попробуйте доработать программу PARSE  , чтобы она могла вычислять значения математических выражений с числами типа  int  а не только одноразрядными числами.
А вот программа PARSE:
Код

// parse.cpp
// программа разбора арифметических выражений
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 80;       // максимальная длина выражения
const int MAX = 40;       //
///////////////////////////////////////////////////////////
class Stack
{
  private:
    char st [ MAX ];      // массив данных
    int top;              // количество сохраненных данных
  public:
    Stack ( )              // конструктор
      { top = 0; }
    void push ( char var ) // поместить в стек
      { st [ ++top ] = var; }
    char pop ( )           // взять из стека
      { return st [ top-- ]; }
    int gettop ( )         // узнать количество элементов
      { return top; }
};
///////////////////////////////////////////////////////////
class express
{
  private:
    Stack s;                   // стек данных
    char* pStr;                // строка для ввода
    int len;                   // длина строки
  public:
    express ( char* ptr )      // конструктор
      {
        pStr = ptr;            // запоминаем указатель на строку
        len = strlen ( pStr ); // устанавливаем длину
      }
    void parse ( );            // разбор выражения
    int solve ( );             // получение результата
}
///////////////////////////////////////////////////////////
void express::parse ( ) // добавляем данные в стек
{
  char ch;              // символ из строки
  char lastval;         // последнее значение
  char lastop;          // последний оператор

  for ( int j = 0; j < len; j++ ) // для всех символов в строке
  {
    ch = pStr [ j ];    // получаем символ

    if ( ch >= '0' && ch <= '9' ) // если это цифра,
      s.push ( ch - '0' );        // то сохраняем ее значение
    else
    if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' )
    {
      if ( s.gettop ( ) == 1 ) // если это первый оператор,
        s.push ( ch );         // помещаем его в стек
      else // иначе
      {
        lastval = s.pop ( ); // получаем предыдущее число
        lastop = s.pop ( );  // получаем предыдущий оператор
        // если это * или /, а предыдущий был + или -, то
        if ( ( ch == '*' || ch == '/' ) && ( lastop == '+' || lastop == '-' ) )
        {
          s.push ( lastop ); // отменяем последние два взятия из стека
          s.push ( lastval );
        }
        else
        {
          // помещаем в стек результат операции
          switch ( lastop )
          {
            case '+': s.push ( s.pop ( ) + lastval ); break;
            case '-': s.push ( s.pop ( ) - lastval ); break;
            case '*': s.push ( s.pop ( ) * lastval ); break;
            case '/': s.push ( s.pop ( ) / lastval ); break;
            default: cout << "\nНеизвестный оператор"; exit ( 1 );
          }
        }
        s.push ( ch ); // помещаем в стек текущий оператор
      }
    }
    else               // какая-то ерунда...
    {
      cout << "\nНеизвестный символ";
      exit ( 1 );
    }
  }
}
///////////////////////////////////////////////////////////
int express::solve ( ) // убираем данные из стека
{
  char lastval;        // предыдущее значение

  while ( s.gettop ( ) > 1 )
  {
    lastval = s.pop ( ); // получаем предыдущее значение
    switch ( s.pop ( ) ) // получаем предыдущий оператор
    {
      case '+': s.push ( s.pop ( ) + lastval ); break;
      case '-': s.push ( s.pop ( ) - lastval ); break;
      case '*': s.push ( s.pop ( ) * lastval ); break;
      case '/': s.push ( s.pop ( ) / lastval ); break;
      default: cout << "\nНеизвестный оператор"; exit ( 1 );
    }
  }
  return int ( s.pop ( ) ); // последний оператор в стеке – это результат
}
///////////////////////////////////////////////////////////
int main ( )
{
  char ans;            // 'д' или 'н'
  char string [ LEN ]; // строка для разбора

  cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
          "\nЧисла должны быть из одной цифры"
          "\nНе используйте пробелы и скобки";

  do
  {
    cout << "\nВыражение: ";
    cin >> string;                          // вводим строку
    express* eptr = new express ( string ); // создаем объект для разбора
    eptr->parse ( );                        // разбираем
    cout << "\nРезультат: "
         << eptr->solve ( );                // решаем
    delete eptr;                            // удаляем объект
    cout << "Еще одно выражение (д/н)? ";
    cin >> ans;
  }
  while ( ans == 'д' );
  return 0;
}
 
Я сам пытался сделать но застрял.
 А вот моя версия
Код


#include "stdafx.h"
#include <iostream>
using namespace std;
class Token
{
public: virtual void getnum(char[])=0;
        virtual void getop(char)=0;
        virtual bool win()=0;
        virtual char returnchar()=0; // ch daki deyishenin +-*/ oldugunu yoxlamaq uchun.
                

};
////////////////////////////////
class Number:public Token
{
private: int num;

public: void getnum(char[]);    //Token* ptr de num-i formalashdirmaq uchun
        void getop(char t){}    //****//
        bool win(){ return true;}
        char returnchar(){return 't';} //*****//  // ch daki deyishenin +-*/ oldugunu yoxlamaq uchun.
        
};
/////////////////////////////
class Operator:public Token
{
private: char ch;

public: void getop(char);    //Token* ptr-de ishareni yerleshdirmek uchun;
        void getnum(char t[]){}        //*****//
        bool win(){ return false;}
        char returnchar(){return ch;} // ch daki deyishenin +-*/ oldugunu yoxlamaq uchun.
        
        
};
/////////////////////////////////////////////////
void Number::getnum(char str[])
{
    int len=strlen(str);
    int* ptr[10];
     
    for(int j=0;j<len;j++)
    {
        ptr[j]=new int;
        *ptr[j]=str[j]-48;
    }

    int kuk=10;
    for(int y=len-2; y>=0; y--)
    {
        *ptr[y]=(*ptr[y]*kuk);
        kuk*=10;
    }

    num=0;
    for(int d=0;d<len;d++)
        num+=**(ptr+d);

    for(int r=0; r<len;r++)
        delete ptr[r];

}

///////////////////////////////////
void Operator::getop(char sim)
{
    ch=sim;
};
/////////////////////////////////
class Stack
{
private: Token* st[40];
         int top;

public: Stack(){top=0;}

        void push(Token* var)
        { st[++top]=var; }

        Token* pop()
        { return st[top--];} 

        int gettop()
        { return top;}
};
////////////////////////////////////////
class express
{
private: Token* pstr[40];
         int    n;
         Stack    s;
         express* exptr;

public: express(char []);
        void parse();
        int solve();
        
};
////////////////////////////////////////////////
express::express(char mts[])
        {                    //konstruktor
            int len=strlen(mts);
            char str[20];
            n=0;
            for(int i=0;i<len;i++)
            {                        //for
                int k=0;
                while(mts[i]!='+' && mts[i]!='-' && mts[i]!='*' && mts[i]!='/')
                {                    //if
                    str[k]=mts[i];
                    i++;
                    k++;
                }                    //if
                str[k]='\0';
                pstr[n]=new Number;
                pstr[n++]->getnum(str);

                pstr[n]=new Operator;
                pstr[n++]->getop(mts[i]);

                i++;
            }                        //for

        
        }                    //konstruktor
/////////////////////////////////////////////////////////////
void express::parse()
{                //parse
    Token* bilayn;
    Token* lastval;
    Token* lastop;

    for(int i=0;i<n;i++)
    {                    //for
        bilayn=pstr[i];
        if(bilayn->win()==true)
            s.push(bilayn);
        else 
        {        //else 1
            if(s.gettop()==1)
                s.push(bilayn);
            
            else
            {        //else 2
                lastval=s.pop();
                lastop=s.pop();
                
                if((bilayn->returnchar()=='*'||bilayn->returnchar()=='/')&&
                    (lastop->returnchar()=='+'||lastop->returnchar()=='-'))
                {        //if
                    lastop=s.pop();
                    lastval=s.pop();
                }        //if
///////////////////////////////////////////////////////////////////////////////////////////
                          else
                {        //else3
    
                    switch(lastop->returnchar())
                    {
                    case'+': 

                    }
                }        //else3                
                
/////////////////////////////////////////////////////////////////////////////////////////
            s.push(bilayn);
            
            }        //else 2


        }        //else 1

    }                    //for

}                //parse

int main()
{
    return 0;
}





   

а застрял я здесь 
Код

else
{        //else3
switch(lastop->returnchar())
{
case'+': 
}
}        //else3                


уважаемый модератор по моему вы можете поместит мою тему в “Центр помощи”.

PM MAIL   Вверх
observateur
Дата 23.10.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



я тоже знаю ошибка в коде парсера но где именно?

Добавлено @ 22:34 
я тоже знаю ошибка в коде парсера но где именно?
PM MAIL   Вверх
observateur
Дата 24.10.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Люди добрые, помогите пожалуйста.
HELP ME PLEASE.
AIDEZ MOI,S'ILVOUS PLAIT


M
alexeis1

Правила раздела: 
. В данном разделе запрещено поднимать темы, т. е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.


Это сообщение отредактировал(а) alexeis1 - 24.10.2006, 11:42
PM MAIL   Вверх
Damarus
Дата 24.10.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



Цитата(observateur @  23.10.2006,  19:43 Найти цитируемый пост)
Попробуйте доработать программу PARSE  , чтобы она могла вычислять значения математических выражений с числами типа  int  а не только одноразрядными числами.


Код
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 80;       // максимальная длина выражения
const int MAX = 40;       //
///////////////////////////////////////////////////////////
class Stack
{
private:
    int st [ MAX ];      // массив данных
    int top;              // количество сохраненных данных
public:
    Stack ( )              // конструктор
    { top = 0; }
    void push ( int var ) // поместить в стек
    { st [ ++top ] = var; }
    int pop ( )           // взять из стека
    { return st [ top-- ]; }
    int gettop ( )         // узнать количество элементов
    { return top; }
};
///////////////////////////////////////////////////////////
class express
{
private:
    Stack s;                   // стек данных
    char* pStr;                // строка для ввода
    int len;                   // длина строки
public:
    express ( char* ptr )      // конструктор
    {
        pStr = ptr;            // запоминаем указатель на строку
        len = strlen ( pStr ); // устанавливаем длину
    }
    void parse ( );            // разбор выражения
    int solve ( );             // получение результата
};
///////////////////////////////////////////////////////////
void express::parse ( ) // добавляем данные в стек
{
    char ch;              // символ из строки
    int  lastval;         // последнее значение
    int  lastop;          // последний оператор
    string currval;

    for ( int j = 0; j < len; j++ ) // для всех символов в строке
    {
        ch = pStr [ j ];    // получаем символ

        if ( ch >= '0' && ch <= '9' ) // если это цифра,
            currval += ch;            // то сохраняем ее значение
        else
        {
            s.push(atoi(currval.c_str()));
            currval.clear();
            if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' )
            {
                if ( s.gettop ( ) == 1 ) // если это первый оператор,
                    s.push ( ch );         // помещаем его в стек
                else // иначе
                {
                    lastval = s.pop ( ); // получаем предыдущее число
                    lastop = s.pop ( );  // получаем предыдущий оператор
                    // если это * или /, а предыдущий был + или -, то
                    if ( ( ch == '*' || ch == '/' ) && ( lastop == '+' || lastop == '-' ) )
                    {
                        s.push ( lastop ); // отменяем последние два взятия из стека
                        s.push ( lastval );
                    }
                    else
                    {
                        // помещаем в стек результат операции
                        switch ( lastop )
                        {
                        case '+': s.push ( s.pop ( ) + lastval ); break;
                        case '-': s.push ( s.pop ( ) - lastval ); break;
                        case '*': s.push ( s.pop ( ) * lastval ); break;
                        case '/': s.push ( s.pop ( ) / lastval ); break;
                        default: cout << "\nНеизвестный оператор"; exit ( 1 );
                        }
                    }
                    s.push ( ch ); // помещаем в стек текущий оператор
                }
            }
            else               // какая-то ерунда...
            {
                cout << "\nНеизвестный символ";
                exit ( 1 );
            }
        }
    }
    if (!currval.empty()) s.push(atoi(currval.c_str()));
}
///////////////////////////////////////////////////////////
int express::solve ( ) // убираем данные из стека
{
    int lastval;        // предыдущее значение

    while ( s.gettop ( ) > 1 )
    {
        lastval = s.pop ( ); // получаем предыдущее значение
        switch ( s.pop ( ) ) // получаем предыдущий оператор 
        {
        case '+': s.push ( s.pop ( ) + lastval ); break;
        case '-': s.push ( s.pop ( ) - lastval ); break;
        case '*': s.push ( s.pop ( ) * lastval ); break;
        case '/': s.push ( s.pop ( ) / lastval ); break;
        default: cout << "\nНеизвестный оператор"; exit ( 1 );
        }
    }
    return s.pop ( ); // последний оператор в стеке – это результат
}
///////////////////////////////////////////////////////////
int main ( )
{
    char ans;            // 'д' или 'н'
    char string [ LEN ]; // строка для разбора

    cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
        "\nЧисла должны быть из одной цифры"
        "\nНе используйте пробелы и скобки";

    do
    {
        cout << "\nВыражение: ";
        cin >> string;                          // вводим строку
        express* eptr = new express ( string ); // создаем объект для разбора
        eptr->parse ( );                        // разбираем
        cout << "Результат: "
            << eptr->solve ( );                 // решаем
        delete eptr;                            // удаляем объект
        cout << "\nЕще одно выражение (д/н)? ";
        cin >> ans;
    }
    while ( ans == 'д' );
    return 0;
}

PM MAIL ICQ Jabber   Вверх
observateur
Дата 26.10.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Дорогой DAMARUS, я очен тебе благодарен но у меня выходит такая ошибка
C:\Program Files\Microsoft Visual Studio\MyProjects\mimi\mimi.cpp(57) : error C2039: 'clear' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'

PM MAIL   Вверх
Damarus
Дата 26.10.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



observateur, странно. clear входит в basic_string (basic_string::clear). Какая у тебя студия smile 

PS. У меня VS2005: 0 error(s), 1 warning(s)
PM MAIL ICQ Jabber   Вверх
observateur
Дата 26.10.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Microsoft Visual C++ 6.0
PM MAIL   Вверх
Damarus
Дата 26.10.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



observateur, не знаю почему в VС++ 6.0 нет basic_string::clear. Можешь попробовать написать свой string. Или можно обойтись обычным массивом char'ов и strcat'ом.
PM MAIL ICQ Jabber   Вверх
Damarus
Дата 27.10.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



observateur, вот:
Код
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 80;       // максимальная длина выражения
const int MAX = 40;       //
///////////////////////////////////////////////////////////
class Stack
{
private:
    int st [ MAX ];      // массив данных
    int top;              // количество сохраненных данных
public:
    Stack ( )              // конструктор
    { top = 0; }
    void push ( int var ) // поместить в стек
    { st [ ++top ] = var; }
    int pop ( )           // взять из стека
    { return st [ top-- ]; }
    int gettop ( )         // узнать количество элементов
    { return top; }
};
///////////////////////////////////////////////////////////
class express
{
private:
    Stack s;                   // стек данных
    char* pStr;                // строка для ввода
    int len;                   // длина строки
public:
    express ( char* ptr )      // конструктор
    {
        pStr = ptr;            // запоминаем указатель на строку
        len = strlen ( pStr ); // устанавливаем длину
    }
    void parse ( );            // разбор выражения
    int solve ( );             // получение результата
};
///////////////////////////////////////////////////////////
void express::parse ( ) // добавляем данные в стек
{
    char ch;              // символ из строки
    int  lastval;         // последнее значение
    int  lastop;          // последний оператор
    char currval[12] = { 0 };

    for ( int j = 0; j < len; j++ ) // для всех символов в строке
    {
        ch = pStr [ j ];    // получаем символ

        if ( ch >= '0' && ch <= '9' ) // если это цифра,
            strncat(currval, &ch, 1); // то сохраняем ее значение         
        else
        {
            s.push(atoi(currval));
            currval[0] = '\0';
            if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' )
            {
                if ( s.gettop ( ) == 1 ) // если это первый оператор,
                    s.push ( ch );         // помещаем его в стек
                else // иначе
                {
                    lastval = s.pop ( ); // получаем предыдущее число
                    lastop = s.pop ( );  // получаем предыдущий оператор
                    // если это * или /, а предыдущий был + или -, то
                    if ( ( ch == '*' || ch == '/' ) && ( lastop == '+' || lastop == '-' ) )
                    {
                        s.push ( lastop ); // отменяем последние два взятия из стека
                        s.push ( lastval );
                    }
                    else
                    {
                        // помещаем в стек результат операции
                        switch ( lastop )
                        {
                        case '+': s.push ( s.pop ( ) + lastval ); break;
                        case '-': s.push ( s.pop ( ) - lastval ); break;
                        case '*': s.push ( s.pop ( ) * lastval ); break;
                        case '/': s.push ( s.pop ( ) / lastval ); break;
                        default: cout << "\nНеизвестный оператор"; exit ( 1 );
                        }
                    }
                    s.push ( ch ); // помещаем в стек текущий оператор
                }
            }
            else               // какая-то ерунда...
            {
                cout << "\nНеизвестный символ";
                exit ( 1 );
            }
        }
    }
    if (currval[0] != '\0') s.push(atoi(currval));
}
///////////////////////////////////////////////////////////
int express::solve ( ) // убираем данные из стека
{
    int lastval;        // предыдущее значение

    while ( s.gettop ( ) > 1 )
    {
        lastval = s.pop ( ); // получаем предыдущее значение
        switch ( s.pop ( ) ) // получаем предыдущий оператор 
        {
        case '+': s.push ( s.pop ( ) + lastval ); break;
        case '-': s.push ( s.pop ( ) - lastval ); break;
        case '*': s.push ( s.pop ( ) * lastval ); break;
        case '/': s.push ( s.pop ( ) / lastval ); break;
        default: cout << "\nНеизвестный оператор"; exit ( 1 );
        }
    }
    return s.pop ( ); // последний оператор в стеке – это результат
}
///////////////////////////////////////////////////////////
int main ( )
{
    char ans;            // 'д' или 'н'
    char string [ LEN ]; // строка для разбора

    cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
        "\nЧисла должны быть из одной цифры"
        "\nНе используйте пробелы и скобки";

    do
    {
        cout << "\nВыражение: ";
        cin >> string;                          // вводим строку
        express* eptr = new express ( string ); // создаем объект для разбора
        eptr->parse ( );                        // разбираем
        cout << "Результат: "
            << eptr->solve ( );                 // решаем
        delete eptr;                            // удаляем объект
        cout << "\nЕще одно выражение (д/н)? ";
        cin >> ans;
    }
    while ( ans == 'д' );
    return 0;
}

PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.