Zahlen von 1-999 in Java in Worten ausgeben?
Guten Abend,
das Ziel ist es in Java die Zahlen von 1 bis 999 in Worten auszugeben. (Bsp. 12=zwölf). Da ich noch recht frisch in Java unterwegs bin soll bei der Aufgabe grundlegend nur mit if- und switch Anweisungen gearbeitet werden. Nun muss man also einen Algorithmus finden. Ich weiß, dass man die Zahl in "einser", "zehner" und "hunderter" aufteilen muss. Jedoch weiß ich nicht wie ich das in Java schreibe und zu einem String zusammenfüge.
Mfg
Metrox
5 Antworten
ist zwar kein Java aber ich fand die aufgabe recht amüsant.
hier eine lösung in C# kann aber noch optimiert werden war mein erster anlauf in der umsetzung
class Program
{
static string[] stelle1a= new string[10] { "null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun" };
static string[] stelle1b = new string[10] { "", "einund", "zweiund", "dreiund", "vierund", "fünfund", "sechsund", "siebenund", "achtund", "neunund" };
static string[] stelle2a = new string[3] { "zehn", "elf", "zwölf"};
static string[] stelle2b = new string[10] { "", "zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig" };
static string[] stelle3 = new string[10] { "", "einhundert", "zweihundert", "dreihundert", "vierhundert", "fünfhundert", "sechshundert", "siebenhundert", "achthundert", "neunhundert" };
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
if (i < 10) Console.Write(stelle1a[i]);
else if (i < 13)
{
Console.Write(stelle2a[i - 10]);
}
else if (i < 20)
{
if (i == 16) { Console.Write("sechzehn"); }
else if (i == 17) { Console.Write("siebzehn"); }
else Console.Write(stelle1a[i - 10] + "zehn");
}
else if (i < 100) {
Console.Write (get_zehner(i));
}
else
{
Console.Write(stelle3[i/100]);
Console.Write(get_zehner(i));
}
Console.Write(Environment.NewLine);
}
Console.ReadLine();
}
static string get_zehner (int i)
{
string ret = null;
int einser = i - ((i / 10) * 10);
int zweier = (i>=100)?i/100:i / 10;
ret += stelle1b[einser];
ret += stelle2b[zweier];
return ret;
}
}
nochmal fehler bereinigt, keine ahnung ob das eine effiziente lösung ist, aber sie funktionert:
class Program
{
static string[] stelle1a= new string[10] { "", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun" };
static string[] stelle1b = new string[10] { "", "einund", "zweiund", "dreiund", "vierund", "fünfund", "sechsund", "siebenund", "achtund", "neunund" };
static string[] stelle2a = new string[3] { "zehn", "elf", "zwölf"};
static string[] stelle2b = new string[10] { "", "zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig" };
static string[] stelle3 = new string[10] { "", "einhundert", "zweihundert", "dreihundert", "vierhundert", "fünfhundert", "sechshundert", "siebenhundert", "achthundert", "neunhundert" };
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
if (i == 0) Console.Write("null");
else if (i < 10) Console.Write(stelle1a[i]);
else if (i < 13)
{
Console.Write(stelle2a[i - 10]);
}
else if (i < 20)
{
if (i == 16) { Console.Write("sechzehn"); }
else if (i == 17) { Console.Write("siebzehn"); }
else Console.Write(stelle1a[i - 10] + "zehn");
}
else if (i < 100) {
Console.Write (get_zehner(i));
}
else
{
int a = (i - (i / 100) * 100);
Console.Write(stelle3[i/100]);
if (a > 9 && a < 20)
{
if (a < 13) Console.Write(stelle2a[a - 10]);
else if (a == 16) { Console.Write("sechzehn"); }
else if (a == 17) { Console.Write("siebzehn"); }
else Console.Write(stelle1a[a-10] + "zehn");
}
else Console.Write(get_zehner(i));
;
}
Console.Write("-"+i);
Console.Write(Environment.NewLine);
}
Console.ReadLine();
}
static string get_zehner (int i)
{
string ret = null;
int einser = i - ((i / 10) * 10);
int zweier = (i>=100)?(i-((i/100)*100))/10:i / 10;
ret += (zweier == 0)? stelle1a[einser]:stelle1b[einser];
ret += stelle2b[zweier];
return ret;
}
}
Durchaus verständlich wenn einen mal eine Aufgabe reizt, aber dem Fragesteller das Ergebnis zu präsentieren anstatt ihm zu helfen, die Aufgabe selbst zu lösen kann natürlich auch nach hinten los gehen:
da ist irgendwo total der wurm drinn
Das soll kein Vorwurf sein, sondern ein Vorschlag.
Dem Fragesteller ist am ehesten geholfen, wenn man ihm erklärt, wie er das Problem lösen kann:
Von einem fertigen Kuchen, weiß ich nicht, wie er gebacken wurde.
das mit worten verständlich zu erklären ist noch schwieriger als die aufgabe selbst.
da ich das in c# geschrieben habe kann er den code eh nicht 1:1 übernehmen und muss sich zwangsläufig mit dem inhalt auseinandersetzten um seine Lösung in java lauffähig zu bekommen.
im grunde stimme ich dir aber zu, das vorkauen meist nicht hilfreich ist.
zudem ist es der erste entwurf der kann noch um einiges optimiert werden, sollte er auch.
"Von einem fertigen Kuchen, weiß ich nicht, wie er gebacken wurde."
Naja gut dass es kein Kuchen ist ;)
Quellcode ansehen, alles was man nicht kennt per Google lernen und ggf. mitm Debugger ran ^^.
Es ist interessant. Ich habe andere Aufgabe bei IBM gehabt - "speech to text".
(US, US-military, DE, IT, FR usw)
Habe für alles Grammars mit LEX geschrieben.
Du kannst es umgekehrt machen: Datum zum Wort (mit Tabelle, ob Output US oder DE oder Bayrisch ist), dann nur ein Sprachgenerator einschalten - haben wir auf Bayrisch für BMW auch gebastelt :-)))
LEX ist genug, im schwierigen Fällen auch YACC.
Moin,
viel arbeit auf Dich warten - kannst am besten mit FreeTTS durch starten ...
Wird auf http://freetts.sourceforge.net/docs/index.php recht gut erklärt - ist trotzdem "arbeit"
Viel Spaß
so long(knife)
x=In.readInt();
if(x==1){
Out.println("eins");
}
if(x==2){
Out.println("zwei");
}
usw..
Darauf bin ich auch gekommen. Nur weiß ich nicht wie ich die Dinger am Ende verknüpfen soll.
Aufteilen kannst du es mit Modulo, den Strings zuweisen mit Switch-Case.
Verknüpfen kannste mit + oder +=.
Beispielsweise:
String test="";
test+="a";
test+="b;
test="a" + "b";
Sollte zumindest so klappen.
https://bitbucket.org/snippets/Ettar/AjqL4
Das ist n bissl was, was ich fix dazu geschrieben habe.
Gibt es denn eine Möglichkeit das ohne dieses String args zu schreiben? Sowas hatten wir noch nicht, ist auch nicht gefordert.
Das gehört mWn zur Signatur von main ;)
http://stackoverflow.com/questions/890966/what-is-string-args-parameter-in-main-method-java
http://stackoverflow.com/questions/13603445/legal-main-method-signature-in-java
Du kannst wohl auch etwas angepasste nehmen, aber drin sein muss es.
Das ist im Endeffekt nur dazu da Parameter der Kommandozeile entgegenzunehmen und wird eh nicht benutzt in meinem Prog ^^.
mir fällt grade auf da ist irgendwo total der wurm drinn ^^