Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачник.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

InitializeComponent();

}

//обработчики событий кнопок калькулятора

}

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

Рассмотрим обработчики событий кнопок r1, r2, n, передающих в поля класса данные, введенные пользователем в окна формы:

private void button1_Click(object sender, EventArgs e)

{

//ввод r1

string s, s1, s2;

int ind,m, n;

s = textBox1.Text;

try

{

ind = s.IndexOf('/');

s1 = s.Substring(0, ind);

s2 = s.Substring(ind + 1);

m = int.Parse(s1);

n = int.Parse(s2);

r1 = new Rational(m, n);

textBox1.Text = r1.PrintRational("");

}

catch (Exception ex)

{

textBox1.Text = ex.Message +

"\r\nЗадайте корректный формат: n/m";

}

}

private void button2_Click(object sender, EventArgs e)

{

//ввод r2

string s, s1, s2;

int ind, m, n;

s = textBox2.Text;

try

{

ind = s.IndexOf('/');

s1 = s.Substring(0, ind);

s2 = s.Substring(ind + 1);

m = int.Parse(s1);

n = int.Parse(s2);

r2 = new Rational(m, n);

textBox2.Text = r2.PrintRational("");

}

catch (Exception ex)

{

textBox2.Text = ex.Message +

"Задайте корректный формат: n/m";

}

}

private void button5_Click(object sender, EventArgs e)

{

//ввод k

k = int.Parse(textBox3.Text);

textBox3.Text = "=" + k.ToString();

}

private void button9_Click(object sender, EventArgs e)

{

//чистка окон r1, r2, n;

textBox1.Text = "";

textBox2.Text = "";

textBox3.Text = "";

}

Ввод данных, осуществляемый пользователем, всегда следует контролировать. Поэтому преобразование данных из полей формы в поля класса организовано в виде try-catch блока, предусматривающее возможность появления в процессе ввода исключительных ситуаций и их обработку.

Пользователи склонны периодически нарушать заданные спецификации. У нарушений могут быть две разные причины – либо знаменатель рационального числа равен нулю, либо неверно задан формат вводимых данных. В первом случае ситуация обнаружится в конструкторе класса Rational, где будет выброшено исключение соответствующего типа. Во втором случае ошибка обнаружится в процессе преобразования введенной строки в число. В обоих случаях пользователю будет выдано сообщение, описывающее возникшую ситуацию, и он сможет повторить ввод.

Обработчики события Click для кнопок, издающих операции над рациональными числами устроены просто и похожи друг на друга. В классе Rational определены знаки операций, что позволяет переменной r1 присвоить бинарное выражение с заданной бинарной операцией. Лишь в обработчике, реализующем операцию округления рационального числа, вызывается метод RationalRound класса Rational.

private void button4_Click(object sender, EventArgs e)

{

//сложение

r1 = r1 + r2;

textBox1.Text = r1.PrintRational("");

}

private void button3_Click(object sender, EventArgs e)

{

//вычитание

r1 = r1 - r2;

textBox1.Text = r1.PrintRational("");

}

private void button7_Click(object sender, EventArgs e)

{

//умножение

r1 = r1 * r2;

textBox1.Text = r1.PrintRational("");

}

private void button6_Click(object sender, EventArgs e)

{

//деление

r1 = r1 / r2;

textBox1.Text = r1.PrintRational("");

}

private void button8_Click(object sender, EventArgs e)

{

//возведение в целую степень

r1 = r1 ^ k;

textBox1.Text = r1.PrintRational("");

}

private void button10_Click(object sender, EventArgs e)

{

//округление до k значащих цифр

r1 = r1.RationalRound(k);

textBox1.Text = r1.PrintRational("");

}

Для демонстрации сложно устроенных выражений над рациональными числами на форму посажена кнопка Expression, обработчик события Click которой вычисляет сложно устроенное выражение:

private void button11_Click(object sender, EventArgs e)

{

//пример выражения над рациональными числами

if ((r1 * r1 - r2 ^ 3) > Rational.One)

r1 = r1 / r2 + new Rational(24, 46);

else

r1 = (r1 + r2) ^ 2;

textBox1.Text = r1.PrintRational("");

}

Консольный калькулятор для работы с рациональными числами

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

Построим традиционное консольное приложение, где в некотором цикле, управляемом пользователем, на каждом шаге ему предлагается меню из возможных команд. Пользователь выбирает команду, вводит нужные данные для этой команды, затем команда обрабатывается, результат ее выполнения выводится на экран, и все повторяется, пока пользователь не откажется от продолжения работы.

