Zum Inhalt springen

C#: Fragen zur Herangehensweise zu der Aufgabe: Programmierung eines Taschenrechners


Empfohlene Beiträge

Geschrieben (bearbeitet)

Guten Abend

Das ist mein erster Beitrag in diesem Forum und ich bräuchte gleich mal Eure Hilfe.

Ich hoffe einfach mal, dass das das richtige Forum ist.

Da ich Student bin und im Moment Semesterferien habe, hab ich mir gedacht, dass ich meine Zeit damit verbringe mich ein bisschen mit c# (und somit auch der OOP) zu beschäftigen.

In meinem Übungsprojekt möchte ich einen Taschenrechner programmieren.

Der Taschenrechner besteht aus einer Windowsform. Diese hat eine Textbox zur Eingabe der Aufgabe und eine Textbox zur Ausgabe. Sowie einen Button zum Losrechnen.

Der Taschenrechner soll dabei folgenden Merkmale aufweisen:

Eingabe des Zahlensystems mittels einem Präfix(0b, 0o, 0x oder keins (=dezimal)) vor dem Zahlenwert dann soll der Operator kommen und dann die zweite Variable (mit optionalem Präfix). Wenn das Ergebnis nicht im dezimalsystem ausgegeben werden soll dann soll dies der Benutzer durch einen Doppelpunkt und einem nachfolgenden 0b, 0o, 0x oder nichts (=dezimal) dem Taschenrechner sagen.

Wenn keine zweite Variable eingegeben und stattdessen der ":" & Zahlensystem eingegeben worden ist dann soll der Taschenrechner die erste Zahl nur in das andere Zahlensystem umwandeln.

Wenn das ganze funktioniert dann soll er später auch noch komplex rechnen können. Dachte mir, dass ich dann die komplexe Zahl durch ekige Klammern kennzeichnen kann (z.B.: [3+4i])

Wie würdet Ihr an so eine Aufgabe herangehen?

Ich hab mit OOP noch nicht soviel Erfahrung. Bringt mir die OOP hier was?

Würde mich über Vorschläge zur Herangehensweise sehr freuen.

VG

Herki

Bearbeitet von Herki
  • 3 Wochen später...
Geschrieben

also ich denke es ist nicht die beste methode um in die Objektorientierung einzusteigen, zumal du ja bei so einem Taschenrechner nicht so viele Klassen hast.

Allerdings kannst du hier gut das MVC Konzept Anwenden (Model-View-Control). Da gehts darum Design und Verarbeitung zu trennen. du hast also eine Klasse die für das Anzeigen der verschiedenen Steuerelemente zuständig ist (Textbox etc.) und eine die die eigentliche Rechnung übernimmt

Geschrieben

Wozu einen Einsteiger mit für den Fall unnötigem Fachgesimpel abschrecken?! Einen Taschenrechner zu programmieren und dabei auf - in dem Fall unsinnige Dinge zu verweisen - schreckt doch eher ab! En Einsteiger der mit Konzepten anfängt, hat nach ner Woche keinen Bock mehr...ich bin gegen Entmutigung und eher für sach- und fachgerechte Fragestellungen.

Das ist weder eine Kritik an den Ot noch an Jasper, aber hier fehlen einfach die Basics. (Punkt)

Geschrieben

Hallo Herki,

Ein Taschenrechner, mit einer Funktion, wie du sie beschreibst sollte dein Fernziel sein.

Ich würde diesen Weg vorschlagen:

Dein 1. Ziel sollte so sein:

Eine Windows-Form, die bei Maus-Klick auf das Fenster ausgeführt wird. Zwei Operanden(Textfelder) und die Operation(Radio-Button) werden eingestellt. Bei Druck auf den "OK"-Button wird in die Ansicht das Ergebnis gezeichnet.

2. Ziel=1. Erweiterung

Zusätzlich können mehrere Zahlensysteme eingestellt werden

3. Ziel =2. Erweiterung

Umwandlung der Form zur Eingabe der Aufgabe mit einem Operandin ein Textfeld.

Umstellung der Ansicht auf eine FormView. Ein zweites Textfeld zeigt das Ergebnis.

Ein Button "Losrechnen"

Aufgabenlösung mit einer Parser-Klasse.

4. Ziel=3. Erweiterung

Umwandlung des Parsers für Aufgaben mt mehreren Operanden mit der typischen Leserichtung von links nach rechts.

5. Ziel =4. Erweiterung

Umstellung des Parsers auf Punkt-vor-Strichrechnung

6. Ziel =5. Erweiterung

Umstellung des Parsers auf Zahlensysteme

Fernziel=6. Erweiterung

Hinzufügen komplexer Zahlen als eigen entwickelte Datenstruktur

Nach meiner Erfahrung solltest du früh anfangen, dir klarzumachen und vorzustellen, wie die Programme funktionieren und aufgebaut sind, und wie die beteiligten Objekte erzeugt und zerstört werden.

Dazu hilft und unterstützt dich die UML.

Du lernst Kapselung, Vererbung und Nachrichten kennen, wesentliche Bestandteile der OOP.

Günstiger zum Lernen wäre es vielleicht, eine Adressverwaltung o.ä. zu programmieren. Aber das kann ja das nächste Projekt sein.

Vielleicht konnte ich helfen.

LG

Andre'

Geschrieben

Hallo alle miteinander.

Sorry. War einige Zeit nicht online.

Hallo andiE

Dein 1. Ziel sollte so sein:

Eine Windows-Form, die bei Maus-Klick auf das Fenster ausgeführt wird. Zwei Operanden(Textfelder) und die Operation(Radio-Button) werden eingestellt. Bei Druck auf den "OK"-Button wird in die Ansicht das Ergebnis gezeichnet.

