WinFuture-Forum.de: Binär in Dezimal - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Binär in Dezimal c++


#1 Mitglied ist offline   DieKillerhuhn 

  • Gruppe: aktive Mitglieder
  • Beiträge: 178
  • Beigetreten: 13. Mai 08
  • Reputation: 0

geschrieben 10. November 2013 - 20:51

Guten Tag,

wir haben jetzt in der Schule mit C++ begonnen und arbeiten mit Microsoft Visual Studio 2010.


Zuerst einmal ohne Nachkommastellen.
Hier dazu mein Code, der funktioniert auch prima, allerdings hätte ich da zwei Mängel: Er schreibt in jede Zeile nur eine 0 oder 1 , das sollte am besten in einer Zeile stehen, also die Binärzahl. Als Zweites würde ich gerne, dass die Dezimalzahl richtig herum also das das MSB ( Most significant Bit ) auch an erster Stelle steht, was jetzt nicht der Fall ist!

Mfg

#include <iostream>

int main()
{
	
	int Dezimalzahl, a, b;
	std::cout << "Bitte Zahl eingeben:" << std::endl;
	std::cin >> Dezimalzahl;


	while ( Dezimalzahl > 0)
	{
	a= Dezimalzahl/2;
	b= Dezimalzahl % 2;
	Dezimalzahl= a;
	std::cout << b << std::endl;
	}
	std::cout << "von unten nach oben!" << std::endl;
	std::cin.get();
	getchar();

	return 0;
}

0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 10. November 2013 - 21:20

Wenn Du vom 'richtigen' Ende anfangen willst, müßtest Du den binären Logarithmus des Eingabewerts bestimmen. Der würde Dir dann die Länge des Endergebnisses angeben und Du könntest das Problem andersherum angehen.

Alternativ bliebe noch, den Algorithmus so zu lassen, wie er ist; aber statt je Durchlauf etwas auszugeben (Achtung: hat auch Auswirkungen auf die Laufzeit) müßtest Du zu Anfang einen leeren String initialisieren und diesen pro Durchlauf von hinten auffüllen (das neue Ergebnis an die erste Stelle und den bestehenden Schwanz hinten dranhängen).

Um Umbrüche zu unterdrücken, nehm' ich printf(). Aber ob und inwieweit das für dieses konkrete Problem zulässig ist, weiß ich nicht.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   DieKillerhuhn 

  • Gruppe: aktive Mitglieder
  • Beiträge: 178
  • Beigetreten: 13. Mai 08
  • Reputation: 0

geschrieben 10. November 2013 - 21:24

OK , ich werde es versuchen danke!

Jetzt habe ich noch eine andere Frage zu einer anderen Aufgabe, wollte nicht extra einen neuen Thread öffnen.

Folgende Aufgabe :
Schreiben Sie ein C++-Programm, das für jeden der elementaren Datentyp char, short, int, long, float, double und long double die Größe des benötigten Speicherplatzes sowie die Untergrenze und Obergrenze seines Wertebereichs auf dem Bildschirm ausgibt. Die Ausgabe soll dabei folgendes Format haben:
<Datentyp>
Größe: <Größe>
Untergrenze: <Untergrenze>
Obergrenze: <Obergrenze>

Naja, ich habe mir überlegt man kann ja den gewünschten Datentyp eingeben und dann gibt er die Sachen dafür aus, damit man nicht für jeden Datentyp jeden Schritt machen muss. Allerdings krieg ich das nicht hin, hier mein Versuch:


#include <iostream>
#include <climits>

int main()
{
	char Datentyp;
	std::cin >> Datentyp;
	std::cout << Datentyp	
			  << "\n " << sizeof(Datentyp)
			  << "\n" << Datentyp_MIN<< " ... " << Datentyp_MAX
			  << std::endl;
	std::cin.get();
	getchar();
	return 0;
}

0

#4 Mitglied ist offline   LoD14 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.931
  • Beigetreten: 04. Mai 03
  • Reputation: 45
  • Wohnort:Hennef bei Köln

geschrieben 11. November 2013 - 08:11

Beitrag anzeigenZitat (RalphS: 10. November 2013 - 21:20)

Alternativ bliebe noch, den Algorithmus so zu lassen, wie er ist; aber statt je Durchlauf etwas auszugeben (Achtung: hat auch Auswirkungen auf die Laufzeit) müßtest Du zu Anfang einen leeren String initialisieren und diesen pro Durchlauf von hinten auffüllen (das neue Ergebnis an die erste Stelle und den bestehenden Schwanz hinten dranhängen).

Das kannst du vermeiden, wenn du den String normal auffüllst, ihn am Ende in ein Char-Array konvertierst und dann einfach rückwärts ausgibst.

Dieser Beitrag wurde von LoD14 bearbeitet: 11. November 2013 - 08:12

0

#5 Mitglied ist offline   Lastwebpage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 516
  • Beigetreten: 26. Dezember 07
  • Reputation: 46

geschrieben 11. November 2013 - 10:04

"Datentyp_MIN"
Ist das wirklich SO angedacht, mit irgendwelchen konstanten Werten, die irgendwo definiert sind? Dann könnte man sich das mit sizeof ebenfalls sparen.

Idee 1:
cout << static_cast< int >(std::numeric_limits< char >::max()) und
cout << static_cast< int >(std::numeric_limits< char >::min())


Idee 2, etwas raffinierter:
Spiele mal mit dem Wert -1 und signed bzw. unsigned herum.
siehe z.B. http://msdn.microsof...y/37ct5baz.aspx
(Da sollte man dann aber auch erklären können warum das so ist, und bei den so ermittelten Werten muss teilweise noch +1 bzw. -1 gerechnet werden)

char Datentyp; =>EIN Zeichen
cin >> Datentyp; => och nööö... bei Datentyp =int, long... hätte es funktioniert, char ist in Zusammenhang mir cin etwas haarig, besser ist hier:
char a;
cin.get(a);

"richtiger" wäre char Datentyp[10] gewesen.
(Cin verhindert aber auch hier nicht die Eingabe von 10 oder 11 Zeichen...)
if(Datentyp=="int") =>och nööö, vergleichen kann man Char Arrays so nicht.

Oder
string Datentyp , ich weiß aber nicht ob ihr das schon hattet.

Und zum Schluss, dummerweise...
sizeof(Datentyp)...
bei deinem char Datentyp => 1 (Byte)
bei char Datentyp[10] => 1 (Byte) * anzahl der eingebenen Zeichen + 1 (für die abschließende \0"
Welchen Wert "Datentyp" hat, interessiert Sizeof relativ wenig...
sizeof<"int"> => 4 Byte. I + N + T + \0
sizeof<"char"> => 5 Byte...

Dieser Beitrag wurde von Lastwebpage bearbeitet: 11. November 2013 - 18:41

0

#6 Mitglied ist offline   DieKillerhuhn 

  • Gruppe: aktive Mitglieder
  • Beiträge: 178
  • Beigetreten: 13. Mai 08
  • Reputation: 0

geschrieben 11. November 2013 - 13:07

Alles klar danke!
0

#7 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. November 2013 - 16:05

Schleife zur Ausgabe = schlecht. Vermeiden, wenn möglich. :imao:

Der Weg übers Komplement gefällt mir da schon besser, aber das muß man dann tatsächlich erklären können. :)
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#8 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 15. Dezember 2013 - 18:39

Nochmal ein Vorschlag zur ersten Aufgabe:

#include <iostream>

int main()
{
	unsigned int Dezimalzahl;
	std::cout << "Bitte Zahl eingeben:" << std::endl;
	std::cin >> Dezimalzahl;

	unsigned int bit = 1;
	bit <<= sizeof( unsigned int ) * 8 - 1;

	for( unsigned int i = 0; i < sizeof( int ) * 8; ++i )
	{
		std::cout << (bool) ( Dezimalzahl & bit );
		Dezimalzahl <<= 1;
	}
	std::cout << std::endl;

	return 0;
}



MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0