[На главную] [Назад на предыдущую]
Дополнение к данной странице. Примеры ученических работ
[Создание арифметического калькулятора]
Следующие страницы
[на страницу "Циклы"]

6. Проект Калькулятор v.2

Вместо введения. Вначале сайт задумывался, в виде некоего конспекта или шпаргалки для старшеклассников, изучающих информатику, как профильный предмет. Однако скорость реформ сегодня такова, что школы не успев создать предпосылок (материальных, информационных, кадровых) для выбранного профиля, уже вынуждены выстраивать ориентацию вдоль нового каприза административной моды. Вспомнить о потерях времени  учителя на разработку методик, о немалых тратах на литературу и какое-никакое оборудование, никому и в голову не придёт. Вперёд к новым миражам. В итоге в текущем году информатики у меня осталось по 1 часу в неделю в 5 и 8 классе. В 5 классе, согласно программе, начали изучать текстовый редактор. Однако время не стоит на месте, и то что десяток лет казалось чудом, теперь стало частью бытовой культуры. Оказалось, что почти все деревенские пятиклассники уже умеют довольно уверенно набирать текст, сохранять, редактировать и перемещать файлы, могут нарисовать несложную картинку. Эти умения работы с компьютером были выработаны частично в начальном звене школы, частично самостоятельно. Вот тут и возникла мысль: раз уж вы такие шустрые, то вместо сказки про белого бычка пишите текст программы. В конце концов какая разница создавать текст в Word'е или во встроенном текстовом редакторе языка программирования. Двоих самых продвинутых на это и отрядили. Каково же было моё удивление, когда на следующем занятии я обнаружил ещё одного мальчика, который принёс с собой самоучитель Visual Basic.Net, и самостоятельно открыв устаревшую версию Visual Basic 6 пытался сделать простейший калькулятор, описанный в предыдущих трёх экранах. Поэтому на вызов пришлось отвечать.

Далее будет написано, как работали над проектом Калькулятор v.2 равнецкие пятиклассники. Напомню, что на момент начала проекта пятиклассники ещё не знали арифметических дробей, отрицательных чисел, координат на плоскости, функций и много другого, что вроде бы необходимо. Но вот, что получилось. Итак Калькулятор (версион два  )

Постановка задачи. Усовершенствуем Калькулятор (см экран 3) так, чтобы он:
-1. Bыполнял 4 арифметических действия, но числа вводились бы не только с клавиатуры, но и с кнопок на форме.
-2. При этом числа должны вводиться только в одно окно, а кнопкой "Вверх" передаваться во второе, и тогда при выполнении арифметической операции пользователь будет видеть оба компонента.
-3. Должно быть третье окно для памяти, куда в случае необходимости пользователь бы одно число положить, а потом, когда понадобится взять.

Интерфейс. Создадим новый проект. Разместим на форме три текстовых окна. Затем четыре кнопки для арифметических операций. Это уже знакомо нам по предыдущему проекту. Можно этим объектам оставить прежние имена, а можно дать новые. Например, ученик 5 класса Цвирко Виталий, готовясь к грядущему усложнению кода заменил малоинформативные имена вроде txtA, txtB на более содержательные txtRezult, txtMemory. И он прав. Потому что через неделю вряд ли вспомнишь, какие контролы именовал буквами А и В, тогда как имена Memory или Divide несут большую смысловую нагрузку. Добавим ещё 10 кнопок с цифрами. Присвоим им имена от bt1, bt2 ...и т.д. до bt9, bt0. Свойству Text в окне свойств присвоим соответственно 1; 2; и т.д. до 9 и 0. При создании десяти одинаковых кнопок, конечно же, лучше воспользоваться копированием. Внимание! Те кто знаком с Visual Basic 6 будут ожидать, что программа предложит создать массив (array) контролов, для обработки всех десяти кнопок в одной процедуре. Нет, в Visual Studio это будет выглядеть несколько иначе и об этом позднее. Добавим ещё три кнопки для перемещения чисел между окнами.  Для наглядности сведения о контролах, их свойствах и присвоенных свойствам значениях представим в таблице.
Control Name Text TextAlign
Форма frmCalc Цвирко Виталий умолчание
Верхнее окно TextBox для памяти (на рис в нём 0) txtMemory нет текста Right
Среднее окноTextBox для записи числа (на рис в нём 521) txtSecondNumber Right
Нижнее окно TextBox для ввода числа и оно же
для вывода результата вычислений (на рис в нём 809)
txtRezult Right
Кнопка сложения btnPlus + умолчание
Кнопка вычитания btnMinus -
Кнопка умножения btnMult х
Кнопка деления btnDivide :
Кнопка "Вверх". Её нажатие означает,
что ввод первого числа окончен. Введённое
число сдвигается вверх, и окно очищается
для ввода второго числа.
btnToUp Вверх
Кнопка  "В память". Число из нижнего окна
копируется в верхнее. При этом число
ранее содержавшееся в памяти уничтожается.
btnToMemory В память
Кнопка "Из памяти". Число из верхнего окна
копируется в нижнее. При этом содержимое
нижнего окна сдвигается вверх.
btnToRezult Из памяти
Кнопка 1 и т. д. bt1 1

