# In Römische Zahlen umwandeln



## Eyian (9. Nov 2011)

Hallo Forum, 
Hab vor kurzem mit einem Wirt.Informatikstudium angefangen und habe zu einer Aufgabe eine Frage.
Bin schon einige Tage im Netz unterwegs und habe mir verschiedene Antworten angeguckt und versucht zu verstehen ( wenn mal eine dieser Antworten funktionierte) :ALSO ICH BIN NICHT ZU BLÖD UM ZU GOOGLEN !!!
Und ich bin auch niemand der nicht in der Uni aufpasst, mir macht das alles Spass und bin da auch begeistert. Nur leider ist unser Tutor nicht das gelbe vom Ei -.- (erstes Jahr tutor und prog erst seit einem Jahr).

So jetzt zur eigentlichen Aufgabe es geht um  einen selbst erstellten Taschenrechner der statt arabische Zahlen (1,2,3,....) römische Zahlen ausgeben soll (I,II,III...).
So den Taschenrechner hab ich aber scheiter generell daran eine normale Zahl in eine römische 
Zahl zu wandeln. (Und wie gesagt hab mir ziemlich viel im Netz angeschaut was mir nicht geholfen hat wills im Prinzip so einfach wie möglich ) Habe mir gedacht das ich einfach mit einer if funktion oder switch funktion die Zahl umwandel.
Hier mein Ansatz:



```

```
package Taschenrechner;

public class RömischeZahlen {


	public static void main(String[] args) {
		String romZahlen = "II";
		int x=2;

			if (x=2)
			x=romZahlen;
		else
			x = ERROR;



		System.out.print(x);
	}

}

(irgendwas stimmt auch nciht mit meiner IF funktion -auch da habe ich noch keine Erfahrung und habe mein gesamtes if wissen aus dem Netz  )

So hätte ich ja eigentlich x = II rausbekommen müssen.
Bin erst in der 2ten Woche Info und arbeite mit eclipse fals das irgendwie von belang ist.

Vielen Dank und Gruß


----------



## Evil-Devil (9. Nov 2011)

Naja, was an deinem IF nicht stimmt ist offensichtlich.

Bei einem Vergleich benötigst du den Vergleich Operator == und nicht den Zuweisung Operator =.

Deine falsche Zeile würde korrekt wie folgt lauten: if (x == 2)


Zur Umwandlung der Arabischen Zahlen nach Römisch würde ich wohl versuchen die größte Zahl zu ermitteln die mit einer römischen Zahl direkt dargestellt werden kann und dann mit dem verbliebenen Rest das selbe Spielchen wiederholen bis die Zahl komplett umgewandelt dasteht.

ↂ > ↁ > M > D >  C > L > X > V > I


----------



## timbeau (9. Nov 2011)

Und dabei nicht die IX, IV, oder sowas ekliges wie XLIX (49) vergessen...



Denke man kann auch dann VIIII schreiben.


----------



## langhaar! (9. Nov 2011)

EDIT: zu spät; wurde alles schon genannt ueh:


----------



## Eyian (9. Nov 2011)

Also wenn ich einmal geschafft habe die römische zahl auszugeben dachte ich an etwas wie eine Schleife  also x++ break bei 5000 und dann geb ich einzelnd ein was v x c m etc ist hatte mir sowas in der art dann gedacht 

Koders Code Search: RomanNumbers.java - Java

nur muss erstmal die if funktion funktionieren ... 

bin jetzt soweit


```
package Taschenrechner;

public class RömischeZahlen {

 
	public static void main(String[] args) {
		String romZahlen = "II";
		int x=2;
		
		if (x==2)
			x=romZahlen;
		else
			x == "ERROR";
		
		
		
		System.out.print(x);
	}

}
```

mache immer noch einen fehler ...


Vielen dank für die schnellen antworten

@Langharr
Mit einem Buch fang ich am Wochende an ^^


----------



## timbeau (9. Nov 2011)

Wie bringst du dir denn Java bei? Von vorne bis hinten grausamst!

int x = String   :shock:

else int == "String"


WTF?


----------



## Firephoenix (9. Nov 2011)

Eine genauere spezifikation des Programms das herauskommen soll würde auch nicht schaden.

Ein Taschenrechner der Römisch ausgibt kann ja viel bedeuten...

