Forum: PC-Programmierung Hilfe zu Programm Rechner


von Hsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mir mal in C# einen kleinen Taschenrechner programmiert.
Allerdings klappt es noch nicht so wie bei dem Windows Rechner, dass
ich zur Laufzeit die Zahl im Textbox in Dezimal bzw. Binärumwandeln
kann. Ich habe eine RadioButton mit dem ich die Zahl in der TextBox in
eine Dezimalzahl bzw Binärwert umwandeln kann. Ich möchte mein Programm
so haben, dass wenn ich einen RadioButton aktiviere, dass der Wert in
der TextBox dementsprechen umgewandelt wird.

von Thomas L. (tom)


Lesenswert?

Hallo :)

Nunja - ich kann dir zu einem raten (ich habs mir nicht genauer
angesehen). Lasse im Hintergrund immer eine Zahl (von mir aus Double)
mitlaufen, die sagt, welcher Wert gerade im Feld steht.

Die Ausgabe nach Tastendruck oder eben auch nach Ändern des
Darstellungsmodus kannst du einfach mittels:

string x = zahl.ToString("X"); für hexadezimalen Output


hier findest du mögliche format - strings:
http://alexonasp.net/samples/stringformatting/

von Hsch (Gast)


Lesenswert?

Hi Thomas.

Hmm meinst du damit wird es gehen.
Was meinst du damit:

Nunja - ich kann dir zu einem raten (ich habs mir nicht genauer
angesehen). Lasse im Hintergrund immer eine Zahl (von mir aus Double)
mitlaufen, die sagt, welcher Wert gerade im Feld steht.

von Thomas L. (tom)


Lesenswert?

Ich habs mir ehrlich gesagt nicht genau angesehen ...

Was ich mit dem Absatz sagen wollte:
Es wäre eine Möglichkeit, die internen Daten von den angezeigten zu
trennen, so musst du nicht dauernd unterscheiden, was denn nun gerade
angezeigt wird :)

Wenn du konkrete Fragen hast -> Mail an somnaticuser@hotmail.com :)

von Hsch (Gast)


Angehängte Dateien:

Lesenswert?

Also mit meinem Rechner bin ich noch nicht weitergekommen.
Wie gesagt der Rechner sollte sich so verhalten wie der von Windows.
Ich kann ohne Probleme einen Binärwert in Hex oder Dezimal umwandeln
und umgekehrt. Nur wenn ich zum Beispiel Dez angewählt habe und gebe
anschließend eine Zahl ein und diese soll dann in Bin während der
Programmlaufzeit umgewandelt werden, dann funzt das nicht.

Im Anhang befindet sich die C# Datei.

Was müsste ich in meinem Programm andern damit die so funktioniert?

von Thomas L. (tom)


Angehängte Dateien:

Lesenswert?

Hallo Hsch

Ich habe dir schnell eine Beispiel - Applikation geschrieben. Sie ist
sicher nicht perfekt - mir fallen da auf der Stelle ein paar Dinge ein
die man besser machen sollte, z.b. das Initialisieren der Buttons usw.
- aber sie funktioniert. Ausserdem kann sie noch nicht rechnen, aber
auch das sollte nicht allzuschwer sein zu implementieren (alten Wert
bei Buttonklick speichern, display rücksetzen, neuen Wert speichern und
bei klick auf den nächsten *,+,/,- oder = button den alten mit dem neuen
mit der entsprechenden Operation verknüpfen.

Sieh dir das mal an. Das Prinzip ist das, welches ich pben geschrieben
habe. Im Hintergrund läuft andauernd ein Integer mit, welcher den
aktuellen Wert speichert. Dieser wird nun je nach eingestelltem Modus
in einen String derjenigen Repräsentation umgewandelt
(Convert.ToString(int i, int basis)) und dann in der textBox
dargestellt.

Viel Spass :)

von Hsch (Gast)


Lesenswert?

Hallo Thomas,

erstmal recht herzlichen Dank für deine Unterstützung.
Ich habe mir mal den Code angeschaut.
Leider kann ich das Projekt nicht öffnen, da ich
nur die Version 7.1 von Microsoft Visual Studio .NET habe.
Wie kann ich trotz all dem das Projekt mit meiner
Entwicklungsumgebung öffnen?

von ToM (Gast)


Lesenswert?

