Zahlensystemumrechner in MS Visual Studio

jack1991

Grünschnabel
hiho ich bin neu hier und hoffe das ich das richtig gepostet habe^^

Also ich pogrammiere in C++ im MS Visual Studio 2005 einen taschenrechner.

zurzeit mache ich die radio buttons für die umrechnung von Dez, Bin, Hex, Okt

die funktion wie man es umrechnet habe ich schon allerdings funkttioniert das nicht richtig entweder das programm stürtzt ständig ab oder es rechnet nicht richtig um.

hier jetzt mal meine aktuellen quelltexte für die 4 radio buttons.

Code:
//Hex radio button
private: System::Void Hex_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
				 
	if(Dez->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 10), 16);
	}

	

	if(Okt->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 8), 16);

	}

	if(Bin->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 2), 16);

	}


Code:
//Dez radio button

private: System::Void Dez_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
	
	if(Hex->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 16), 10);

	}

	if(Okt->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 8), 10);

	}

	if(Bin->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 2), 10);

	}


		 }
Code:
// Oktal radio button

private: System::Void Okt_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
			 
	if(Dez->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 10), 8);
	}

	if(Hex->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 16), 8);

	}

	

	if(Bin->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 2), 8);

	}
		 }


Code:
// Binär radio button

private: System::Void Bin_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
       
	 if(Dez->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 10), 2);
	}

	if(Hex->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 16), 2);

	}

	if(Okt->Checked)
	{
		this->textBox1->Text = Convert::ToString(Convert::ToInt32(this->textBox1->Text, 8), 2);

	}

	


		 }



Ich überprüfe ja immer welcher radio button checked ist und beim nächsten klick auf den button rechnet er es dann um so hab ich das jedenfalls versucht zu programmieren.

Nur leider gibt er mir ziemlich viel mist aus was nicht ganz so stimmt.

z.B wenn ich 50 dez in hex rechne gibt er mir 80 aus (eigentlich sollte ja 32 rauskommen)

und wenn ich jetzt 50 hex in dez rechne gibt er mir 32 aus also grade Spiegelverkehrt ist mir aufgefallen..

auserdem wenn ich in binär umrechnen will schmiert das programm komischweise ab

Wär nett wenn sich das jemand bitte anschauen könnte ich weis leider selber nicht wieso diese probleme auftauchen.

vielen dank schonmal im vorraus
 
Ich vermute, dass jeweils beide Buttons eine CheckedChanged Message bekommen, einer als Nachricht, dass er abgewählt wurde, der andere, damit er merkt, dass er angewählt wurde. Zunächst wird der eine Button gecheckt und der andere wird auf unchecked gesetzt. Dann bekommen die beiden Buttons eine Message über die Zustandänderung. Deswegen will der eine Button, der abgewählt wurde, in sein Zahlensystem umrechnen (denn der andere Button wird als gecheckt erkannt), der angewählte wird aber nicht aktiv, weil er selbst gecheckt ist, aber kein anderer.
Du solltest dir angewöhnen, Zustands-Daten in Variablen zu speichern, und nicht die Formularelemente dafür zu verwenden; du siehst ja nun, welche Konfusion dadurch entstehen kann. Dass beim Umwandeln in Binär der Rechner das Programm abbricht, wundert mich nicht, denn für die Verarbeitung wird wegen der fehlenden Zustandswechselüberprüfung eine falsche Methode aufgerufen, die versucht, 50 als binär zu interpretieren und in ein anderes Zahlensystem umzuwandeln, was nicht möglich ist. Die anderen Konvertierungen gelingen deswegen, weil der String "50" in jeder ihrer Basis eine gültige Ziffernfolge ist.
 
danke schonmal für die antwort!

Also das mit dem binär hab ich verstanden was du meinst und klingt auch logisch nur wie kann ich das fixen hast ja geschrieben man brauch da eine "Zustandswechselüberprüfung"

leider programmiere ich noch nicht lange und weis gar nicht wie das funktionieren soll...

und wie meinst du das mit dem zwischenspeichern in einer variable?

das ich einfach die textBox1 immer erst auf eine variable speichern soll bevor es umrechnet und dann das umgerechnete ergbnis von der variable auf die textBox1 schreiben ?

also so hab ich das verstanden...

ich hoffe du kannst mir da noch helfen :)
 
Um es mal theoretisch zu erläutern: Die Variablen, deren Werte das Verhalten eines Systems beeinflussen, sind die Zustandsvariablen. Der Zustand des Systems wird durch die Werte charakterisiert, die in diesen Variablen gespeichert sind. Bei dir ist das System das Formular, und das Verhalten des Formulars ist die Art, wie es auf Eingaben reagiert. Du hast keine eigene Variable, die dir sagt, in welchem Zahlensystem du derzeit rechnest, und genau das musst du ändern. Du musst eine Variable einführen, in der du speicherst, ob du gerade Binärdaten oder Dezimalzahlen oderwasauchimmer verarbeiten sollst. Diese aktualisierst du immer dann, wenn eine neue Zahlenbasis angewählt wird; das entsprechende Event verarbeitest du ja schon. In dieser Routine kannst du dann auch eine entsprechende Umwandlungsroutine einbauen, die deine Zahl in der Anzeige von der Basis, die in deiner Zustandsvariablen gespeichert ist, in diejenige Basis konvertiert, welche nun angewählt wird. Diese Variable kannst du dann z.B. auch für Eingabeüberprüfungen nutzen, um nur solche 'Ziffern' zu akzeptieren, die mit dem momentanen Zahlensystem verträglich sind.
 