Erfolgt die Eingabe römisch oder dezimal?
Welche Rechenarten müssen umgesetzt werden?
Muss sichergestellt werden, dass die eingebene römische / dezimale zahl gültig ist?

Dann besteht hier definitiv Nachholbedarf bei dem Grundsyntax von Java (Variablendeklarationen, Typzuweisungen, Vergleiche, Objekte, Methodenaufrufe, Methodendeklarationen usw).

Gruß


----------



## Eyian (9. Nov 2011)

mit int x wollte ich sagen es gibt ein x das  2 ist 
dann wollte ich schreiben wenn x = 2 ist soll der II ausgeben. 
Ist meine Denkweise falsch ???


----------



## Eyian (9. Nov 2011)

Aufgabe 1: Der kleine Taschenrechner - Die Bedingung (Teil 1)
Die römischen Kaiserin Aggripina ist durch die Zeit gereist und in Ihrer Geburtsstadt Köln (ehemals 
Colonia Claudia Ara Aggripinensum) gelandet. Sie hat leider das Problem, dass Sie nur römische
Zahlen versteht, jedoch ist hier und heute fast alles in arabischen Zahlen beschriftet. Können Sie ihr
helfen?
Erweitern Sie ihren Taschenrechner, so dass er eine arabische Zahl als Eingabe erwartet, diese in die
entsprechende römische Zahl umrechnet und auf dem Bildschirm ausgibt. Falls Sie Probleme bei 
der Umwandlung haben, informieren Sie sich im Internet über bekannte Umwandlungsverfahren.
Verwenden Sie vereinfacht keine Subtraktionsmethode (z.B. IV), sondern schreiben maximal vier
gleiche Zeichen hintereinander (z.B. IIII), wobei M das größte unterstütze Zeichen sein soll. Die
eingegebene arabische Zahl muss kleiner als 5000 sein, da sie sonst nicht umgewandelt werden
kann.


Das steht soweit in der aufgabe ^^


----------



## timbeau (9. Nov 2011)

Mal umgangssprachlich formuliert:

Du sagst, dass du beim McDoof einen Hamburger möchtest. Wenn du den Hamburger dann bekommst checkst du ob es ein Hamburger ist (McDoof macht keine Fehler!) und sagst der Hamburger ist jetzt ein Mercedes. 

Solltest du aber einen Cheeseburger erhalten haben (McDoof macht aber keine Fehler [int x = 2, dann ist x = 2!]) sagst du, der Nichthamburger ist jetzt ein BMW.

Als Tip: 

Map oder 2dimensionales Array mit Zuweisung von Römischen Strings zu den entsprechenden Integern!

Und fang mit dem Buch HEUTE an!

Und nein, du hast nicht nur keine Ahnung von if, sondern keine Ahnung von deinem Algorithmus und vor allem keine Ahnung von Java. Glaubs mir und tu was dagegen.


----------



## Eyian (9. Nov 2011)

Aber wie gesagt glaube ich bruache nur die if funktion zu verstehen dann weis ich auch wie es weiter geht ^^... hoffe ich


----------



## Gast2 (9. Nov 2011)

Syntaktisch korrekt wäre dein Programm so:

```
String rom = "";
int x = 2;
if (x == 2) {
  rom = "II";
else {
  System.out.println("keine ahnung");
}
```
Die If Abfrage ist hier natürlich total fehl am platz, x ist an der Stelle immer 2.


----------



## Eyian (9. Nov 2011)

Danke Eike, 
Warum gibt er immer 2 aus sollte ich die switch funk nutzen ???
Dachte das wäre das selbe wie d if funk nur übersichtlicher


----------



## Asgar13 (9. Nov 2011)

```
int eingabe = 1001
int abbruch = 0;

[code=Java]while(abbruch > 0){
  if ((eingabe/1000)>=1){
  System.out.print("M");
  eingabe= eingabe-1000;
}else{
  abbruch++;
}
}
```

Den Rest kannst du selbst.


----------



## Firephoenix (9. Nov 2011)

```
String rom = ""; //Leeren String rom erzeugen
int x = 2; //Setze x auf Wert 2
if (x == 2) { //Wenn x gleich 2
  rom = "II"; //Setze rom auf "II"
else { //Ansonsten
  System.out.println("keine ahnung"); //Gebe keine Ahnung aus
}
```

