Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
 Аватар для maschinarium0
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 26

Калькулятор VB, Нужно, чтобы последовательно могли выполняться более трех действий одновременно

28.10.2013, 17:19. Показов 5222. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Если не затруднит какого-нибудь крутого программиста, то помогите, пожалуйста, начинающему. Пишу калькулятор по типу Windows калькулятора на VB.
Практически готов (сложность была в защите "от дурака"). Но есть еще одно НО. Нужно, чтобы он считал, например, так: (2+5)*9=63 (а НЕ так: 2+5 = 7, затем 7*9 = 63). То есть считалось 3 и более числа сразу (уточняю, что НЕобязателно именно с этими числами). Нужно, чтобы последовательно могли выполняться более трех действий одновременно. а не посредством нажатия кнопки "=", чтобы повторялось предыдущее действие. У меня же выполняется только действие, например, сложение, а затем смотрится рез-т с помощью кнопки "=". Если надо умножить потом то же число, то нельзя потом просто нажать на кнопку умножить, а придется заново вводить два числа и считать.
Есть идеи, но не знаю как осуществить. Буду очень признателен. (приведу часть кода):
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Public Class WinCalc
    Dim x As Double, y As Double, z As Double, order As Integer
    Dim prov As Integer
    Dim znak As Integer
    Dim buf As Double
    Private Sub equally_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles equally.Click
        y = txt.Text
        If order = 1 Then z = x + y
        If order = 2 Then z = x - y
        If order = 3 Then z = x * y
        If order = 4 Then z = x / y
        txt.Text = z
        If (x / 0 = z) Then
            txt.Text = " "
            MsgBox("На ноль делить нельзя!", MsgBoxStyle.Information, "Ошибка")
        End If
        If x = "" Or y = "" Then txt.Text = ""
        MsgBox("Введите данные")
    End Sub
_____Кнопка плюс
Private Sub plus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles plus.Click
        x = txt.Text
        txt.Text = ""
        order = 1
    End Sub
____Кнопка минус
    Private Sub minus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles minus.Click
        x = txt.Text
        txt.Text = ""
        order = 2
    End Sub
____Кнопка умножение
    Private Sub multiplication_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles multiplication.Click
        x = txt.Text
        txt.Text = ""
        order = 3
    End Sub
____Кнопка деление
    Private Sub degree_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles degree.Click
        x = txt.Text
        txt.Text = ""
        order = 4
    End Sub
____TextBox
   Private Sub txt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt.KeyPress
        If Not (IsNumeric(e.KeyChar) Or ((e.KeyChar = ".") Or (e.KeyChar = ",")) Or (e.KeyChar = "-")) Then e.Handled = True
    End Sub
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2013, 17:19
Ответы с готовыми решениями:

Как сделать, чтобы программой могли пользоваться несколько пользователей одновременно
Для того, чтобы несколько пользователей могли одновременно пользоваться пограммой, т.е. в форме выбирать свои параметры и они все...

Как сделать, чтобы в файле Excel могли работать несколько пользователей одновременно по сети?
Как сделать, чтобы в файле Excel могли работать несколько пользователей одновременно по сети, а то файл открывается только для чтения, если...

Нужно, чтобы слова на русском тоже могли загружаться
При добавлении (в моём случае) новой категории, т. е. нового элемента в бд, я не могу писать слова на русском (кириллице). Он выдаёт...

26
Заблокирован
28.10.2013, 21:36
Студворк — интернет-сервис помощи студентам
Да там вообще если разобраться все события можно передавать стандартному калькулятору
в режиме hide и кода будет три строчки без заморочек

