007
11.04.2003, 09:52 Uhr
Chillmaster
|
Naja, war gestern doch zu spät. Habs eben schnell zusammengeschustert und auch gleich nen kleinen Objektorientierten Ansatz miteingebaut :)
Ich glaub der Quelltext is nicht sehr übersichtlich, aber ihr werdet euch da schon durchwursteln ;)
C++: |
#include <iostream.h> #include <conio.h> #include <string.h>
enum BASIS {BIN=2, OCT=8, DEZ=10, HEX=16}; class DeziFun { public: // Konstruktoren DeziFun (unsigned long dezZahl): itsInt(dezZahl) { }; // INLINE DeziFun (unsigned long dezZahl, BASIS basis, unsigned short initGroup = 4); ~DeziFun() { delete[] endString; }; // INLINE
// Zugriffsfunktionen unsigned long GetInt() const { return itsInt; }; char * GetString() const { return endString; }; void NewBasis (BASIS newBasis, unsigned short newGroup = 4);
private: void WandelUm();
unsigned long itsInt; BASIS itsBasis; unsigned short itsGroup; char * endString;
};
DeziFun::DeziFun(unsigned long dezZahl, BASIS basis, unsigned short group): itsInt(dezZahl), itsBasis(basis), itsGroup(group), endString(0) { WandelUm(); }
void DeziFun::WandelUm() { delete [] endString;
const int MaxLaenge = 70; char tmpStr[MaxLaenge]; unsigned long tmpInt; int i, aktLaenge, rest[MaxLaenge];
if ( (itsBasis > 16) || (itsBasis < 0) ) itsBasis = 16;
for ( i=0; i<MaxLaenge; i++) { tmpStr[i] = ' '; rest[i] = -1; } tmpStr[i] = '\0';
// endString setzen tmpInt = itsInt; for ( i=0; tmpInt != 0; tmpInt /= itsBasis, i++ ) rest[i] = ( tmpInt % itsBasis ); for (; ( i % itsGroup ) != 0; i++ ) rest[i] = 0;
for ( short j = 0, i = MaxLaenge - 1; i >= 0; j++, i-- ) switch ( rest[i] ) { case -1: break; case 10: tmpStr[j] = 'A'; break; case 11: tmpStr[j] = 'B'; break; case 12: tmpStr[j] = 'C'; break; case 13: tmpStr[j] = 'D'; break; case 14: tmpStr[j] = 'E'; break; case 15: tmpStr[j] = 'F'; break; default: tmpStr[j] = char( rest[i] + 48 ); } for (i=0; rest[i] != -1; ) i++; aktLaenge = i+1; endString = new char[aktLaenge + (aktLaenge / itsGroup) + 1 ]; for (short j=0, i=0; i < aktLaenge; j++, i++) { if ( (i % itsGroup == 0) && i ) { endString[j] = ' '; j++; } endString[j] = tmpStr[MaxLaenge-aktLaenge+1+i]; } endString[aktLaenge+1] = '\0'; }
void DeziFun::NewBasis (BASIS newBasis, unsigned short newGroup) { itsBasis = newBasis; itsGroup = newGroup; WandelUm(); }
// ********** RAHMENPROGRAMM *************** int main() { unsigned long dez; cout << "Bitte eine Dezimalzahl eingeben, welche umgewandelt werden soll: "; cin >> dez; DeziFun * Zahl1 = new DeziFun(dez, BIN, 8); cout << "\n\nBinaer:\t\t" << Zahl1->GetString() << endl; Zahl1->NewBasis(OCT, 2); cout << "\nOktal:\t\t" << Zahl1->GetString() << endl; Zahl1->NewBasis(DEZ, 3); cout << "\nDezimal:\t" << Zahl1->GetString() << endl; Zahl1->NewBasis(HEX, 4); cout << "\nHexadezimal:\t" << Zahl1->GetString() << endl;
getch(); return 0; }
|
Das Programm wandelt mittels Klassen Dezimalzahlen in Zahlen von der Basis 2 - 16 um. -- With Great Power Comes Great Responsibility Dieser Post wurde am 11.04.2003 um 09:56 Uhr von Chillmaster editiert. |