000
05.06.2005, 14:28 Uhr
~Steffi
Gast
|
Hi, hat jemand von Euch eine Ahnung, wie diese Programm in Java geschrieben wird???:
C++: |
#include <iostream> #include <sstream> #include <string> #include <cctype> using namespace std;
class RomanDigit { public: const string decimalToRoman(unsigned int decDigit) throw(); const string romanToDecimal(const string& romDigit) throw(); private: unsigned int computeDecimalValue(const string& romDigit) throw(); };
//Eine Dezimalzahl in eine römische Zahl umrechnen. const string RomanDigit :: decimalToRoman(unsigned int decDigit) throw() { stringstream ss; //Bereich überprüfen if(decDigit < 1 || decDigit > 3999) { ss << "Valide range is 1 - 3999" << "\n" << "Not: " << decDigit << "\n"; return ss.str(); } //1000sender abarbeiten(max 3). while(decDigit >= 1000) { ss << "M"; decDigit -= 1000; } //Es kann max. einen 500er geben. if(decDigit >= 500) { ss << "D"; decDigit -= 500; } //Es kann nur drei gleiche Buchstanben hintereinander geben. //Also 500 weniger 100 = 400 if(decDigit >= 400) { ss << "CD"; decDigit -= 400; } else { //Max. dreimal while(decDigit >= 100) { ss << "C"; decDigit -= 100; } } //Es kann max. einen 50er geben. if(decDigit >= 50) { ss << "L"; decDigit -= 50; } //Es kann nur drei gleiche Buchstanben hintereinander geben. //Also 50 weniger 10 = 40 if(decDigit >= 40) { ss << "XL"; decDigit -= 40; } else { //Max. dreimal while(decDigit >= 10) { ss << "X"; decDigit -= 10; } } //Es kann max. einen 5er geben. if(decDigit >= 5) { ss << "V"; decDigit -= 5; } //Es kann nur drei gleiche Buchstanben hintereinander geben. //Also 5 weniger 1 = 4 if(decDigit == 4) { ss << "IV"; decDigit -= 4; //dann Null (obsolet) } else { //Max. dreimal while(decDigit > 0) { ss << "I"; --decDigit; } } return ss.str(); }
//Eine römische Zahl in einen Dezimalwert umrechnen. const string RomanDigit :: romanToDecimal(const string& romDigit) throw() { if(romDigit.size() == 0) return string("Digit is emty, when it should not be!"); stringstream ss; //Es wird hier noch nicht die richtige Reihenfolge der römischen Lettern geprüft, //sondern nur ob die Lettern existieren . //Vielleicht implemetiert ich den Reihenfolgecheck noch, mal sehen. for(unsigned int i = 0; i < romDigit.size(); ++i) { if(romDigit[i] != 'M' && romDigit[i] != 'D' && romDigit[i] != 'C' && romDigit[i] != 'L' && romDigit[i] != 'X' && romDigit[i] != 'V' && romDigit[i] != 'I') { ss << "Invalide roman digit: " << romDigit << "\n" << "Error at: " << i << " (" << romDigit[i] << ")" << "\n"; ss << "Use M = 1000, D = 500, C = 100, L = 50, X = 10, V = 5, i = 1\n"; return ss.str(); } } //Umrechnen unsigned int decValue = computeDecimalValue(romDigit); ss << decValue; //Integer in einen String umwandeln. //Alles korrekt return ss.str(); }
unsigned int RomanDigit :: computeDecimalValue(const string& romDigit) throw() { unsigned int decValue = 0; unsigned int pos = 0; while(pos < romDigit.size() && romDigit[pos] == 'M') { decValue += 1000; ++pos; }
if(pos < romDigit.size() && romDigit[pos] == 'D') { decValue += 500; ++pos; } //Eine Position vorgreifen, wegen möglicher umgekehrter Notation. if(pos + 1 < romDigit.size() && romDigit[pos + 1] == 'D') { decValue += 400; pos += 2; } else { while(pos < romDigit.size() && romDigit[pos] == 'C') { decValue += 100; ++pos; } } if(pos < romDigit.size() && romDigit[pos] == 'L') { decValue += 50; ++pos; } if(pos + 1 < romDigit.size() && romDigit[pos + 1] == 'L') { decValue += 40; pos += 2; } else { while(pos < romDigit.size() && romDigit[pos] == 'X') { decValue += 10; ++pos; } } if(pos < romDigit.size() && romDigit[pos] == 'V') { decValue += 5; ++pos; } if(pos + 1 < romDigit.size() && romDigit[pos + 1] == 'V') { decValue += 4; pos += 2; //obsolet } else { while(pos < romDigit.size() && romDigit[pos] == 'I') { decValue += 1; ++pos; } } return decValue; }
int main(int argc, char *args[]) { RomanDigit rD; if(argc < 2) cout << "Not enough Arguments!"; else if(isdigit(args[1][0])) cout << rD.decimalToRoman(atoi(args[1])); else cout << rD.romanToDecimal(args[1]); return 0; }
//oder das hier:
#include <string> std::string arab2roman(int x) { if(x < 1 || x > 3999) throw(x); //nicht darstellbar
static const char *rom_strings[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; static const int rom_values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; std::string ret; for(int i = 0; x != 0; ++i) while(x >= rom_values[i]) { x -= rom_values[i]; ret += rom_strings[i]; }
return ret; }
|
Vielen Dank für Eure Hilfe! alles liebe, Steffi Dieser Post wurde am 05.06.2005 um 21:21 Uhr von Windalf editiert. |