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
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Bin aber eben blutiger Anfänger.
Kennen niemanden, dem es nicht gleich ergangen ist.
Tipp numero uno: Wir brauchen mehr input!
mr.escape
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
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
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
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
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;
}
}
}
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
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
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.
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 = "";
}
// Deklarationen
//
int Ergebnis = 0;
bool loeschen = false;
bool xbeliebig = false;
AboutBox myAboutBox = new AboutBox();
Deklaration vergessen sry. Man dieser PC Stress.
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.
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
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
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
Dann würde es sich irgendwie anbieten wenn Du einen Neuen Thread zu diesem Thema startest ;-)
Gruß
Borlander
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