Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Синтаксический анализатор


Автор: kkkggg 28.4.2006, 20:36
int main (int argc,char *argv[])

Нужна элементарная прогграма калькулятор,  выражения должны вводиться в виде аргументов, т.е
#my-prog-calc 25+66
в своё время программа должна узнать, что 25 и 66 это числа и их нужно сложить!!!
Напишите элементарный пример по анализу и вычислению подобных выражений (25+66). При условии, что выражения идут в виде оптимуса. Под словом оптимус я понимаю: 
НАЗВАНИЕ_ПРОГРАММЫ <ОПТИМУС>    дальше жмём Enter и видим результат.

 

Автор: LPBOY 28.4.2006, 21:00
А приоритет операторов, скобки должны обрабатываться? 

Автор: MAKCim 28.4.2006, 21:03
# my-prog-calc 25+16 или # my-prog-calc 25 + 16? 

Автор: kkkggg 28.4.2006, 21:51
LPBOY Не приоритет операторов не важет.
MAKCim Не важно.
 

Автор: DeadSoul 28.4.2006, 22:15
http://gzip.rsdn.ru/forum/Message.aspx?mid=1869497 

Автор: Знак 29.4.2006, 01:46
# - это знак для прекомпиллера..
после него обычно идут дерективы
и только потом имена с присваивываемым
значением.. 
а программа 
типа без  применения переменных среды

Код

int sum=argv[1]+argv[2];
cout<<"sum=a+b res="<<sum<<endl;



Это так типа делалось
но эту программу надо несколько модифицировать 
и кое что усложнить.. в плане 
добавления нескольких функцийй

 

Автор: MAKCim 29.4.2006, 11:00
Цитата

# - это знак для прекомпиллера..

в данном случае это приглашение к вводу команд в командном интерпретаторе (скорее всего в *ix bash/sh/ksh/csh/sh... для root)
Цитата

MAKCim Не важно.

как раз важно
в случае 25 + 16
Код

argv[1]="25"
argv[2]="+"
argv[3]="16"
argc=4

а в случае 25+16
Код

argv[1]="25+16"
argc=2

  

Автор: kkkggg 29.4.2006, 11:18
Нужно 25+16, хочется сделать что-то наподобие программы calc. calc линуксячая прога. 

Автор: MAKCim 29.4.2006, 11:40
Цитата

Код

int sum=argv[1]+argv[2];


 smile  smile 
Цитата

Нужно 25+16, хочется сделать что-то наподобие программы calc. calc линуксячая прога.  

можно написать ф-ию для выделения из const char* числа
Код

bool find(const char* str, unsigned int& index, int& number)
{
    number=0;
    bool flag=false;
    while (str[index] && (str[index]<48 || str[index]>57)) ++index;
    while (str[index] && (str[index]>47 && str[index]<58))
    {
        flag=true;
        int s=number, p=10;
        number=0;
        while (s)
        {
            number+=(s%10)*p;
            p*=10;
            s/=10;
        }
        number+=str[index]-48;
        ++index;
    }
    return flag;
}

 

Автор: Знак 30.4.2006, 00:46
Цитата

можно написать ф-ию для выделения из const char* числа

а можно еще можно использовать atoi();
из библ. от 1994г. smile 
Код

//а потом 
if(argv[1][2]=='+') //так и оставить
res=argv[1][1]+argv[1][3]; // а вт эти две переменные изменить
// из строковых в числовые при помощи atoi();


вообще-то перевод строковых не очень хорошё
определен иной раз в типа попутаться можно
но если у тя 5.0 BCPP то соответственно все ОК.

ну и на последок есть
та функция isdigit() - так кажись кличат
она проверяет char на пренадлежность
к диапозону 0-99 
 

Автор: kkkggg 30.4.2006, 01:31
Спосибо большое за ответы, то что мне нужно было мы с вами порвали. К сожалению не могу повысить репутацию из за недостатка постов, if могбы добавил MAKCim-у, он написал как раз то, что мне было нужно. Поэтому придётся ограничется отдельным ПАСИБА!!  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)