Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » RomanToDecimal in Java????

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.06.2005, 21:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Die Syntax von Java und C++ ist ja nicht gerade so sehr grundverschieden. Wir sind hier kein Hausaufgabenforum...
Du brauchst das mehr doer weniger nur 1:1 abschreiben. Musst doch nur mal überlegen was für ein Prinzip dahinter steckst... Wenn du an einer konkreten Stelle nicht weiterkommst oder eine spezielle Frage hast bekommst du hier auch ne Antwort aber einfach so ein wer schreibt mir mal das Programm wo du mehr oder weniger schon selber ne Lösung gefunden hast ist ein bisschen zu billig...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.06.2005, 12:41 Uhr
(un)wissender
Niveauwart


Wow, das ist mein Programm (das obere), uralt und sehr umständlich, aber schön.
Also, Steffi, wenn du das nicht in Java portiert bekommst (oder es noch nicht einmal versuchst), bekommst du hier sicherlich keine Hilfe. Einfacher geht es kaum noch.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.06.2005, 21:04 Uhr
0xdeadbeef
Gott
(Operator)


Heh. Und der untere Teil des Codes ist meins. Ich geb die arabisch nach römisch-Konvertierung mal vor:

C++:
class RomanConverter {
    private static final int[] ROM_NR_ARRAY = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    private static final String[] ROM_STRING_ARRAY = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

    public static String getRomanValue(int x) throws IllegalArgumentException {
        if(x <= 0 || x >= 4000)
            throw new IllegalArgumentException("x out of range");

        StringBuffer sb = new StringBuffer();

        for(int i = 0; x != 0; ++i) {
            while(x >= ROM_NR_ARRAY[i]) {
                x -= ROM_NR_ARRAY[i];
                sb.append(ROM_STRING_ARRAY[i]);
            }
        }

        return sb.toString();
    }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: