Покритикуйте мое творенье..

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Покритикуйте мое творенье..

Сообщение burik » 18.10.2007 (Чт) 20:26

Вот для своих нужд написал эвалюатор математических выражений. Прошу всех кому не лень протестить и покритиковать.. :)
Вложения
burik-Evaluator.zip
Поправленный эвалюатор от 22.10.2007 15:03 (GMT+2) :)
(3.29 Кб) Скачиваний: 49
Последний раз редактировалось burik 22.10.2007 (Пн) 15:04, всего редактировалось 2 раз(а).
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 18.10.2007 (Чт) 20:44

Баян.
Изображение

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 18.10.2007 (Чт) 23:14

keks-n писал(а):Баян.

Хотелось бы услышать какие-нибудь замечания по существу
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

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

Сообщение Viper » 19.10.2007 (Пт) 7:41

Ну например первое замечание:

Вместо
Код: Выделить всё
s <> ""

или
Код: Выделить всё
If s = "" Then

проверяй длину строки, типа так:
Код: Выделить всё
If Len(s) = 0 Then


Дальше пока не смотрел.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.10.2007 (Пт) 8:18

1) В чём причина, которая заставила тебя использовать класс? К чему тут класс?

2) Твой эвалюатор говорит, что 12! будет 2. Really?

3) ... что 10 * 20 * 30 * 40 будет 200. (хотя будет 240000 )

4) ... что 65536/256/16/4 будет 256 (хотя будет 4)

5) ... что cos(cos(1)) будет .... Type mismatch.

6) ... что 10 / -2 будет тоже что-то нехорошее.

7) Я бы сделал перевод в RPN. А потом эвалюацию. С поддержкой букв и User-Defined функций.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Viper » 19.10.2007 (Пт) 11:42

Ужасное творение, кривое до нельзя... И да, Хакер прав, на кой надо было это в класс тащить? С cos там трабла вылезает потому, что автор почему то меняет точки на запятые... Лично у меня разделитель целой и дробной части как раз таки точка, поэтому на CDbl сие творение затыакается. Видимо у Хакера тоже самое...

В аттаче файл творения с комментами
Вложения
clsEval.rar
Комменты к "шедевру"
(3.13 Кб) Скачиваний: 50
Весь мир матрица, а мы в нем потоки байтов!

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 19.10.2007 (Пт) 17:20

Вот это я и хотел услышать! :)

2) Твой эвалюатор говорит, что 12! будет 2. Really?

Ну 12! он говорит будет 12 (а не 2) но это потому что факториалы я просто забыл... :oops:

3) ... что 10 * 20 * 30 * 40 будет 200. (хотя будет 240000 )

4) ... что 65536/256/16/4 будет 256 (хотя будет 4)

Это все из-за мелкой ошибки (одна строчка кода)..

5) ... что cos(cos(1)) будет .... Type mismatch.

Было чуть сложнее, но исправлено..

6) ... что 10 / -2 будет тоже что-то нехорошее.

Тоже мелкая ошибочка.. :)

С cos там трабла вылезает потому, что автор почему то меняет точки на запятые...

Бред.. Там просто выражение не правильно бралось из скобок. Да и где тут запятые?

P. S.
Хакер писал(а):7) Я бы сделал перевод в RPN. А потом эвалюацию. С поддержкой букв и User-Defined функций.

Я так тоже дамал вначале, но разве перевод в RPN будет проще чем то, что делаю я? Да и идей по поводу перевода в RPN у меня что-то нет..
Вложения
matEvaluator.zip
Поправленный вариант..
(3.28 Кб) Скачиваний: 49
Последний раз редактировалось burik 19.10.2007 (Пт) 17:27, всего редактировалось 1 раз.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.10.2007 (Пт) 17:22

Ну 12! он говорит будет 12 (а не 2) но это потому что факториалы я просто забыл...

Я имел ввиду 1*2*3*4*5*6*7*8*9*10*11*12
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 19.10.2007 (Пт) 17:33

Тогда это все та же мелкая ошибка.. (одна строка кода). Уже исправлено.. :)
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

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

Сообщение Viper » 20.10.2007 (Сб) 10:06

burik, все же зацени мои змечания то! Главное прибей замену точек на запятые!!!! А то прям как торанн видиеть Type Mismatch при попытки вычисления 0.5+0.5 !!!!
Щаз полезу анализировать...

З.Ы. Забвно, евалютатор пытется убедить меня в том, что 56+4-sin(45+2)) равно 607... С чего бы так много? Остальной мир считает, что 59.8764268772548... Или это из области, что "в военное время значение синуса может достигать любой нужной величины"?

З.З.Ы. Факториал таки не считаем?
З.З.З.Ы. Повозился с тригонометрией... Лучше бы не возился... результаты бреддддд - типа выражение cos(3.14/2) к моменту вычисления косинуса становится cos(3)... Что-то неладно в датском королевстве...
Весь мир матрица, а мы в нем потоки байтов!

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 20.10.2007 (Сб) 13:51

