vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zahlen einordnen 
Autor: Sebi90
Datum: 21.08.17 22:00

Hallo,

wie kann ich zahlen in eine Bereich einordnen ?
Beispiel Zahl 5

-10 bis -5
-5 bis 0
0 bis 5
5 bis 10
10 bis 15

Könnte ich vielleicht ein kleines Beispiel haben.

MfG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 22.08.17 06:30

Hallo!

Es sind einige Detailfragen zu klären:


Handelt es sich bei den Zahlen um Ganzzahlen (Integer)?
Wie sind die Werte der Bereichs-Grenzen den Bereichen zuzuordnen
(oberer oder unterer Bereich)?
Sind die Klassengrenzen direkt aneinander hängend oder gibt es
dazwischen freie Zahlenbereiche?
Wird die gesamte Spannweite der Zahlen durch die Bereiche abgedeckt?
Sind die Kategorien gleich breit?

Vielleicht so ....
Private Sub Classification()
 
   'ab -10 bis -5    Index 1
   'über -5 bis 0    Index 2
   'über 0 bis 5     Index 3
   'über 5 bis 10    Index 4
   'über 10 bis 15   Index 5
   'sonst            Index -1
   Dim limits() As Integer = {-10, -5, 0, 5, 10, 15} 'Obergrenzen der Bereiche
 
   Dim numbers() As Integer = _
     {-20, 12, 4, 8, 4, 15, 0, 3, 3, -10, 16, 5} 'einzuordnende Zahlen
 
   Dim classindex(numbers.Length - 1) As Integer 'Index des Bereichs der Zahl 
   ' in Numbers
   Dim classfreq(limits.Length - 1) As Integer   'Häufigkeit im Bereich
   Dim outnumbers As Integer = 0 'Häufigkeit nicht zuzuordnender Zahlen
 
   For i As Integer = 0 To numbers.Length - 1
      If numbers(i) < limits(0) Or _
         numbers(i) > limits(limits.Length - 1) Then
         outnumbers += 1
         classindex(i) = -1 'Zahl liegt ausserhalb der Bereiche
      Else
         For c As Integer = 0 To limits.Length - 1
            If numbers(i) <= limits(c) Then
               classindex(i) = c   'Index des Bereichs der Zahl
               classfreq(c) += 1   'Häufigkeit im Bereich
               Exit For
            End If
         Next c
      End If
   Next i
 
   Console.WriteLine("Zuordnung der Zahlen zu Bereichs-Indices")
   For i As Integer = 0 To numbers.Length - 1
      Console.WriteLine _
         (numbers(i).ToString & " --> " & classindex(i).ToString)
   Next i
 
   Console.WriteLine("Zahlen-Häufigkeit in den Bereichen")
   For i As Integer = 0 To limits.Length - 1
      Console.WriteLine(i.ToString & " --> " & classfreq(i).ToString)
   Next i
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 22.08.17 19:46

Hallo Manfred,

sorry für meine schwammige Auskunft.
Bei den Zahlen handelt es sich nicht um Ganzzahlen ( zwei Nachkommastellen)
Freie Zahlenräume gibt es nicht. Der ganze bereich hat sich jetzt ein bisschen geändert.
Die Zahlen liegen zwischen -2 bis +2
Mein Ansatz sieht so aus:
Public Class Form1
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Text = "   Größer – 1,2"
        Label2.Text = "- 1,2 bis - 0,9"
        Label3.Text = "- 0,9 bis - 0,6"
        Label4.Text = "- 0,6 bis - 0,3"
        Label5.Text = "- 0,3 bis + 0,3"
        Label6.Text = "+ 0,3 bis + 0,6"
        Label7.Text = "+ 0,6 bis + 0,9"
        Label8.Text = "+ 0,9 bis + 1,2"
        Label9.Text = "   Größer + 1,2"
 
    End Sub
 
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
      Button1.Click
        lblAusgabe.Text = TextBox1.Text
        lblAusgabe.Refresh()
    End Sub
 
    Private Sub lblAusgabe_TextChanged(sender As Object, e As EventArgs) _
      Handles lblAusgabe.TextChanged
        'Label11 größer - 1,2
        If lblAusgabe.Text > "- 1,2" Then
            Label11.Text = Label11.Text + 1
        End If
        'Label12 - 1,2 bis - 0,9
        'Label13 - 0,9 bis - 0,6
        'Label14 - 0,6 bis - 0,3
        'Label15 - 0,3 bis + 0,3
        'Label16 + 0,3 bis + 0,6
        'Label17 + 0,6 bis + 0,9
        'Label18 + 0,9 bis + 1,2
 
 
        If lblAusgabe.Text > "1,2 Then" Then
            Label19.Text = Label19.Text + 1
        End If
 
    End Sub
