Еще один эвалюатор

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Еще один эвалюатор

Сообщение Конь » 07.03.2007 (Ср) 5:59

На днях написал за полчаса. Вроде работает. Поддерживает все мат. функции VB6, а также ^ * / + - и ()
У вас нет доступа для просмотра вложений в этом сообщении.
Подпись находится в стадии разработки...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 07.03.2007 (Ср) 9:08

На выражение "128 + 28 - 26 + 4 - 6" он мне выдал результат 120.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

zan
Бывалый
Бывалый
 
Сообщения: 224
Зарегистрирован: 24.08.2006 (Чт) 4:55

Сообщение zan » 07.03.2007 (Ср) 11:31

128 + 64 * 2 -128 + 64 * 2 = 0

Конь писал(а):На днях написал за полчаса

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.03.2007 (Ср) 14:35

Нды... полчаса эт не дело... Ну например в процедуре Eval есть такое милое место:

Код: Выделить всё
For i = Len(Expression) To 1 Step -1
        If LCase(Mid(Expression, i, 4)) = "sqr(" Then
            For j = i + 4 To Len(Expression)
                ' а если в скобках выражение со скобками?
                If Mid(Expression, j, 1) = ")" Then
                    Tmp = GEval(Tmp)
                    Tmp = CStr(Sqr(Val(Tmp)))
                    Expression = Left(Expression, i - 1) & Tmp & Mid(Expression, j + 1)
                    Tmp = vbNullString
                    Exit For
                Else
                    Tmp = Tmp & Mid(Expression, j, 1)
                End If
            Next
        ElseIf LCase(Mid(Expression, i, 4)) = "atn(" Then
'и еще несколько ElseIf
Next i


спрашивается, а нельзя ли было вытащить через Mid нужный кусок выражения, а потом уже сравнивать? Зачем несколько раз повторять одно и то же действие. Тем более, что есть Select Case. Я уж не говорю, что первы 4 прохода по циклу ваще мимо кассы...
Далее, в цикле меняется длина Expression, а число проходов по циклу как раз таки и зависит от ее длины. В один хороший момент получим ошибку (причем скорее всего совершенно неожиданную)


Ну и так далее. Афтор, потрать еще время на код!
Весь мир матрица, а мы в нем потоки байтов!

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 07.03.2007 (Ср) 15:48

' а если в скобках выражение со скобками?
На этот случай вставлено Tmp = GEval(Tmp), которое я сейчас решил заменить на Eval(Tmp) :)
Ошибки из-за изменения длины не получим, т.к. цикл идет с конца строки в начало.
Ладно, еще немного помозгую :)
Подпись находится в стадии разработки...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 09.03.2007 (Пт) 17:01

Конь, а ты смотрел мой "эвалютатор"?
O, sancta simplicitas!


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList