Показать полную графическую версию : Ошибка вычисления деления калькулятора на С#
Здрасьте. мною написан, уже в полузавершенном варианте инженерный калькулятор..В момент написания кода к действию "деления" само действие работало прекрасно, но после добавления след строк по действиям до существующего конца программы..возникает непонятная ошибка) (причем ничего изменено не было). Подскажите в чем дело..почти дописан(
Папочку с кодом предлагаю для рассмотрения.
возникает непонятная ошибка »
Опять тот же вопрос :) Что за ошибка?
Подскажите в чем дело »
Где именно смотреть? Скачал проект, но что - то в нем не так, не хватает Form1.Designer.cs, скорее всего :)
Ksenya, Так как вы снова не указали ошибку и место где она возникает, буду угадывать...
При делении у вас всегда выводится "Деление на ноль невозможно" .
Это из - за того, что вы обнуляете переменную, заносите ее в поле и потом его парсите:
double answer = 0; // вот тут обнуление у вас
if (ch == '+')
{ answer = Temp + double.Parse(textBox1.Text); }
if (ch == '-')
{ answer = Temp - double.Parse(textBox1.Text); }
if (ch == '*')
{ answer = Temp * double.Parse(textBox1.Text); }
if (ch == '^')
{ answer = Math.Pow(Temp, double.Parse(textBox1.Text)); }
if (ch == 'k')
{ answer = SqrtY(Temp); }
if (ch == 'm')
{ answer = Temp % double.Parse(textBox1.Text); }
textBox1.Text = answer.ToString(); // здесь вы в поле текстбокс1 вносите "0"
textBox2.Text = textBox1.Text;
if (ch == '/')
{
// а тут начинаете парсить, в итоге первое условие никогда не выполнится, только если равно нулю.
if (double.Parse(textBox1.Text) != 0) { answer = Temp / double.Parse(textBox1.Text); }
else if (double.Parse(textBox1.Text) == 0)
{
textBox1.Text = "Деление на ноль невозможно";
textBox2.Text = textBox1.Text; System.Media.SystemSounds.Asterisk.Play();
}
}
И еще, просто совет, на примере этого же куска кода. Не делайте просто через if, лучше использовать else if. Будет выполняться меньше проверок, тем самым оптимизируете работу.
if (ch == '+')
{ answer = Temp + double.Parse(textBox1.Text); }
else if (ch == '-')
{ answer = Temp - double.Parse(textBox1.Text); }
else if (ch == '*')
{ answer = Temp * double.Parse(textBox1.Text); }
esle if (ch == '^')
{ answer = Math.Pow(Temp, double.Parse(textBox1.Text)); }
....
и еще с блоком проверки деления на ноль проблема
if (ch == '/')
{
if (double.Parse(textBox1.Text) != 0) { answer = Temp / double.Parse(textBox1.Text); }
else if (double.Parse(textBox1.Text) == 0)
{
textBox1.Text = "Деление на ноль невозможно";
textBox2.Text = textBox1.Text; System.Media.SystemSounds.Asterisk.Play();
return;
}
}
textBox1.Text = answer.ToString();
textBox2.Text = textBox1.Text;
Да, но тогда возникает ошибка, я писала о ней в пред теме..(использование переменной, которой не присвоено значение(скриншот в дополнение)
и тогда напрашивается другой вопрос: почему другие действия не становятся равными нулю? магия, как вы думаете? :)
но тогда возникает ошибка »
тогда это когда?
и где скриншот?
извините, "Общая квота форума превышена на 117.6 Kb. " , не получилось. (Когда оставляю просто:
private void button_answ_Click(object sender, EventArgs e)
{ double answer; // без "=0"
if (ch == '+')
{ answer = Temp + double.Parse(textBox1.Text); }
догадалась, надо просто этот этап выполнить последним;)
private void button_answ_Click(object sender, EventArgs e)
{
double answer=0;
if (ch == '+')
{ answer = Temp + double.Parse(textBox1.Text); }
if (ch == '-')
{ answer = Temp - double.Parse(textBox1.Text); }
if (ch == '*')
{ answer = Temp * double.Parse(textBox1.Text); }
if (ch == '^')
{ answer = Math.Pow(Temp, double.Parse(textBox1.Text)); }
if (ch == 'k')
{ answer = SqrtY(Temp); }
if (ch == '/')
{
if (double.Parse(textBox1.Text) != 0) answer = Temp / double.Parse(textBox1.Text);
else if (double.Parse(textBox1.Text) == 0)
{
textBox1.Text = "Деление на ноль невозможно";
textBox2.Text = textBox1.Text; System.Media.SystemSounds.Asterisk.Play();
}
}
if (ch == 'm')
{ answer = Temp % double.Parse(textBox1.Text); }
textBox1.Text = answer.ToString();
textBox2.Text = textBox1.Text;
}
вот я чучело-мяучело=*
спасибо ребят..;)
эх и намучилась я с ним, с этим калькулятором, есть кстати полу-почти-инженерный исходник, но он мудреный слишком и с ошибками, тоже с делением..препод завалит.(
а вот такой вопрос..перерыла кучу литературы, но так и не смогла найти инф-ию по нахождению факториала от отрицательного дробного числа в с# .. это что в природе не возможно на данном языке? (потому как нашла только дэлфийский)
нет, работает не так..потому что после нахождения деления, к примеру деления на ноль, не выводит сообщение в textbox пользователю, о том что он ошибся. а как избавится от записи double answer=0; или что-то в этом роде?
потому как нашла только дэлфийский »
Ну алгоритм значит есть, остается только перевести на другой язык...
нет, работает не так..потому что после нахождения деления, к примеру деления на ноль, не выводит сообщение в textbox пользователю, о том что он ошибся »
воообще не понятно, что не так
а как избавится от записи double answer=0 »
Зачем от нее избавляться?
потому что после нахождения деления, к примеру деления на ноль, не выводит сообщение в textbox пользователю, о том что он ошибся »
на самом деле выводит, но функция продолжает выполнятся и значение меняется на 0
из функции надо выйти
textBox1.Text = "Деление на ноль невозможно";
textBox2.Text = textBox1.Text; System.Media.SystemSounds.Asterisk.Play();
return;
видели б вы какой он страшный..могу привести..не разобрать просто)) (код дэлфийский)
на самом деле выводит, но функция продолжает выполнятся и значение меняется на 0
из функции надо выйти
точно)) спасибо..
Вот тут (http://www.rsdn.ru/forum/alg/156422.flat.aspx) можно посмотреть про факториал дробного числа. А так, в принципе, ищите гамма - функции.
Нет, я окончательно решила отказаться от такого каркаса, так как возникла идея создать все намного грамотнее и красивее..код, требующий доработки до полного инженерного, также отказывается выполнять деление( в частности на ноль, как странно бы не звучало)..
Ни ошибки исключений, ни какие-либо другие записи в поле "ответа" не выводятся ..я извиняюсь, но если есть возможность посмотреть, оцените пожалуйста насколько мои шансы доделать это действие делимы на ноль. :) :dont-know
Файл содержит пояснения, то насколько мне удалось разобраться..(наверно будет слегка не литературно)
В частности в месте:
//блок выполнения операций
private double ExecuteOperation(double DoubResul, double num, Operation op)
{
switch (op)//в зависимости от переменной для операций
{
case Operation.Add:
{
DoubResul = DoubResul + num;
return DoubResul;
}
case Operation.Div:
{ if (num == 0) { DoubResulLast=DoubResul; label_number.Text= "Деление на ноль невозможно!: " ;
return 0; }
else
DoubResul = DoubResul / num;
return DoubResul;
}
case Operation.Mult:
{
DoubResul = DoubResul * num;
return DoubResul;
}
case Operation.Sub:
{
DoubResul = DoubResul - num;
return DoubResul;
}
case Operation.Per:
{
DoubResul = (DoubResul * num) / 100;
return DoubResul;
}
case Operation.Sqrt:
{
DoubResul = Math.Sqrt(num);
return DoubResul;
}
case Operation.DivX:
{
DoubResul = 1 / num;
return DoubResul;
}
case Operation.Mod:
{
DoubResul = DoubResul % num;
return DoubResul;
}
default: return DoubResul;
//}
}
/*catch (DivideByZeroException ex) ---> тоже не срабатывает
{
label_number.Text = "Деление на ноль невозможно!: " + ex.Message;
return 0;
}
catch (Exception ex)
{
MessageBox.Show("Ошибка!: " + ex.Message);
return 0;
}*/
}
ошибка именно в выполнении действия в процессе отладки
__
как разрешить такое:Общая квота форума превышена на 105.6 Kb. Пожалуйста, сообщите об этом администрации..
выложите весь проект
вот вроде работает
Delirium
28-10-2011, 01:06
как разрешить такое:Общая квота форума превышена на 105.6 Kb. Пожалуйста, сообщите об этом администрации.. »
Общий объем доступного места на форуме для вложений зависит от количества сообщений пользователя. Т.к. вы новичок => и объем маленький.
ferget:вот вроде работает
да, все как надо) спасибо
...
еще возник такой момент,: если в Дэлфи функция: delete(st,length(st),1); смогла бы удалить нам последний символ в строке..то вроде как в С# аналогов этому не существует. И если пойти через свойство длины строки:
Convert.ToString(DoubResul).Lenght = Convert.ToString(ExecuteOperation(DoubResul, Num, CurrOper)).Lenght - 1;
светлого решения проблемы точно не увидишь, похоже что в доступных функциях, как в немногих других языках, # каким-то образом обделен..
Delirium
28-10-2011, 02:37
.то вроде как в С# аналогов этому не существует »
Вовсе нет. делается так:
string str = "some text";
str = str.Substring(0, str.Length-1);
Convert.ToString(DoubResul).Lenght »
Гораздо проще написать DoubResul.ToString().Length
Цитата Ksenya:
.то вроде как в С# аналогов этому не существует »
Вовсе нет. делается так: »
Ну или так :
string str = "OsZone!";
str = str.Remove(str.Length-1);
// в str будет "OsZone"
Удаляет последний символ...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.