End Class
Leider funktioniert nur die Abfrage > 1,2.
Und warum funktioniert > "- 1,2" nicht ?
Und ich weis nicht wie ich die anderen Werte Abfragen soll.

Beitrag wurde zuletzt am 22.08.17 um 19:47:33 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 22.08.17 20:15

Also mit den positiven Zahlen funktioniert es
Private Sub lblAusgabe_TextChanged(sender As Object, e As EventArgs) Handles _
  lblAusgabe.TextChanged
        'Label11 größer - 1,2
 
        'Label12 - 1,2 bis - 0,9
        'Label13 - 0,9 bis - 0,6
        'Label14 - 0,6 bis - 0,3
        'Label15 - 0,3 bis + 0,3
 
        If lblAusgabe.Text > "-0,3" And lblAusgabe.Text < "0,3" Then
            Label15.Text = Label15.Text + 1
        End If
        If lblAusgabe.Text > "0,3" And lblAusgabe.Text <= "0,6" Then
            Label16.Text = Label16.Text + 1
        End If
        If lblAusgabe.Text > "0,6" And lblAusgabe.Text <= "0,9" Then
            Label17.Text = Label17.Text + 1
        End If
        If lblAusgabe.Text > "0,9" And lblAusgabe.Text <= "1,2" Then
            Label18.Text = Label18.Text + 1
        End If
        If lblAusgabe.Text > "1,2 Then" Then
            Label19.Text = Label19.Text + 1
        End If
 
    End Sub
Aber sobald ich negativ werde nicht ....
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 22.08.17 21:01

Wenn Du mit Zahlen arbeitest, benutze numerische Datentypen !!!
Und für die Anzeige Konvertierungsfunktionen (z.B. ToString) !!!
Public Class frmClassification
 
    Dim WithEvents txtInput As New TextBox _
       With {.Parent = Me, .Width = 300}
 
    Dim classlabels As New List(Of Label)
    Dim classfreq As New List(Of Label)
 
    Dim class_ug As Decimal = -1.2D
    Dim class_width As Decimal = 0.3D
 
    Private Sub frmClassification_Load(sender As System.Object, _
        e As System.EventArgs) Handles MyBase.Load
 
        Me.Size = New Size(300, 350)
 
        Dim tp As Integer = 50
        Dim lh As Integer = 24  'Labelhöhe
        Dim lw As Integer = 120 'Labelbreite
 
        'Labels erstellen
 
        classlabels.Add(New Label With _
           {.Text = "kleiner gleich -1,2", _
            .Parent = Me, .Width = lw, .Top = tp})
        classfreq.Add(New Label With _
           {.Parent = Me, .Left = lw + 5, .Width = 60, .Top = tp, _
            .Text = "0"})
 
        Dim ug As Decimal = class_ug, w As Decimal = class_width
 
        For i As Integer = 1 To 8
            classlabels.Add(New Label With _
               {.Parent = Me, .Width = lw, .Top = tp + i * lh, _
                .Text = ug.ToString("0.00") & " bis " & (ug + w).ToString( _
                "0.00")})
            classfreq.Add(New Label With _
                {.Parent = Me, .Left = lw + 5, .Width = 60, .Top = tp + i * lh, _
                 .Text = "0"})
            ug += w
        Next i
 
        classlabels.Add(New Label With _
            {.Text = "größer 1,2", _
             .Parent = Me, .Width = lw, .Top = tp + lh * 9})
        classfreq.Add(New Label With _
            {.Parent = Me, .Left = lw + 5, .Width = 60, .Top = tp + 9 * lh, _
             .Text = "0"})
 
    End Sub
 
 
    Private Sub txtInput_KeyDown(sender As Object, _
        e As System.Windows.Forms.KeyEventArgs) Handles txtInput.KeyDown
 
        Dim number As Decimal
 
        If e.KeyCode = Keys.Enter Then
            If Not Decimal.TryParse(txtInput.Text, number) Then
                MsgBox("Keine gültige Zahl") : Exit Sub
            End If
            number = Math.Round(number, 2)
            If number <= -1.2 Then
                classfreq(0).Text = (CInt(classfreq(0).Text) + 1).ToString
            ElseIf number > 1.2 Then
                classfreq(9).Text = (CInt(classfreq(9).Text) + 1).ToString
            Else
                For i As Integer = 1 To 8
                    If number <= class_ug + class_width * i Then
                        classfreq(i).Text = _
                          (CInt(classfreq(i).Text) + 1).ToString
                        Exit For
                    End If
                Next i
            End If
        End If
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 22.08.17 21:21

