Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Einfacher Taschenrechner

Trax5 / 17 Antworten / Baumansicht Nickles

Hallo!
Ich mach zur Zeit ein Praktikum und soll nen Taschenrechner programmieren. Is aber eigentlich ziehmlich simpel wenn mans kapiert hat. Bin aber eben blutiger Anfänger. Kann mir jemand nen einfachen Quellcode schicken? Ich brauch nur Windows Applikation: Button "1","2","+" und "=". Würde mir um einiges weiterhelfen.

Mfg Miguel Calzado

bei Antwort benachrichtigen
mr.escape Trax5 „Einfacher Taschenrechner“
Optionen
Ich mach zur Zeit ein Praktikum und soll nen Taschenrechner programmieren.
Bin aber eben blutiger Anfänger.

Kennen niemanden, dem es nicht gleich ergangen ist.
Tipp numero uno: Wir brauchen mehr input!

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Trax5 mr.escape „ Kennen niemanden, dem es nicht gleich ergangen ist. Tipp numero uno: Wir...“
Optionen

Ok, ich versuchs ma.
Da wo ich Praktikum mache, benutzen die nur C#. Ich such seit Tagen im Internet nach nem programmierten Taschenrechner, hab zwar auch schon welche gefunden aber entweder in anderen Programmiersprachen oder zu umfangreich so dass ich als Anfänger da nicht richtig durchblicke. Ich benutze Visual Studio 2005 und soll da unter der Windowsapplikation nen Taschenrechner mit 4 Button und einem Textfeld programmieren. Ich denke ma für erfahrene Leute hört sich das ziehmlich lächerlich an, weil ich nur die "1", die "2", das Textfeld,das "+" und "=" programmieren. Da ich da noch nicht so durchblicke, ist auch das schwierig für mich. Ich bräuchte nen einfachen Quellcode. Hab zum Beispiel die 1 und die 2 folgendermaßen programmiert:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void buttonOne_Click(object sender, EventArgs e)
{
textBox1.Text += 1;
}

private void buttonTwo_Click(object sender, EventArgs e)
{
textBox1.Text += 2;
}

private void buttonAdd_Click(object sender, EventArgs e)
{

}
}

Ist nicht grad viel, aber so funktionieren die beiden Zahlen wenigstens einwandfrei.^^
Auf alle Fälle hab ich noch ziehmlich Probleme mit den Operatoren und den Variablen. Kann mir da einer helfen?

Mfg Trax

bei Antwort benachrichtigen
Borlander Trax5 „Ok, ich versuchs ma. Da wo ich Praktikum mache, benutzen die nur C . Ich such...“
Optionen

Naja, Du brauchst eigentlich nur zwei globale Variablen: Eine für den Operator, und die andere für den Wert der vor Auswählen des Operators eingegeben wurde. Beim Drücken von Gleich gibst Du dann den
"eingabe1" [operator] Textfeldwert
aus. Das wars im prinzip auch schon...

Gruß
Borlander

bei Antwort benachrichtigen
Trax5 Borlander „Naja, Du brauchst eigentlich nur zwei globale Variablen: Eine für den Operator,...“
Optionen

Naja, wie gesagt, ich bin BLUTIGER Anfänger. Kannst du mir das vielleicht nochmal für Laien erklären? Vielleicht mit Beispielen.... Wäre echt nett.

Mfg
Trax

bei Antwort benachrichtigen
Andreas42 Trax5 „Naja, wie gesagt, ich bin BLUTIGER Anfänger. Kannst du mir das vielleicht...“
Optionen

Hi!

Um die "gleiche Sprache" zu finden, müssten wir wissen,wo du stehst und was du (in der praxis) für Programmiererfahrung hast.

Hast du schonmal selbst etwas programmiert und kannst mit begriffen wie Variablen, Konstanten, Strings und Integer etwas anfangen? Es reicht, wenn du weisst, wie man im DOS-Fenster drei Zahlen eingeben lassen kann, diese dnan verrechnet und das Ergebnis ausgibt.