lade dir von Microsoft.com die Visual Studio 2005 C# Express Edition
herunter.
Ist gratis ..

von Hsch (Gast)


Lesenswert?

Hi!

Gibt es in C# eine Funktion mit der man, wenn man einen Button drückt,
z.B. voher war in der Integer Variable "678", eine Stelle
löschen/streichen kann? So dass die Integer Variable nur noch "67"
enthält?

von ToM (Gast)


Lesenswert?

2 Möglichkeiten:
* durch 10 dividieren und dann Math.Floor darauf aufrufen (das liefert
das ganzzahlige Ergebnis).

* In einen String Konvertieren und dann den Substring nehmen von der
ersten bis zur vorletzten Stelle. Dann wieder in einen Int Parsen
(Int32.Parse())

von Hsch (Gast)


Lesenswert?

Ok super ! Das werd ich mal versuchen.

Die nachfolgenden Funktion Funktion ohne Problem.
Jetzt möchte ich aber nicht einen Int Wert in einen String umwandeln,
sonder einen Double Wert(Kommazahl) in einen String. Wie könnte ich
dies realisieren? Die benötige ich weil ich möchte mit dem Rechner auch
Kommazahlen eingeben können.

public int MakeIntFromString(string s, int basis)
    {
      try
      {
        return Convert.ToInt32(s, basis);
      }
      catch
      {
        return 0;
      }
    }

    public string MakeStringFromInt(int i, int basis)
    {
      try
      {
        return Convert.ToString(i, basis);
      }
      catch
      {
        return "";
      }
    }

von ToM (Gast)


Lesenswert?

genau gleich ...

double d = 2.4;
return Convert.ToString(d);

die frage ist jetzt halt was du anzeigen lassen willst wenn man auf hex
umschaltet ... beispielsweise machts der Windows Rechner so, dass er
einfach auf die nächste Ganzzahl kürzt.

von Hsch (Gast)


Lesenswert?

ja das funktioniert auch prima. Nur lese ich meine Zahlen mit diese
Funktion ein. Mit Int Werten funktioniert es super, nur mit den
Kommazahlen, da weiss ich nicht wie man dies damit lösen könnte.


private void buttonPressed(char c)
{
 // A button has been pressed ...
 if (Dez_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 10);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 10);
 }
 else if (Bin_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 2);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 2);
 }
 else if (Hex_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 16);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 16);
 }
}

von ToM (Gast)


Lesenswert?

du könntest es so machen, dass die Variable die im Hintergrund mitläuft
ein double und kein int ist ...

beim Umschalten wird dann zuerst der Double in einen Int umgewandelt
und dann entsprechend dargestellt ..

von Hsch (Gast)


Lesenswert?

Hi Tom,

so ich habe mir nun mal die Gratis Version Visual Studio 2005 C#
Express Edition heruntergeladen. Die Datei ist ja nur ungefähr 3MB
groß.
Das Programm müsste doch sehr viel großer sein oder? Fehlen da noch
einige Dinge? Ist diese version ohne einschränkungen?

von Hsch (Gast)


Lesenswert?

Ich komme nochmal auf das andere Problem zurück.
Und zwar müsste ich dann die Variable curValue in eine double
umändern.

Wie müsste ich dann dies in diese Funktion unterbringen?

private void buttonPressed(char c)
{
 // A button has been pressed ...
 if (Dez_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 10);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 10);
 }
 else if (Bin_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 2);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 2);
 }
 else if (Hex_radioButton.Checked)
 {
  string s = MakeStringFromInt(curValue, 16);
  s += c;
  curValue = MakeIntFromString(s);
  textBox1.Text = MakeStringFromInt(curValue, 16);
 }
}

von Hsch (Gast)


Lesenswert?

Das mit den Kommazahlen will einfach nicht funktionieren.

private void button12_Click(object sender, System.EventArgs e)
{
 buttonPressed('.');
}

Wenn ich den Button (button12) drücke, dann soll das Komma mit
eingefügt werden. Aber es klappt über haupt nicht.

von Hsch (Gast)


Lesenswert?

Ich kann da machen was ich will, ich bekomme kappier es nicht warum dies
nicht so geht. Ich verweifle noch!

von Hsch (Gast)


Lesenswert?

