String to Float

numb

Grünschnabel
Hallo!,
ich habe folgende Aufgabe und habe leider keine Ahnung, wie ich anfangen sollte.

Schreiben Sie ein Programm, das eine auf der Kommandozeile übergebene Zeichenkette der Länge 32, die nur die Zeichen ’0’ und ’1’ enthält, verarbeitet. Zeichenketten im falschen Format führen zu einer Fehlermeldung und dem Programmende. Zeichenketten im richtigen Format werden als binäare Codierung einer Gleitkommazahlen mit einfacher Genauigkeit nach IEEE-Standard 754 interpretiert.
• NaN, +0, ?0, ? und ?? werden erkannt und es wird NaN, +0, -0,NEGATIVE INFINITY oder POSITIVE INFINITY ausgegeben.
• Es werden int-Werte bestimmt, die das Vorzeichen s, den Exponent e und die Man-
tisse m repräsentieren und zwar so, dass die Formel s·2^(e?127) ·m·2^?23 die dargestellte
Gleitkommazahlen mit einfacher Genauigkeit ergibt. Dabei muss berücksichtigt werden, ob es sich um eine normalisiert oder denormalisiert Darstellung handelt.
• Die int-Werte s, e, m und die float-Werte m · 2^?23 und s · m · 2^(e?150) werden ausgegeben.
Benutzen Sie folgende Klasse als Grundlage f¨ur Ihre Implementierung.
Code:
class StringToFloat {
public static void main( String args [] ) {
String str = args [0];
for (int i = 0; i < str. length (); i++)
System .out.print(str. charAt (i));
System .out. println ();
}
}
Könnte jemand mir helfen, wie ich anfangen sollte?
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

interessante Aufgabe für Java :)

Zuerst mal musst du
*den übergebenen String abrufen
*Prüfen, ob er genau 32 Zeichen lang ist
*Prüfen, ob jedes Zeichen '0' oder '1' ist
*und am besten noch ein byte-Array, Größe 32, anlegen, wo entsprechend 0 oder 1 reinkommt.

Der vorgegebene Code zeigt eigentlich schon alle Funktionen etc., die man dafür braucht.
Wenn es da bei der Umsetzung Probleme gibt, bitte genauer nachfragen.
Auch wenn nicht, vllt. mal den eigenen Code davon zeigen
(hilft beim Helfen, wie zB. deine Variablen heißen usw.)

...sonst kanns dann zur eigentlichen Aufgabe weitergehen.
 
@Sheel Wieso 64 Zeichen? Es geht hier um die einfache Genauigkeit, also 32 Zeichen.

Schreiben Sie ein Programm, das eine auf der Kommandozeile übergebene Zeichenkette der Länge 32, die nur die Zeichen ’0’ und ’1’ enthält, verarbeitet. Zeichenketten im falschen Format führen zu einer Fehlermeldung und dem Programmende. Zeichenketten im richtigen Format werden als binäare Codierung einer Gleitkommazahlen mit einfacher Genauigkeit nach IEEE-Standard 754 interpretiert.
Siehe Vorredner, die Strutkur dafür ist ansich schon gegeben, du musst das Programm nur bei Fehlerhaften Werten abbrechen.

NaN, +0, ?0, ? und ?? werden erkannt und es wird NaN, +0, -0,NEGATIVE INFINITY oder POSITIVE INFINITY ausgegeben.
• Es werden int-Werte bestimmt, die das Vorzeichen s, den Exponent e und die Man-
tisse m repräsentieren und zwar so, dass die Formel s·2^(e?127) ·m·2^?23 die dargestellte
Gleitkommazahlen mit einfacher Genauigkeit ergibt. Dabei muss berücksichtigt werden, ob es sich um eine normalisiert oder denormalisiert Darstellung handelt.
• Die int-Werte s, e, m und die float-Werte m · 2^?23 und s · m · 2^(e?150) werden ausgegeben.
Benutzen Sie folgende Klasse als Grundlage f¨ur Ihre Implementierung.
Siehe http://de.wikipedia.org/wiki/IEEE_754#Berechnung_IEEE754-Gleitkommazahl_.E2.86.92_Dezimalzahl
und http://de.wikipedia.org/wiki/IEEE_754#Interpretation_des_Zahlenformats
 