So etwas meine ich:

10 REM Demo
20 INPUT "Wert1: ";a1
30 INPUT "Wert2: ";a2
40 INPUT "Wert3: ";a3
50 e1 = a1 + a2 * a3
60 PRINT "Ergebnis: ";e1

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
xafford Trax5 „Einfacher Taschenrechner“
Optionen

Mach Dir mal erst genau Gedanken, was dein Taschenrechner können muss und was er dafür braucht. Schreib das auf ein Schmierblatt und dann ergibt sich die Struktur fast von alleine. Hier ein paar Denkanregungen:

Was muss er können?

- Eingaben annehmen
- Zahl A und B addieren.
- Das Ergebnis ausgeben
- Fehler erkennen und behandeln


Welche Komponenten sind sinnvoll?

a: MainForm für die Ein- und Ausgabe
b: Die eigentliche Rechenlogik

Was braucht er?

2 Variablen, die die zu berechnenden Argumente aufnehmen
Setter für die Argumente
Eine Rechenmethode

Jetzt solltest Du Dir noch einen grundlegenden Gedanken machen, der gerne vergessen wird:
Soll der Taschenrechner leicht erweiterbar sein (vielleicht stellen sie Dir nächste Woche die Aufgabe auf Minus zu implementieren, oder mehr Zahlen)?

Das Formular macht Dir der FormDesigner, da braucht es jetzt nix als Beispiel, deswegen nur mal kurz und grob der Rechner


public class Calculator
{

private string error = "";
private decimal argument1 = 0;
private decimal argument2 = 0;
private char command = ' ';

public string Error
{
get
{
return this.error;
}
}

public string Operator
{
get
{
return Convert.ToString(this.command);
}
set
{
this.command = Convert.ToChar(value);
}
}

public string Argument
{
get
{
return Convert.ToString(this.argument2);
}
set
{
try
{
if(this.command == ' ')
{
// Noch keine Operation eingegeben
this.argument1 = Convert.ToDecimal(value);
}
else
{
this.argument2 = Convert.ToDecimal(value);
}
}
catch(Exception excpt)
{
this.error = excpt.Message;
}
}
}

public string Calculate()
{

try
{
switch(this.command)
{
// Hier kann man die Klasse um neue Operationen erweitern.
case '+':
this.argument1 += this.argument2;
break;
}
this.argument2 = 0;
this.command = ' ';
return Convert.ToString(this.argument1);
}
catch(Exception excpt)
{
this.error = excpt.Message;
return this.error;
}

}

}

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Trax5 xafford „Mach Dir mal erst genau Gedanken, was dein Taschenrechner können muss und was...“
Optionen

Das nenn ich mal ausführlich erklärt. Bei meinem Praktikum muss ich schon seit eineinhalb Wochen selbst zusehen, wie ich mir das beibringe. Ne kleine Hilfe bei der Erweiterung kann ich bestimmt noch gebrauchen. Auf jeden Fall, danke für die gute Erklärung. Damit kann ich was anfangen.

Mfg Trax

bei Antwort benachrichtigen
OliP. Trax5 „Das nenn ich mal ausführlich erklärt. Bei meinem Praktikum muss ich schon seit...“
Optionen

Ich hab ein etwas spezielleres Problem:

Ich beschäftige mich seit ca. 3 Tagen mit C# und programmiere gerade auch einen taschenrechner in meinem Praktikum.
Die Ziffern und +,-,* und / funktionieren.
Das Problem ist aber, dass wenn ich eine Zahl mit einer anderen plus oder minus nehme der plus und minus button die Zahl immer zu früh addieren/subtrahieren.
ein bsp.: 1 (ich drück 1^^) dann drück ich plus + (oder minus -) und dann rechnet der rechner schon plus/minus. Ich will aber dass erst wenn ich auf = gehe die Zahl addiert oder subtrahiert wird.
Klingt kompliziert is vielleicht auch so aber ixch bitte euch trotzdem um hilfe