Danke Manfred,

genau das was ich gemeint habe.
Aber gibt es noch eine Möglichkeit mein Beispiel lauffähig zu machen ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 22.08.17 21:59

Zeichenfolgen verhalten sich nicht wie Zahlen.
Du mußt den Inhalt der Labels in einen numerischen Typ konvertieren,
um Berechnungen oder Vergleiche korrekt durchführen zu können.
'Statt
 
If lblAusgabe.Text > "-0,3" And lblAusgabe.Text < "0,3" Then
   Label15.Text = Label15.Text + 1
End If
 
'so
 
'Die Zeichenfolge von lblAusgabe muß zuvor auf Gültigkeit getestet werden ( 
' tryparse)
If CDec(lblausgabe.Text) > -0.3 And CDec(lblausgabe.Text) <= 0.3 Then
   'label15.text muß numerisch (mit "0") initialisiert worden sein
   label15.Text = (CInt(label15.Text) + 1).ToString
End If
Auf diese Weise sollte man aber nicht programmieren
(fehleranfällig, wartungsfeindlich).

Beitrag wurde zuletzt am 22.08.17 um 22:22:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 23.08.17 15:54

Ok verstanden.

Bis jetzt habe ich eine Schleife durchlaufen, und die Labels mit
Labelx.Refresh()
aktualisiert.

Wie kann ich die classfreq nach jedem durchlauf aktualisieren ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 31.08.17 20:47

Hallo,

wollte das ganze nochmal abändern.