Добавлено через 9 минут
Не знаю... работают на VB.Net эти функции....
AppActivate(Title, [Wait])
Shell(PathName, [WindowStyle As VbAppWinStyle = vbMinimizedFocus]) As Double
0
 Аватар для maschinarium0
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 26
28.10.2013, 21:43  [ТС]
ViterAlex, сейчас вроде как разобрался. но подойдет лии это для обычного калькулятора для среднестатистического человека?
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
28.10.2013, 22:09
Не вижу проблемы: нажимаешь очередное действие, а в качестве первого аргумента подставляется результат предыдущих действий. Что в этом необычного?
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
28.10.2013, 23:12
Всем привет!
Как всегда, людям свойственно всё усложнять...
Автор, не знаю, устроит ли тебя сей метод, но не проще ли воспользоваться уже готовым решением?
VB.NET
1
2
3
Dim Scr As Object = CreateObject("MSScriptControl.ScriptControl")
Scr.Language = "VBScript"
MsgBox(Scr.Eval("3+2*5"))
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
28.10.2013, 23:45
Что ж, выложу сырой вариант класса, для работы с ОПН (обратной польской нотацией):
Класс для работы с ОПН
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
Public Class ReversePolishNotation
#Region " Поля и свойства "
    'Операторы арифметических действий
    Private Const OPERATORS As String = "+-*/^"
    Private _expression As String
    ''' <summary>
    ''' Исходное выражение
    ''' </summary>
    Public Property Expression() As String
        Get
            Return _expression
        End Get
        Set(ByVal value As String)
            _expression = value
        End Set
    End Property
 
    Private _rpnexpression As String
    ''' <summary>
    ''' Выражение записанное в обратной польской нотации
    ''' </summary>
    Public Property RpnExpression() As String
        Get
            Return _rpnexpression
        End Get
        Set(ByVal value As String)
            _rpnexpression = value
        End Set
    End Property
 
    Private _result As Double
    ''' <summary>
    ''' Вычисленный результат
    ''' </summary>
    Public Property Result() As Double
        Get
            Return _result
        End Get
        Set(ByVal value As Double)
            _result = value
        End Set
    End Property
    'Стек для хранения выражения в ОПН
    Private _rpn As Stack
#End Region
 
    Public Sub New(expression As String)
        _expression = expression
        _rpn = New Stack()
        _rpnexpression = String.Empty
        ConvertToRPN()
        CalculRPN()
    End Sub
    ''' <summary>
    ''' Процедура преобразования в ОПН
    ''' </summary>
    Private Sub ConvertToRPN()
        Dim operand As New List(Of String) 'Список для операторов и операндов
        'Перенос из строки в список. Нужно, чтобы правильно распознать дробные числа
        For Each c As Char In _expression
            'Последнее значение списка
            If operand.Count = 0 Then
                If Not Char.IsDigit(c) And Not IsOperator(c) Then
                    operand.Add("0" & Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)
                Else
                    operand.Add(c)
                End If
                Continue For
            End If
 
            Dim lastValue As String = operand.Item(operand.Count - 1)
            If IsOperator(c) Then
                operand.Add(c)
            Else
                If IsOperator(lastValue(lastValue.Length - 1)) Then
                    If Not Char.IsDigit(c) Then
                        operand.Add("0" & Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)
                    Else
                        operand.Add(c)
                    End If
 
                Else
                    'Самое важное. Ради этого весь цикл и затеивался. Определяем введённый десятичный разделитель и,
                    'если он не соответствует системному, то вместо него записывается системный
                    If Not Char.IsDigit(c) And c <> Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator Then
                        operand.Item(operand.Count - 1) &= IIf(IsOperator(lastValue(lastValue.Length - 1)), "0", "") & Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
                    Else
                        operand.Item(operand.Count - 1) &= IIf(IsOperator(lastValue(lastValue.Length - 1)), "0", "") & c.ToString()
                    End If
                End If
            End If
        Next
 
        Dim stack As New Stack() 'Вспомогательный стек
 
        'Само преобразование в ОПН
        For Each c As String In operand
            'Если символ является цифрой или открывающей скобкой, то просто помещаем его в основной стек
            If Char.IsDigit(c) Then
                _rpn.Push(c)
                Continue For
            ElseIf c = "(" Then
                stack.Push(c)
                Continue For
            End If
            'Если символ является арифметическим оператором
            If OPERATORS.Contains(c) Then
                'Проверка приоритетов
                If stack.Count > 0 AndAlso Priority(c) <= Priority(stack.Peek) Then
                    'Если стек не пустой и приоритет текущего оператора меньше или равен приоритету
                    'оператора в стеке, то оператор из временного стека помещаем в основной стек,
                    'а текущий оператор помещаем во вспомогательный стек
                    _rpn.Push(stack.Pop)
                    stack.Push(c)
                Else
                    'Иначе оператор просто помещается во вспомогательный стек
                    stack.Push(c)
                End If
                Continue For
            End If
            'Если символ является закрывающей скобкой
            If c = ")" Then
                'То перемещаем всё из вспомогательного стека в основной, пока не встретится открывающая скобка
                While stack.Peek <> "("
                    _rpn.Push(stack.Pop)
                End While
                'Удаляем открывающую скобку из вспомогательного стека
                stack.Pop()
            End If
        Next
        'Перенос всех операторов из вспомогательного стека в основной
        While (stack.Count <> 0)
            'Проверка, что во вспомогательном стеке остались только операторы. Иначе -  исключение
            If (OPERATORS.IndexOf(stack.Peek) = -1) Then
                Throw New Exception(String.Format("В выражении {0} не согласованы скобки.", _expression))
            End If
            _rpn.Push(stack.Pop)
        End While
        stack = _rpn.Clone
        'Переписываем стек в строку
        While (stack.Count <> 0) : _rpnexpression = stack.Pop.ToString() & " " & _rpnexpression.Trim() : End While
    End Sub
    ''' <summary>
    ''' Вычисление выражение в ОПН
    ''' </summary>
    Private Sub CalculRPN()
        'Клон основного стека. Если всё сделано правильно, то
        'после работы процедуры в нём будет храниться результат выражения
        Dim stack As Stack = _rpn.Clone
        Dim tempstack As Stack = New Stack 'Вспомогательный стек
        'Перегоняем из основного стека во вспомогательный в обратном порядке
        While (stack.Count > 0)
            tempstack.Push(stack.Pop)
        End While
        'Чтение вспомогательного стека. Т.е. ОПН читается слева-направо
        While (tempstack.Count > 0)
            'Цифру помещаем в основной стек
            If Char.IsDigit(tempstack.Peek) Then
                stack.Push(tempstack.Pop)
                Continue While
            End If
            'Если оператор, то выполняем соответствующее действие над последними двумя цифрами из основного стека
            If (OPERATORS.Contains(tempstack.Peek)) Then
                Dim temp As String
                temp = Calcul(Double.Parse(stack.Pop.ToString), Double.Parse(stack.Pop.ToString), tempstack.Pop.ToString)
                stack.Push(temp)
            End If
        End While
        If stack.Count = 1 Then
            _result = Double.Parse(stack.Pop)
        Else
            Throw New Exception("Несогласованное выражение")
        End If
    End Sub
 
    Private Function Calcul(b As Double, a As Double, action As String) As String
        Dim result As String = String.Empty
        Select Case action
            Case "+"
                result = (a + b).ToString()
            Case "-"
                result = (a - b).ToString()
            Case "*"
                result = (a * b).ToString()
            Case "/"
                If b = 0 Then Throw New ArgumentException("Деление на ноль")
                result = (a / b).ToString()
            Case "^"
                result = Math.Pow(a, b).ToString
        End Select
        Return result
    End Function
 
    Private Function Priority(c As String) As Integer
        Dim result As Integer = 0
        Select Case c.ToString
            Case "*", "/"
                result = 2
            Case "^"
                result = 3
            Case "+", "-"
                result = 1
        End Select
        Return result
    End Function
 
    Private Function IsOperator(c As Char) As Boolean
        Return "+-*/^()".Contains(c)
    End Function
End Class

Что может:
  1. Преобразовывать в ОПН выражения с арифметическими операциями +-*/^ и скобками. (Проверено 4 уровня скобок)
  2. Вычислять введённые выражения
  3. Исправлять неправильно указанный десятичный разделитель
  4. Понимать опущенную нулевую целую часть (запись вида .54)
Может стоит вынести в отдельную тему?
Ещё раз отмечу, что вариант сырой, практически нет обработки ошибок, оптимизации и т.п.
Пример использования
VB.NET
1
2
3
4
5
6
7
8
9
    Sub Main()
        Do
            Console.Write("Введите выражение: ")
            Dim expr As String = Console.ReadLine()
            If (expr = String.Empty) Then Exit Do
            Dim rpn As New ReversePolishNotation(expr)
            Console.WriteLine("Обратная польская нотация: {0} = {1}", rpn.RpnExpression, rpn.Result.ToString())
        Loop While True
    End Sub[
1
0 / 0 / 0
Регистрация: 10.11.2013
Сообщений: 2
10.11.2013, 19:48
ага, я понял, в чем дело. дайте ваш мэйл я вам отправлю
0
5 / 5 / 1
Регистрация: 27.07.2013
Сообщений: 64
11.11.2013, 21:11
Что у вас за калькуляторы.У меня 3 строчки на 1 действие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2013, 21:11

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

Будут ли метки выполняться последовательно, если нет переходов
Меня интересует такой вопрос, если метки описаны последовательно, но нет переходов (прыжков) по ним они будут выполняться последовательно...

Как сделать так, чтобы в фокусе было 2 и более кнопки одновременно
На форме находятся три groupBox в каждом по 3 кнопки. Смысл такой, я нажимаю кнопку на groupBox_1 и она должна остаться активной после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru