Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

парсер выражений

74K
16 сентября 2011 года
Goidberg
2 / / 26.08.2011
добрый день пишу парсер мат выражений и застрял уже в самом начале
для начала пытаюсь сделать распознавание числа (считывание с одного edit и вывод в другой)
вылетает ошибка Access violation of adress 40009739 in module 'rtl60.bpl'. Read of adress FF8B9090.


double __fastcall TForm1::pars(double x)
{
String s=Edit1->Text;
char zifr[]="0123456789,";
double vih[100];
String chislo;
bool flag=false;
int k=0;
int i,z,j;
String h;

for (i=0;i<s.Length();i++)
{ switch(s)
{case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case ',':
flag=true;
while(flag==true){
for (z=i;z<s.Length();z++){
for (j=0;j<12;j++){
if (s[z]==zifr[j]){
chislo=chislo+s[z];}
else {flag=false;}
}

}}
vih[k]=StrToFloat(chislo);
k=k+1;
break;
}}
Edit2->Text=FloatToStr(vih[0]);
return 0;

}
297
18 сентября 2011 года
koodeer
1.2K / / 02.05.2009
Сразу бросилось в глаза магическое число 12 в условии цикла. Что оно означает?
В массиве zifr 11 значений. Делайте выводы.

Ещё замечание. Почему размер массива vih именно 100? А если этого не хватит? Используйте взамен, например, std::vector - он может динамически расширяться.

Ещё: заключайте код в теги [noparse]
 
Код:
 
[/noparse].

P.S. за имена zifr, vih, chislo - расстреливать на месте. Также как и за Edit1, Edit2.
1
19 сентября 2011 года
kot_
7.3K / / 20.01.2000
Цитата: koodeer

P.S. за имена zifr, vih, chislo - расстреливать на месте


из рогаток.
Как впрочем и за такой индийский код. Вот уж действительно - кроме как мат.выражения тут трудно подобрать. Аффтор - если надо "считывание с одного edit и вывод в другой" - то для этого всего навсего надо проверить что введенное есть число - и записать его в другой эдит. Все. Т.е. примерно такой код:

 
Код:
String result = edInput->Text;
try{
 int test = StrToInt(result);
}
catch(...){
 ShowMessage("введено не корректные данные");
 return;
}
edOutput->Text = result;

например. Зачем все остальное?
74K
23 сентября 2011 года
Goidberg
2 / / 26.08.2011
Код:
for (i=0;i<=strlen(ch);i++)
               {switch(ch)
                        {case 'x':
                                vih2[m]=FloatToStr(x);
                                m++;
                                break;
                         case '0':
                         case '1':
                         case '2':
                         case '3':
                         case '4':
                         case '5':
                         case '6':
                         case '7':
                         case '8':
                         case '9':
                         case ',':
                           for (j=0;j<12;j++){
                            if (ch==zifr[j]){
                              chislo=chislo+ch;}}
                            vih2[m]=chislo;
                            break;
                         case '+':
                                m++;
                                chislo="";
                                while(stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
                                  l++;
                                  stack[l]='-';                              
                                  break;
                         case '-':
                                m++;
                                chislo="";
                                while (stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; stack[l]=NULL; m++; l--;}
                                  stack[l]='-';
                                  l++;
                                  break;
                         case '*':
                                m++;
                                chislo="";
                                while (stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
                                {vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
                                l++;
                                stack[l]='*';                                                            
                                break;
                         case '/':
                                m++;
                                chislo="";
                                while(stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
                                {vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
                                l++;
                                stack[l]='/';
                                break;
                         case '^':
                                m++;
                                chislo="";
                                while(stack[l]=='^')
                                {vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
                                l++;
                                stack[l]='^';
                                break;
                         case '(':
                                chislo="";
                                l++;
                                stack[l]='(';
                                break;
                         case ')':
                                while(stack[l]!='('){vih2[m]=stack[l];l--;m++;}
                                if (stack[l]=='('){l--;}
                                break;}}                        
                         if (stack[l]==NULL){l=l-1;}
                         m++;
                         for (i=l;i>=0;i--){vih2[m]=stack; m++;}                        
                         m=1;
                         l=2;
                         for (i=0; i<100;i++){
                                if (vih2=='+'){
                                        if ((vih2[i-2]==NULL)&&(i>2)){
                                                l=2;
                                                while(vih2[i-l]==NULL){
                                                        l++;}
                                                l++;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }}
                                        if ((vih2[i-1]==NULL)&&(i>1)){
                                                m=1;
                                                while(vih2[i-m]==NULL){
                                                        m++;
                                                }}

                                        vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])+StrToFloat(vih2[i-m]));
                                        vih2[i-m]=NULL;
                                        vih2=NULL;
                                }
                                if (vih2=='*'){
                                        l=2;
                                        m=1;
                                        if ((vih2[i-l]==NULL)&&(i>2)){
                                                l=2;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }
                                                l++;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }}
                                        if ((vih2[i-m]==NULL)&&(i>1)){
                                                m=1;
                                                while(vih2[i-m]==NULL){
                                                        m++;}}

                                        z=StrToFloat(vih2[i-l])*StrToFloat(vih2[i-m]);
                                        vih2[i-l]=FloatToStr(z);
                                        vih2[i-m]=NULL;
                                        vih2=NULL;}
                                if (vih2=='/'){
                                        if ((vih2[i-2]==NULL)&&(i>2)){
                                                l=2;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }
                                                l++;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }}
                                        if ((vih2[i-1]==NULL)&&(i>1)){
                                                m=1;
                                                while(vih2[i-m]==NULL){
                                                        m++;
                                                }}
                                        vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])/StrToFloat(vih2[i-m]));
                                        vih2[i-m]=NULL;
                                        vih2=NULL;}

                                if (vih2=='-'){
                                        l=2;
                                        m=1;
                                        if ((vih2[i-2]==NULL)&&(i>2)){
                                                l=2;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }
                                                l++;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }}
                                        if ((vih2[i-1]==NULL)&&(i>1)){
                                                m=1;
                                                while(vih2[i-m]==NULL){
                                                        m++;
                                                }}
                                        vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])-StrToFloat(vih2[i-m]));
                                        vih2[i-m]=NULL;
                                        vih2=NULL;}

                                if (vih2=='^'){
                                        l=2;
                                        m=1;
                                        if ((vih2[i-2]==NULL)&&(i>2)){
                                                l=2;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }
                                                l++;
                                                while(vih2[i-l]==NULL){
                                                        l++;
                                                }}
                                        if ((vih2[i-1]==NULL)&&(i>1)){
                                                m=1;
                                                while(vih2[i-m]==NULL){
                                                        m++;
                                                }}
                                        vih2[i-l]=FloatToStr(pow(StrToFloat(vih2[i-l]),StrToFloat(vih2[i-m])));
                                        vih2[i-m]=NULL;
                                        vih2=NULL;}
                         }
                         Edit2->Text=vih2[0];
                         return 1;

}

Алгоритм ОПЗ. При вводе некоторых выражений считает неправильно и со скобками и х выдаёт ошибку о том что не может переделать " во float. Что нужно подправить?
14
24 сентября 2011 года
Phodopus
3.3K / / 19.06.2008
ДНК. Советую для этого дебаггер.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог