Чтобы не ехать в гости с пустыми руками, Матроскин решает зайти в магазин и купить подарки. Магазин празднует свое 50-летие. По этому поводу объявлены скидки на все игрушки.
Если счет после скидки равен 50$, то в качестве специального подарка покупатель получает видеокассету с фильмом.
Учитывая скидки, выбери, какие 4 игрушки можно купить, чтобы получить бесплатно видеофильм.
Теоретические сведения
Во время создания программы изучаются следующие темы:
- компоненты Form, Panel, Label, CheckBox;
- использование переменных, арифметические операции;
- оператор проверки условия;
- свойства Checked, Tag компонента CheckBox;
- использование объекта sender.
Практикум
Создание интерфейса программы
1. Создайте новый проект, сохраните его.
2. Добавьте на форму компоненты Panel, Label и CheckBox, как показано на рисунке:
3. Измените имя метки, в которой будет выводиться общая сумма покупки на lblSum.
Программирование функций интерфейса
4. Напишите обработчик события OnCheckedChanged объекта checkBox1:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked) iSum += 3; else iSum -= 3;
lblSum.Text = Convert.ToString(iSum) + "$";
}
5. В классе Form1 объявите переменную iSum целого типа:
public partial class Form1 : Form
{
int iSum = 0;
public Form1()
{
InitializeComponent();
}
Запустите программу и убедитесь, что первый переключатель работает.
На заметку: строку
if (checkBox1.Checked) iSum += 3; else iSum -= 3;
можно записать так:
iSum += checkBox1.Checked ? 3 : -3;
6. Для всех переключателей можно написать аналогичный код, однако, это не самое лучшее решение. Процедуру checkBox1_CheckedChanged можно изменить таким образом, чтобы вместо числа 3 использовалось свойство CheckBox1.Tag:
iSum += checkBox1.Checked ? (int)checkBox1.Tag : -(int)checkBox1.Tag;
Теперь измените код, чтобы вместо имени компонента checkBox1 использовался аргумент sender. После всех изменений процедура должна выглядеть следующим образом:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
iSum += ((CheckBox)sender).Checked ? (int)((CheckBox)sender).Tag :
-(int)((CheckBox)sender).Tag;
this.lblSum.Text = Convert.ToString(iSum) + "$";
}
7. В обработчике события OnLoad формы напишите код для задания начальных значений свойству Tag и определения обработчика события On CheckedChanged всеx чекбоксов:
private void Form1_Load(object sender, EventArgs e)
{
this.checkBox1.Tag = 3;
this.checkBox2.Tag = 6;
this.checkBox3.Tag = 8;
this.checkBox4.Tag = 10;
this.checkBox5.Tag = 12;
this.checkBox6.Tag = 15;
this.checkBox7.Tag = 20;
this.checkBox8.Tag = 22;
this.checkBox9.Tag = 24;
this.checkBox10.Tag = 25;
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox6.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox7.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox9.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.checkBox10.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
this.lblSum.Text = "";
this.lblSum.TextAlign = System.Drawing.ContentAlignment.TopRight;
}
Запустите программу и убедитесь, что все переключатели работают.
Изменение кода с учетом скидок
8. Измените процедуру checkBox1_CheckedChanged следующим образом:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
int iPrice, iSale = 0;
iPrice = (int)((CheckBox)sender).Tag;
if (iPrice >= 3 && iPrice <= 5) iSale = 1;
if (iPrice >= 6 && iPrice <= 10) iSale = 2;
if (iPrice >= 11 && iPrice <= 15) iSale = 3;
if (iPrice >= 16 && iPrice <= 20) iSale = 4;
if (iPrice >= 21 && iPrice <= 25) iSale = 5;
iPrice -= iSale;
iSum += ((CheckBox)sender).Checked ? iPrice : -iPrice;
this.lblSum.Text = Convert.ToString(iSum) + "$";
}
Упражнения
1. Добавьте в программу проверку, чтобы в случае, когда головоломка будет решена, на экране появлялась кнопка «Выход», которая будет закрывать окно.