-> Erledigt. Ich habe allerdings nur keine Radio-Buttons zur Auswahl der gewünschten Operation sondern eine Funktion, welche den Operator erkennt.

2. Ziel=1. Erweiterung

Zusätzlich können mehrere Zahlensysteme eingestellt werden

-> Erledigt. Zahlensystemerkennung wird ebenfalls mit einer Funktion erkannt.

Ich rechne alle eingegebenen Variablen zuerst ins Dezimalsystem um, mache dann die Operation und anschließend folgt die Wandlung ins gewünschte Format.

3. Ziel =2. Erweiterung

Umwandlung der Form zur Eingabe der Aufgabe mit einem Operandin ein Textfeld. Umstellung der Ansicht auf eine FormView. Ein zweites Textfeld zeigt das Ergebnis. Ein Button "Losrechnen"

Aufgabenlösung mit einer Parser-Klasse.

-> erledigt

4. Ziel=3. Erweiterung

Umwandlung des Parsers für Aufgaben mt mehreren Operanden mit der typischen Leserichtung von links nach rechts.

-> Ich denke mal erledigt.

Ich nehm den Eingabestring und zerteile ihn.

Erste Variable: 0 bis zum Operator

dann : und anschließendes Zielzahlen system oder zweite Variable bis zum Ende oder : und anschließendes Zielzahlensystem

5. Ziel =4. Erweiterung

Umstellung des Parsers auf Punkt-vor-Strichrechnung

-> Jetzt wirds interessant. Wie würdest Du das machen? es gibt bei mir nur einen Operator. Eine Erweiterung auf verschachtelte Aufgaben (z.b. 3*(4-2)) wäre echt interessant.

6. Ziel =5. Erweiterung

Umstellung des Parsers auf Zahlensysteme

-> Schon erledigt mit der StringUntersuchen()-Fkt.

Fernziel=6. Erweiterung

Hinzufügen komplexer Zahlen als eigen entwickelte Datenstruktur

-> Ich hab mir ne ganze Klasse CVariable gegönnt. Diese hat folgende Atribute: stringvar, realstringvar, imagstringvar, realteil, imagteil. Außerdem habe ich die grundlegenden Operationen +-*/ überschrieben.

Nach meiner Erfahrung solltest du früh anfangen, dir klarzumachen und vorzustellen, wie die Programme funktionieren und aufgebaut sind, und wie die beteiligten Objekte erzeugt und zerstört werden.

-> Objekte werden mit new erzeugt und um die Zerstörung muss ich mich doch nicht kümmern. Macht doch der Garbage-... (weiß grad nich wie er heißt)

Im Moment habe ich aber folgendes Problem:

double var10 // Wert zur Laufzeit z.b. 127,4

int ganzzahl = Math.Truncate(var10) // Wert zur Laufzeit 127

double kommazahl = var10- ganzzahl // Wert sollte 0,4 sein.

Leider ist kommazahl aber 0.40000000000000568. Und ich weiß nicht warum.

Wäre froh wenn mir da jemand weiterhelfen könnten.

VG und gute Nacht

Herki

Geschrieben

Im Moment habe ich aber folgendes Problem:

double var10 // Wert zur Laufzeit z.b. 127,4

int ganzzahl = Math.Truncate(var10) // Wert zur Laufzeit 127

double kommazahl = var10- ganzzahl // Wert sollte 0,4 sein.

Leider ist kommazahl aber 0.40000000000000568. Und ich weiß nicht warum.

Wäre froh wenn mir da jemand weiterhelfen könnten.

0.4 lässt sich nicht genau als Gleitkommawert darstellen. Gleitkommawerte sind prinzipiell ungenau. Die meisten Zahlen, die im Dezimalsystem abbrechende Dezimalbrüche sind, sind als "Dualbruch" periodisch. Nur ganz bestimmte Werte lassen sich exakt darstellen. Genauer gesagt sind das die, bei denen in Bruchschreibweise der Nenner eine Potenz von 2 ist.

Wenn sich ein Wert nicht exakt darstellen lässt, speichert der Computer den Wert, der am nächsten dran ist. Für 0.4 ist das eben der Wert, den du da siehst.

Darum darf man Gleitkommawerte auch nie auf Gleichheit prüfen.

Geschrieben

Hallo Herki,

mir ging nicht es nicht darum, dir zu helfen, einen Taschenrechner zu erstellen, sondern um diese Dinge, weil sie grundlegende Denkweisen der OOP(OOA und OOD) und MVC beinhalten:

1. Erzeugung einer View-Document-Architektur aus Fenster-, Dokument- und Rahmenfensterklasse

2. Abfangen einer "Mouse clicked"- Botschaft und Aufruf eines Dialogs

3. Erstellung eines Dialogs mit verschiedenen Eingabeelementen

4. Auswertung der Dialogeingaben in der Dokumentenklasse

5. Auslösen eines Neuzeichnens

6. Darstellung der Daten im Ansichtsfenster

Da dabei acht und mehr Dateien entstehen können, halte ich es für vorteilhaft, sich die Zusammenhänge graphisch darzustellen, z.B. mit UML-Diagrammen.

Das scheint hier zwar nicht nötig, weil die Zusammenhänge sehr überschaubar sind, sollte aber be anderen Projekten helfen.

LG

Andre'

Geschrieben

Hallo,

zu Punkt vor Strich habe ich diese Idee:

Grundlegende Gleichung:

e=a*b+c*d

Lösung:

z1=a*b

z2=c*d

e=z1+z2

e=a=a*1+0*1

e=a+c=a*1+c*1

e=a*b=a*b+0*1

e=a*b+c=a*b+c*1

übrigens gilt das für - und / genauso.

Mit Klammern habe ich mich noch nicht so befaßt.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...