Java Simples Problem in Java

maddin91

Commander
Registriert
Feb. 2007
Beiträge
2.190
Hallo Leute,
wir haben dieses Jahr mit java angefangen in Informatik (12. Klasse) und wir stehen im Moment noch ziemlich weit am Anfang.
Die Hausaufgabe ist, aus einer Dezimalzahl, die kleiner als 128 ist, eine Binärzahl mit 8 Stellen zu machen.
Ich weiß inzwischen, dass es schlauere Wege gibt, aber ich würde dafür ganz gerne wissen, wie man aus einem Array (a[0-7]) die einzelnen Werte rausholt und zu einem String zusammenfügt, damit das Ergebnis in einer HTML-Datei angezeigt werden kann

Hier der Code, n ist die Dezimalzahl, die umgewandelt wird.

Code:
import java.applet.*;               
import java.awt.*;                       
public class Dezimalzahl extends Applet  
{public Dezimalzahl()
	{	
	int a[] = new int[7];
	int x = 0;
		for(int n=103;x<8;x++)
		{
			if (n<128/(2^x))
				{a[x]=0;
				}
			else 
				{a[x]=1;
				n = n-(128/(2^x));
				}
		}
	String s;
	s = ???;
	Label schriftz = new Label(s);
	add (schriftz);

	}                                       
}

Ich habe im Internet schon lange gesucht und auch schon die SuFu angeworfen, aber nichts brauchbares bekommen. Mein Lehrer konnte mir bis jetzt auch noch nicht helfen, also vertrau ich auf Euch!

Danke und mfG dene_mudda
 
Alle Wrapper-Klassen haben die toString()-Fkt.

Also dürfte folgendes funktionieren:

Code:
String s=a[0].toString();
Des weiteren kann der plus-Operator verwendet werden, um Strings zu verbinden (concatening).

Code:
String s=s+a[x].toString();
 
Den Punkt vor "to" nimmt er irgendwie nicht. Er zeigt immer einen Error!
Trotzdem denke schonmal ;).
 
Das machst du so:

Code:
for (int i = 0; i<8;i++)
{
   s += a[i];
}

Die Schleife durchläuft 8 mal das array, erhöht jedes mal den index i und hängt somit den aktuelle array-Wert an den String an. Sollte so funktionieren, deinen restlichen Code finde ich aber furchtbar verwirrend. :freak:
 
cYaInH3ll schrieb:
Das machst du so:

Code:
for (int i = 0; i<8;i++)
{
   s += a[i];
}

Die Schleife durchläuft 8 mal das array, erhöht jedes mal den index i und hängt somit den aktuelle array-Wert an den String an. Sollte so funktionieren, deinen restlichen Code finde ich aber furchtbar verwirrend. :freak:

Ich habe zwar schon eine ganze Weile kein Java-Programm mehr geschrieben, aber ich bezweifel, dass das funktionieren wird, da s ein String und a ein int ist. Mit String.valueof(int) sollte es aber gehen, also
Code:
s += String.valueOf(a[i]);

dene_mudda schrieb:
Hallo Leute,
wir haben dieses Jahr mit java angefangen in Informatik (12. Klasse) und wir stehen im Moment noch ziemlich weit am Anfang.
Die Hausaufgabe ist, aus einer Dezimalzahl, die kleiner als 128 ist, eine Binärzahl mit 8 Stellen zu machen.
Ich weiß inzwischen, dass es schlauere Wege gibt, aber ich würde dafür ganz gerne wissen, wie man aus einem Array (a[0-7]) die einzelnen Werte rausholt und zu einem String zusammenfügt, damit das Ergebnis in einer HTML-Datei angezeigt werden kann

Hier der Code, n ist die Dezimalzahl, die umgewandelt wird.

Erstmal ist dein Array falsch. new int[7] gibt ein Array der Größe 7 also mit Index 0 bis 6 zurück.

Code:
	int x = 0;
		for(int n=103;x<8;x++)
Für diesen for-Schleifenkopf gehörst du gehauen. :hammer_alt: Was hat das n an der Stelle zu suchen?


Code:
if (n<128/(2^x))
Falls du auf "n<128/(2^x) != 0" testen willst, musst du das auch hinschreiben, denn Java unterscheiden zwischen int und bool.

Code:
public static String dec2bin(int x) {
	String result = "";
	for(int i = 0; i < 8; i++) {
		result += String.valueOf(x % 2);
		x >>= 1; // ist das gleiche wie x = x / 2
	}
	return result;
}

