Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсер, нужна помощь. 
V
    Опции темы
SpAwN3D
Дата 20.5.2012, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите с парсером, не пойму почему не работает или работает, но не правильно особенно с отрицательными числами( в примере это число -10 ).
Парсер использую для высчитывания математических уравнений. 


main
Код

int y;
QByteArray eq;
eq = -10;
//eq = 2*-2;
pars.InsertQueue(equazione.data());
        pars.PrintQueue();
        if(pars.PrintQueue()==0)
        {
            pars.FinishWork();
            pars.outputQueue();
            y = pars.ResolveEquation();
            pars.output.clear();
        }


парсер.h
Код

#ifndef PARSER_H
#define PARSER_H
#include <iostream>
#include <stack>
#include <deque>
#include <queue>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <math.h>
using namespace std;
class parser
{
public:
    parser();
    stack<string> s;
    queue<string> q;
    deque<string> output;
    string b;
    void InsertQueue(string str);
    int PrintQueue();
    void confronta();
    void outputQueue();
    void FinishWork();
    double ResolveEquation();
};

#endif // PARSER_H



парсер.cpp
Код

#include "parser.h"

parser::parser()
{
}

void parser::outputQueue()
{
    deque<string>::iterator it;
    it=output.begin();
    while(it!=output.end())
        cout<<" "<<*it++;
}
void parser::InsertQueue(string str)
{
    string s;
    for(int i=0;i<str.length();i++)
    {
        char c = str[i];
        if(c=='+'|| c=='-' || c=='/'|| c=='*' || c=='^' || c=='(' || c==')')
        {
            if(!s.empty())
            {
                q.push(s);
            }
            s = c;
            q.push(s);
            s.clear();
        }
        else
        {
            s += c;
            if((i+1)==str.length())//se e' in fondo;
            {
                q.push(s);
            }
        }
    }
}
int parser::PrintQueue()
{
    int NumParentesi=0;
    while (!q.empty())
    {
        int exit=0,flag=0;
        cout<<q.front()<<" ";
        if(q.front()==")")
        {
            while(s.top()!="(")
            {
                output.push_back(s.top());
                s.pop();
            }
            s.pop();
            exit=1,flag=0,NumParentesi--;
        }
        while(exit==0)
        {
            if(q.front()=="+"||q.front()=="-"||q.front()=="/"||q.front()=="*" || q.front()=="^")
            {
                if(!s.empty())
                {
                    if(s.top()=="*"||s.top()=="-"||s.top()=="+"||s.top()=="/" || s.top()=="^")
                    {
                        if((s.top()=="+"||s.top()=="-")&&( q.front()=="*"||q.front()=="/"||q.front()=="^" ))
                        {
                            if(flag==0)
                                s.push(q.front());
                        }
                        else if(s.top()=="*"||s.top()=="/" && q.front()=="^")
                        {
                            if (flag==0)
                                s.push(q.front());
                        }
                        else
                        {
                            output.push_back(s.top());
                            s.pop();
                            s.push(q.front());
                        }
                    }
                    else
                        s.push(q.front());
                }
                else
                    s.push(q.front());
            }
            else if(q.front()=="(")
            {
                flag=1,NumParentesi++;
                s.push("(");
            }
            else
                output.push_back(q.front());
            exit=1;
        }
        q.pop();
    }
    if(NumParentesi!=0)
    {
        cout<<"error"<<endl;
        return 1;
    }
    else
        return 0;
}
void parser::FinishWork()
{
    while(!s.empty())
    {
        if(s.top()=="+"||s.top()=="-"||s.top()=="/"||s.top()=="*" || s.top()=="^")
            output.push_back(s.top());
        s.pop();
    }
}
double parser::ResolveEquation()
{
    deque<string>::iterator it;
    it=output.begin();
    char* cstr=new char(2);
    string str;
    int count=0;
    float tmp;
    while (output.size()!=1)
    {
        if(*it=="*"||*it=="+"||*it=="/"||*it=="-" || *it=="^")
        {
            string sign=*it;
            if(*it-->"-9999"||*it<"99999999"&&*it-->"-9999"||*it<"9999999999")
            {
                *it++,*it++;
                output.erase(output.begin()+count);
                it=output.begin()+(count-1);
                str=*it;
                strcpy(cstr,str.c_str());
                tmp=atoi(cstr);
                output.erase(output.begin()+(count-1));
                if(!output.empty())
                {
                    it=output.begin()+(count-2),str=*it;
                    strcpy(cstr,str.c_str());
                    output.erase(output.begin()+(count-2));
                }
                else
                {
                    str='0';
                    strcpy(cstr,str.c_str());
                }
                if(sign=="+")
                    tmp=tmp+atof(cstr);
                else if(sign=="-")
                    tmp=atof(cstr)-tmp;
                else if(sign=="*")
                    tmp=atof(cstr)*tmp;
                else if (sign=="/")
                    tmp=atof(cstr)/tmp;
                else if(sign=="^")
                    tmp=pow(atof(cstr),tmp);
                itoa(tmp,cstr,10);
                str=cstr;
                if(!output.empty())
                {
                   output.insert(output.begin()+(count-2),str);
                }
                else
                {
                   output.insert(output.begin(),str);
                }
                it=output.begin();
                count=0;
            }
        }
        *it++,count++;
    }
    double z;
    string s;
    s = output.front();
    z = atof(s.c_str());
    return z;
}




Это сообщение отредактировал(а) SpAwN3D - 20.5.2012, 15:54
PM ICQ   Вверх
SpAwN3D
Дата 20.5.2012, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



немного исправил код,
но всё ещё есть проблемы,
использовал уравнение для примера 2*(-10) с помощью парсера получается 2,10,-,*
как исправить?
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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