Konsolenanwendung: Verbesserungsvorschläge für meinen Quellcode

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Konsolenanwendung: Verbesserungsvorschläge für meinen Quellcode

    Moin moin.
    Als abschließendes Projekt in meinem Kurs "Grundlagen Hochsprachenprogrammierung" (Teil meines Maschinenbaustudiums) sollen wir ein Programm schreiben. Vorgegeben ist uns dabei nur, was das Programm können soll.
    Ich bin damit jetzt auch fürs erste fertig. Mein Programm erfüllt alle gestellten Anforderungen und funktioniert einwandfrei.

    Ich würde mich nun freuen, wenn ihr einen Blick über meinen Quellcode werfen würdet und mir sagt, was ihr davon haltet. Bedenkt dabei aber bitte, ich habe jediglich Grundkenntnisse mit wenig Erfahrung und kann mit dem Programmierstil von Profis natürlich nicht mithalten. Wäre also nett wenn ihr die Messlatte nicht auf euer Niveau legt, sondern entsprechend tiefer ;). Ich möchte damit erreichen, meinen Quellcode noch etwas abzurunden, was den Stil angeht.
    Vielen Dank schonmal :)

    Zweck des Programms:
    Der User soll sich einen Balken definieren können, der mit beliebig vielen Kräften belastet werden kann, welche der User selber eingibt.
    Zum Schluss sollen die eingegeben Werte ausgegeben werden, wobei die Kräfte nach ihrer Position auf dem Balken sortiert werden sollen

    VB.NET-Quellcode

    1. Module Biegebalken
    2. Sub Main()
    3. Dim dBalkenlaenge, dLoslagerposition, dPosition(0), dKraft(0), dEingabe As Double
    4. Dim strEingabe As String
    5. Dim iAnzahlPositionen As Integer
    6. Console.WriteLine()
    7. Console.WriteLine("!!! Hinweis: Eingabe aller Längenwerte in m und aller Kräfte in kN !!!")
    8. Linie()
    9. EinlesenBalkenlaenge(dBalkenlaenge)
    10. EinlesenLoslagerposition(dBalkenlaenge, dLoslagerposition)
    11. Linie()
    12. ' Primärschleife zum Einlesen von beliebig vielen Punktlasten
    13. Do
    14. ' Sekundärschleife zum Einlesen der Positionen
    15. Do
    16. Do
    17. Console.Write(iAnzahlPositionen + 1 & ". Position eingeben: ")
    18. strEingabe = Console.ReadLine()
    19. ' Bedingung um das Einlesen von mindestens einer Position zu erzwingen
    20. If (strEingabe = "e" Or strEingabe = "E") And dPosition(0) = 0 Then
    21. strEingabe = 0
    22. Console.WriteLine("Mindestens eine Punktlast muss eingegeben werden!")
    23. End If
    24. Loop Until IsNumeric(strEingabe) And Not strEingabe.Contains(".") Or strEingabe = "e" Or strEingabe = "E"
    25. ' Beenden der Sekundärschleife
    26. If strEingabe = "e" Or strEingabe = "E" Then
    27. Exit Do
    28. End If
    29. Loop Until strEingabe > 0
    30. ' Beenden der Primärschleife
    31. If strEingabe = "e" Or strEingabe = "E" Then
    32. Exit Do
    33. End If
    34. dEingabe = strEingabe
    35. ' Kontrolle ob eine Position bereits vergeben wurde
    36. For z As Integer = 0 To dPosition.Length - 1
    37. If dEingabe = dPosition(z) Then
    38. Console.WriteLine("Position wurde bereits vergeben!")
    39. Continue Do
    40. ElseIf dEingabe = dLoslagerposition Then
    41. Console.WriteLine("Position liegt auf Loslager!")
    42. Continue Do
    43. ElseIf dEingabe > dBalkenlaenge Then
    44. Console.WriteLine("Position liegt außerhalb des Balkens!")
    45. Continue Do
    46. End If
    47. Next
    48. ' Array Anpassung
    49. If dPosition.Length = iAnzahlPositionen Then
    50. ReDim Preserve dPosition(dPosition.Length)
    51. ReDim Preserve dKraft(dKraft.Length)
    52. End If
    53. dPosition(iAnzahlPositionen) = dEingabe
    54. ' Sekundärschleife zum Einlesen der Kräfte
    55. Do
    56. Do
    57. Console.Write(iAnzahlPositionen + 1 & ". Kraft eingeben: ")
    58. strEingabe = Console.ReadLine()
    59. Loop Until IsNumeric(strEingabe) And Not strEingabe.Contains(".")
    60. Loop Until strEingabe > 0
    61. dKraft(iAnzahlPositionen) = strEingabe
    62. iAnzahlPositionen += 1
    63. Console.WriteLine()
    64. Loop
    65. ' Sortieren
    66. For i As Integer = 0 To dPosition.Length - 1
    67. For j As Integer = i + 1 To iAnzahlPositionen - 1
    68. If dPosition(i) > dPosition(j) Then
    69. Dim dTempPosition, dTempKraft As Double
    70. dTempPosition = dPosition(i)
    71. dTempKraft = dKraft(i)
    72. dPosition(i) = dPosition(j)
    73. dKraft(i) = dKraft(j)
    74. dPosition(j) = dTempPosition
    75. dKraft(j) = dTempKraft
    76. End If
    77. Next
    78. Next
    79. 'Ausgabe
    80. Linie()
    81. Console.WriteLine("Festlagerposition: 0m")
    82. Console.WriteLine("Loslagerposition: " & dLoslagerposition & "m")
    83. Console.WriteLine("Balkenlänge: " & dBalkenlaenge & "m")
    84. Console.WriteLine()
    85. For m As Integer = 0 To dPosition.Length - 1
    86. Console.WriteLine(m + 1 & ". Position: " & dPosition(m) & "m | Kraft: " & dKraft(m) & "kN")
    87. Next
    88. Console.WriteLine()
    89. End Sub
    90. ' Eingabe der Balkenlänge
    91. Sub EinlesenBalkenlaenge(ByRef dBalken As Double)
    92. Dim strBalken As String
    93. Do
    94. Do
    95. Console.Write("Balkenlänge eingeben: ")
    96. strBalken = Console.ReadLine
    97. Loop Until IsNumeric(strBalken) And Not strBalken.Contains(".")
    98. Loop Until strBalken > 0
    99. dBalken = strBalken
    100. End Sub
    101. ' Eingabe der Loslagerposition
    102. Sub EinlesenLoslagerposition(ByVal dLaenge As Double, ByRef dPosition As Double)
    103. Dim strPosition As String
    104. Do
    105. Do
    106. Console.Write("Position des Loslagers eingeben: ")
    107. strPosition = Console.ReadLine
    108. Loop Until IsNumeric(strPosition) And Not strPosition.Contains(".")
    109. Loop Until strPosition > 0 And strPosition <= dLaenge
    110. dPosition = strPosition
    111. End Sub
    112. ' Linie mit Abstaz
    113. Sub Linie()
    114. Console.WriteLine("_________________________________________________________________________")
    115. Console.WriteLine()
    116. End Sub
    117. End Module
    Hallo ElBarto,

    YESS!! Im nächsten Herbstsemester darf auch ich mein Maschinenbaustudium beginnen! Puh. Ich freu mich schon voll. :thumbsup: Ich meine: ausgebildeter Konstrukteur zu sein ist ja auch schön, aber warum dabei bleiben? :D

    Zum Code:
    • Verwende doch eine List(Of Double) statt Arrays.
    • Ersetze bei der Linie den String folgendermassen: Space(50).Replace(" "c, "_"c)
    • Ich hätte jetzt eine Struktur für den belastenten Balken angelegt, die die Rechnung automatisiert. So wird der "Haupt-Code" kürzer, leserlicher und verständlicher.

    Die Logik habe ich jetzt nicht angeschaut, weil ich zu müde bin(Scheiss "Wirtschaftswoche" :( ).

    Konstruktive Grüsse

    Higlav
    code ist grauenhaft, aber für jmd, der annähernd noch nie, und auch nie wieder programmiert, völlig ok.

    Console selbst ist grauenhaft.

    Allenfalls die Array.Sort()-Methode zu nutzen wäre eine wirkliche Verbesserung.
    Weil einen sortier-Algo selbst zu schreiben ist zwar kunstvoll und zeugt von Talent :thumbup: , ist aber alles annere als "Hochsprachen-Programmierung", und daher eigentlich total Fail :thumbdown: .
    Aber dazu müsstest du dich schon viel zu sehr in die Materie einarbeiten, und würdest wahrscheinlich auch deinen Lehrkörper überfordern (was ich immer und immer wieder mitkriege: die Lehrkörper solcher Kurse haben normalerweise selbst keine Ahnung von .Net).
    @Higlav
    - List(Of Double) sagt mir leider überhaupt nichts.
    - Was meinst du mit Struktur anlegen und Berechnung? Weil gerechnet wird noch garnichts und ist auch nicht gefordert. Das wäre die Fortführung des Grundkurses. Aber für uns gibt es garkeine Fortführung :D
    Oder meinst du eine weitere Aufgliederung in Unterprogramme? Wie man sieht, hab ich da schon ein bischen was gemacht, da wir das auch in der Vorlesung angeschnitten hatten. Für die Aufgabe ist das aber auch nicht gefordert.

    @ErfinderDesRades
    Ich habs nicht anders erwartet^^ Grauenhaft ist bestimmt die beste Beschreibung aus Sicht eines geübten Programmierers.
    An unserem Proff liegts aber definitiv nicht. Der ist äußerst kompetent. Ich weiß zwar nicht, wie tief sein Kenntnisse in VB gehen. Aber zumindest über Grund- und Erweitertekenntnisse ist der weit hinaus.

    Array.Sort()? Ich ahne schon was dahinter steht. Aber das geht über das hinaus, was gefordert wird.

    ElBarto schrieb:

    An unserem Proff liegts aber definitiv nicht. Der ist äußerst kompetent.
    Wie solltest du das beurteilen können?
    Imo ists von ihm schomal Fail, dass er euch mit VB.Net anfangen lässt, und also mit Option Strict Off.
    C# wäre hier viel sauberer, denn da gibts die Strict-Off-Peinlichkeit garnet.
    Ich merk schon wieder, die Diskussion läuft am Thema vorbei. Aber nagut:
    Da ich nicht auf den Kopf gefallen bin und nicht naiv durch leben schreite, sehe ich mich druchaus in der lange die Kompetenz von jemandem beurteilen zu können auch ohne selber über dessen Kompetenz zu verfügen. Wenn man eine zeitlang mit jemandem arbeitet merkt man einfahc ob der sein Fach versteht oder nicht. Also glaubt es mir oder lasst es bleiben: Er ist kompetent.

    Warum Option Strict OFF habe ich in diesem Forum schonmal erläutert. Für uns ist es OK.

    Warum VB-Net? 90% seiner bisherigen Maschinenbaustudenten haben später in der Praxis eher mit VB-Net als anderen Sprachen zu tun (wenn sie überhaupt mit Programmieren konfrontiert werden). Daher hat er sich vor Jahren dafür entschieden Maschinenbauer nicht weiter in C# zu unterrichten.
    Seine Elektrotechniker unterrichtet er weiterhin in C# oder C++ (keine Ahnung welches er erwähnt hatte), da es der Branche entspricht.

    Wenn noch wer gerne wa zum eigentlichen Topic sagen möchte, nur zu.
    Ich hab das Thema aber als erledigt markiert, da mir die Aussage "code ist grauenhaft, aber für jmd, der annähernd noch nie, und auch nie wieder programmiert, völlig ok." als Bestätigung ausreicht.

    Verbesserungsvorschläge

    VB.NET-Quellcode

    1. Loop Until strEingabe > 0


    Du vergleichst hier einen String mit einem Integer, daß kannn man so nicht stehen lassen. Du solltest versuchen strEingabe vor deinem Vergleich in einen Integer zu konvertieren.

    VB.NET-Quellcode

    1. Dim iConEingabe as Integer
    2. If Int.TryParse(strEingabe, iConEingabe) Then
    3. ...
    4. Else:EndIf
    Stehen lassen kann man es schon. Das Programm ist so geschrieben, dass an der Stelle in strEingabe nur ein nummerischer Wert stehen kann und dieser dann auch mit 0 verglichen werden kann. Nicht sehr elegant, aber ich wusste mir nicht anders zu helfen.

    Mir fällt gerade ein, ich könnte noch eine zusätzliche Variable einführen:

    VB.NET-Quellcode

    1. dZusatz = strEingabe
    2. Loop Until dZusatz > 0
    3. (...)
    4. dEingabe = dZusatz


    Das würde an der Funktionsweise des Programms nichts ändern. Aber ob es eleganter ist, weiß ich auch nicht.

    Kannst du mir die Funktionsweise deines Vorschlages erklären? Int.TryParse ist mir nicht bekannt, also was soll dieser Befehl bewirken?

    ElBarto schrieb:

    Der User soll sich einen Balken definieren können
    Klingt nach Interaktion zwischen Programm und User.
    Dafür ist eine Console-Anwendung der denkbar schlechteste Rahmen.
    Mach eine ereignisgesteuerte WinForm-Anwendung:
    n TextBoxen oder NumericUpDowns für die Eingaben und einen Start-Button zur Berechnung sowie Controls für das Resultat.
    Falls (Konjunktiv) jetzt Deine Antwort sein sollte:
    Die Console ist uns vorgegeben
    dann sage Deinem Prof, er möge bitte mal seine Augen öffnern und sich die Realität anschauen, in der Fahrschule hat man die Kurse für Holzrollerfahrer auch schon abgeschafft. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es stand uns frei, dass als Consolen-Anwendung oder WPF-Anwendung zu machen. Da ich es in WPF aber schwieriger hab ichs so gemacht.

    Meinem Proff werde ich ganz sicher nicht sagen, dass er seine Prüfung ändern soll, weil wir was machen, was eigentlich nicht praxistauglich ist. Denn so wie wir es machen ist es trotzdem in Ordnung!
    Die meisten hier im Forum sind bestimmt clevere Programmierer und ihr habt mit euren Aussagen ja auch recht. Nur vergesst ihr allzu oft die Hintergründe zu beachten und kritisiert einfach drauf los.
    Die Tatsache, dass du ein Konsolenprogramm erstellst, ist erstmal total okay, lass dir da nichts einreden.
    Nur weil gerade hier im Forum das Aussehen von Programmen häufig wichtiger erscheint als deren Funktion oder die Lösungsansätze, die dahinter stecken, heißt das nicht, dass das bessere Programm immer das mit dem besseren (G)UI ist.

    Auch werden hier im Forum häufig Programme erstellt und gezeigt, die von einer breiten Masse verwendet werden (sollen), sprich Editoren, Browser, YouTube-Downloader etc. Solche Programme müssen leicht und intuitiv bedienbar sein und somit eine gute GUI besitzen, der Code dahinter kommt leider häufig zu kurz oder wird zumindest nicht so beachtet. Als Maschinenbaustudent (bin ich quasi auch), wirst du solche Programme nicht schreiben müssen, häufig geht es um Programme, die Berechnungen durchführen oder auch nur bestimmte Forschungsergebnisse filtern. Solche Programme brauchen keine grafische Oberfläche, sondern nur eine möglichst effiziente und fehlerresistente Vorgehensweise.

    In diesem Sinne solltest du dir die restlichen Kritiken schon eher zu Herzen nehmen. "Option Strict Off" scheint zwar erstmal bequem, wird aber ganz schnell zu einer Fehlerquelle, die nicht nur weitreichende, sondern vor allem auch schwer zu findene Fehler erzeugt.

    Ein paar Tipps von mir, die hoffentlich recht einfach zu verstehen sind:

    - Trenne das Frontend vom Backend, sprich: Richte einen Teil deines Codes darauf ein, die benötigten Daten vom User einzulesen und richte eine feste Schnittstelle (möglicherweise einen Datentyp) dafür ein, diese Daten an den Teil des Programmes weiterzugeben, der letztendlich die Berechnung durchführt. Dieser Teil sollte dann auch nichts mit dem Benutzer zu tun habe (also kein Console.Read/Write).

    - Englische Variablennamen: Vllt. ist das nur ne persönliche Sache, aber wenn ich nen fremden Code mit deutschen Variablen- oder Funktionsnamen sehe, kriege ich erstmal das kalte Ko****. Die meisten Programmiersprachen sind auf Englisch gehalten (if, then, else, do, switch ....), dazu kommt noch das englische .NET-Framework (WriteLine etc.), da machen sich deutsche Worte irgendwie schlecht.

    - Wenn du .NET lernst, dann lerne auch .NET (geht vermutlich mehr an deinen Prof/Dozenten). Dinge wie Array.Sort() oder List(Of T) sind elementare Funktionen von .NET und sollten daher auch mit .NET beigebracht werden, ansonsten ist Visual Basic nämlich nur eine besondere Sytax, die leider im Vergleich zu der von C# oder C++ nicht besonders mächtig ist, in dem Sinne, dass du damit später (möglicherweise im Berufsleben) nicht viel anfangen kannst. Kennst du (große) Teile des .NET-Frameworks, kannst du auch problemlos zu C# oder auch C++ (etwas schwieriger) switchen und direkt richtig anfangen.

    Was mir daneben sehr positiv aufgefallen ist, sind die Kommentare. Schreibt man selber ein Programm, kommt einem Vieles absolut logisch vor, jemand anderem, der sich den Code anschaut, jedoch nicht. Die Kommentare dürfen hier im deutschsprachigen Raum auch gerne auf Deutsch gehalten werden, gerade an der Uni hat man jedoch auch häufig Kontakt zu ausländischen Studenten oder Professoren. Daher immer die Frage: Wer muss mein Programm noch lesen oder bearbeiten?
    -> Also immer schön weiter kommentieren, gerne noch ein bisschen mehr :)

    ElBarto schrieb:

    Nur vergesst ihr allzu oft die Hintergründe zu beachten
    Das vefrgessen wir nicht, die Thread-Ersteller erachten es nicht als notwendig, solch "Zwangsvorgaben" im Eröffnungspost zu erwähnen. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!