Войти

Показать полную графическую версию : Ошибка вычисления деления калькулятора на С#


Страниц : 1 [2]

Ksenya
29-10-2011, 15:21
Наверно, все это прекрасно работает, только не в моем коде..калькулятор отказывается выполнять мои требования. :(

ferget
29-10-2011, 16:25
private void button_del_Click(object sender, EventArgs e)
{
label_number.Text = label_number.Text.Remove(label_number.Text.Length - 1);
if (label_number.Text == "")
label_number.Text = "0";
}

Ksenya
29-10-2011, 17:32
ferget, да, такой вариант сработает, просто в коде отсутствуют операции Click-ов, действия всех кнопок распознает метод - Operation ReturnOperation(((Button)sender).Text); действия для отобранной операции: либо - double ExecuteOperation(double DoubResul, double num, Operation op), либо - как например, для обнуления экрана(Clr) - void UnarOperationEvent(object sender, EventArgs e).. просто потом, подумав и переделываю чисто под стереотип, (не забывая про void и double).. получаю тот же самый игнор. Т.е глубже копая, по нажатию на кнопку в конструкторе он ссылается на ButtonClick, вместо UnarOperation, как другие(например, √ ) и другие..

ferget
29-10-2011, 21:05
btn_clr_num работает неправильно, только с унарными операциями работает, а с обычными нет

просто в коде отсутствуют операции Click-ов »

они есть у button_dot, button_clear и button_chs которые работают правильно

Ksenya
29-10-2011, 21:37
Да, причем попробуйте сделать следующее: поменяйте код действий( например у √ и нашей стрелки, увидите, что стрелка вычисляет, а корень наоборот нет) . в чем-то подвох, исходник не мой, ноя в нем почти разобралась, вероятно закрыт доступ не родным визуальным объектам на форме? мистика

ferget
29-10-2011, 22:17
мистика »

не мистика

просто кнопки изначально были разбиты на группы по действиям:

унарные

бинарные

ввод числа

память

и по одной, кнопки не связанные с вычислениями

button_dot, button_clear, button_chs

вы добавляете кнопки не связанные с вычислениями и привязываете их к группам по действиям, что неправильно

нужно или сделать их отдельными или выделить в особую группу

Ksenya
29-10-2011, 22:35
просто я пробовала добавить новые кнопки с действием, к примеру корня, в итоге поняла, что они мои кнопочки обделены) (привязывала к унарным)

ferget
29-10-2011, 22:59
Вот вариант, вроде все кнопки работают

Ksenya
29-10-2011, 23:36
точно! вы правы, спасибо :yes: а если я добавлю другие операции, унарные/бинарные на новых кнопках, они сработают, если прописать их в группах? пробую, пока не получается(

Ksenya
30-10-2011, 02:32
и еще такой вопрос, про использование скобок. Нужен новый класс, я полагаю..вот как в примере..только как его связать со скобками и вычислениями..
нет уже сил с этим калькулятором :o

lxa85
30-10-2011, 08:05
Ksenya, отслеживаю тему, все никак руки не дойдут до трассировки.
Опиши пожалуйста на словах принцип разбора выражения и его расчета.
Т.е. при введении скобок и сложных выражений, с разделением приоритетов выполнения операций, могут применяться различные типы разбора строки.
Как пример - Польская обратная запись. Она может строиться с помощью стека, может строиться с помощью дерева. Я в свое время писал на Delphi не слишком быстрый, многопроходный разбор выражения в дерево.

OPZ - как я понимаю и есть Польская обратная запись. С принципом ее работы разобрались?
К ночи постараюсь взглянуть на код.
----
ferget, LilLoco, :up

Ksenya
30-10-2011, 19:13
Здрасьте, lxa85.) честно говоря не совсем) да, на 2 курсе опз рассматривали, и для моего калькутера я выбрала наиболее подходящий вариант опз. исходник. но он применим для консольного калькулятора, это во-первых, а во-вторых, там совершенно другие входные данные, которые меня и смущают, пусть я переименую их, когда распознаю, к примеру как сейчас - числовые данные, которые я ввожу в поле - label_number.Text =(с обработкой операции и получением резалта)= Convert.ToString(ExecuteOperation(DoubResul, Num, CurrOper));.

Но как использовать определяемые, с помощью ОПЗ, данные для наших операций..просто мозги набекрень, это что мне теперь под один этот класс придется переделывать всю главную программу? потому как:
//заменить умножение или деление в строке InBrackets на посчитанное значение
public void repMD(int i) {
double MD;
if (InBrackets[i] == '*')
MD = GetLeftOperand(i) * GetRightOperand(i);// ладно, пускай в нашем случае-вместо MD-результат прописывался как-DoubResul
else
MD = GetLeftOperand(i) / GetRightOperand(i);
ReplaceExp(i, MD);
Calc(); //вернуться в метод Calc - получается, что-то вроде взаимной рекурсии
} или как-то совместить: метод определения опреации по тексту нажатой Button - private Operation ReturnOperation(string str_op)
и систему ОПЗ для выражений со скобками?

lxa85
30-10-2011, 21:15
я трассировку то конечно выполню, но я ничего не понял, из того, что ты сказала :(
Напиши словами. Convert.ToString(ExecuteOperation(DoubResul, Num, CurrOper));. »
Вот это выражение нам что возвращает?
repMD - что за зверь? Как звучит полностью?
Система ОПЗ со скобками вообще не работает. Как сказать то...
Первая задача - перевести выражение в ОПЗ.
Вторая задача - по полученной ОПЗ посчитать выражение.
Блок схемку приведи, иль еще чего. Т.е. нужны смысловые блоки (ищем операцию, инициализируем переменные и т.п.) и тогда можно будет программу структурировать и понимать, за что отвечает тот или иной блок операторов.
----
Программы скачал, сейчас буду разбираться.

Ksenya
30-10-2011, 22:33
ага, значит, это выражение выдает нам ответ, вычисленный по методу расчета операций( "+","-","*","/" и других) и переведенный в окошко label_number.Text в строковом формате. т.е сначала после нажатия кнопок с текстами: цифра - знак операции-цифра ..срабатывает метод ReturnOperation(он выдает то или иное название операции), ..затем..после нажатия кнопки "="..срабатывает вложенный цикл методов: ExecuteOperation(DoubResul, Num, CurrOper)) - get_answer();- OperationEvent(object sender, EventArgs e). Как теперь включать опз, не меняя координально структуру, причем ведь еще есть операции: "√", возведения в степень(включу потом со старой версии калькулятора) ..
ума не приложу.




© OSzone.net 2001-2012