Laut deiner Nachricht habe ich die Überprüfungen abgeschlossen. Aber wenn ich eine Zahl, die mehr als 10 Stellen hat, eingebe, dann krige ich eine Fehler ://
Wie sollte ich tun?
Code:
class StringToFloat {
	public static void main(String args[]) {
	String str = args[0]; 
	int x=Integer.parseInt(args[0]); // erste Überprüfung, ob es binär ist!
	int y=Integer.parseInt(args[0]); // zweite Überprüfung, ob es 32 stellig ist!
	int Ziffer;
		 while (x!=0){
			 Ziffer=x%10;
			 if (Ziffer>1){
			 	 System.out.println("Bitte geben Sie ein BinärZahl ein!");
			 	 return;
			 }
			 if (Ziffer<0){
			 	 System.out.println("Bitte geben Sie ein BinärZahl ein, die keine Vorzeichen hat!");
			 	 return;
			 }
			 x=x/10;
		 }
		 int stZahl=0;
		 while (y!=0){
		 	 stZahl++; 
		 	 y=y/10; // letzte Ziffer weg
		 	 if (stZahl>32){ // 32Bit kontrollieren
		 	 	 System.out.println("Das ist keine richtige Zahl!");
		 	 	 return;
		 	 }
		 }
	for (int i = 0; i < str. length (); i++)
	System.out.print(str.charAt(i));
	System.out.println();
	}
}
 
Hey Numb,

ich bin mir nicht sicher, ob ich richtig liege, aber ich glaube, du hast nen Denkfehler in deinen Code eingebaut.

y=y/10; // letzte Ziffer weg

Damit würdest du bei einer Dezimalzahl die letzte Ziffer weg bekommen*. Bei dir handelt es sich aber um binäre Zahlen. Die kannst du nicht einfach durch eine Dezimalzahl teilen. Verarbeite die Eingabe lieber wie einen String und geh die Zeichen nacheinander mit charAt(i) in einer Schleife durch...

Und noch was ist mir aufgefallen:

int x=Integer.parseInt(args[0]); // erste Überprüfung, ob es binär ist!
int y=Integer.parseInt(args[0]); // zweite Überprüfung, ob es 32 stellig ist!

Wenn du den String damit in eine Binärzahl umwandeln willst, musst du als zweiten Parameter die Basis angeben (also 2 für binäre Zahlen)**. Allerdings solltest du das erst machen, nachdem du die Länge des Strings validiert hast.

* Allerdings würde das bei Dezimalzahlen auch nur funktionieren, wenn du immer ohne Rest durch 10 teilen kannst.

** Doku: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#parseInt(java.lang.String, int)
Allerdings befürchte ich, dass dein Prof/Lehrer ne selbstgestrickte Lösung sehen will...

Viele Grüße
Frezl
 
a)
Denkfehler mit dem parseInt.
parseInt nimmt einen String wie
Java:
String s = "23";
her, nimmt an, es sein eine Dezimalzahl, und liefert den Wert als int, vergleichbar zu
Java:
int i = 23;
Wenn du jetzt 1001 eingibst ist das nicht binär-1001, also 9, sondern Tausendeins.

Warum bei zehnstelligen Zahlen Fehler kommen?
int´s (und auch die float, um die es später bei deiner Aufgabe gehen wird) haben intern 32 Binär-bit.
Normalerweise merkt man in Java davon nicht viel, aber das i mit Wert 23 wäre umgerechnet
00000000 00000000 00000000 00010111
Der höchste mögliche Wert wäre binär
11111111 11111111 11111111 11111111
das ist ins Dezimale zurückgerechnet 4294967295. 10 Stellen.
Merkst was? :)
Alles größer als diese Zahl zehnstellige passt in kein 32bit-int rein.

(Es gibt auch noch das "Problem" mit signed/unsigned, aber das geht hier zu weit. Ist auch egal.
Nur kurz: Die reale höchste Zahl ist nur die Hälfte der Angegebenen,
dafür gibts auch negative Zahlen.)

Aber parseInt ist hier sowieso sinnlos, da es dezimal arbeitet...

b)
Java:
String str = args[0]; 
int x=Integer.parseInt(args[0]); // erste Überprüfung, ob es binär ist!
int y=Integer.parseInt(args[0]); // zweite Überprüfung, ob es 32 stellig ist!
Da muss ich ein bisschen meckern.
Diese Zeilen überpürfen die angegebenen Sachen sicher nicht.
Warum weist man args[0] str zu, wenn man dann erst wieder args[0] verwendet?
str wäre doch einfacher.
Und wenn man schon mal ein ganzes Integer.parseInt(args[0]) hat,
könnte man in Zeile 3 doch einfach int y=x; schreiben,
statt das Ganze wieder abzufragen.

c)
Die ganze Sache mit den Schleifen und Modulo weiter unten
ist leider ebenso sinnlos wie parseInt.
Du machst es dir zu kompliziert.

