# Umrechnung in verschiedene Zahlensysteme



## merkas (7. Apr 2005)

hallo!

könnte mir hier jemand einen lösungsansatz geben?

 Ein Programm zur Umrechnung ganzer Zahlen in verschiedene Zahlensysteme soll entwickelt werden. Das Programm setzt sich zusammen aus einem Hauptprogramm, das den Dialog mit dem Benutzer führt, und einer Klasse, die die Umrechnung erledigt. Das Hauptprogramm liest zunächst einen String ein, der die umzurechnende Zahl darstellt. Als Ziffern sind die Ziffern des Dezimalsystems (0-9) und (bei Bedarf) die Buchstaben (A-Z) zu verwenden. Dabei soll Groß- und Kleinschreibung der Buchstaben nicht unterschieden werden (a=A) Anschließend wird noch die Basis der eingegebenen Zahl angegeben und die Basis, in die umzurechnen ist. Die beiden Basis-Zahlen werden dabei jeweils im Dezimalsystem angegeben und müssen zwischen 2 und 36 (einschließlich) liegen. Ein Dialog könnte also wie folgt aussehen:

Umzurechnende Zahl: A1Da2

Basis der eingegebenen Zahl: 16

Umzurechnen in Basis: 10

A1Da2 (Basis: 16) ergibt zur Basis 10: 662946

Die Klassen/Schnittstellen dieser Übung sollen alle im Java-package de.fhkonstanz.alda2.aufg1 erstellt werden.

   1. Entwerfen Sie die Schnittstelle der Umrechnungsklasse und implementieren Sie diese als Java-interface.
   2.

      Implementieren Sie in einer eigenen Klasse das Hauptprogramm. Dabei verwendet das Hauptprogramm zur Umrechnung eine Variable vom Typ der oben definierten Schnittstelle. Die Initialisierung der Variablen kann noch nicht erfolgen, da die Implementierungsklasse noch nicht erstellt ist. Dennoch kann man das Hauptprogramm schon compilieren.

      Beachten Sie auch die Hinweise zu Javas Eingabe-Klassen. Behandeln Sie die Exceptions, die von den Eingabe-Klassen aus dem Java-package java.io geworfen werden, indem Sie sie fangen, einen entsprechenden Fehlertext zeigen und das Programm beenden.
   3. Implementieren Sie die Klasse, die die Umrechnung durchführt. Jetzt kann das Hauptprogramm diese Klasse instanziieren und man kann es zur Umrechnung verwenden.
   4.

      Behandeln Sie in der Umrechnungsklasse folgende Fehlersituationen:
          * Die Eingabe- oder Ausgabebasis ist außerhalb des gültigen Bereichs: 2-36
          * Der eingebene String enthält unerlaubte Sonderzeichen (etwa: '.', '/', ...)
          * Der eingegebene String kann keine Zahl der angegebenen Eingabebasis sein (zum Beispiel: 9 bei Eingabebasis 2)

      Schreiben Sie für jeden Fehlertyp eine eigene Exception-Klasse, die von java.lang.Exception ableitet. Sie müssen jetzt natürlich die Methoden-Signatur (auch des Java-interfaces) entsprechend anpassen.
   5. Behandeln Sie diese Exceptions im Hauptprogramm, indem Sie sie fangen, einen entsprechenden Fehlertext ausgeben und von vorne starten.
   6. Schreiben Sie einen jUnit-Test zum Testen Ihrer Umrechnungsklasse. Dazu rufen Sie in einer test-Methode die Umrechnungsfunktion mit ein paar festen Zahlen auf und überprüfen den Rückgabewert auf Korrektheit.
   7. Ergänzen Sie weitere test-Methoden, um auch die Ausnahmefälle zu testen. Dazu rufen Sie die Umrechnungsmethode mit ungültigen Eingaben auf und fangen die entsprechenden Exceptions. Wenn die Exception gefangen wurde, also die Ausführung im catch-Block fortgesetzt wird und nicht unmittelbar nach Aufruf der Umrechnungsmethode, dann ist der Test erfolgreich. Andernfalls (also im Anschluss an den Aufruf der Umrechnungsmethode) beenden Sie den Test mit einer Fehlermeldung durch Aufruf von fail("Fehlermeldung");.


danke!


----------



## merkas (7. Apr 2005)

Hinweise zur Eingabeverarbeitung