Напомним, что изменять значения свойств надо в окне свойств (Properties). Кроме перечисленного в таблице минимально необходимого набора свойств, можно поупражняться со свойствами BackColor (фоновый цвет кнопок и самой формы), Font (шрифт, его размер, жирность, курсив), ForeColor (цвет букв и символов выведенных на контролы). Однако если вы сделаете кнопку 1 ярко-красной, кнопку 4 ядовито-зелёной, а кнопку 7 нежно-розовой, то кто-нибудь непременно сочтёт вас за глупца. Но если вы будете поскромнее в цветастости, то получится некий объект, который возможно будет походить на варианты калькулятора, изображённые ниже.

  

Как обеспечить ввод чисел с кнопок на форме. Код. Первое приближение.
Допустим мы нажимаем кнопку 4. В окне ввода (у нас это txtRezult) должна появиться четверка. Напишем следующий код:

Private Sub bt4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt4.Click
txtRezult.Text = bt4.Text
End Sub

При нажатии на кнопку 4 в окне ввода действительно возникает четвёрка, но потом сколько ни жми второй четвёрки не появляется. А дело в том, что новая четвёрка при своём появлении стирает старую. Изменим код так, чтобы четвёрка не стирала предыдущую запись, а приписывалась к ней.

Private Sub bt4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt4.Click
txtRezult.Text = txtRezult.Text + bt4.Text
End Sub

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

 Private Sub bt0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt0.Click
txtRezult.Text = txtRezult.Text + bt0.Text
End Sub

Private Sub Bt1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Bt1.Click
txtRezult.Text = txtRezult.Text + Bt1.Text
End Sub

Private Sub Bt2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Bt2.Click
txtRezult.Text = txtRezult.Text + Bt2.Text
End Sub

Private Sub bt3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt3.Click
txtRezult.Text = txtRezult.Text + bt3.Text
End Sub

Private Sub bt4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt4.Click
txtRezult.Text = txtRezult.Text + bt4.Text
End Sub

Private Sub bt5_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt5.Click
txtRezult.Text = txtRezult.Text + bt5.Text
End Sub

Private Sub Bt6_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Bt6.Click
txtRezult.Text = txtRezult.Text + Bt6.Text
End Sub

Private Sub bt7_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt7.Click
txtRezult.Text = txtRezult.Text + bt7.Text
End Sub

Private Sub bt8_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt8.Click
txtRezult.Text = txtRezult.Text + bt8.Text
End Sub

Private Sub Bt9_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Bt9.Click
txtRezult.Text = txtRezult.Text + Bt9.Text
End Sub

Как обеспечить ввод чисел с кнопок на форме. Код. Второе приближение.
Оптимизируем код. Десять процедур, похожих друг на друга, как близнецы, и отличающихся только именем кнопки заменим одной. Эта общая процедура немного отличается от ранее написанных процедур обработки события. Поскольку компьютер не понимает какой контрол мы хотим обработать, заголовок процедуры придётся вводить с клавиатуры, и сам заголовок несколько усложнится. Во-первых его надо придумать, например, уже знакомый нам пятиклассник Виталий остановился на таком варианте  Allbtn0to9, что означает: все кнопки от нуля до девяти. Во-вторых перечислить все обрабатываемые кнопки. Вот так он будет выглядеть:

