umrechnung von zahlen in ein dual system

Stephan Liebig

Erfahrenes Mitglied
Also ich möchte in C++ folgende Aufgabenstellung realisieren:

Aufgabe 2
Erstellen Sie ein Programm, welches die Basis b eines Zahlensystems einliest (1<b<=10) . Danach
sollen ganze Zahlen eingelesen werden. Als Ergebnis sollen die Ziffern dieser Zahlen im
Zahlensystem mit Basis b ausgegeben werden. Wählen Sie ein geeignetes Kriterium zur Beendigung
des Programms. Hinweis: Verwenden Sie den %-Operator.
Beispiel: b=3 - eingelesene Zahl 10 – Ausgabe 1 0 1
Freiwillige Erhöhung des Levels für Studenten, die sich mit dieser Aufgabe unterfordert fühlen
Es ist noch eine zweite Basis c einzulesen. Für b und c gelte 1< b,c<=30. Die Zahl soll dann im Zahlensystem c eingelesen werden.

Mein Code sieht derzeit folgendermasen aus:

Code:
#include <iostream>


int main() 
{
	int basis(0); //Variable für die Basis
	int zahl(0);




	cout << "Praktikum 3.2 - Stephan Liebig und Maurice Bergander" << endl;
	cout << "--------------------------------------------------------------------" << endl;
	cout << "  Geben Sie die Basis ein zwischen 1 und 10 ein:" << endl;
	cout << "    Ihre Eingabe: ";
	cin >> basis;
	cout << "\n  Geben Sie jetzt noch eine Zahl ein, die mit der Basis dargestellt werden soll: ";
	cout << "\n    Ihre Eingabe: ";
	cin >> zahl;
	
	cout << endl;
	cout << "Die Zahl " << zahl << " wird mit der Basis " << basis << " dargestellt:" << endl;
	cout << basis_wert; //Das soll die Variable sein, in der meine Zahl steht?


	return 0;


Wie soll ich genau den Modulo operator verwenden, dass ich eine Binäre zahl bekomme?
 
Ganz einfach
http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
dort kann man sich das genau erklaeren lassen :D

Bsp:
Die Dezimalzahl 546 wird ins 2er-System umgewandelt

Gehe nach folgendem Verfahren vor:
(1) Teile die Zahl mit Rest durch 2.
(2) Der Divisionsrest ist die nächste Ziffer (von rechts nach links).
(3) Falls der (ganzzahlige) Quotient = 0 ist, bist du fertig,
andernfalls nimm den (ganzzahligen) Quotienten als neue Zahl
und wiederhole ab (1).

546 : 2 = 273 Rest: 0
273 : 2 = 136 Rest: 1
136 : 2 = 68 Rest: 0
68 : 2 = 34 Rest: 0
34 : 2 = 17 Rest: 0
17 : 2 = 8 Rest: 1
8 : 2 = 4 Rest: 0
4 : 2 = 2 Rest: 0
2 : 2 = 1 Rest: 0
1 : 2 = 0 Rest: 1

Resultat: 1000100010
 
Okay, das hab ich soweit verstanden... jetzt könnte es noch an der Umsetzung in C++ scheitern ^^

[edit]

C++:
#include <iostream>
using namespace std;

int main() 
{
	int basis(0); //Variable für die Basis
	int zahl(0);
	int i=8;
	int dualzahl[7];
	int ergebnis;


	cout << "Praktikum 3.2 - Stephan Liebig und Maurice Bergander" << endl;
	cout << "--------------------------------------------------------------------" << endl;
	cout << "  Geben Sie die Basis zwischen 1 und 10 ein:" << endl;
	cout << "    Ihre Eingabe: ";
	cin >> basis;
	cout << "\n  Die Zahl, die dargestellt werden soll: ";
	cout << "\n    Ihre Eingabe: ";
	cin >> zahl;
	
	cout << endl;
	cout << "Die Zahl " << zahl << " wird mit der Basis " << basis << " dargestellt:" << endl;
	for(i; i>=0; i--)
	{
		ergebnis = (zahl/basis);
		dualzahl[i] = 
	}
	for(int j=0; j<=7; j++) 
	{ 
		cout << dualzahl[j];
	}
	system("Pause");


	return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
C++:
for(i; i>=0; i--)
	{
		ergebnis = zahl%basis;
		dualzahl[i] = ergebnis;
	}

Bei Zahl 11 und Basis 3 kommt bei mir dann raus:

2 ... klar ... 11:3 = 9 Rest 2
 
Zuletzt bearbeitet von einem Moderator:
C++:
for(i; i>=0; i--)
	{
		rest = zahl%basis;
		zwischenergebnis = zahl/basis;
		dualzahl[i] = rest;
		zahl = zwischenergebnis;
	}

Das scheint ja schonmal ganz gut zu sein, bei der Zahl 10 und Basis 2 macht er es auch, aber bei 11 zur Basis 3 nicht so richtig
 
Zuletzt bearbeitet von einem Moderator:
Wie kommst du denn auf i? Du weisst doch im vorneherein nicht, wie oft der Teilen muss um auf das Zwischenergebnis 0 zu kommen?!
Daher wuerde ich dir eine while-Schleife empfehlen, die solange laeuft bis das Zwischenergebnis 0 ist.
 
Machs doch einfahc folgendermaßen:

Pseudocode:

Einlesen von Zeichenkette

Arbeite mit Zeichen x aus Zeichenkette

Überprüfe Bit x von 8 Bits ( 0-7 )
Wenn Bit gesetzt, gib 1 aus, andernfalls 0 für nicht gesetzt
Erhöhe Bit
Wiederhole Bit überprüfung bis alle Bits überprüft

Überprüfe nächstes Zeichen
Ende Pseudocode

Schau dir mal die Bit-Operationen an ; - ).
 
Machs doch einfahc folgendermaßen:

Pseudocode:

Einlesen von Zeichenkette

Arbeite mit Zeichen x aus Zeichenkette

Überprüfe Bit x von 8 Bits ( 0-7 )
Wenn Bit gesetzt, gib 1 aus, andernfalls 0 für nicht gesetzt
Erhöhe Bit
Wiederhole Bit überprüfung bis alle Bits überprüft

Überprüfe nächstes Zeichen
Ende Pseudocode

Schau dir mal die Bit-Operationen an ; - ).