Du hast einen String in args[0].
Im Idealfall ist jedes Zeichen entweder '0' oder '1'.
Jetzt sollst du erstmal prüfen, ob das 32 Zeichen sind oder nicht.
Wie bekoommt man die Länge eines Strings? .length()
Also einfach so:
Java:
if(args[0].length() != 32)
    //dann Fehlermeldung
Das war die ganze Längenüberprüfung.

Passt hier nicht ganz dazu, aber du solltest zuerst noich prüfen,
ob es args[0] überhaupt gibt.
Wenn man gar nichts übergibt gibt es auch kein args[0].
args ist ein Array. Damit es ein Element [0] gibt muss das Array min. ein Element lang sein.
Java:
if(args.length < 1)
    //dann Fehlermeldung
Achtung, bei Strings hat length Klammern, bei Arrays nicht
(bei Strings ist es eine Methode, bei Arrays eine Variable).

Als letzte Prüfung, ob es eine Binärzahl sein kann,
also ob nur '0 oder '1' drin sind:
Eine Schleife von 0 bis <32 durch,
wenn das aktuelle Zeichen nicht '0' und nicht '1' dann Fehler.
 
okay alles klar! ich habe die beiden Kontrollen gemacht und es funktioniert!
Eigentlich weiß ich es nicht, wie man bei einer String aktuelle Ziffer finden soll.
ich habe so was versucht aber leider funktioniert das nicht :/
Code:
int stelle=0;
while (Stelle<=32){
	if(args[0].charAt(stelle)!=0 || args[0].charAt(stelle)!=1){
	    System.out.println("Die Zahl ist nicht binär!");
	    return;
	}
        stelle++;
}
ich habe 100% ein Fehler bei if bedingungen.
vielen Dank für deine Hilfe:)
Grüß
 
Zuletzt bearbeitet:
a) =! muss heißen != (aber das hast du ja gerade ausgebessert)

b) Stelle sollte stelle sein. Groß/kleinschreibung ist wichtig.
Solche Compilerfehler sollte man aber selbst beheben können :rolleyes:

c) Wann ist ein Zeichen c in Ordnung?
Wenn c==0 || c==1
Was ist das Gegenteil davon, wann ist es nicht in Ordnung?
Wenn c!=0 && c!=1
Und, nicht Oder.
Überleg mal mit Oder:
Wenn c weder 0 noch 1 ist geht es zwar ordentlich zur Fehlermeldung,
aber wenn es 0 ist? Nicht 0 oder Nicht 1? Es ist nicht 1, also Fehler.
Selbes mit 1. Das ist nicht 0, also Fehler.
Es soll nur Fehler geben, wenn es keins der beiden ist.

d)
Man darf nicht auf 0 und 1 prüfen, sondern '0' und '1'
Die Eingaben vom Benutzer sind im Asciicode
(bzw. irgendeinem anderen Zeichensatz auf Basis Ascii).
Jedes anzeigbare Zeichen in der Konsole (Buchstaben, Ziffern, Satzzeichen usw.)
hat eine Nummer zugeordnet, nachschaubar in Tabellen.
Diese Nummer wird letztendlich gespeichert.
Das kleine 'a' wäre zB. 97, 'A'=65
Und die Ziffern '0','1','2'... sind nicht die Zahlen 0,1,2 sondern 48,49,50...
Zahl 0 wäre das Stringende statt der angezeigten Ziffer '0'
Also entweder auf 48 und 49 prüfen, oder '0' und '1'. Ist das Selbe.

PS: Hier war es zwar ziemlich offensichtlich, aber wenn etwas nicht funktioniert,
sag bitte auch dazu, was passiert.
Siehe Signatur.
 
Um Missverständnisse zu klären:

Damit würdest du bei einer Dezimalzahl die letzte Ziffer weg bekommen*. Bei dir handelt es sich aber um binäre Zahlen. Die kannst du nicht einfach durch eine Dezimalzahl teilen.
Man kann in jedem beliebigen System die letzte Stelle wegbekommen, in dem man durch die Basis teilt. Im binären System also durch 2 (vergleichbar dem rechts-shift >>)

* Allerdings würde das bei Dezimalzahlen auch nur funktionieren, wenn du immer ohne Rest durch 10 teilen kannst.
Teilt man Integer durch Integer, bzw ist das Ergebnis ein Integer, also eine Ganzzahl, gibt es keine Kommastellen, die werden quasi "abgeschnitten". 3/2 ist demnach 1, und nicht 1.5.
 

Neue Beiträge

Zurück