Du setzt einen Wert auf 2, und prüfst direkt dannach ob er 2 ist - warum aslo kommt immer "II" raus? :rtfm:


----------



## timbeau (9. Nov 2011)

int x = 2

if(x == 2) ...

Was soll denn x anderes sein als 2? 

Weil mir langweilig ist:


```
List<Integer> werte = new ArrayList<Integer>();
		werte.add(1000);
		werte.add(500);
		werte.add(100);
		werte.add(50);
		werte.add(10);
		werte.add(5);
		werte.add(1);
		
		List<String> roem = new ArrayList<String>();
		roem.add("M");
		roem.add("D");
		roem.add("C");
		roem.add("L");
		roem.add("X");
		roem.add("V");
		roem.add("I");

		int eingabe = 4389;
		int[] ausgabe = new int[7];
		for (int i = 0; i < ausgabe.length; i++) {
			// System.out.println("werte:" + werte.get(i));
			ausgabe[i] = eingabe / werte.get(i);
			// System.out.println("ausgabe[" + i + "]: " + ausgabe[i]);
			eingabe = eingabe % werte.get(i);
		}

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < ausgabe.length; i++) {
			for (int j = 0; j < ausgabe[i]; j++) {
				sb.append(roem.get(i));
			}
		}

		String ergebnis = "MMMMCCCLXXXVIIII";
		System.out.println(sb.toString());
		System.out.println("Wahr? " + sb.toString().equals(ergebnis));
```


----------



## Eyian (9. Nov 2011)

Vielen dank für eure Antworten!

@Firephoenix

mein eclips erkennt kein "List" ??

und was bedeutet diese Aussage ?


----------



## timbeau (9. Nov 2011)

importier mal java.util.List;

Schönen Feierabend noch...


----------



## Eyian (9. Nov 2011)

Kommt immernoch diese Fehlermeldung


	ArrayList cannot be resolved to a type


----------



## Eyian (9. Nov 2011)

ach hat sich erledigt hätte noch die array importieren sollen ... beschäftige mich schon zulange damit
 danke


----------



## turtle (9. Nov 2011)

Mir war auch langweilig

```
public class A {
	public static void main(String[] args) {
		List<RoemischeZahlen> werte = new ArrayList<RoemischeZahlen>();
		werte.add(new RoemischeZahlen(1000, "M"));
		werte.add(new RoemischeZahlen(900, "CM"));
		werte.add(new RoemischeZahlen(500, "D"));
		werte.add(new RoemischeZahlen(400, "CD"));
		werte.add(new RoemischeZahlen(100, "C"));
		werte.add(new RoemischeZahlen(90, "XC"));
		werte.add(new RoemischeZahlen(50, "L"));
		werte.add(new RoemischeZahlen(40, "XL"));
		werte.add(new RoemischeZahlen(10, "X"));
		werte.add(new RoemischeZahlen(9, "IX"));
		werte.add(new RoemischeZahlen(5, "V"));
		werte.add(new RoemischeZahlen(4, "IV"));
		werte.add(new RoemischeZahlen(1, "I"));

		int eingabe = 1984; //--> MCMLXXXIV
		StringBuilder builder = new StringBuilder();
		while (eingabe > 0) {
			for (RoemischeZahlen roemischeZahlen : werte) {
				int x = eingabe - roemischeZahlen.getWert();
				if (x >= 0) {
					eingabe = x;
					builder.append(roemischeZahlen.getText());
					break;
				}
			}
		}
		System.err.println(builder.toString());
	}
}

class RoemischeZahlen {
	private int wert;
	private String text;

	public RoemischeZahlen(int wert, String text) {
		this.wert = wert;
		this.text = text;
	}

	public int getWert() {
		return wert;
	}

	public void setWert(int wert) {
		this.wert = wert;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

}
```


----------



## Eyian (9. Nov 2011)

Schaue mir heute abend nochmal alles genauer an shconmal vielen dank vorab !!!!!


----------



## Andi_CH (10. Nov 2011)

timbeau hat gesagt.:


> Und dabei nicht die IX, IV, oder sowas ekliges wie XLIX (49) vergessen...


Ich habe gelernt, dass das schlicht falsch sei und IL heisse - wikipedia sagt was anderes ...
L scheint sowieso eine Ausnahme zu sein



