Announcement

Collapse
No announcement yet.

4 Grundrechenarten via Konsole

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 4 Grundrechenarten via Konsole

    Servus,

    ich hab folgendes Problem: Ich bin absoluter Newbie was Programmierung angeht und die Konsole macht mir echt Sorgen. Ich hab hier eine Aufgabe liegen, bei der ich absolut nicht weiter komme.
    Ich muss ein Programm erstellen, in dem man alle 4 Grundrechenarten vereint hat. Mein Codevorschlag ist vollgender:
    Sub rechne(ByVal op1 As Single, ByVal oper As String, ByVal op2 As Single)

    Dim argumente(2) As String 'Arraybehälter mit 3 Feldern

    argumente(0) = op1

    argumente(1) = oper

    argumente(2) = op2

    Dim ergebnis As Single

    Dim s As String = " "

    ReadLine() = argumente ............Diese Zeile funktioniert nicht!



    Select Case argumente(1)

    Case argumente(1) = "+"

    ergebnis = op1 + op2

    Write(" = ")

    WriteLine(ergebnis)

    Case argumente(1) = "-"

    ergebnis = op1 - op2

    Write(" = ")

    WriteLine(ergebnis)

    Case argumente(1) = "*"

    ergebnis = op1 * op2

    Write(" = ")

    WriteLine(ergebnis)

    Case argumente(1) = "/"

    ergebnis = op1 / op2

    Write(" = ")

    WriteLine(ergebnis)

    Case " "

    WriteLine("Kein passender Operator")

    Case argumente.Length > 3

    WriteLine("Zu viele Argumente")

    Case argumente.Length < 2

    WriteLine("Zu wenig Argumente")

    Case Else

    'Write("Die Länge dieses Arrays ist: ")

    'WriteLine(argumente.Length)

    WriteLine()

    End Select

    ReadLine()

    End Sub



    Sub Main()

    Dim i As Integer

    For i = 1 To 100

    rechne(op1, oper, op2)

    Next

    End Sub

    End Module

    aber irgendwie funzt das nicht. wer echt klasse wenn das einer mal bitte komplettieren könnte. meistens kappier ich es erst, wenn ich es denn sehe!
    danke euch schonmal im vorraus!!!!!!!!!!!!!!!!!!!!!!!

  • #2
    Hallo

    Das Openbook hilft hier wohl nicht richtig weiter....(vorausgesetzt, man verwendet Visual Basic 2005)
    Aber was man braucht sind Befehle wie
    Code:
    Console.ReadLine()
    und
    Code:
    Console.Write
    MfG
    Cheat-Sheets for Developers / Programming Quotes

    Comment


    • #3
      Hallo,

      vielleicht solltest Du zuerst sagen, welche Eingaben Du erwartest. Sehe ich es richtig, dass bei ReadLine eine Aufgabe wie "1+2" oder "3.5*4.33" eingegeben werden soll?

      Deine Hauptaufgabe ist damit, eine solche Zeile zu analysieren (Stichwort: Parse). Dabei sind mir folgende Problemstellen aufgefallen:
      • Du ordnest argumente() Werte zu.
      • Diese argumente() weist Du ReadLine zu.
      • Umgekehrt wird ein Schuh daraus: ReadLine wird abgefragt und als String gelesen.
      • Der String muss für argumente aufgeteilt werden.
      • Das geht nicht automatisch: Woher soll das Programm wissen, was zu argumente(0) oder (1) oder (2) gehört?
      • Woher kommen eigentlich in der Main-Methode die Werte, die Du an die rechne-Methode übergibst?

      Also zuerst die Aufgabe abfragen:
      Code:
            Dim line As String
            line = Console.ReadLine()
      Dann ist sie aufzuteilen in das Array argumente(3). Mit RegEx sollte das ganz einfach gehen: erster Teil besteht nur aus Ziffern (ggf. noch +- und Dezimaltrenner), dann kommt genau ein Rechenzeichen, dann kommen wieder nur Ziffern (und ggf. +-,.). Aber mit RegEx habe ich mich noch nie befasst.

      Alternativ kann man den String manuell aufteilen: Leerzeichen mit Replace entfernen, mit IndexOfAny (ab Position 1) den Operator suchen, den Substring davor als Zahl1 herausholen und per Double.TryParse() konvertieren, analog Zahl2. Bitte verwende nicht die Methoden der Convert-Klasse; die führen bei Fehleingaben zu Exceptions.

      Wenn ich Dein Problem völlig falsch verstanden habe, dann bitte ich um genauere Erläuterung und Richtigstellung. Außerdem wäre es nett, wenn Du Deinen Code mit dem #-Button als solchen markieren würdest, dann liest sich erheblich besser.

      Jürgen

      Comment


      • #4
        nein so ungefähr hast du das schon richtig verstanden aber, das muss ich ehrlich zugeben, bin ich noch nicht richtig dahinter gestiegen. das liegt aber wahrscheinlich auch daran, das ich erst 2 monate programmiererfahrung haben. ich hab den code nochmal überarbeitet, jetzt sieht er so aus:




        Imports Microsoft.VisualBasic
        Imports System.Console


        Code:
        Module Module1
        
        
            Sub Main(ByVal Argumente() As String)
        
        
        
                WriteLine("Anzahl der Argumente: {0}", Argumente.Length)
                If Argumente.Length > 3 Then
                    WriteLine("Zuviele Argumente")
                    Exit Sub
                ElseIf Argumente.Length < 3 Then
                    WriteLine("Zuwenig Argumente")
                    Exit Sub
        
        
                End If
        
                Dim opt1, opt2, ergebnis As Single
                Dim oper As String
        
        
                Select Case oper
                    Case oper = "+"
                        ergebnis = opt1 + opt2
        
                        Write(" = ")
        
                        WriteLine(ergebnis)
        
                    Case oper = "-"
                        ergebnis = opt1 + opt2
        
                        Write(" = ")
        
                        WriteLine(ergebnis)
        
                    Case oper = "*"
                        ergebnis = opt1 + opt2
        
                        Write(" = ")
        
                        WriteLine(ergebnis)
        
                    Case oper = "/"
                        ergebnis = opt1 + opt2
        
                        Write(" = ")
        
                        WriteLine(ergebnis)
        
                End Select
                ReadLine()
        
            End Sub
        
        End Module





        ich komm einfach nicht drauf, wie man anfangen soll, um überhaupt erstmal die argumente richtig einzulesen bzw überhaupt erstmal in die console einzugeben. am anfang hängt es total.
        Zuletzt editiert von Rolle; 14.04.2008, 13:11.

        Comment


        • #5
          nein so ungefähr hast du das schon richtig verstanden
          Aber offensichtlich nicht vollständig. Sag doch genau: Beim Programmstart soll eine Aufgabe angegeben werden.

          Originally posted by Jürgen Thomas View Post
          Außerdem wäre es nett, wenn Du Deinen Code mit dem #-Button als solchen markieren würdest, dann liest sich erheblich besser.
          Bitte ändere das; ich will Deinen Code verstehen, also muss er als Code zu erkennen sein. Diese Änderung kannst Du auch nachträglich vornehmen: gehe auf "Editieren", markiere den Code-Bereich, klicke auf den #-Button.

          Wenn Dir das so nicht gelingt, schreib "[C ODE]" an den Anfang und "[ /CODE]" an das Ende des Code-Abschnitts (aber ohne Leerzeichen und Gänsefüßchen).

          Jürgen
          Zuletzt editiert von Jürgen Thomas; 14.04.2008, 12:49.

          Comment


          • #6
            so besser?

            Comment


            • #7
              Nein. Außer dass jetzt zweimal # zu lesen ist, hat sich doch nichts geändert. Ich will aber Einrückungen sehen. In meinem ersten Beitrag gibt es einen Block, der ausdrücklich als Code bezeichnet wird und in der Courier-Schrift angezeigt wird. So muss es aussehen! Jürgen

              Comment


              • #8
                So, jetzt stimmts oder

                Comment


                • #9
                  achso und ja, wenn die console augeht, soll man zB 3 + 3 eingeben und darunter soll dann die lösung stehen, also = 6 zB. ansonsten, wenn man zB nur 3 + eingibt, soll ne fehlermeldung kommen, in der steht, "Zuwenig Argumente" und die Sub soll sich beenden

                  Comment


                  • #10
                    Originally posted by Rolle View Post
                    achso und ja, wenn die console augeht, soll man zB 3 + 3 eingeben
                    Damit ändert sich Deine Konstruktion: Die Argumente haben nichts mit den Parametern der Main-Methode zu tun, sondern werden erst anschließend abgefragt. Das Programm (nämlich der Inhalt von Main) besteht also (nur) aus einer Endlosschleife, bis eine Variable IsFinished auf true gesetzt wird.

                    Innerhalb der Schleife musst Du zunächst die Eingabe abfragen; siehe dazu meinen ersten Code-Schnipsel. Dann wird die Textzeile geprüft und aufgeteilt. Wenn das Aufteilen zu einem Fehler führt, wird IsFinished = true gesetzt. Wenn das Aufteilen fehlerfrei ist, wird die Rechnung ausgeführt und das Ergebnis angezeigt.

                    Du solltest also die einzelnen Schritte trennen (anders als Du bisher vorgegangen bist). Die Eingabe ist natürlich klar. Die Prüfung der Textzeile benötigt eine eigene Methode; das Konzept dazu habe ich unter "manuell aufteilen" schon skizziert. Die Berechnung ist dann eine eigene Methode.

                    Dir muss klar werden, dass das Programm die Trennung der Eingabe nicht automatisch erkennen kann! (Ach je, auch das habe ich schonmal geschrieben; warum muss ich mich bloß dauernd wiederholen...) Kürzer als mit einer manuellen Prüfmethode geht es, wie gesagt, mit RegEx; aber dazu gibt es keine Hilfe durch mich.

                    So, nun noch mal neu denken und planen. Jürgen

                    PS. Meinst Du nicht auch, dass der Code jetzt besser lesbar ist?

                    Comment


                    • #11
                      danke aber das ist für mich noch zu hoch. von deinem "IsFinished = true" hab ich noch nie was gehört und schon gar nicht von regex.
                      ich wiederhole nochmal, der junge hier ist im 2ten monat, also wird das auch anders gehen, simpler.

                      ich find nicht das er lesbarer ist. man kanns auch kompliziert machen.

                      Comment


                      • #12
                        Hi,

                        hab das Programm mal schnell geschrieben und hoffe Du lernst etwas daraus?!
                        Schau's Dir an und frag wenn Du etwas nicht verstehst!

                        Code:
                        Module Module1
                        
                            Sub Main()
                        
                                'Du musst nur noch Eingabefehler abfangen (z.B. "a1 + 23") und
                                'evtl. bei "option strict on" die "String-Zahlen" in Single konvertieren
                                'z.B. mit "opt1 = convert.ToSingle(argumente(0))"
                                'bei "option strict off" macht das der Compiler für Dich
                        
                                Dim eingabe As String = ""          'Variable für Deine Eingabe
                                Dim argumente(2) As String          'Array mit 3 Feldern für die Eingabe
                                Dim opt1, opt2, ergebnis As Single
                                Dim oper As String
                                Dim nochmal As Boolean = True       'um das Programm bis zur eingabe von "n" zu wiederholen
                        
                                While nochmal = True
                        
                                    Console.Write("Berechne: ")
                        
                                    'So liest Du einen String von der Konsole in eine Variable ein:
                                    eingabe = Console.ReadLine()
                        
                                    'nur berechnen wenn nicht "n" für abbrechen eingegeben wurde
                                    If eingabe <> "n" Then
                        
                                        'Mit "split" kannst Du einen String an bestimmten Stellen teilen
                                        '(keine Argumente -> teile bei Leerzeichen) und in ein Array schreiben
                                        'das heisst aber auch das Du Leerzeichen bei der Eingabe verwenden musst z.B. "12 + 3"
                                        argumente = eingabe.Split
                        
                                        ''---------------------------------------------------------------------
                                        ''andere Version um an die Operanden und den Operator zu kommen
                                        ''--> kommentiere mal obige Zeile und enferne die Kommentare ab hier:
                        
                                        ''Position an welcher der Operator steht
                                        'Dim pos_oper As Integer
                                        ''Array mit den möglichen Operatoren
                                        'Dim oper_array As Char() = New Char(3) {"+"c, "-"c, "*"c, "/"c}
                                        ''Position des Operators suchen
                                        'pos_oper = eingabe.IndexOfAny(oper_array)
                        
                                        'argumente(0) = eingabe.Substring(0, pos_oper)
                                        'argumente(1) = eingabe.Substring(pos_oper, 1)
                                        'argumente(2) = eingabe.Substring(pos_oper + 1)
                                        ''---------------------------------------------------------------------
                        
                                        'Nach dem splitten können wir die Werte zuweisen
                                        opt1 = argumente(0)
                                        opt2 = argumente(2)
                                        oper = argumente(1)
                        
                                        'Beachte den Syntax einer Select Case Verzweigung!
                                        Select Case oper
                                            Case "+"
                                                ergebnis = opt1 + opt2
                                                Console.WriteLine(" = " & ergebnis)
                                            Case "-"
                                                ergebnis = opt1 - opt2
                                                Console.WriteLine(" = " & ergebnis)
                                            Case "*"
                                                ergebnis = opt1 * opt2
                                                Console.WriteLine(" = " & ergebnis)
                                            Case "/"
                                                ergebnis = opt1 / opt2
                                                Console.WriteLine(" = " & ergebnis)
                                            Case Else
                                                'nur als Beispiel für Case Else, das Programm wird hier nie reinkommen!
                                                Console.WriteLine("Falsche Eingabe! '" & oper & "' ist kein Operator!")
                                        End Select
                        
                                    Else
                                        nochmal = False
                                    End If
                                End While
                        
                            End Sub
                        
                        End Module
                        Zuletzt editiert von Philsen; 14.04.2008, 20:09.

                        Comment


                        • #13
                          danke!!!! das ist ne hilfe!!!!!! vielen dank nochmal phil!!!

                          Comment


                          • #14
                            Ich hab jetzt übrigends meinen Fehler. War halt ein Anfängerfehler. An sich war ich mit meinem Code auf dem richtigen weg nur hab ich halt immer via Debugmodus bei VB2008 versucht, dem problem auf den grund zu gehen, jedoch muss man einfach nur die console mit der erstellten exe starten und tada............oh man, so leicht und doch so schwer drauf zu kommen. habs jetzt aber glaub ich. DANKE NOCHMAL PHIL!!!!!!!!!!!!

                            Comment


                            • #15
                              @Phil
                              Ich wollte keine fertige Lösung bringen (abgesehen davon, dass ich sie kaum in VB, sondern in C# hätte schreiben können). Ich finde es immer besser, wenn man sich etwas selbst entwickelt. Mein Ziel war, durch Fragen und Anregungen Rolle auf den richtigen Weg zu bringen; das ist offensichtlich schief gelaufen.

                              @Rolle
                              Ich hoffe, Du hast wirklich etwas gelernt und nicht nur kopiert.
                              von deinem "IsFinished = true" hab ich noch nie was gehört und schon gar nicht von regex.
                              "IsFinished" wäre eine eigene Variable, mit der das Ende abgefragt wird - dasselbe, was Phil mit "nochmal" gemacht hat.

                              Dass RegEx normalerweise nichts ist für Anfänger, ist mir klar. (Auch ich habe mich nach drei Jahren NET noch nicht damit befasst.) Da es für solche Prüfungen und Aufteilungen prädestiniert ist, wollte ich es auf jeden Fall erwähnen.

                              Noch eine Bemerkung zu den Namen der Variablen: Ich bin grundsätzlich dafür, in Deutschland deutschsprachige Bezeichnungen zu verwenden. Beim Programmieren bin ich aber davon abgekommen: Spätestens wenn der Designer EventHandler erzeugt, entsteht grausamer Mischmasch: Für eine ComboBox kundenAuswahl wird eine Methode kundenAuswahl_SelectedIndexChanged erzeugt; und dieses Denglisch empfinde ich als noch schlimmer als den Verzicht auf deutsche Bezeichner.

                              Gruß Jürgen

                              Comment

                              Working...
                              X