Public Class Form1
 
 
 
    Dim WithEvents txtInput As New TextBox With {.Parent = Me, .Width = 150}
    Dim WithEvents Länge As New TextBox With {.Parent = Me, .Left = 232, .Width _
      = 150}
    Dim Info As New Label With {.Parent = Me, .Text = "<= 200", .Top = 25}
    Dim Info1 As New Label With {.Parent = Me, .Left = 232, .Text = "> 200", _
      .Top = 25}
 
 
    Dim classlabels, classlabels1 As New List(Of Label)
    Dim classfreq, classfreq1 As New List(Of Label)
 
    Dim class_ug As Decimal = -1.2D
    Dim class_width As Decimal = 0.3D
 
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
      Handles MyBase.Load
 
        Me.Size = New Size(500, 350)
 
        Dim tp As Integer = 50
        Dim lh As Integer = 24  'Labelhöhe
        Dim lw As Integer = 120 'Labelbreite
 
        'Labels erstellen
 
        classlabels.Add(New Label With {.Text = "kleiner gleich -1,2", .Parent _
          = Me, .Width = lw, .Top = tp})
        classfreq.Add(New Label With {.Parent = Me, .Left = lw + 5, .Width = _
        60, .Top = tp, .Text = "0"})
        classlabels1.Add(New Label With {.Text = "kleiner gleich -1,2", .Parent _
        = Me, .Width = lw, .Left = 232, .Top = tp})
        classfreq1.Add(New Label With {.Parent = Me, .Left = 352, .Width = 60, _
        .Top = tp, .Text = "0"})
 
 
        Dim ug As Decimal = class_ug, w As Decimal = class_width
        Dim ug1 As Decimal = class_ug, w1 As Decimal = class_width
 
        For i As Integer = 1 To 8
            classlabels.Add(New Label With {.Parent = Me, .Width = lw, .Top = _
              tp + i * lh, .Text = ug.ToString("0.00") & " bis " & (ug + _
              w).ToString("0.00")})
            classfreq.Add(New Label With {.Parent = Me, .Left = lw + 5, .Width _
            = 60, .Top = tp + i * lh, .Text = "0"})
            ug += w
        Next i
 
        For i As Integer = 1 To 8
            classlabels.Add(New Label With {.Parent = Me, .Width = lw, .Left = _
              232, .Top = tp + i * lh, .Text = ug1.ToString("0.00") & " bis " & _
              (ug1 + w1).ToString("0.00")})
            classfreq.Add(New Label With {.Parent = Me, .Left = lw + 232, _
            .Width = 60, .Top = tp + i * lh, .Text = "0"})
            ug1 += w1
        Next i
 
 
 
 
        classlabels.Add(New Label With {.Text = "größer 1,2", .Parent = Me, _
          .Width = lw, .Top = tp + lh * 9})
        classfreq.Add(New Label With {.Parent = Me, .Left = lw + 5, .Width = _
        60, .Top = tp + 9 * lh, .Text = "0"})
 
        classlabels1.Add(New Label With {.Text = "größer 1,2", .Parent = Me, _
          .Width = lw, .Left = 232, .Top = tp + lh * 9})
        classfreq1.Add(New Label With {.Parent = Me, .Left = 352, .Width = 60, _
        .Top = tp + 9 * lh, .Text = "0"})
 
    End Sub
 
 
    Private Sub txtInput_KeyDown(sender As Object, e As _
      System.Windows.Forms.KeyEventArgs) Handles txtInput.KeyDown
 
        Dim number As Decimal
 
        If e.KeyCode = Keys.Enter Then
            If Not Decimal.TryParse(txtInput.Text, number) Then
                MsgBox("Keine gültige Zahl") : Exit Sub
            End If
            number = Math.Round(number, 2)
            If number <= -1.2 Then
                classfreq(0).Text = (CInt(classfreq(0).Text) + 1).ToString
            ElseIf number > 1.2 Then
                classfreq(9).Text = (CInt(classfreq(9).Text) + 1).ToString
            Else
                For i As Integer = 1 To 8
                    If number <= class_ug + class_width * i Then
                        classfreq(i).Text = _
                          (CInt(classfreq(i).Text) + 1).ToString
                        Exit For
                    End If
                Next i
            End If
        End If
    End Sub
End Class
Wenn ich Werte größer 1,2 eintrage, wird alles in der zweiten Spalte eingetragen? Warum ist das so ?
Und wie kann ich eine zweite Abfrage mit Einordnung <=200 Linke Spalte >200 Rechte Spalte verwirklichen ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 01.09.17 12:49

Hallo!

Du hast eine Klassifikation im Bereich -1.2 bis +1.2.
Wie paßt der Wert 200 dazu?

Wenn Du classlabels1, classfreq1 deklarierst, sollte
in der zweiten 1bis8-Schleife vermutlich auf diese
Objekte verwiesen werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 01.09.17 17:20

Hallo,

