vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 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
Softwaredesign an einem Beispiel bewerten 
Autor: Theo_kkv
Datum: 08.01.20 09:29

Hallo,
ich habe mit/für meine Kinder eine Schulaufgabe mit einem kleinen Programm gelöst. Mal abgesehen von der fachlichen Seite (die soweit korrekt ist), interessiert mich Eure Meinung, ob mein runtergeschriebener Code überhaupt dem aktuellen Design entspricht. Ich bitte um Hinweise, was/wie verbessert werden kann.

Vielen Dank
Grüße Tom

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim b As Double = 14.755            'm
        Dim gamma As Double = 90.20295      
        Dim soll_flaeche As Double = 12.42  'm²
 
        Dim Iterationen As Integer = 1
        Dim a As Double = 0.5               'Startwert
 
        Do Until Math.Abs(soll_flaeche - Calculator.Flaeche(a, b, gamma)) < 0.01
            Dim differenz As Double = soll_flaeche - Calculator.Flaeche(a, b, _
              gamma)
 
            If Calculator.Flaeche(a, b, gamma) < soll_flaeche Then
                Select Case differenz
                    Case > 1
                        a += 0.25
                    Case > 0.5
                        a += 0.1
                    Case > 0.25
                        a += 0.05
                    Case > 0.1
                        a += 0.01
                    Case > 0.01
                        a += 0.001
                End Select
            Else
                Select Case differenz
                    Case < -1
                        a -= 0.25
                    Case < -0.5
                        a -= 0.1
                    Case < -0.25
                        a -= 0.05
                    Case < -0.1
                        a -= 0.01
                    Case < -0.01
                        a -= 0.001
                End Select
            End If
            Iterationen += 1
        Loop
 
        Label2.Text = Math.Round(Math.Abs(soll_flaeche - Calculator.Flaeche(a, _
          b, gamma)), 3).ToString + Space(1) + "m²"
        Label4.Text = Calculator.C(b, a, gamma).ToString
        Label6.Text = Calculator.S(a, b, Calculator.C(b, a, gamma)).ToString
        Label8.Text = a.ToString
        Label10.Text = Iterationen.ToString
 
    End Sub
Public Class Calculator
    Public Shared Function C(ByVal loc_b As Double, ByVal loc_a As Double, _
      ByVal loc_gamma As Double) As Double
        Return Math.Sqrt((loc_a * loc_a) + (loc_b * loc_b) - (2 * loc_a * loc_b _
        * Math.Cos(loc_gamma * Math.PI / 180)))
    End Function
    Public Shared Function Flaeche(ByVal a As Double, ByVal b As Double, ByVal _
      gamma As Double) As Double
        Return Math.Sqrt(S(a, b, Calculator.C(b, a, gamma)) * (S(a, b, _
        Calculator.C(b, a, gamma)) - a) * (S(a, b, Calculator.C(b, a, gamma)) - _
        b) * (S(a, b, Calculator.C(b, a, gamma)) - Calculator.C(b, a, gamma)))
    End Function
    Public Shared Function S(ByVal loc_a As Double, ByVal loc_b As Double, _
      ByVal loc_c As Double) As Double
        Return ((loc_a + loc_b + loc_c) / 2)
    End Function
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Softwaredesign an einem Beispiel bewerten 
Autor: Manfred X
Datum: 08.01.20 10:40

Hallo!

Ohne genauere Angaben läßt sich Code kaum sinnvoll bewerten.

Einige allgemeine Anmerkungen:

Es wäre zu bezweifeln, dass ein Windows.Forms.Form heute noch als aktuell einzuordnen ist.
Im Load-Event der Form sollten nur Aktionen ausgeführt werden, die zur Intialisierung der
Form erforderlich sind, aber kein Code für spezifische Aufgaben.
Den Zahlenfilter sollte man nicht über "Select Case" erledigen, sondern die Grenzwerte
könnten klassenglobal in ein Array eingetragen und über eine Schleife verarbeitet werden.
Die Benennung der Elemente (Controls, Parameter) sollte aussagekräftig sein.
Das gilt auch für die Benennung der Shared-Funktionen in der Calculator-Klasse.
Bei fest codierten Zahlen-Werten wären klassenglobale Constants einzusetzen.
Variable Werte abhängig von der Funktionalität als Settings deklarieren/speichern oder
in einer Datenbank ablegen.
So weit ich sehe, werden in der Funktion "Fläche" Berechnungen mit gleichen Parametern
mehrfach durchgeführt. Sinnvoll? Notwendig?

Beitrag wurde zuletzt am 08.01.20 um 10:54:05 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Softwaredesign an einem Beispiel bewerten 
Autor: Theo_kkv
Datum: 08.01.20 12:20

Hallo,
hier doch noch einige Erläuterungen zur eigentlichen Aufgabe der Berechnung. Es stand die Aufgabe, in einem ebenen Dreieck mit gegebener Seite B, Winkel Gamma und !jetzt kommt's der Fläche des Dreiecks die "Seite A" auszurechnen. Daher die Variablenbezeichnung. Das Lösen dieser Aufgabe ist mit der euklidischen Geometrie gar nicht so trivial. Daher mein Ansatz mithilfe eines Startwertes über eine Iteration zum Ziel zu kommen. Mit einem angenommenen Startwert für Seite A von 0.5m werden über den Kosinussatz die Seite C, dann der Wert für "S" aus der heronschen Flächenformel und schließlich die Fläche selbst berechnet. Dann einige Vergleiche und Verbesserungen für den Startwert und los gehts wieder mit der Iteration. So lange bis es beim Abbruchwert passt.

Zu Deinen Hinweisen, Manfred X.
Du meinst sicher WPF. Darin habe ich mich (noch) nicht eingearbeitet. Die Lernkurve ist sicher recht steil. Für diese reine Berechnungsaufgabe ist eventuell auch F# geeignet.
Das mit dem Load-Event habe ich berichtigt.
In der Funktion "Fläche" (heronsche Flächenformel) werden nicht immer gleiche Parameter verwendet. Der Hilfswert in dieser Funktion für Seite C wird immer aus der Funktion "C" entnommen.

Kann man den Codebereich der Do Loop Schleife auch noch kapseln?

Tom
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Softwaredesign an einem Beispiel bewerten 
Autor: Manfred X
Datum: 09.01.20 09:04

Deine Routine Fläche könnte so aussehen:
Public Shared Function Flaeche _
     (ByVal a As Double, b As Double, gamma As Double) As Double
 
     Dim cval As Double = Calculator.C(b, a, gamma)
     Dim sval As Double = S(a, b, cval)
     Return Math.Sqrt(sval * (sval - a) * (sval - b) * (sval - cval))
 
End Function
Das Select-Case-Statement wäre z.B. ungefähr so möglich:
   Dim limits() As Double = {1, 0.5, 0.25, 0.1, 0.01, -0.0001}
   Dim adjust() As Double = {0.25, 0.1, 0.05, 0.01, 0.001, 0}
 
   sgn = Math.Sign(differenz)
   diff = Math.Abs(differenz)
 
   For i As Integer = 0 To limits.Length - 1
       If diff > limits(i) Then adj_value = adjust(i) : Exit For
   Next i
   adj_value *= sgn
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