Wafiqque Ответов: 3

Задача о нахождении максимального и минимального значений


Мой код для минимальных значений возвращает максимальное значение а код для максимального возвращает 0
Private Sub BtnCalcMin_Click(sender As Object, e As EventArgs) Handles btnCalcMin.Click
        'Minimum Calculation 

        Dim strsql As String = "SELECT [Price] FROM [Booking]"
        Dim strpath As String = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\Users\User\Desktop\Dummy database for login register\Flight2\Flight\test.mdb"

        Dim odaTest As New OleDb.OleDbDataAdapter(strsql, strpath)
        Dim datvalue As New DataTable

        Dim intcount As Integer

        Dim decMinimum As Decimal = 0

        odaTest.Fill(datvalue)
        odaTest.Dispose()


        For intcount = 0 To datvalue.Rows.Count - 1
            If decMinimum >= Convert.ToDecimal(datvalue.Rows(intcount)("Price")) Then
                decMinimum = Convert.ToDecimal(datvalue.Rows(intcount)("Price"))
            Else
                decMinimum = decMinimum
            End If
        Next

        Label5.Text = "RM" & decMinimum

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       'Maximum Calculation 

        Dim strsql As String = "SELECT [Price] FROM [Booking]"
        Dim strpath As String = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\Users\User\Desktop\Dummy database for login register\Flight2\Flight\test.mdb"

        Dim odaTest As New OleDb.OleDbDataAdapter(strsql, strpath)
        Dim datvalue As New DataTable

        Dim intcount As Integer

        Dim decMax As Decimal = 0

        odaTest.Fill(datvalue)
        odaTest.Dispose()

        For intcount = 0 To datvalue.Rows.Count - 1
            If decMax < Convert.ToDecimal(datvalue.Rows(intcount)("Price")) Then
                decMax = Convert.ToDecimal(datvalue.Rows(intcount)("Price"))
            End If
        Next

        Label6.Text = "RM" & decMax
    End Sub


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

Я попробовал изменить тип данных с валюты на цифры

phil.o

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

3 Ответов

Рейтинг:
0

Patrice T

Цитата:
Мой код для минимальных значений возвращает максимальное значение а код для максимального возвращает 0

Для Mon и Max никогда не начинайте с фиксированного значения, такого как 0, всегда начинайте с элемента списка, обычно первого.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Visual Basic / Visual Studio Video Tutorial - Базовая Отладка - YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и средства отладки[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


0x01AA

"Для Min и Max никогда не начинайте с фиксированного значения, такого как 0, всегда начинайте с элемента списка, обычно первого." *большой палец вверх*

Или, по крайней мере, инициализировать его с помощью, например, double.Мин или двойной.Макс

Рейтинг:
0

Maciej Los

На уровне SQL Server:

SELECT DISTINCT MIN([Price]), MAX([Price]) FROM [Booking]


На уровне клиента
Dim minval = datvalue.AsEnumerable().Min(Function(x) x.Field(of Integer)("Price"))
Dim maxval = datvalue.AsEnumerable().Max(Function(x) x.Field(of Integer)("Price"))


Wafiqque

он говорит, что последовательность не содержит элемента

Рейтинг:
0

Richard MacCutchan

Переменная decMinimum начинается с нуля, поэтому он никогда не будет заменен никаким другим значением. То decMaximum также начинается с нуля, но мы должны предположить, что в datatable нет никаких значений, иначе он был бы заменен. Как предлагает Патрис Т, используйте отладчик, чтобы увидеть, какие фактические значения (если таковые имеются) вы обрабатываете. Кроме того, удалите это избыточное предложение Else в вашем коде:

If decMinimum >= Convert.ToDecimal(datvalue.Rows(intcount)("Price")) Then
    decMinimum = Convert.ToDecimal(datvalue.Rows(intcount)("Price"))
' Else                         these lines are redundant
'    decMinimum = decMinimum           ditto
End If


Richard MacCutchan

1. Не используйте типы float или double для финансовых значений; используйте integer или decimal.
2. при поиске максимума вы должны инициализировать его либо первым значением в списке, либо нулем.
3. нет смысла отбирать значение из нулевого элемента на каждой итерации цикла.