Das würde aber nur bei dem Dualzahl-System funktionieren. Wenn ich ihn jetzt nicht
falsch vertsanden habe möchte er aber, dass die Zahl in ein beispielsweise
Dreierzahl-System(max 3 an jeder stelle) ungewandelt wird, was auch immer
eingegeben wird. Das würde dann so nicht funktionieren. Außerdem, wenn er nur
die Bits überprüft, hätte er nicht seine Aufgabe(modulo benutzen) erfüllt.

Hier mein vorschlag an code, da du das mit dem modulo anscheinend schon
verstanden hast wird das hier wohl nicht zu viel hilfe sein:
C++:
        /* Calc down to zero */
        while (Number > 0)
        {
            Rest = Number % CalcBase;
            /* itoa, Rest = number to conv, new char[10] = char buffer to put number str, 10 = 0-9 number system */
            RestStr = itoa(Rest, new char[10], 10);
            Number2 = RoundDown((double)Number / (double)CalcBase);

            /* Rest greater 9? Don't add the Rest, add a letter (big letters in ASCII table starts at 65, so here we start with letters up from 9 so 55 + 10 = first letter 'A') */
            if (Rest > 9)
                NewNumStr += (char)(Rest + 55);            
            else
                NewNumStr += RestStr;

            delete[] RestStr;

            #ifdef _DEBUG
                std::cout << "Number: " << Number << "\tNumber2: " << Number2 << "\tRest: " << Rest << std::endl;
            #endif

            Number = Number2;
        }
 
Zuletzt bearbeitet:
Zurück