der Wert 200 soll der trenner für zwei Verschiedene Klassifikationen sein.

Ist der Wert kleiner bzw gleich 200 Klassifikation 1
Ist der Wert größer 200 Klassifikation 2

Immer die gleichen Bereiche -1.2 - +1.2 aber eben unterscheiden ob Länger oder Kürzer 200
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 01.09.17 20:13

Ersetze den Eventhandler der Textbox "txtInput" durch den der Textbox "Länge"
und nehme die von mir oben angegebene Korrektur vor.

    Private Sub Länge_KeyDown(sender As Object, e As  _
      System.Windows.Forms.KeyEventArgs) Handles Länge.KeyDown
 
        Dim number, length As Decimal
        Dim cf As List(Of Label)
 
        If e.KeyCode = Keys.Enter Then
            If Not Decimal.TryParse(txtInput.Text, number) Then
                MsgBox("Keine gültige Zahl") : Exit Sub
            End If
 
            If Not Decimal.TryParse(Länge.Text, length) _
                OrElse length <= 0 Then
                MsgBox("Keine gültige Länge") : Exit Sub
            End If
 
            'Zuweisung der Referenz der benötigten LabelListe  
            If length > 200 Then
                cf = classfreq1
            Else
                cf = classfreq
            End If
 
            number = Math.Round(number, 2)
            If number <= -1.2 Then
                cf(0).Text = (CInt(cf(0).Text) + 1).ToString
            ElseIf number > 1.2 Then
                cf(9).Text = (CInt(cf(9).Text) + 1).ToString
            Else
                For i As Integer = 1 To 8
                    If number <= class_ug + class_width * i Then
                        cf(i).Text = _
                          (CInt(cf(i).Text) + 1).ToString
                        Exit For
                    End If
                Next i
            End If
        End If
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 02.09.17 15:31

Hallo,

danke Manfred.
Das ganze ist ein Stück eines etwas größeren Projekts. In der Entwicklungsumgebung wird das ganze Problemlos und ohne Fehler ausgeführt. Starte ich das ganze unter Windows, bleibt das Programm hängen. (keine Rückmeldung)
Starte ich das Programm im Kompatibilitätsmodus unter Windows 7 läuft das Programm wieder Fehlerfrei durch.
Obwohl das OS aus Windows 7 ist.

Kann man der Exe mitgeben das sie automatisch im Kompatibilitätsmodus startet ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 02.09.17 16:20

Hallo!

[I]In der Entwicklungsumgebung wird das ganze Problemlos und ohne Fehler ausgeführt.
Starte ich das ganze unter Windows, bleibt das Programm hängen.[/I]

Auch im Debugmodus (innerhalb Entwickungsumgebung) wird zunächst eine EXE-Datei
erstellt und danach ausgeführt. Selbstverständlich läuft auch dabei das Projekt
"unter Windows".

Wenn Du diese Exe-Datei (Debug/Release-Konfiguration?) direkt startest und sie hängen
bleibt, hat das vielleicht Gründe, die z.B. in der dann etwas höheren Ausführungs-
Geschwindigkeit liegen (Multithreading-Race-Bedingung). Oder falsche Pfade zu
den zu ladenden Daten-Dateien. Oder Verweise auf "alte" Bibliotheken. Oder ...

Die Anwendung deshalb im Kompatibilitätsmodus auszuführen, ist vermutlich keine
solide Lösung.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Sebi90
Datum: 02.09.17 18:28

Und wie würdest du hier vorgehen ?
Welche Möglichkeiten gibt es ?
Pfade kann ich ausschließen. Wie kann man die Ausführungsgeschwindigkeit drosseln ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen einordnen 
Autor: Manfred X
Datum: 03.09.17 06:42

Ich kenne Dein Projekt nicht.
Setze einige Messageboxen an "prominente" Stellen,
um herauszufinden (einzugrenzen), in welchem Code-Abschnitt
die Anwendung hängen bleibt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel