# Zahlenumwandlung



## 5c4r3 (25. Jan 2011)

Hallo zusammen!
Es soll ein Programm geschrieben werden, welches nach der Eingabe einer dreistelligen Zahl diese ausschreibt.
Bsp: Eingabe: 123 -> Ausgabe: eins zwei drei.
Das ist mein Lösungsansatz, der leider kläglich scheitert, nur warum? 
Muss die eingegebene Zahl abgespeichert werden, sodass ich mit der charAt-Funktion da mehrmals drauf zugreifen kann?


```
import java.io.*;
public class Zahlenumwandlung 
{
	public static void main(String[] args) throws IOException
	{
		int i=0, zahl;
		BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
		System.out.println("Bitte dreistellige Zahl eingeben:");
		do
		{	
			zahl = input.readLine().charAt(i);
			if (zahl=='1')
				System.out.print("eins ");
				else
					if (zahl=='2')
						System.out.print("zwei ");
					else
						if (zahl=='3')
							System.out.print("drei ");
						else
							if (zahl=='4')
								System.out.print("vier ");
							else
								if (zahl=='5')
									System.out.print("fünf ");
			else
				if (zahl=='6')
					System.out.print("sechs ");
				else
					if (zahl=='7')
						System.out.print("sieben ");
					else
						if (zahl=='8')
							System.out.print("acht ");
						else
							if (zahl=='9')
								System.out.print("neun ");
							else
								if (zahl=='0')
									System.out.print("null ");
			System.out.print(i);
			i++;
		}
		while (i<=3);
	}
}
```


----------



## eRaaaa (25. Jan 2011)

Naja, durch readLine() willst du eben immer eine neue Zeile einlesen. Mache das außerhalb der Schleife (ohne das charAt am Ende, also nur den String) und lege das in einer String-Variablen ab, welche du dann in deiner Schleife mit charAt durchlaufen kannst, das würde gehen ja (allerdings ist deine Schleifenbedingung falsch)


----------



## XHelp (25. Jan 2011)

5c4r3 hat gesagt.:


> Das ist mein Lösungsansatz, der leider kläglich scheitert, nur warum?



Formuliere doch eine konkrete Beschreibung: Compiler-Fehler, Runtime-Fehler, anderes Verhalten als erwartet... ?
Und damit du mit der Eingabe arbeiten kannst, solltest du zunächst mal die *ganze* Eingabe speichern


----------



## 5c4r3 (25. Jan 2011)

Habs! Danke!
[JAVA=42]
import java.io.*;
public class Zahlenumwandlung 
{
	public static void main(String[] args) throws IOException
	{
		int i=0; 
		String zahl;
		BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
		System.out.println("Bitte dreistellige Zahl eingeben:");
		zahl = input.readLine();
		do
		{	
			char stelle = zahl.charAt(i);
			if (stelle=='1')
				System.out.print("eins ");
				else
					if (stelle=='2')
						System.out.print("zwei ");
					else
						if (stelle=='3')
							System.out.print("drei ");
						else
							if (stelle=='4')
								System.out.print("vier ");
							else
								if (stelle=='5')
									System.out.print("fünf ");
			else
				if (stelle=='6')
					System.out.print("sechs ");
				else
					if (stelle=='7')
						System.out.print("sieben ");
					else
						if (stelle=='8')
							System.out.print("acht ");
						else
							if (stelle=='9')
								System.out.print("neun ");
							else
								if (stelle=='0')
									System.out.print("null ");
			i++;
		}
		while (i<=2);
	}
}

[/code]


----------



## XHelp (25. Jan 2011)

Da du schon deine Lösung hast, wäre es eine Überlegung wert switch einzusetzen:

```
public static String numberStringToWord(String number) {
	if (number.isEmpty()) {
		return "";
	}
	String digit;
	char c = number.charAt(0);
	switch (c) {
	case '1':
		digit = "eins";
		break;
	case '2':
		digit = "zwei";
		break;
	case '3':
		digit = "drei";
		break;
	case '4':
		digit = "vier";
		break;
	case '5':
		digit = "fünf";
		break;
	case '6':
		digit = "sechs";
		break;
	case '7':
		digit = "sieben";
		break;
	case '8':
		digit = "acht";
		break;
	case '9':
		digit = "neun";
		break;
	case '0':
		digit = "null";
		break;
	default:
		digit = "_unbekanntes Zeichen_";
		break;
	}
	return digit+" "+numberStringToWord(number.substring(1));
}
```


----------



## 5c4r3 (25. Jan 2011)

> Da du schon deine Lösung hast, wäre es eine Überlegung wert switch einzusetzen:



Gefällt mir persönlich auch besser. Die Aufgabenstellung hat mir jedoch vorgeschrieben if-else zu nutzen. 
Meine 2. Variante ist auch mit case.

Danke!


----------



## Andi_CH (26. Jan 2011)

Es ist übrigens durchaus üblich das wie folgt zu formatieren.

Es braucht dann nicht unbedingt zwei Bildschirme nebeneinander 


```
import java.io.*;

public class Zahlenumwandlung 
{
	public static void main(String[] args) throws IOException
	{
		int i=0; 
		String zahl;
		BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
		System.out.println("Bitte dreistellige Zahl eingeben:");
		zahl = input.readLine();
		do
		{   
			char stelle = zahl.charAt(i);
			if (stelle=='1')
				System.out.print("eins ");
			else if (stelle=='2')
				System.out.print("zwei ");
			else if (stelle=='3')
				System.out.print("drei ");
			else if (stelle=='4')
				System.out.print("vier ");
			else if (stelle=='5')
				System.out.print("fünf ");
			else if (stelle=='6')
				System.out.print("sechs ");
			else if (stelle=='7')
				System.out.print("sieben ");
			else if (stelle=='8')
				System.out.print("acht ");
			else if (stelle=='9')
				System.out.print("neun ");
			else if (stelle=='0')
				System.out.print("null ");
			i++;
		}
		while (i<=2);
	}
}
```

und das Schleifenende würde ich eher so formulieren:


```
while (i<=zahl.length());
```


----------



## chalkbag (26. Jan 2011)

Alternativ, könntest du einen Enum für die einzelnen Zahlen anlegen (falls ihr das schon gelernt habt). Dann wird das ganze etwas übersichtlicher und die Ifs kannst du dir sparen, da du nur auf dein Enum castest und dann mit der entsprechenden toString Methode den zugehörigen Wert ausgeben kannst.

Grüße


----------



## Andi_CH (26. Jan 2011)

chalkbag hat gesagt.:


> Alternativ, könntest du einen Enum für die einzelnen Zahlen anlegen (falls ihr das schon gelernt habt). Dann wird das ganze etwas übersichtlicher und die Ifs kannst du dir sparen, da du nur auf dein Enum castest und dann mit der entsprechenden toString Methode den zugehörigen Wert ausgeben kannst.
> 
> Grüße


Hast du post 5 und 6 gelesen ???:L???:L???:L


----------