So könnte man es machen, wobei man eher einen StringBuffer benutzen sollte, denn wenn man + oder += auf einen String anwendet, wird jedesmal ein neues Objekt erzeugt. Du solltest auch vermeiden so häufig zu potentieren, denn das ist recht aufwendig. Ansonsten solltest du noch generell an der Formatierung deines Codes arbeiten, denn der ist wirklich schlecht lesbar.
 
Limit schrieb:
...ich bezweifel, dass das funktionieren wird, da s ein String und a ein int ist.

Solange man mit Strings und nicht mit einem StringBuffer arbeitet, funktioniert das. Und auch beim StringBuffer gibt es eine Methode append(int).

Limit schrieb:
Code:
if (n<128/(2^x))
Falls du auf "n<128/(2^x) != 0" testen willst, musst du das auch hinschreiben, denn Java unterscheiden zwischen int und bool.
Ja, Java unterscheidet zwischen boolean und int.
Den einzigen Schönheitsfehler in der Abfrage sehe ich (ohne es ausprobiert zu haben) allerdings in einem fehlenden Klammerpaar:
Code:
if (n<(128/(2^x)))
 
Cobinja schrieb:
Solange man mit Strings und nicht mit einem StringBuffer arbeitet, funktioniert das. Und auch beim StringBuffer gibt es eine Methode append(int).

ok, hast recht. Hab es nochmal kurz getestet.


Cobinja schrieb:
Ja, Java unterscheidet zwischen boolean und int.
Den einzigen Schönheitsfehler in der Abfrage sehe ich (ohne es ausprobiert zu haben) allerdings in einem fehlenden Klammerpaar:
Code:
if (n<(128/(2^x)))

Auch hier hast du recht.

Da hat wohl die späte Stunde, der schlecht leserlische Stil und die längere Zeit, in der ich kein Java geschrieben hat zusammengewirkt. Sorry.
 
Ok, Leute, danke schon mal!

Bei dem hier habt ihr Recht, dafür sollte ich echt geschlagen werden:
Code:
int x = 0;
for(int n=103;x<8;x++)

Ich habs nun geändert auf:

Code:
int n = 103;
for(int x=0;x<8;x++)

Stimmt doch nun soweit oder? Macht das eigentlich einen Unterschied oder ist das nur Formalität?

Falls du auf "n<128/(2^x) != 0" testen willst, musst du das auch hinschreiben, denn Java unterscheiden zwischen int und bool.

Das müsst ihr mir nochmal genau erklären. Ich habe gerad erst mit Java angefangen und kann mit "bool" nicht so viel anfangen. Außerdem will ich wirklich nur sagen: Wenn n kleiner als 128/(2^x) ist, dann mach das und wenn nicht, dann das (else).

Bei deinem restlichem Code (@ Limit) werden mit ne Menge Fehler angezeigt.

Warum muss man hier eine Klammer mehr setzen?:

Code:
if (n<(128/(2^x)))

Ich weiß, mehr Klammern können in diesem Fall hier nicht schaden, aber sie bezwecken doch auch nichts oder?

Mein Code, in dem der String nun gebildet wird sieht jetzt so aus:
Code:
String s;
s = "";
for (int i = 0; i<8;i++) {
   s += String.valueOf(a[i]);
}

Ist das soweit richtig?
Was meine Schreibweise betrifft: Ich mach das wie gesagt noch nicht lange und unser Lehrer hat auch noch nicht darüber gesprochen. Ich würde ganz gerne wissen, was ihr zu bemängeln habt, ich will ja schließlich auch was dazulernen :).

Ein großes Dankeschön schonmal für die jetzigen Antworten!
 
dene_mudda schrieb:
Ok, Leute, danke schon mal!

Bei dem hier habt ihr Recht, dafür sollte ich echt geschlagen werden:
Code:
int x = 0;
for(int n=103;x<8;x++)

Ich habs nun geändert auf:

Code:
int n = 103;
for(int x=0;x<8;x++)

Stimmt doch nun soweit oder? Macht das eigentlich einen Unterschied oder ist das nur Formalität?

Passt so. Ist nur eine Formalität, aber es verwirrt sehr stark und wenn man's nur schnell überfliegt, übersieht man sowas schnell.