Private Sub Allbtn0to9(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
bt1.Click, bt2.Click, bt3.Click, bt4.Click, bt4.Click, bt5.Click, bt6.Click, _
bt7.Click, bt8.Click, bt9.Click, bt0.Click

Теперь о служебном слове Handles (обрабатывает), посмотрите на фрагменты кода в первом приближении , там фигурирует и Private Sub Bt9_Click (щелчок на кнопке 9), и зачем-то казалось бы дублирующее пояснение Handles bt9.Click (обрабатывает щелчок на кнопке 9). И вот нам становится ясно, что имя можно придумать самим, и оно может быть  любым, но после слова Handles необходимо указать компьютеру, какие события мы намереваемся обрабатывать. И что удивительно, как только мы напишем имя первой кнопки, компьютер начнёт нас понимать и предлагать свои услуги в виде всплывающих окон. Останется только ставить запятые и щелкать на нужных пунктах. Похоже в создание среды Visual Studio Программисты Microsoft вложили всю свою душу. Чем не пример для восхищения и подражания. Слишком длинную строку кода можно переносить так: после пробела поставить нижнее тире.

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

Dim objVitaliBtn As Button

Во второй строке запишем что этот объект принимает сигнал о том какая кнопка нажата. Иначе говоря объекту objVitaliBtn  присваивается значение отправителя. Sender и с VS и с английского переводится, как отправитель.

 objVitaliBtn = sender

И следующим кодом припишем к тексту окна txtRezult цифру, хранимую в свойстве кнопке text.

If txtRezult.Text = "0" Then
txtRezult.Text = objVitaliBtn.Text
Else
txtRezult.Text = txtRezult.Text + objVitaliBtn.Text
End If

Заметим, что в этом фрагменте использована структура ветвления со следующими служебными словами: IF...THEN...ELSE...END IF. Она поможет избавиться от возможного появления в начале числа ничего не значащих нулей. Переведём с языка VS  на русский язык её содержание.

если в окне txtRezult стоит только ноль то
этот ноль заменяется цифрой стоящей на нажатой кнопке
а иначе
к тому что уже написано добавляется новая цифра с текста кнопки
блоку
если конец

Для более полного понимания смысла блока если можно рассмотреть расположенную ниже схему:

Полный текст кода процедуры будет выглядеть так:


Private Sub Allbtn0to9(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
bt1.Click, bt2.Click, bt3.Click, bt4.Click, bt4.Click, bt5.Click, bt6.Click, _
bt7.Click, bt8.Click, bt9.Click, bt0.Click

Dim objVitaliBtn As Button
objVitaliBtn = sender
If txtRezult.Text = "0" Then
txtRezult.Text = objVitaliBtn.Text
Else
txtRezult.Text = txtRezult.Text + objVitaliBtn.Text
End If


Для закрепления умения обрабатывать события различных контролов в одной процедуре ученикам было предложено написать код меняющий цвет кнопки, в момент появления над кнопкой курсора и возвращающий прежний цвет, когда курсор уводится с поверхности кнопки. Поясним только, что появление курсора над контролом это событие MouseEnter, а уход курсора это событие MouseLeave. Для имён процедур Виталий выбрал такие понятные ему наборы символов как, ColorEnter (цвет на вход) и ColorOut (цвет на выход).


 Private Sub ColorEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt0.MouseEnter, bt1.MouseEnter, _
bt2.MouseEnter, bt3.MouseEnter, bt4.MouseEnter, bt5.MouseEnter, bt6.MouseEnter, bt7.MouseEnter, bt8.MouseEnter, bt9.MouseEnter _
, btnDivide.MouseEnter, btnMinus.MouseEnter, btnMult.MouseEnter, btnPlus.MouseEnter, btnToMemory.MouseEnter, _
btToRezult.MouseEnter, btToUp.MouseEnter

Dim objRed As Button
objRed = sender
objRed.BackColor = Color.Lime
End Sub



Private Sub ColorOut(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt0.MouseLeave, bt1.MouseLeave, _
bt2.MouseLeave, bt3.MouseLeave, bt4.MouseLeave, bt5.MouseLeave, bt6.MouseLeave, bt7.MouseLeave, _
bt8.MouseLeave, bt9.MouseLeave, btnDivide.MouseLeave, btnMinus.MouseLeave, btnMult.MouseLeave, _
btnPlus.MouseLeave, btnToMemory.MouseLeave, btToRezult.MouseLeave, btToUp.MouseLeave

Dim objSnow As Button
objSnow = sender
objSnow.BackColor = Color.Snow
End Sub


В качестве конкретного примера приведу следующие две страницы, которые написал ученик 8 класса Равнецкой школы Садыков Козбай. На странице Создание арифметического калькулятора ученик рассказывает о своём интересе к программированию и о создании своей первой «полунастоящей» программы. Это краткое изложение его выступления на конференции «Шаг в будущее». На странице Просмотр исходного кода содержится код всех процедур арифметического калькулятора и картинки с изображением интерфейса.

[На главную]
[На предыдущую]
Примеры ученических работ
[Создание арифметического калькулятора.(Пример)]
[Код арифметического калькулятора.(Пример)]
Следующие страницы
[на страницу "Циклы"]
экран 4

Сайт управляется системой uCoz