Java arbeitet intern nur mit Unicode-Zeichen und verwaltet diese mit 2 Byte pro Zeichen. Das heisst ein char ist also in Java 2 Byte gross und nicht wie in C/C++ nur ein Byte. Liest man Zeichen von der Standard-Eingabe kommen diese aber nur Byte-weise. Deswegen sollten man, wenn man Zeichen oder Strings (von einer Datei oder der Standard-Eingabe) liest, grundsätzlich über ein Reader-Objekt gehen, um sicherzustellen, dass Bytes korrekt in char konvertiert werden. Ein Reader besitzt die Methoden:

    * String readLine(), zum Einlesen einer ganzen Zeile
    * int read(), zum Einlesen einzelner Zeichen

Es ist etwas überraschend, dass read() einen int und nicht etwa ein char zurückgibt ist. Das liegt daran, dass sowohl der Code aller gültigen Zeichen (0-65535) zurückgegeben werden kann, als auch -1, falls kein Zeichen mehr gelesen werden kann.

Um nun einen InputStream System.in in einen Reader zu konvertieren, geht man über die Klasse InputStreamReader. Damit ergibt sich folgender Code, um etwas von der Standard-Eingabe einzulesen:

BufferedReader stdEingabe= new BufferedReader(new InputStreamReader(System.in));

String line= stdEingabe.readLine();


----------



## Wildcard (7. Apr 2005)

Also erstens bist du im falschen Bereich! Ist ja wohl ganz klar ein Fall für "Aufgaben und Gesuche"!
Und zweitens:
Hier werden keine Hausaufgaben gelöst! Stell konkrete Fragen dazu und dir wird geholfen.
Ist ja kein sonderlich kompliziertes Problem, also schreib mal was du bis jetzt hast, und wie du weiter vorgehen willst, dann sehen wir weiter...


----------



## Beni (7. Apr 2005)

*verschoben*


----------



## merkas (7. Apr 2005)

Wildcard hat gesagt.:
			
		

> Also erstens bist du im falschen Bereich! Ist ja wohl ganz klar ein Fall für "Aufgaben und Gesuche"!
> Und zweitens:
> Hier werden keine Hausaufgaben gelöst! Stell konkrete Fragen dazu und dir wird geholfen.
> Ist ja kein sonderlich kompliziertes Problem, also schreib mal was du bis jetzt hast, und wie du weiter vorgehen willst, dann sehen wir weiter...



bis jetzt hab ich:

main:
import java.io.*;

public class Test {

	public static void main(String[] args) {
		IntUmrechnung myUmrechnung = new Umrechnung();

		BufferedReader stdEingabe= new BufferedReader(new InputStreamReader(System.in));

		DataInput stdEingabe2 = new DataInputStream(System.in);
		try {
			System.out.print("Umzurechnende Zahl: ");
			String line = stdEingabe.readLine();

			System.out.print("Basis der eingegebenen Zahl: ");
			int basis = Integer.parseInt(stdEingabe2.readLine());

			System.out.print("Umzurechnen in Basis: ");
			int basisErgebnis = Integer.parseInt(stdEingabe2.readLine());

			System.out.println(line);
			System.out.println(basis);
			System.out.println(basisErgebnis);

			System.out.println(myUmrechnung.konvertiere(line,basis,basisErgebnis));
		}
		catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
}


interface:
public interface IntUmrechnung {
	public int konvertiere(String line,int basis,int basisErgebnis);
}

class:
public class Umrechnung implements IntUmrechnung {
	private int ergebnis;

	public Umrechnung() {ergebnis = 0;};

	public int konvertiere(String line,int basis,int basisErgebnis) {
		try {
			ergebnis = Integer.parseInt( line, basis );
		}
		catch ( NumberFormatException e ) {
			System.err.println("Fehler beim Konvertieren");
		}
		return ergebnis;
	}
}


nun weiß ich nicht mehr weiter.


----------



## Wildcard (7. Apr 2005)

Benutz bitte die Code-Tags! So ist das echt unleserlich!


> nun weiß ich nicht mehr weiter.


Na etwas genauer gehts wohl schon? 
Fehlt dir die Formel zum umrechnen?
Dezimal in m-adisches System:

```
50 / 8 -> 6 Rest 2
6 / 8   -> 0 Rest 6
-> 62 Basis 8
```

Würd mir eine Hashmap mit Buchtstaben a-z und 0-9 als Key, und Integer-Werte als Values.
Den String Zeichen für zeichen betrachten und die Werte aus der Map holen.
Wenn einer nicht zur Basis passt Exception usw...

```
BufferedReader stdEingabe= new BufferedReader(new InputStreamReader(System.in)); 

DataInput stdEingabe2 = new DataInputStream(System.in);
```
Was soll das eigentlich sein???  :bahnhof:


----------



## Guest (7. Apr 2005)

Wildcard hat gesagt.:
			
		

> Benutz bitte die Code-Tags! So ist das echt unleserlich!
> 
> 
> > nun weiß ich nicht mehr weiter.
> ...


----------



## Guest (7. Apr 2005)

aber ich bekomm schon nen fehler wenn ich in der klasse den string in eine ganzzahl umwandle (in der methode konvergiere() )


----------



## merkas (7. Apr 2005)

der aufbau also 1.-3. passt so?


----------



## Wildcard (7. Apr 2005)

> aber ich bekomm schon nen fehler wenn ich in der klasse den string in eine ganzzahl umwandle (in der methode konvergiere() )


Ist ja auch klar! Du kannst nicht einfach so mit parseInt irgendein Zahlensystem konvertieren...
Genau das sollst ja du machen  :lol: 


> der aufbau also 1.-3. passt so?


Was soll ich da sagen? Du hast ja noch nicht viel!
Jetzt erklär mal wofür du die 2 Reader brauchst?


----------



## merkas (7. Apr 2005)

ich wollte für die zahl als string einlesen und die basen als int.
oder soll ich besser alle 3 als string?


----------



## Wildcard (7. Apr 2005)

> ich wollte für die zahl als string einlesen und die basen als int.
> oder soll ich besser alle 3 als string?


Dafür brauchst du aber keine 2 Reader!
Lies alles mit dem BufferedReader ein, und parse die Basis als int.


----------



## merkas (7. Apr 2005)

> public static void main(String[] args) {
> IntUmrechnung myUmrechnung = new Umrechnung();
> 
> BufferedReader stdEingabe= new BufferedReader(new InputStreamReader(System.in));
> ...




so?
also beim übergeben an die methode parsen?[/quote]


----------



## Wildcard (7. Apr 2005)

Die CODE Tags! Nicht die QUOTE Tags   


```
BufferedReader stdEingabe= new BufferedReader(new InputStreamReader(System.in)); 

try 
{ 
    System.out.print("Umzurechnende Zahl: "); 
    String line = stdEingabe.readLine(); 

    System.out.print("Basis der eingegebenen Zahl: "); 
    int basis = Integer.parseInt(stdEingabe.readLine()); 

    System.out.print("Umzurechnen in Basis: "); 
    int basisErgebnis = Integer.parseInt(stdEingabe.readLine()); 
}
catch(IOException ex)
{
    ex.printStackTrace();
}
catch(NumberFormatException ex)
{
    syso("Blödmann");
    wiederholen();
}
```


----------



## merkas (7. Apr 2005)

>Würd mir eine Hashmap mit Buchtstaben a-z und 0-9 als Key, und Integer-Werte als Values.
>Den String Zeichen für zeichen betrachten und die Werte aus der Map holen.
>Wenn einer nicht zur Basis passt Exception usw... 


wie mach ich das?


----------



## Wildcard (7. Apr 2005)

```
HashMap map = new HashMap();
map.put("a",Integer.valueOf(11));
```


----------



## merkas (7. Apr 2005)

wie kann ich den string zeichen für zeichen betrachten?


----------



## Wildcard (7. Apr 2005)

merkas hat gesagt.:
			
		

> wie kann ich den string zeichen für zeichen betrachten?


Du hast nicht wirklich ahnung von dem was du da tust, oder? 

```
String s = "";
s.charAt(int i);
```


----------



## merkas (7. Apr 2005)

Wildcard hat gesagt.:
			
		

> merkas hat gesagt.:
> 
> 
> 
> ...



hab lang nix mehr gemacht


----------



## merkas (7. Apr 2005)

also ich stress dich mal jetzt nicht weiter!  
eine frage noch:
gibts irgendwo nochmal so was änliches wie  javainsel?
also so ein openbook in deutsch.


----------



## Wildcard (7. Apr 2005)

Schau mal in die JLib oder unter Bücher und Tutorials.
Hab auch gerade im Anfärgerbereich den Link zu Java 2 in 21 gepostet. Das ist ganz gut für den anfang!


----------