dene_mudda schrieb:
Das müsst ihr mir nochmal genau erklären. Ich habe gerad erst mit Java angefangen und kann mit "bool" nicht so viel anfangen. Außerdem will ich wirklich nur sagen: Wenn n kleiner als 128/(2^x) ist, dann mach das und wenn nicht, dann das (else).

Ein boolscher Wert ist ein Wahrheitswert, kann also nur die Werte true und false annehmen.
Wenn du Vergleiche machst ist das Ergebnis immer ein boolscher Wert.
Code:
boolean b = (x < y);
if(b) {
  System.out.println("x ist kleiner y\n");
}

In anderen Programmiersprachen (z.B. C) gibt es den Typ bool oder boolean nicht. Dort wird stattdessen einfach ein beliebiger Ganzzahlentyp (char, short, int, long, ...) genommen, wobei die 0 false entspricht und alles andere true. Da könntest du dann auch sowas machen:

Code:
int a = 3;
if(a)
 printf("true\n"); // hier würde er true ausgeben, da 3 ungleich 0 ist
else
 printf("false\n");


dene_mudda schrieb:
Bei deinem restlichem Code (@ Limit) werden mit ne Menge Fehler angezeigt.

Hier mal die ganze Datei. Einfach als Test.java speichern, compilieren und ausführen.


Code:
public class Test {

	public static String dec2bin(int x) {
		String result = "";
		for(int i = 0; i < 8; i++) {
			result = (x % 2) + result;
			x >>= 1;
		}
		return result;
	}

	public static void main(String[] args) {
		System.out.println( dec2bin(1) );
		System.out.println( dec2bin(2) );
		System.out.println( dec2bin(4) );
		System.out.println( dec2bin(8) );
		System.out.println( dec2bin(255) );
		return;
    }
}

dene_mudda schrieb:
Warum muss man hier eine Klammer mehr setzen?:

Code:
if (n<(128/(2^x)))

Ich weiß, mehr Klammern können in diesem Fall hier nicht schaden, aber sie bezwecken doch auch nichts oder?

Die Sache ist halt die, dass nicht jeder die Prioritäten der einzelnen Operationen auswendig kennt bzw. man sich da schnell einmal vertut. Daher ist es häufig sinnvoller einfach Klammern drum herum zu setzen, denn dann ist es auf jeden Fall eindeutig.
Du könntest auch hier und da ein paar Leerzeichen extra einfügen um die Lesbarkeit zu verbessern.

dene_mudda schrieb:
Mein Code, in dem der String nun gebildet wird sieht jetzt so aus:
Code:
String s;
s = "";
for (int i = 0; i<8;i++) {
   s += String.valueOf(a[i]);
}

Ist das soweit richtig?

Sieht gut aus.

dene_mudda schrieb:
Was meine Schreibweise betrifft: Ich mach das wie gesagt noch nicht lange und unser Lehrer hat auch noch nicht darüber gesprochen. Ich würde ganz gerne wissen, was ihr zu bemängeln habt, ich will ja schließlich auch was dazulernen :).

siehe Test.java. So könnt man es z.B. formatieren. Da hat jeder seinen persönlichen Stil. Man sollte aber immer dafür sorgen das es einheitlich, übersichtlich und eindeutig ist.

dene_mudda schrieb:
Ein großes Dankeschön schonmal für die jetzigen Antworten!
 
Hey Leute,
mein Lehrer hat mir heute eine Email geschrieben. Er hat gesagt, dass es das Zeichen "^" in Java nicht gäbe. Daher hat auch bei mir am Ende nichts funktioniert. Stattdessen hat mir eine andere Möglichkeit gesagt. Meine Umsetzung ist jetzt fertig und sieht so aus:
Code:
import java.applet.*;               
import java.awt.*;

public class Dezimalzahl extends Applet {
	public Dezimalzahl() {       
        int a[] = new int[8];
        int n = 5;
        int p = 1;
        String s = "";
        
                for(int x = 0; x<8; x++) {
                        if (n<128/(p)) {
                        	a[x]=0;
                        }
                        else {
                        	a[x]=1;
                            n = n-(128/(p));
                        }
		                p = p * 2;
		                }
                
			      for(int i = 0;i<8;i++) {
			      	      if (a[i]==1) {
			      	      	  s=s+"1";
			              }
			              else {
			              s=s+"0";
			              }
			      }
                
		Label schriftz = new Label(s);
		add (schriftz);

	}                                       
}

Alles funktioniert soweit. Danke für Eure Hilfe!
 
Zurück
Oben