# Aufgabe in C++ Binäre in Dezimal



## ProfSanka (14. Januar 2013)

Hallo zusammen, 
ich bin neu hier;
kurz zu mir;  Ich studiere Maschinenbau und muss im 2.Semester C++ lernen, ende Januar ist Prüfungszeit, somit auch die Info-Klausur.
Ich beschäftige mich jetzt seit einigen Tagen erst intensiver mit C++ und bin jetzt auf folgende Aufgabe gestosen;

Schreiben Sie ein Programm das eine binäre Zahl mit max 10 Stellen einliest, z.B. 1101, und deren entsprechenden dezimalen Wert zurückgibt.

Hinweis: Bei der Berechnung des dezimalen Werts einer binären Zahlen, etwa 1101 gehen Sie von der Potenzdarstellung zur Basis 2 aus: 1*2³ + 1*2² + 0*2^1 + 1*2^0

Das ganze soll ich "nur mit" Schleifen und/oder if/else ohne string und char lösen.

Ich bin gerade fertig mit den Nerven, ich wäre wirklich dankbar wenn mir jemand einen Code geben könnte oder einen Link mit der Lösung.


----------



## Jennesta (14. Januar 2013)

Hallo und Willkommen,

einen fertigen Code wird dir hier sicher keiner geben (wobei diese Aufgabe sicher im Netz zu finden wäre). Allerdings helfen wir dir gerne bei der programmierung der Aufgabe. Zeig doch mal was du bisher gemacht hast und äußere eine konkrete Frage.
Ohne das selbst gemacht zu haben, wirst du es wohl eh nicht richtig verstehen und somit in der Prüfung auch Probleme bekommen.

Viele Grüße,
Jennesta


----------



## ProfSanka (14. Januar 2013)

ich hab nichteinmal eine Idee, ich habe bisher solche Uebungen gemacht; und in diesem Stil moechte ich das beibehalten

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

float potenzreihen (float a, int b);

void main()
{
	float a;
	int b;
	cout<<"Dieses Programm gibt eine Potenz aus.\n";
	cout<<"Wert der Basis:\t\t";
	cin>>a;
	cout<<"Wert des Exponenten:\t";
	cin>>b;
	cout<<"Die Potenz ergibt:\t"<<potenzreihen(a, b)<<endl;

	system("PAUSE");
}

float potenzreihen (float a, int b)
{
	float potenz=1.0;
	int i;

	for(i=1; i<=b; i++)
	{
		potenz = potenz*a;
	}
	return potenz;
}

Bei der Binäraufgabe versuche ich zuerstmal klarzustellen wie ich die Binärzahl einlese; normal wäre ja von links nach rechts und so will ich auch das, ach verdammt; ich werd mal versuchen den Verantwortlichen Autor dieser Aufgabe danach zu befragen


----------



## Cromon (14. Januar 2013)

Hallo und herzlich willkommen, ProfSanka

Würde es sich um eine reguläre Übungsaufgabe handeln würde ich diese dem Assistenten mit einem breiten Grinsen im Gesicht und dem folgenden Satz auf dem Blatt zurückgeben:
"Diese Aufgabe ganz ohne Variabeln, ohne Funktionen und nur mit Schleifen und Abfragen zu lösen ist nicht möglich."

Aber es handelt sich um eine Prüfungsaufgabe und ich denke wir sehen mal über die schlechte Aufgabenstellung weg und vermuten einfach dass damit gemeint ist, dass man nicht die Formatierungsoptionen von iomanip verwenden sollte, weil es ja so viel wichtiger ist in der Industrie alles neu zu erfinden anstatt bestehende Implementationen zu verwenden....

However, ich werde es mal etwas ausführlicher erklären da es ja zur Prüfungsvorbereitung dient. Nur den Code zu posten bringt ja nicht wahnsinnig viel.

Also ich schätze mal wie man die einzelnen Ziffern der Binärzahl in das entsprechende Dezimale umwandelt dürfte rein von der Mathematik her klar sein, was dir fehlt ist der konzeptionelle Ansatz. 

Aus völlig unerklärlichen Gründen darfst du ja überhaupt keine strings und nichts verwenden, mit anderen Worten du musst also die Eingabe des Benutzers in einen Integer einlesen (völliger Schwachsinn, aber ja...). Das sollte grundsätzlich kein Problem sein:

```
int binIntValue = 0;
std::cin >> binIntValue;
```

In einem nächsten Schritt musst du jetzt alle Zehnerpotenzen der Zahl durch Zweierpotenzen ersetzen. Dafür kannst du den Modulooperator verwenden, da dieser dir ja den Rest der Division gibt. Machst du % 10 erhälst du hinterste Ziffer der Zahl (die ja entweder 0 oder 1 ist, da der User ja eine Binärzahl eingegeben hat). Ergo:

```
int binValue = 0;

int base = 0;
while(binIntValue) {
       int curDigit = binIntValue % 10;
       binIntValue /= 10; // bei der Division von 2 Integerwerten werden die Nachkommastellen abgeschnitten

       if(curDigit < 0 || curDigit > 1) {
             // der user hat eine Zahl eingegeben, die nicht die Form 0011001010 hat, sondern bsp 020300101
            // irgendwas hier machen, Fehlerbehandlung halt
       }
       binValue += curDigit * (1 << (base++));
}
```

Nun hast du in binValue den eigentlichen Wert den der Benutzer eingegeben hat, ohne Strings und ohne chars.

Grüsse
Cromon


----------