thx gruss Oli

bei Antwort benachrichtigen
xafford OliP. „Ich hab ein etwas spezielleres Problem: Ich beschäftige mich seit ca. 3 Tagen...“
Optionen

Tja, welche Hilfestellung erwartest Du nun? Da Du mit keinstem Wort erwähnt hast wie dein Code derzeit aussieht kann man daran auch nichts verbessern. Kleiner Hinweis: Die angegebene Klasse oben tut das nicht, was Du an deiner Version bemängelst.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
OliP. xafford „Tja, welche Hilfestellung erwartest Du nun? Da Du mit keinstem Wort erwähnt...“
Optionen

Sry stimmt du hast recht.
Ziehmlich Lang aber ich hoffe es ist ok. "gleich" Funktioniert auch nicht wirklich

public taschenrechner()
{
InitializeComponent();
}

private void eins_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}

this.Ausgabe.Text += "1";
}

private void Ausgabe_TextChanged(object sender, EventArgs e)
{

}

private void infoToolStripMenuItem_Click(object sender, EventArgs e)
{
myAboutBox.ShowDialog();
}

private void zwei_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}

this.Ausgabe.Text += "2";
}

private void drei_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}

this.Ausgabe.Text += "3";
}

private void vier_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "4";

}

private void fünf_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "5";

}

private void sechs_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "6";

}

private void sieben_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "7";

}

private void acht_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "8";

}

private void neun_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "9";

}

private void nix_Click(object sender, EventArgs e)
{
if (loeschen == true)
{
this.Ausgabe.Text = "";
loeschen = false;
}
this.Ausgabe.Text += "0";

}

private void plus_Click(object sender, EventArgs e)
{

Ergebnis = Ergebnis + Convert.ToInt32(this.Ausgabe.Text);
Ausgabe.Text = Ergebnis.ToString();
loeschen = true;

}

private void gleich_Click(object sender, EventArgs e)
{


Ausgabe.Text = Ergebnis.ToString();
loeschen = true;

}

private void minus_Click(object sender, EventArgs e)
{
if (xbeliebig == false)
{
Ausgabe.Text = Ergebnis.ToString();
xbeliebig = true;
}
Ergebnis = Ergebnis - Convert.ToInt32(this.Ausgabe.Text);
Ausgabe.Text = Ergebnis.ToString();
loeschen = true;
}

private void mal_Click(object sender, EventArgs e)
{
if (Ergebnis == 0)
{
Ergebnis = 1;
}
Ergebnis = Ergebnis * Convert.ToInt32(this.Ausgabe.Text);
Ausgabe.Text = Ergebnis.ToString();
loeschen = true;

}

private void rechnungLöschen_Click(object sender, EventArgs e)
{
Ergebnis = 0;
Ausgabe.Text = "";
}

private void ergebnisLöschen_Click(object sender, EventArgs e)
{
Ausgabe.Text = "";
}

bei Antwort benachrichtigen
OliP. Nachtrag zu: „Sry stimmt du hast recht. Ziehmlich Lang aber ich hoffe es ist ok. gleich...“
Optionen

// Deklarationen
//
int Ergebnis = 0;
bool loeschen = false;
bool xbeliebig = false;
AboutBox myAboutBox = new AboutBox();


Deklaration vergessen sry. Man dieser PC Stress.

bei Antwort benachrichtigen
xafford OliP. „// Deklarationen // int Ergebnis 0 bool loeschen false bool xbeliebig false...“
Optionen

private void plus_Click(object sender, EventArgs e)
{

Ergebnis = Ergebnis + Convert.ToInt32(this.Ausgabe.Text);
Ausgabe.Text = Ergebnis.ToString();
loeschen = true;

}