Анализ выбора пользователя строится по известной схеме разбора случаев, а тело каждого варианта case практически совпадает с тем, что делается в обработчике события Click при выборе соответствующей кнопки в калькуляторе Windows. Приведу текст консольного проекта:

namespace ConsoleCalc

{

class Program

{

static Rational r1, r2;

static int n;

static int menu;

static void Main(string[] args)

{

string answer = "yes";

string invite;

r1 = new Rational(1,1);

r2 = new Rational(1,1);

invite = "Выберите пункт меню:\r\n";

invite += "0 - ввод r1\r\n";

invite += "1 - ввод r2\r\n";

invite += "2 - r1 = r1+r2\r\n";

invite += "3 - r1 = r1-r2\r\n";

invite += "4 - r1 = r1*r2\r\n";

invite += "5 - r1 = r1/r2\r\n";

invite += "6 - (r1 > r2)?\r\n";

invite += "7 - (r1 < r2)?\r\n";

invite += "8 - (r1 == r2)?\r\n";

invite += "9 - r1 = r1^n\r\n";

invite += "10 - r1 = r1.Round(n)\r\n";

do

{

Console.WriteLine(invite);

menu = int.Parse(Console.ReadLine());

Parsing();

Console.WriteLine("Продолжим? (yes/no)");

answer = Console.ReadLine();

} while (answer == "yes");

}

static void Parsing()

{

//Разбор случаев. Выполняются действия согласно

//выбранному пункту меню.

int a=1, b=1;

bool r = true;

switch (menu)

{

case 0:

{

Console.WriteLine("Введите целое - числитель r1");

a = int.Parse(Console.ReadLine());

Console.WriteLine("Введите целое - знаменатель r1");

b = int.Parse(Console.ReadLine());

r1 = new Rational(a, b);

break;

}

case 1:

{

Console.WriteLine("Введите целое - числитель r2");

a = int.Parse(Console.ReadLine());

Console.WriteLine("Введите целое - знаменатель r2");

b = int.Parse(Console.ReadLine());

r2 = new Rational(a, b);

break;

}

case 2:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r1 = r1+r2;

Console.WriteLine(r1.PrintRational("r1+r2"));

break;

}

case 3:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r1 = r1 - r2;

Console.WriteLine(r1.PrintRational("r1-r2"));

break;

}

case 4:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r1 = r1 * r2;

Console.WriteLine(r1.PrintRational("r1*r2"));

break;

}

case 5:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r1 = r1 / r2;

Console.WriteLine(r1.PrintRational("r1/r2"));

break;

}

case 6:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r = (r1 > r2);

Console.WriteLine("(r1>r2) == "+r.ToString());

break;

}

case 7:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r = (r1 < r2);

Console.WriteLine("(r1<r2) == " + r.ToString());

break;

}

case 8:

{

Console.WriteLine(r1.PrintRational("r1"));

Console.WriteLine(r2.PrintRational("r2"));

r = (r1 == r2);

Console.WriteLine("(r1==r2) == " + r.ToString());

break;

}

case 9:

{

Console.WriteLine("Введите целое - степень r1");

n = int.Parse(Console.ReadLine());

Console.WriteLine(r1.PrintRational("r1"));

r1 = r1 ^ n;

Console.WriteLine(r1.PrintRational("r1^n"));

break;

}

case 10:

{

Console.WriteLine("Введите целое - " +

"число значащих цифр при округлении r1");

n = int.Parse(Console.ReadLine());

Console.WriteLine(r1.PrintRational("r1"));

r1 = r1.RationalRound(n); Console.WriteLine(r1.PrintRational("r1.RationalRound("

+ n.ToString()));

break;

}

}

}

}

На рис. 2_3 показан процесс работы с консольным калькулятором:

Рис. 2_3 Консольный калькулятор в процессе работы

В заключение несколько слов о том, как запускать нужный проект на выполнение. В построенном нами решении два проекта – консольный и Windows, каждый из которых является выполняемым. Выбрав для любого из этих проектов в меню Project пункт «Set as StartUp Project», можно установить, какой из проектов будет запускаться на выполнение. Большего можно добиться на странице свойств решения, где можно не только установить стартовый проект, но запустить оба проекта одновременно, включив возможное свойство «Multiple startup projects».