burik, все же зацени мои змечания то! Главное прибей замену точек на запятые!!!! А то прям как торанн видиеть Type Mismatch при попытки вычисления 0.5+0.5 !!!!
Щаз полезу анализировать...

Вообще то 0.5+0.5=1 (как говорит мой эвалюатор)

З.Ы. Забвно, евалютатор пытется убедить меня в том, что 56+4-sin(45+2)) равно 607... С чего бы так много? Остальной мир считает, что 59.8764268772548... Или это из области, что "в военное время значение синуса может достигать любой нужной величины"?

Вообщето он говорит что в выражении 56+4-sin(45+2)) лишняя закрывающая скобка символ: 15. А выражение 56+4-sin(45+2) = 60. Сейчас заметил еще одны мелкую ошибочку из-за которой от 56+4 не отнималось sin(45+2):
Надо заменить в функции CBE в первом цикле:
Код: Выделить всё
Case "-"
            If i = 1 Then
                curE = "-"
            ElseIf (curChar = "(") Or (curChar = "+") Or _
                        (curChar = "-") Or (curChar = "*") Or (curChar = "/") Then

на
Код: Выделить всё
Case "-"
            If i = 1 Then
                curE = "-"
            ElseIf (Mid$(strBE, i - 1, 1) = "(") Or _
                    (Mid$(strBE, i - 1, 1) = "+") Or _
                    (Mid$(strBE, i - 1, 1) = "-") Or _
                    (Mid$(strBE, i - 1, 1) = "*") Or _
                    (Mid$(strBE, i - 1, 1) = "/") Then


З.З.Ы. Факториал таки не считаем?
З.З.З.Ы. Повозился с тригонометрией... Лучше бы не возился... результаты бреддддд - типа выражение cos(3.14/2) к моменту вычисления косинуса становится cos(3)... Что-то неладно в датском королевстве...

Факториал не считаем и не собирались считать (хотя можно и это). А выражение cos(3.14/2) к моменты вычисления косинуса становится cos(1.57)...

Возможно надо было просмотреть мой предыдущий ответ и скачать поправленную версию? Я даже сам скачал для проверки...[/code]
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 20.10.2007 (Сб) 14:14

1/0 = ERR
2/-2 =ERR
2^-2 = ERR
sin(sin(sin(0)))) = 0
sin(sin(sin(0))) = ERR
2^2^2 = 4
2*2*2 = 4
2/2/2 = 1
2.2/2.1/2.0 = (>1)
2*2/42*108/48 = 4

:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 20.10.2007 (Сб) 15:16

Скачайте обновленный эвалюатор в первом посте.. :)
Там все исправления внесенные в код на протяжении обсуждения темы.. Там все работает правильно, кроме деления на ноль.. Что лучше возвращать при делении на ноль? И при попытке получить ctg(0)?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 20.10.2007 (Сб) 15:55

я первый искачивал:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

`

Сообщение SSecurity » 20.10.2007 (Сб) 16:09

1/(1-1) = ERR
(-2^-2) = -1.75
-2^-2 = 0.25
2+2 = 4, но (2+2)= 6
1=1=0, но (1-1) = -1
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 20.10.2007 (Сб) 19:50

SSecurity
Что по-твоему нужно возращать при делении на ноль?

Все остальное исправляется заменой строк 48-50:
Код: Выделить всё
strExp = Left$(strExp, i - 1) & _
                                curExp & _
                                Mid$(strExp, CBInStr(i, strExp) - 1)

На строки 53-55:
Код: Выделить всё
strExp = Left$(strExp, i) & _
                                    curExp & _
                                    Mid$(strExp, i + CBInStr(i, strExp))
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

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

Сообщение Viper » 22.10.2007 (Пн) 7:51

Таки какой из вариантов поправленный? Грохни лишний.
Весь мир матрица, а мы в нем потоки байтов!

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 22.10.2007 (Пн) 15:04

В первом посте - поправленный эвалюатор.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 22.10.2007 (Пн) 20:19

Выводи сообщение при попытке деления на ноль

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 22.10.2007 (Пн) 22:43

ИМХО лучше при делении на ноль выводить "INFINITY" (как сделано например в JAVA). тем более что так оно и есть на самом деле.
Однако можно и писать что-то типа стандартной ошибки ВБ, типа "Чувак, я не буду делить на ноль, потому что на ноль делить нельзя. Учи матасть по курсу математики в начальной школе". (Хотя насчет начальной не уверен, если что поправьте меня).
Подпись проходит рефакторинг

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

Сообщение Viper » 26.10.2007 (Пт) 13:15

Дошли руки до творенья. Возвращаю с комментами. Общее впечатление: изначально неправилен подход, поэтому вылезает всякое разное. Почитай по алгоритмам парсеров что-нибудь. Больше используй константы, остальное в комментах в тексте.
Вложения
clsEval.rar
(3.74 Кб) Скачиваний: 48
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Народный треп

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

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

    TopList