In Römische Zahlen umwandeln

Eyian

Mitglied
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:


Java:
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 :D )

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ß
 
Zuletzt bearbeitet:

Evil-Devil

Top Contributor
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

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

:)

Denke man kann auch dann VIIII schreiben.
 

Eyian

Mitglied
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

Java:
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 ^^
 
F

Firephoenix

Gast
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

Mitglied
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

Mitglied
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

Gesperrter Benutzer
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.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Syntaktisch korrekt wäre dein Programm so:
Java:
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

Mitglied
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

Bekanntes Mitglied
Java:
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.
 
F

Firephoenix

Gast
Java:
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

Gesperrter Benutzer
int x = 2

if(x == 2) ...

Was soll denn x anderes sein als 2?

Weil mir langweilig ist:

Java:
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));
 

turtle

Top Contributor
Mir war auch langweilig
Java:
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;
	}

}
 

Andi_CH

Top Contributor
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

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 ...

Java:
/*
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

Java:
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());
	}
}
 
Zuletzt bearbeitet:

Landei

Top Contributor
"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

Top Contributor
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 ;-)
 
Zuletzt bearbeitet:

langhaar!

Bekanntes Mitglied
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

Neues Mitglied
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/
 

Neue Themen


Oben