Doctor GME Ответов: 1

Хотите, чтобы мой калькулятор выполнял несколько процессов


это мой дизайн калькулятора:

https://www3.0zz0.com/2020/05/28/19/797035332.jpg[^]

верхнее текстовое поле предназначено для расчета, а нижнее-для результата
это очень просто для меня, чтобы написать калькулятор, который может сделать простой процесс, как:
1 + 1 или 2 -1
но я хочу калькулятор, как калькулятор windows
который может выполнять сразу несколько процессов, таких как:

https://www5.0zz0.com/2020/05/28/19/531418581.png[^]

например, если я пишу 1 + 2, а затем нажимаю=, то в Нижнем текстовом поле отображается результат 3
то же самое должно произойти, когда я нажимаю+, нижнее текстовое поле показывает 3, а верхнее текстовое поле добавляет
+ к расчету и так далее.

Что я уже пробовал:

мне удалось хорошо решить функцию сложения (+)
но остальные 3 процесса не работают
процесс вычитания (-) делает сложение с - перед числом
пример: 8 - 2 результат равен -10
процессы умножения и деления всегда приводят к 0
это мой код.:

Public Class Form1

    Private Sub buttons(sender As Object, e As EventArgs) Handles Btn0.Click, Btn1.Click, Btn2.Click, Btn3.Click, Btn4.Click, Btn5.Click, Btn6.Click, Btn7.Click, Btn8.Click, Btn9.Click

        If CalculatorText.Text = "" Then
            CalculatorText.Text = sender.text
        Else CalculatorText.Text = CalculatorText.Text & sender.text
        End If

    End Sub
    Private Sub BtnPoint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPoint.Click

        CalculatorText.Text += BtnPoint.Text

    End Sub
    Private Sub BtnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClear.Click

        CalculatorText.Clear()
        CalculatorResult.Clear()

    End Sub
    Private Sub BtnDelete_Click(sender As Object, e As EventArgs) Handles BtnDelete.Click
        CalculatorText.Text = CalculatorText.Text.Remove(CalculatorText.Text.Length - 1, 1)
    End Sub
    Private Sub BtnPlus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPlus.Click

        Dim plus As String()
        Dim num As Long

        If CalculatorText.Text.Contains("+") Then
            plus = CalculatorText.Text.Split("+")
            For Each NumToPower As String In plus
                num += CStr(NumToPower)
            Next
            CalculatorResult.Text = "= " & num
            CalculatorText.Text += "+"
        Else
            CalculatorText.Text += "+"
        End If

    End Sub
    Private Sub BtnMinus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMinus.Click
        CalculatorText.Text += "-"
    End Sub
    Private Sub BtnDivide_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDivide.Click
        CalculatorText.Text += "/"
    End Sub
    Private Sub BtnMultiply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMultiply.Click
        CalculatorText.Text += "*"
    End Sub
    Private Sub CalculatorText_TextChanged(sender As Object, e As EventArgs) Handles CalculatorText.TextChanged

        If CalculatorText.Text = "" Then
            BtnResult.Enabled = False
            BtnPlus.Enabled = False
            BtnMinus.Enabled = False
            BtnMultiply.Enabled = False
            BtnDivide.Enabled = False
        End If

        If CalculatorText.Text <> "" Then

            Dim s As String = CalculatorText.Text.Substring(Len(CalculatorText.Text) - 1, 1)
            If s = "+" Or s = "-" Or s = "/" Or s = "*" Then
                BtnResult.Enabled = False
                BtnPlus.Enabled = False
                BtnMinus.Enabled = False
                BtnMultiply.Enabled = False
                BtnDivide.Enabled = False
            End If
            If s <> "+" And s <> "-" And s <> "/" And s <> "*" Then
                BtnResult.Enabled = True
                BtnPlus.Enabled = True
                BtnMinus.Enabled = True
                BtnMultiply.Enabled = True
                BtnDivide.Enabled = True
            End If

        End If
    End Sub
    Private Sub BtnResult_Click(sender As Object, e As EventArgs) Handles BtnResult.Click

        Dim result As Double
        Dim plus As String()
        Dim Substract As String()
        Dim multiply As String()
        Dim divide As String()
        Dim num As Long

        If CalculatorText.Text.Contains("+") Then
            plus = CalculatorText.Text.Split("+")
            For Each NumToPower As String In plus
                num += CStr(NumToPower)
            Next
        End If

        If CalculatorText.Text.Contains("-") Then
            Substract = CalculatorText.Text.Split("-")
            For Each NumToPower As String In Substract
                num -= CStr(NumToPower)
            Next
        End If

        If CalculatorText.Text.Contains("/") Then
            divide = CalculatorText.Text.Split("/")
            For Each numbertodivide As String In divide
                If numbertodivide <> 0 Then
                    num /= CStr(numbertodivide)
                    result = num
                Else
                    MessageBox.Show("Cannot Divide By 0")
                    Exit Sub
                End If
            Next
        End If

        If CalculatorText.Text.Contains("*") Then
            multiply = CalculatorText.Text.Split("*")
            For Each NumToPower As String In multiply
                num *= CStr(NumToPower)
            Next
        End If

        CalculatorResult.Text = "= " & num

    End Sub

End Class

CHill60

"не работает" не помогает нам помочь вам - что происходит или не происходит

Doctor GME

извините за это
вопрос был отредактирован...

1 Ответов

Рейтинг:
5

CHill60

Ваша концепция того, как анализировать текст калькулятора, кажется немного странной

If CalculatorText.Text.Contains("-") Then
    Substract = CalculatorText.Text.Split("-")
    For Each NumToPower As String In Substract
        num -= CStr(NumToPower)
    Next
End If
Во-первых, NumToPower это уже строка, так что нет никакой необходимости функция CStr(NumToPower). CStr-это очень старая школа в любом случае - если вы действительно хотите конвертировать вещи в строки, используйте Convert.ToString() вместо.

Вы пытаетесь добавить строку в long - это плохая практика, иногда вам это может сойти с рук в VB, но не всегда. Вам нужно конвертировать NumToPower к долгому.
Воспользуйся Long.Parse или еще лучше, Long.TryParse Вот справочная информация Синтаксический анализ числовых строк в .NET | Microsoft Docs[^]

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

Как вы попали в этот блок кода num = 0, NumToPower сначала он получит значение 8, так что ваш код говорит
num -= 8
что равно -8
На следующем проходе, NumToPower = -2 Так что
num -=2
это то же самое, что
-8-2
которая равна -10

В принципе, ваша логика применения операторов к числам неверна.

Также рассмотрим текст калькулятора
8 - 2 + 4
Ваша логика сначала разделит его на знак+, и вы получите два элемента в массиве "8 - 2" и "4" - Когда вы попытаетесь преобразовать этот первый элемент в числовое значение, вы получите ошибку.

Боюсь вам придется переосмыслить как разобрать строку калькулятора чтобы извлечь из нее числа и операторы

Редактировать - я нашел пару полезных статей на CodeProject

Вот простой пример, которому вы могли бы подражать ..
Простой калькулятор в Windows Forms[^]

Или если вы хотите сделать более сложный уровень синтаксического анализа всей входной строки взгляните на
Синтаксический анализ математических выражений в VB.NET: миссия возможна[^]


phil.o

5 б

Maciej Los

Согласитесь!

Richard Deeming

Большая разница между ними CStr(x) и x.ToString() это CStr не буду бросать NullReferenceException если объект случайно окажется null / Nothing. :)

Convert.ToString может быть, это лучшая замена.

CHill60

Хорошая мысль - я обновил свое решение!