Achso

Also das heißt ich muss jedes mal bevor es umrechnet erstmal in das entsprechende Zahlensystem umrechnen.

Also für Hex, Dez, und oktal ist das "int" oder? da ich ja ganze zahlen hab obwohl bei Hex hab ich auch buchstaben?

und was muss ich z..B. bei Bin benutzen?
 
Mach dir erst einmal eine Variable, in der du speicherst, welches Zahlensystem verwendet wird; am beisten verwendest du ein enum. Und in deiner XXX_Checked_Changed-Methode aktualisierst du dann auch diese Variable.
 
so hat bischen gedauert bis ich wieder zeit hatte um weiterzumachen sry...

das mit dem zwischenspeichern hab ich soweit verstanden nur was soll ich für die Variable nehmen?

Also hab jetzt mal int genommen:
Code:
//Hex
int zahlensystemInt;
private: System::Void Hex_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
				 
	if(Dez->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 10), 16);
	}

	

	if(Okt->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 8), 16);

	}

	if(Bin->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 2), 16);

	}
			 }
Code:
//Dez
private: System::Void Dez_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
	
	if(Hex->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 16), 10);

	}

	if(Okt->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 8), 10);
	}

	if(Bin->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 2), 10);

	}


		 }
Code:
//Okt
private: System::Void Okt_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
			 
	if(Dez->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 10), 8);
	}

	if(Hex->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 16), 8);
	}

	

	if(Bin->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 2), 8);

	}
		 }
Code:
//Bin
private: System::Void Bin_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
       
	 if(Dez->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 10), 2);
	}

	if(Hex->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 16), 2);
	}

	if(Okt->Checked)
	{
		zahlensystemInt = Convert::ToInt32(this->textBox1->Text);
		this->textBox1->Text = Convert::ToString((zahlensystemInt, 8), 2);
	}

	


		 }

das programm läuft soweit aber irgendwann bekomm ich ein a in die textbox was wahrscheinlich wegen Hex ist und dann schmiert das programm logischweise ab wegen dem falschen format.



aber das Hauptproblem ist ja noch das es gar nicht richtig rechnet sondern irgendwelche zahlen ausgibt die total falsch sind :/
und damit meinte ich z..B. Dez in oktal was doch eig beides in der variable
Code:
int zahlensystemInt;
gespeichert werden kann

ich weis nicht mehr was ich da machen soll :confused:

könntest du dir vielelicht nochmal den kompletten quelltext anschauen ich weis absolut nicht weiter

schon so viel probiert und nichts geht :(
 
Eigentlich hatte ich das so gemeint:
C++:
private: System::Void Bin_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
	// Wenn es abgewählt wurde, ist nichts zu tun
	if(!Bin->Checked) return;
	// Bin-Button wurde angewählt -> Konvertierung vornehmen 
	// - Zahlenstring in int umwandeln
	// ( die alte Zahlenbasis ist noch in zahlensystemInt gespeichert )
	int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);
	// - die Basis des neuen Zahlensystems speichern
	zahlensystemInt = 2;
	// - den int32-Wert in einen Zahlenstring des neuen Zahlensystems umwandeln
	// - den Zahlenstring als Text der textBox zuweisen 
	this->textBox1->Text = Convert::ToString(value,zahlensystemInt);
}
Für die anderen Buttons machst du es ähnlich, du brauchst nur die zuzuweisende Basis entsprechend zu ändern.
 
Zuletzt bearbeitet von einem Moderator:
danke mit den kommentaren ist das ziemlich einfach zu verstehen

Also ich habe das jetzt mal komplett auf die 4 radio buttons gemacht leider funktioniert es noch nicht ganz.
hier mal der komplette quelltext:

Code:
	private: System::Void Hex_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
	 if(!Hex->Checked) return;  
	 int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);   
	 zahlensystemInt = 16;  
	 this->textBox1->Text = Convert::ToString(value,zahlensystemInt);
	
			 }
private: System::Void Dez_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
	 if(!Dez->Checked) return;  
	 int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);   
	 zahlensystemInt = 10;  
	 this->textBox1->Text = Convert::ToString(value,zahlensystemInt);
	

		 }
private: System::Void Okt_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
			 
	 if(!Okt->Checked) return;  
	 int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);   
	 zahlensystemInt = 8;  
	 this->textBox1->Text = Convert::ToString(value,zahlensystemInt);
	
		 }
private: System::Void Bin_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
       
	 if(!Bin->Checked) return;  
	 int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);   
	 zahlensystemInt = 2;  
	 this->textBox1->Text = Convert::ToString(value,zahlensystemInt);
	


		 }


so wenn ich jetzt auf einen radio Button klicke sagt er mit jedes mal: "Additional information: Ungültige Basis."

und der grüne peifel der sagt wo das programm en fehler hat zeigt auf diese zeile:
Code:
int value = Convert::ToInt32(this->textBox1->Text,zahlensystemInt);

ich denke mal das soll heißen das zahlensystem keinen wert besitzt oder?

was ist da den noch der fehler mhh?
 
Zurück