timbeau hat gesagt.:


> Denke man kann auch dann VIIII schreiben.


Nein, das ist falsch, genau so wie das auf Kirchenturmuhren verbreitet IIII für 4 falsch ist.

Forumssuche: "römische zahlen"

da und da und ...

Noch etwas konkretes das während einem früheren Thread entstanden ist - es ist zu lange her, als das ich noch Details weiss ...


```
/*
Zeichen 	I 	V 	X 	L 	C 	D 	M
Wert 		1 	5 	10 	50 	100 	500 	1000
 */

public class RoemischeZahl {

	private String mRom;

	public RoemischeZahl (String rom){
		if ((rom != null) && isValid(rom))
			mRom = rom.toUpperCase();
		else
			throw new NumberFormatException(rom + "ist not a valid number");
	}
	
	public RoemischeZahl (int value) {
		mRom = "";
		toRom(value);
		optimize();
	}

	public String optimize() {
		mRom = mRom.replace("VIIII", "IX");
		mRom = mRom.replace("IIII",  "IV");
		mRom = mRom.replace("LXXXX", "XC");
		mRom = mRom.replace("XXXX",  "XL");
		mRom = mRom.replace("DCCCC", "CM");
		mRom = mRom.replace("CCCC",  "CD");
		return mRom;
	}

	public String toRom(int number) {
		while (number > 0) {
			if (number  >=  1000) {
				mRom += "M";
				number  -=  1000;
			}
			else if (number  ==  900) {
				mRom  +=  "CM";
				number  -=  900;
			}
			else if (number  >=  500  &&  number < 1000) {
				mRom  +=  "D";
				number  -=  500;
			}
			else if (number  ==  400) {
				mRom  +=  "CD";
				number  -=  400;
			}
			else if (number  >=  100  &&  number < 500) {
				mRom += "C";
				number -= 100;
			}
			else if (number == 90) {
				mRom += "XC";
				number -= 90;
			}
			else if (number >= 50 && number < 100) {
				mRom += "L";
				number -= 50;
			}
			else if (number == 40) {
				mRom += "XL";
				number -= 40;
			}
			else if (number >= 10 && number < 50) {
				mRom += "X";
				number -= 10;
			}
			else if (number == 9) {
				mRom += "IX";
				number -= 9;
			}
			else if (number >= 5 && number < 9) {
				mRom += "V";
				number -= 5;
			}
			else if (number == 4) {
				mRom  +=  "IV";
				number -= 4;
			}
			else if (number >= 1 && number < 4) {
				mRom += "I";
				number -= 1;
			}
		}
		return mRom;
	}

	private static boolean valid(char c) {
		switch (c) {
		case 'I':
		case 'V':
		case 'X':
		case 'L':
		case 'C':
		case 'D':
		case 'M':
			return true;
		default:
			return false;
		}
	}

	public static boolean isValid(String str) {
		if ((str==null)||(str.length()<1))
			return false;
		for (int i=0; i<str.length(); i++)
			if (!valid(str.charAt(i)))
				return false;
		int max = value(str.length()-1, str);
		if (str.length()<2)
			return true;
		for (int i=str.length()-2; i>=0; i--) {
			int val = value(i, str);
			int nVal = value(i+1, str);
			if (val>=max) {
				max = val;
			} else {
				switch (val) {
				case 1:
					if (!((nVal==5) || (nVal==10)))
						return false;
					break;
				case 10:
					if (!((nVal==50) || (nVal==100)))
						return false;
					break;
				case 100:
					if (!((nVal==500) || (nVal==1000)))
						return false;
					break;
				default:
					return false;
				}
			}
		}
		return true;
	}

	private static int value (int i, String str) {
		return value(str.charAt(i));
	}

	private int value (int i) {
		return value(mRom.charAt(i));
	}

	private static int value(char c) {
		switch (c) {
		case 'I':
			return 1;
		case 'V':
			return 5;
		case 'X':
			return 10;
		case 'L':
			return 50;
		case 'C':
			return 100;
		case 'D':
			return 500;
		case 'M':
			return 1000;
		}
		throw new NumberFormatException("Invalid Digit " + c + "in roman number");
	}

	public int convert() {
		int result = 0;
		for (int i=mRom.length()-1; i >=0 ; i--) {
			int val = value(i);
			if (i < mRom.length()-1) {
				int nextVal = value(i+1);
				if (val<nextVal) {
					result -= val;
				} else {
					result += val;
				}
			} else {
				result = val;
			}
		}
		return result;
	}
	
	@Override
	public String toString() {
		return mRom;
	}
}
```