Da liegt der Hund begraben:

Ausgabe.Text = Ergebnis.ToString();

Schmeiss das aus allen Operator-Funktionen raus.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
mr.escape OliP. „Ich hab ein etwas spezielleres Problem: Ich beschäftige mich seit ca. 3 Tagen...“
Optionen

Beim klick auf die ziffern: eingabe erweitern (führende nullen eliminieren und höchstens ein komma akzeptieren), evtl. lassen sich sich die ziffern als control-array anlegen, denn der code ist ja immer identisch.
Beim klick auf operator (+-*/=): letzte gemerkte aktion durchführen, ergebnis als "op1" speichern und die aktuelle operation merken.
z.b.:
      eingabe op1   aktion
start #       0     =
3     3       0     =
1     31      0     =
+     #       31    + (übernahme wegen =)
1     1       31    +
4     14      31    +
=     #       45    = (addition wegen +)
*     #       45    * (keine aktion, da keine eingabe, nur * merken)
2     2       45    *
=     #       90    = (multiplikation wegen *)
3     3       90    =
-     #       3     - (ergebnis überschreiben, weil eingabe vorhanden)
1     1       3     -
+     #       2     + (subtraktion wegen -)
5     5       2     +
=     #       7     = (addition wegen +)


Hier bedeutet "#", dass seit der letzten aktion keine eingabe erfolgt ist. In diesem fall wird op1 angezeigt. Die aktion von "=" ist es, den eingabewert zu übernehmen.
eingabe, op1 und aktion sind die variablen. Ist keine neue eingabe vorhanden, wenn ein operator angeklickt wird, wird nicht gerechnet, sondern nur der neue operator gemerkt.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Borlander mr.escape „Beim klick auf die ziffern: eingabe erweitern führende nullen eliminieren und...“
Optionen
evtl. lassen sich sich die ziffern als control-array anlegen, denn der code ist ja immer identisch.
Man könnte die Ziffern auch einfach aus der Button-Beschriftung extrahieren (oder was sauberer wäre: Eine Eigenschaft wie tag oder data nutzen, sofern es bei der hier verwendeten Graphikbibliothek sowas gibt). Also nur noch eine Ereignisbehandlung für alle Zifferntasten und die gedrückte Ziffer anhand des Senders ermitteln ;-)

Gruß
bor
bei Antwort benachrichtigen
mr.escape Borlander „ Man könnte die Ziffern auch einfach aus der Button-Beschriftung extrahieren...“
Optionen

Im alten VisualBasic konnte man ganz einfach control-arrays anlegen, wo der index ein parameter im aufruf der event-methoden war. Bei .njet muss man die controls einzeln anlegen und ihrer Click-methode den selben handler zuweisen:

Private Sub ButtonZiff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button0.Click, _
Button1.Click, Button2.Click, Button3.Click, Button4.Click, _
Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click


statisch bzw.

AddHandler Button0.Click, AddressOf ButtonZiff_Click 'etc.

dynamisch in Form_Load.

In c# geht es in etwa so:

Button0.Click += new System.EventHandler(this.ButtonZiff_Click);

Unterschieden werden die controls per "Text" oder "Tag".

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Borlander OliP. „Ich hab ein etwas spezielleres Problem: Ich beschäftige mich seit ca. 3 Tagen...“
Optionen
Ich hab ein etwas spezielleres Problem
Dann würde es sich irgendwie anbieten wenn Du einen Neuen Thread zu diesem Thema startest ;-)

Gruß
Borlander
bei Antwort benachrichtigen
OliP. Borlander „ Dann würde es sich irgendwie anbieten wenn Du einen Neuen Thread zu diesem...“
Optionen

Ich danke euch es funzt.

Da sich das Problem gelöst hat brauch ich keinen neuen Thread mehr eröfnen :)

Aber ich werds mir merkn

bei Antwort benachrichtigen