Ошибка вычисления деления калькулятора на С#
Вложений: 1
Здрасьте. мною написан, уже в полузавершенном варианте инженерный калькулятор..В момент написания кода к действию "деления" само действие работало прекрасно, но после добавления след строк по действиям до существующего конца программы..возникает непонятная ошибка) (причем ничего изменено не было). Подскажите в чем дело..почти дописан(
Папочку с кодом предлагаю для рассмотрения. |
|
:) перезалила
|
Ksenya, Так как вы снова не указали ошибку и место где она возникает, буду угадывать...
При делении у вас всегда выводится "Деление на ноль невозможно" . Это из - за того, что вы обнуляете переменную, заносите ее в поле и потом его парсите: Код:
double answer = 0; // вот тут обнуление у вас Код:
if (ch == '+') |
и еще с блоком проверки деления на ноль проблема
Код:
if (ch == '/') |
Да, но тогда возникает ошибка, я писала о ней в пред теме..(использование переменной, которой не присвоено значение(скриншот в дополнение)
и тогда напрашивается другой вопрос: почему другие действия не становятся равными нулю? магия, как вы думаете? :) |
|
извините, "Общая квота форума превышена на 117.6 Kb. " , не получилось. (Когда оставляю просто:
Код:
private void button_answ_Click(object sender, EventArgs e) Код:
private void button_answ_Click(object sender, EventArgs e) спасибо ребят..;) эх и намучилась я с ним, с этим калькулятором, есть кстати полу-почти-инженерный исходник, но он мудреный слишком и с ошибками, тоже с делением..препод завалит.( а вот такой вопрос..перерыла кучу литературы, но так и не смогла найти инф-ию по нахождению факториала от отрицательного дробного числа в с# .. это что в природе не возможно на данном языке? (потому как нашла только дэлфийский) |
нет, работает не так..потому что после нахождения деления, к примеру деления на ноль, не выводит сообщение в textbox пользователю, о том что он ошибся. а как избавится от записи double answer=0; или что-то в этом роде?
|
Цитата:
Цитата:
Цитата:
|
Цитата:
из функции надо выйти Код:
textBox1.Text = "Деление на ноль невозможно"; |
Вложений: 1
видели б вы какой он страшный..могу привести..не разобрать просто)) (код дэлфийский)
|
Цитата:
|
Вот тут можно посмотреть про факториал дробного числа. А так, в принципе, ищите гамма - функции.
|
Вложений: 1
Нет, я окончательно решила отказаться от такого каркаса, так как возникла идея создать все намного грамотнее и красивее..код, требующий доработки до полного инженерного, также отказывается выполнять деление( в частности на ноль, как странно бы не звучало)..
Ни ошибки исключений, ни какие-либо другие записи в поле "ответа" не выводятся ..я извиняюсь, но если есть возможность посмотреть, оцените пожалуйста насколько мои шансы доделать это действие делимы на ноль. :) :dont-know Файл содержит пояснения, то насколько мне удалось разобраться..(наверно будет слегка не литературно) В частности в месте: Код:
//блок выполнения операций __ как разрешить такое:Общая квота форума превышена на 105.6 Kb. Пожалуйста, сообщите об этом администрации.. |
Вложений: 1
выложите весь проект
вот вроде работает |
Цитата:
|
Цитата:
... еще возник такой момент,: если в Дэлфи функция: delete(st,length(st),1); смогла бы удалить нам последний символ в строке..то вроде как в С# аналогов этому не существует. И если пойти через свойство длины строки: Код:
Convert.ToString(DoubResul).Lenght = Convert.ToString(ExecuteOperation(DoubResul, Num, CurrOper)).Lenght - 1; |
|
Цитата:
Код:
string str = "OsZone!"; |
Вложений: 1
Наверно, все это прекрасно работает, только не в моем коде..калькулятор отказывается выполнять мои требования. :(
|
Код:
private void button_del_Click(object sender, EventArgs e) |
Вложений: 1
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, как другие(например, √ ) и другие..
|
btn_clr_num работает неправильно, только с унарными операциями работает, а с обычными нет
Цитата:
|
Да, причем попробуйте сделать следующее: поменяйте код действий( например у √ и нашей стрелки, увидите, что стрелка вычисляет, а корень наоборот нет) . в чем-то подвох, исходник не мой, ноя в нем почти разобралась, вероятно закрыт доступ не родным визуальным объектам на форме? мистика
|
Цитата:
просто кнопки изначально были разбиты на группы по действиям: унарные бинарные ввод числа память и по одной, кнопки не связанные с вычислениями button_dot, button_clear, button_chs вы добавляете кнопки не связанные с вычислениями и привязываете их к группам по действиям, что неправильно нужно или сделать их отдельными или выделить в особую группу |
просто я пробовала добавить новые кнопки с действием, к примеру корня, в итоге поняла, что они мои кнопочки обделены) (привязывала к унарным)
|
Вложений: 1
Вот вариант, вроде все кнопки работают
|
точно! вы правы, спасибо :yes: а если я добавлю другие операции, унарные/бинарные на новых кнопках, они сработают, если прописать их в группах? пробую, пока не получается(
|
Вложений: 1
и еще такой вопрос, про использование скобок. Нужен новый класс, я полагаю..вот как в примере..только как его связать со скобками и вычислениями..
нет уже сил с этим калькулятором :o |
Ksenya, отслеживаю тему, все никак руки не дойдут до трассировки.
Опиши пожалуйста на словах принцип разбора выражения и его расчета. Т.е. при введении скобок и сложных выражений, с разделением приоритетов выполнения операций, могут применяться различные типы разбора строки. Как пример - Польская обратная запись. Она может строиться с помощью стека, может строиться с помощью дерева. Я в свое время писал на Delphi не слишком быстрый, многопроходный разбор выражения в дерево. OPZ - как я понимаю и есть Польская обратная запись. С принципом ее работы разобрались? К ночи постараюсь взглянуть на код. ---- ferget, LilLoco, :up |
Здрасьте, lxa85.) честно говоря не совсем) да, на 2 курсе опз рассматривали, и для моего калькутера я выбрала наиболее подходящий вариант опз. исходник. но он применим для консольного калькулятора, это во-первых, а во-вторых, там совершенно другие входные данные, которые меня и смущают, пусть я переименую их, когда распознаю, к примеру как сейчас - числовые данные, которые я ввожу в поле - label_number.Text =(с обработкой операции и получением резалта)= Convert.ToString(ExecuteOperation(DoubResul, Num, CurrOper));.
Но как использовать определяемые, с помощью ОПЗ, данные для наших операций..просто мозги набекрень, это что мне теперь под один этот класс придется переделывать всю главную программу? потому как: //заменить умножение или деление в строке InBrackets на посчитанное значение Код:
public void repMD(int i) { и систему ОПЗ для выражений со скобками? |
я трассировку то конечно выполню, но я ничего не понял, из того, что ты сказала :(
Напиши словами. Цитата:
repMD - что за зверь? Как звучит полностью? Система ОПЗ со скобками вообще не работает. Как сказать то... Первая задача - перевести выражение в ОПЗ. Вторая задача - по полученной ОПЗ посчитать выражение. Блок схемку приведи, иль еще чего. Т.е. нужны смысловые блоки (ищем операцию, инициализируем переменные и т.п.) и тогда можно будет программу структурировать и понимать, за что отвечает тот или иной блок операторов. ---- Программы скачал, сейчас буду разбираться. |
ага, значит, это выражение выдает нам ответ, вычисленный по методу расчета операций( "+","-","*","/" и других) и переведенный в окошко label_number.Text в строковом формате. т.е сначала после нажатия кнопок с текстами: цифра - знак операции-цифра ..срабатывает метод ReturnOperation(он выдает то или иное название операции), ..затем..после нажатия кнопки "="..срабатывает вложенный цикл методов: ExecuteOperation(DoubResul, Num, CurrOper)) - get_answer();- OperationEvent(object sender, EventArgs e). Как теперь включать опз, не меняя координально структуру, причем ведь еще есть операции: "√", возведения в степень(включу потом со старой версии калькулятора) ..
ума не приложу. |
Время: 21:03. |
Время: 21:03.
© OSzone.net 2001-