| |
VB.NET - Ein- und UmsteigerZahlen 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 | |
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 | |
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. | |
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 .... | |
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 | |
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 ? | |
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. | |
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 ? | |
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 ? | |
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. | |
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 | |
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 | |
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 ? | |
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. | |
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 ? | |
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. | |
| 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 |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|