und das Test-Hauptprogramm


```
public class RomZa {

	private static RoemischeZahl romZ = null;

	public static void inst(String str) {
		try {
			romZ = new RoemischeZahl(str);
		} catch (NumberFormatException e) {
			System.out.println("Exception");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args){
		for (int i = 40; i<=100; i++) {
			romZ = new RoemischeZahl(i);
			System.out.println(i + " = " + romZ);
		}
		//		inst (null);
		//		inst("");
		//		inst(" ");
		//		inst("i");
		//		inst("I");
		//		inst("IA");
		//		inst("MDCLXVI");
		//		System.out.println(romZ.convert());
		inst("CMCDXCXLIXIV");
		System.out.println(romZ.convert());
		inst("MCDXLIII");
		System.out.println(romZ);
		romZ = new RoemischeZahl(1443);
		System.out.println(romZ);
		//		Scanner input = new Scanner(System.in);
		//		System.out.println("Please enter number: ");
		//		int z = input.nextInt();
		//		Converter c = new Converter(z);
		//		System.out.println(c.convert());
		//		System.out.println("Please enter roman number: ");
		//		input.nextLine();
		//		String y = input.nextLine();
		//		BackConverter b = new BackConverter(y);
		//		System.out.println(b.convert());
	}
}
```


----------



## Landei (10. Nov 2011)

"Falsch" und "richtig" ist hier relativ. Man findet alle möglichen Varianten auf historischen Dokumenten. Heutzutage ist üblich, dass man vier Zeichen hintereinander vermeidet, und stattdessen die Subtraktionsregel heranzieht, und zwar in der Form IV für 4 und IX für 9.


----------



## Andi_CH (10. Nov 2011)

ok ok - 1:0 für dich - aber du schreibst und sprichst auch nicht mehr Altdeutsch obwohl es immer noch richtig wäre ;-)

So wie es da bei wikipedia bescheiben ist, ist es noch komplizierter

IL, VC, IC, XM, IM -> nicht zulässig - aber was ist die Regel?
Wenn nur die nächst kleinere Zahl  subtrahiert werden dürfte, wäre auch IX nicht zulässig.

Tja - Probleme die die heutige Welt nicht all zu sehr bewegen ;-)


----------



## langhaar! (10. Nov 2011)

Andi_CH hat gesagt.:


> aber du schreibst und sprichst auch nicht mehr Altdeutsch obwohl es immer noch richtig wäre



Bei einem ohnehin veraltetem Darstellungssystem von falsch oder richtig zu sprechen, wenn die Darstellung in verschiedenen Epochen unterschiedlich war, halte ich für sehr fragwürdig.

Ist aber auch egal. Die Aufgabe des TE ist genau spezifiziert und soll ohne Subtraktionsregel erfolgen:
http://www.java-forum.org/hausaufgaben/126858-roemische-zahlen-umwandeln.html#post824170

Ich habe auch gelernt, dass z.B. VIIII falsch sei, habe mich aber bei Wikipedia eines besseren belehren lassen.


----------



## swimmy2103 (22. Sep 2017)

Der Thread ist zwar schon veraltet, aber Dezimalzahlen in Römische Zahlen umzuwandeln ist sicherlich eine recht populäre Aufgabe. Vielleicht stößt ja so jemand hierauf, der noch einen anderen interessanten Ansatz sucht:

http://mathematik-kapiert.de/roemische-zahlen-umrechnung/

Die 33 möglichen Bausteine werden zunächst in einem Array oder ähnlichem abgelegt (statt IX kann man dort natürlich auch VIIII ablegen, falls man die Subtarktionsregel nicht mag ).
Anschließend muss man nur noch stellenweise durch die Dezimalzahl iterieren und die zugehörigen Bausteine zusammensetzen.

So hat es der Kollege offenbar auch programmiert:
mathematik-kapiert.de/roemische-zahlen-onlinerechner/


----------

