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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2010, 15:04   #1
Ruslan-9020
Новичок
Джуниор
 
Регистрация: 21.05.2010
Сообщений: 2
По умолчанию Синтаксический анализатор sin, cos, ln, exp

В похожей теме "Синтаксический анализатор математических выражений" был описан анализатор без тригонометрических функций! Вот вопрос: может кто-нибудь помочь в этот анализатор добавить эти функции??? Очень надо, я пробовал, не получается(((
Ruslan-9020 вне форума Ответить с цитированием
Старый 21.05.2010, 20:17   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Как пробывал? Что именно не получается? Чем не подошли тонны кода анализаторов в инете?
p51x вне форума Ответить с цитированием
Старый 17.05.2013, 12:00   #3
SoniC67
Новичок
Джуниор
 
Регистрация: 17.05.2013
Сообщений: 2
Печаль проблемка

Ребят прошу помочь, столкнулся с той же проблемой.На Си пишу недавно. Взял исходник у Г.Шилдта(http://lord-n.narod.ru/download/book..._C/24/2404.htm), решил его модифицировать чтоб он работал с функциями. Как я понял у них приоритет как у возведения в степень(ибо она тоже функция), реализовать решил так:

Сделал функцию которая будет обрабатывать изначально строку:
Код:
#include <stdio.h>
#include <string.h>

extern char *prog;

void processing()
{
	int i;
	 

	for(i=0;i<100;i++)
	{
		if(prog[i]=='s'){
			if(prog[i+1]=='i'){
				if(prog[i+2]=='n'){prog[i]='$' ;prog[i+1]='_'; prog[i+2]='_';i++;}}}
		if(prog[i]=='='){prog[i]='_'; break;}
	}
	return;
}
всё отлично работает.

Далее преобразовываю eval_exp4:
Код:
void eval_exp4(double *answer)
{
  double temp, ex;
  register int t;

  eval_exp5(answer);

  if(*token == '^') {
    get_token();
    eval_exp4(&temp);
    ex = *answer;
    if(temp==0.0) {
      *answer = 1.0;
      return;
    }
    for(t=temp-1; t>0; --t) *answer = (*answer) * (double)ex;
  }
   if(*token == '$') {
    get_token();
    eval_exp4(&temp);
    *answer = (double)sin(temp);
  }
}
И преобразовываю get_token, чтоб он воспринимал мой символ $:
Код:
void get_token(void)
{
  register char *temp;

  tok_type = 0;
  temp = token;
  *temp = '\0';

  if(!*prog) return; /* конец выражения */
  while(isspace(*prog)) ++prog; /* пропустить пробелы,
                  символы табуляции и пустой строки */

  if(strchr("+-*/%^=()$", *prog)){
    tok_type = DELIMITER;
    /* перейтик следующему символу */
    *temp++ = *prog++;
  }
  else if(isalpha(*prog)) {
    while(!isdelim(*prog)) *temp++ = *prog++;
    tok_type = VARIABLE;
  }
  else if(isdigit(*prog)) {
    while(!isdelim(*prog)) *temp++ = *prog++;
    tok_type = NUMBER;
  }

  *temp = '\0';
}
Ну и теперь собственно вопрос, где я ошибся?))
SoniC67 вне форума Ответить с цитированием
Старый 20.05.2013, 01:10   #4
SoniC67
Новичок
Джуниор
 
Регистрация: 17.05.2013
Сообщений: 2
По умолчанию

ПОжалуйста, народ оч важно!!!
SoniC67 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксический анализатор математических выражений Blade Общие вопросы C/C++ 7 21.05.2010 14:59
Синтаксический анализатор delphin100 Общие вопросы Delphi 10 01.05.2010 12:50
Процедура, вычисляющая Y=a*cos(G) и X=a*sin(G) Vishez Помощь студентам 4 25.04.2007 17:41