You are not logged in.

  • Login

1

Thursday, November 2nd 2006, 11:07am

von binär in dezimal...

Folgende Aufgabe:

Quoted

Schreiben Sie ein C++-Programm, das eine bin¨are Ziffernfolge einliest (nur Betrag, kein Vorzeichen),
z.B. 1101, und den entsprechenden dezimalen Wert ausgibt. Die bin¨are Ziffernfolge
wird zeichenweise von der Tastatur eingelesen. Jedes Zeichen wird unmittelbar verwendet, um
das Ergebnis zu aktualisieren.
Hinweis: Lesen Sie die einzelnen Zeichen in eine char-Variablen ein. Verwenden Sie hierzu das
Kommando cin.get(Variablenname), wobei Variablenname der Name der char-Variablen
ist. Der Kopf der Schleife k¨onnte somit folgendes Aussehen haben:
while (cin.get(c) && ( c == ’0’ || c == ’1’))
{
...
}
Gehen Sie bei der Berechnung des dezimalen Wertes einer bin¨aren Zahl von der Potenzreihendarstellung
zur Basis 2 aus:
z.B. 1101: 1*2³ + 1*2² + 0*2^1 + 1*2^0


Das Umrechnen ist kein Problem, aber wie soll ich das machen, dass der das immer "live" umrechnet? Hab bisher nur den nackten Quelltext... :( Ich probier mal weiter aber vll hat ja jemand nen Denkanstoß...

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main ()
{
  cout << "Dieses Programm rechnet von binären Zahlenfolgen in dezimale Zahlenwerte um! " << endl;
  cout << " " << endl;
  cout << "Bitte Zahlen eingeben (nur 0 und 1 werden akzeptiert): " << endl;
 
  char c;
 
while (cin.get(c) && ( c == ’0’ || c == ’1))
{
 
}
}
:roll:

EDIT: Ich weiß vorallem nicht wie ich das hinkriegen soll, dass sich die Exponenten der Zahl 2 bei jeder Eingabe um 1 erhöhen...

2

Thursday, November 2nd 2006, 1:21pm

man nehme eine Varianle "int count = 0;"
Nach jedem eingelesenen Zeichen wird diese um 1 erhöht.
Dann bastelst du dir ein Funktion "int hoch2 (int n)" die den Wert berechnet.
Und dann musst du die Funktionsergebnisse nur noch zusammenzählen

viel Erfolg!

3

Sunday, November 5th 2006, 6:21pm

Quoted

#include <iostream>
#include <cmath>
using namespace std;

int main ()
{
int c;
int count=0;
while (cin.get(c) && ( c == ’0’ || c == ’1’))
{

count=count+1;
int pow(c);

}

cout << c << endl;



}


Ich kriegs nicht hin :( Ich weiß nicht wie cihd as dann richtig zusammenzählen soll

4

Sunday, November 5th 2006, 7:36pm

:(

5

Sunday, November 5th 2006, 8:04pm

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <bitset>
 
int main()
{
	char c;
	std::bitset<sizeof(long)*8> bset;
	std::cout<<"Bits eingeben:\n";
	while (std::cin.get(c) && ( c == '0' || c == '1'))
	{
		bset = bset<<1;
		if(c=='0')
			bset.set(0,false);
		else
			bset.set(0,true);
		std::cin.get();//return konsumieren
	}
	std::cout<<bset.to_string()<<std::endl;
	std::cout<<bset.to_ulong()<<std::endl;
 
	return 0;
}


An deinen Programmierkenntnissen musst du unbedingt was machen.
Sonst wirst du im Informatikstudium noch enorme Probleme bekommen.

Gruß void

6

Sunday, November 5th 2006, 8:24pm

Quoted from ""void""

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <bitset>
 
int main()
{
	char c;
	std::bitset<sizeof(long)*8> bset;
	std::cout<<"Bits eingeben:\n";
	while (std::cin.get(c) && ( c == '0' || c == '1'))
	{
		bset = bset<<1;
		if(c=='0')
			bset.set(0,false);
		else
			bset.set(0,true);
		std::cin.get();//return konsumieren
	}
	std::cout<<bset.to_string()<<std::endl;
	std::cout<<bset.to_ulong()<<std::endl;
 
	return 0;
}


An deinen Programmierkenntnissen musst du unbedingt was machen.
Sonst wirst du im Informatikstudium noch enorme Probleme bekommen.

Gruß void


vielen Dank, ja du hast Recht, wir haben eben egrade erst angefangen, und ich hab nebenbei total viele Aufgaben zu mathematischer Modellierung, zu Rechnerarchitektur und zu Algebra auf, sonst würde ich mich da mal richtig ransetzen und Tutorials durchackern. Hoffe ich komme bald dazu.

Das mit dem bitset hatten wir beispielsweise noch gar nicht. Ich habs gerade mal probiert. Irgendwie gibt es 2 Probleme. Ich verstehe die Schleife nicht wirklich, und das Programm gibt auch nicht nach jeder Biteingabe den String als Dezimalzahl aus... ich probier mal weiter. Danke erstmal :)

EDIT: achso, wenn man das hier

Quoted

std::cout<<bset.to_string()<<std::endl;
std::cout<<bset.to_ulong()<<std::endl;
IN die Schleife packt gehts wie gewünscht. :roll:

cewbie kann gar nicht mehr denken heute :shock:

7

Monday, November 6th 2006, 7:08am

Wenn ihr noch keine bitsets etc. hattet solltest du sowas besser auch nicht benutzen.
Ausser du nimmst das Risiko in Kauf dass dir jemand unangenehme Fragen zur Funktionsweise "deines" Programms stellt.
Ne einfachere Variante wäre diese hier:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <bitset>
 
int main()
{
	char c;
	long value=0;
	std::cout<<"Bits eingeben:\n";
	while (std::cin.get(c) && ( c == '0' || c == '1'))
	{
		value <<= 1;
		if(c=='1')
			value +=1;
		std::cout<<"Aktueller Wert:"<<value<<std::endl;
		std::cin.get();//return konsumieren
	}
	return 0;
}


Gruß void

8

Monday, November 6th 2006, 10:45am

fein danke! :wink:

Eine Frage habe ich noch:

Quoted

value <<= 1;
if(c=='1')
value +=1;


kannst du das mal näher erklären? Was soll <<= bedeuten?
und wenn man value um eines erhöhen will schreibt man dann nicht normalerweise

Quoted

value=value+1;
Das += kannte ich bisher nicht.

EDIT: und warum ist da kein pow drin? Wo wird denn der Exponent bestimmt?

und warum schreibst du immer das std:: vor cout und cin? Ohne gehts nicht :? (habs probiert )

mfg,

cewbie

Entschuldige meine Unwissenheit... :?

9

Monday, November 6th 2006, 1:31pm

es ist seltsam. Das Programm funktioniert, aber ich verstehe das

C Quellcode

1
Value <<= 1
nicht.

Für mich fehlt da im Quellcode irgendwie auch die Multiplikation mit 2?!

10

Monday, November 6th 2006, 2:00pm

Quoted

value <<= 1

Der Wert "1" wird an value übergeben.


Quoted

value +=1

Der Wert von value wird um den Wert "1" erhöht.

Bin mir aber nicht 100% sicher weil es schon ein bißchen her ist das ich C++ in der Schule hatte. :wink:

11

Monday, November 6th 2006, 2:04pm

Guck auch mal hier ;)
http://www.highscore.de/cpp/einfuehrung/operatoren.html

12

Monday, November 6th 2006, 2:05pm

Quoted from ""DasBunny""

Quoted

value <<= 1

Der Wert "1" wird an value übergeben.
:


Das kann nicht stimmen. Wenn du dir das Programm von void ansiehst, und man gibt nur eine Null ein, müsste das Programm nach deiner Logik fälschlicherweise eine 1 ausgeben, da value der Wert 1 zugewiesen worden sein müsste. Das Programm gibt aber korrekt 0 aus.

Auf der Seite von dir steht


Quoted

Genauso wie mit Hilfe des arithmetischen Operators + ein kombinierter Zuweisungsoperator += gebildet werden kann, können mit anderen Operatoren folgende kombinierte Zuweisungsoperatoren gebildet werden: -=, *=, /=, %=, &=, |=, ^=, <<= und >>=.


Aber das hilft mir nicht. Eigentlich dürfte das Programm von void nicht funktionieren... hab mit mehreren Kommilitonen geredet. Es funktioniert aber eben trotzdem :?

Gruß

cewbie

13

Monday, November 6th 2006, 5:25pm

C Quellcode

1
value <<= 1;

ist eine Kurzversion von

C Quellcode

1
value = value << 1;


<< steht für Shift-Left

<< 1 ist ein Spezilefall und ist die performanteste Variante eine Multiplikation mit 2 durchzuführen

14

Monday, November 6th 2006, 5:39pm

Quoted from ""phax""

C Quellcode

1
value <<= 1;

ist eine Kurzversion von

C Quellcode

1
value = value << 1;


<< steht für Shift-Left

<< 1 ist ein Spezilefall und ist die performanteste Variante eine Multiplikation mit 2 durchzuführen


danke :) dann müsste ich das ganze ja auch durch value = value*2 ersetzen können, so funktioniert das Programm jedoch nicht richtig

15

Monday, November 6th 2006, 5:57pm

Ja, sobald mehr als 32 Ziffern eingegeben werden kommt es zum Overflow.
Am besten du packst es gleich in ein "double" dort hast du eine range bis 10^308
Schreib ruhig value *= 2;

16

Monday, November 6th 2006, 5:59pm

Inwiefern funktioniert es dann nicht richtig?
Sollte es aber eigentlich.

Gruß void

17

Monday, November 6th 2006, 7:31pm

hm jetzt gehts. komisch.

jetzt verstehe ich auch das Programm :) fein

yeah 6 Stunden Wartungsarbeiten am Einsendungsserver... *grml*

Similar threads

Social bookmarks