Ja und noch was, wenn ich dies so mache wie Tom beschrieben hat, das
geht doch nicht. Weil wenn ich eine Kommazahl dann in eine Int umwandle
dann ist es ja gar keine Kommazahl. Das verstehe ich überhaupt nicht.
Ich brächte nur mal eine ANregung wie genau ich die Funktion
private void buttonPressed(char c) abändern muss!

von ToM (Gast)


Lesenswert?

Die Funktion Button Pressed, musst du gar nicht ändern - ich kann mir
diese Woche den Source Code nicht ansehen, erst nächste Woche wieder.

Im Prinzip basiert alles darauf, dass das Programm nicht das anzeigt,
was es intern speichert (angezeigt wird ein String, gespeichert ein
Double - in der alten Version halt noch ein Int).

Je nachdem was du machen willst, musst du den String dementsprechend
darstellen lassen.

Kann es sein, dass du noch nicht allzuviel Programmiererfahrung hast -
denn hier gehts ja gerade um die kompletten Basics.

von Hsch (Gast)


Lesenswert?

private void button12_Click(object sender, System.EventArgs e)
{
 buttonPressed('.');
}

Wenn ich diese Funktion ausführe indem ich den button12 drücke, dann
sollte doch das eigentlich funktionieren. Und zwar wird dann die
Funktion buttonPressed ausgeführt. Und dieser Funktion wird dann dieses
Zeichen '.' übergeben. Daraufhin müsste doch dann ein Komme im String
vorhanden sein oder ?
Oder müsste ich in der Funktion buttonPressed diesen Eintrag abändern

String s = MakeStringFromInt(curValue, 10);

von ToM (Gast)


Lesenswert?

Du könntest das Ganze schrittweise debuggen, dann siehst du sofort, wo
der . verloren geht.

von Hsch (Gast)


Lesenswert?

Hallo,

endlich habe ich mein großes Problem gelöst bekommen.
Jetzt funzt alles mal soweit.
Allerdings bei der Verwendung von Hex gibt es noch ein kleines Problem.
Wenn ich z.B. den Button für den Buchstaben "a" drücke,
denn soll die Funktion buttonPressed diese auch verarbeiten.
Wenn ich dann auf Dez umstelle erscheint in der TextBox1 "0".
Wahrscheinlich geht der Buchstabe "a" hier curDoubleValue =
System.Convert.ToDouble(curStringValue); verloren.

private void bB_Click(object sender, System.EventArgs e)
{
 buttonPressed('b');
}

private void buttonPressed(char c)
{
 try
 {
  string s = curStringValue + c;
  curStringValue +=c;
  textBox1.Text = curStringValue;

  curDoubleValue = System.Convert.ToDouble(curStringValue);
  curIntValue = System.Convert.ToInt32(curDoubleValue);
 }
 catch
 {
 }
 i = false;
}

von ToM (Gast)


Lesenswert?

ich schätze eher dass eine Exception auftritt, die zwar abgefangen, aber
nicht behandelt wird.

Das Problem ist:

Es steht dort:
du tippst ein: a

der string ist dann "a".

Ein ToDouble von "a" gibt es nicht. -> Exception

Wenn du im Hex oder Binary Modus auch Kommazahlen willst, erfordert das
einiges an Zusatzaufwand - nicht umsonst ist es im Windows Rechner nicht
möglich :) - Klar - es geht, aber ist es dir das wert ?

von Hsch (Gast)


Lesenswert?

Hi ToM,

ja wie würdest du dieses Problem angehen? Also bei String do Double
gibt es jetzt Probleme mit dem umwandeln von "a" "b" usw.

von ToM (Gast)


Lesenswert?

Keine Ahnung - Überleg dir halt mal wie ein Double als String im
Hexadezimalen Format aussehen müsste.
Trennen beim Kommapunkt ?

von Hsch (Gast)


Lesenswert?

Hi,

ich habe da noch ein Problem und zwar komme ich da nicht weiter beim
umwandeln.
Wenn ich zwei mal den Button A drücke, dann soll dieser Wert in Dezimal
umgewandelt werden. Wie konnte ich dies in C# realisieren?

von Hsch (Gast)


Lesenswert?

Da ich die Funktion "buttonPressed(char c)" verwende, werden erstmal
alle Wert in dieser Funktion gesammelt. Wie könnte ich dann eine Hex
Zahl z.B. AA hex in einen Integer bzw. Double Wert
umweandeln/verarbeiten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.