Kardinalität < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 16:26 Do 03.11.2011 | Autor: | mikexx |
Aufgabe | Hallo, ich habe folgendes Problem.
Eine Integer-Zahl steht ja für eine bestimmte Menge.
So steht die Zahl 4 für die Menge [mm]\left\{2\right\}[/mm], weil in der 32-bit-Binärdarstellung nur eine 1 an der 2. Position steht, ansonsten Nullen.
Aufgabe ist es nun einen Java-Algorithmus zu bauen, der einem die Kardinalität der zu einer Integer-Zahl gehörigen Menge ausgibt. |
Meine Idee ist es eigentlich gewesen, das mit einer for-Schleife und der bitweisen Rechts-Verschiebung zu machen:
Ich schiebe jeweils die i-te Bit-Position um 32-i Stellen nach Rechts, dann kommt entweder 0 oder 1 heraus. Wenn eine 1 herauskommt (sprich: an der 0-ten Bitstelle steht), erhöhe ich die Kardinalität um 1, wenn da eine Null steht, eben nicht.
Zu Anfang lege ich also die Kardinalität auf Null fest.
Könnte man das so machen??
|
|
|
|
moin mikexx,
Ja, das dürfte so klappen.
Du musst aber nach dem Verschieben noch "mod 2" rechnen, damit du auch wirklich nur die letzte Stelle erhältst.
lg
Schadow
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:47 Do 03.11.2011 | Autor: | mikexx |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Mein Problem ist, daß ich das nicht in Java-Code umsetzen kann.
Kannst Du mir dabei vielleicht helfen??
Mein Ansatz ist dieses hier:
public class schieben {
/**
* @param args
*/
public static void main(String[] args) {
int a=96;
for(int i=0; i<32;i++)
{
int kard=0;
int d=a>>>(32-i);
if (d==1)
kard=kard++;
else
kard=+0;
}
// TODO Auto-generated method stub
System.out.println(kard);
Aber er zeigt an, daß bei dem System.out was nicht stimmt.
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
>
> Mein Problem ist, daß ich das nicht in Java-Code umsetzen
> kann.
>
> Kannst Du mir dabei vielleicht helfen??
>
> Mein Ansatz ist dieses hier:
Hmm, seltsamer Code...
public class schieben $\{$
>
> /**
> * @param args
> */
> public static void main(String[] args) $\{$
> int a=96;
>
>
> for(int i=0; i<32;i++)
> $\{$
> int kard=0; du setzt kard jedesmal wieder auf 0, also unschön wenn du hochzählen willst^^ (ich würde hier auch nen syntaxfehler erwarten, aber was solls)
> int d=a>>>(32-i);
> if (d%2==1) mod 2 nicht vergessen!
> kard=kard++; wieso auf diese Art? Wieso nicht einfach kard++; ?
> else
> kard=+0; kannst den else-Teil doch auch ganz weg lassen^^
>
> $\}$
> // TODO Auto-generated method stub
> System.out.println(kard);
>
> Aber er zeigt an, daß bei dem System.out was nicht stimmt.
Jupp, kard existiert nicht.
Du definierst kard innerhalb der for-Schleife, deshalb existiert es auch nur darin.
Wenn du System.out außerhalb der Schleife aufrufst ist kard nicht bekannt...
Also überarbeite den Code nochmal und definiere kard außerhalb der for-Schleife.
lg
Schadow
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:20 Do 03.11.2011 | Autor: | mikexx |
Jetzt gibt er eine Lösung aus.
Was mich wundert, ist:
Für a=7 gibt er 4 aus, es müsste aber wohl 3 herauskommen...
Weißt Du, woran das liegen könnte?
|
|
|
|
|
> Jetzt gibt er eine Lösung aus.
>
> Was mich wundert, ist:
>
> Für a=7 gibt er 4 aus, es müsste aber wohl 3
> herauskommen...
>
> Weißt Du, woran das liegen könnte?
Hmm, dürfte wohl irgendwo ein Logikfehler drinn sein.
Ich kenne mich aber mit Bitshifts nicht ganz so gut aus.
Versuch es vielleicht mal mit Division durch 2:
7%2 = 1, also um 1 erhöhen.
7/2 = 3
3%1 = 1, also um 1 erhöhen.
3/2 = 1
1%1 = 1, also um 1 erhöhen.
1/2 = 0; Berechnung beenden.
Hierbei ist mit / natürlich immer die Ganzzahldivision gemeint.
Es müsste mit Bitshifts auch irgendwie funktionieren, aber frag mich nicht wieso bei dir nicht...
lg
Schadow
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:30 Do 03.11.2011 | Autor: | mikexx |
Ich glaube mein Fehler war, daß ich in der Schleife i<33 hatte, ich habe es jetzt auf i<32 korrigiert und bei a=7 kommt auch 3 heraus.
Noch eine weitere Frage hierzu.
Wenn ich es jetzt als Methode formulieren soll,
so ist es doch recht ähnlich wie der obige Code, nur, daß ich als Parameter int a nehme. Oder?
Ich will die vollständige Methode lieber nicht posten, nachher kapieren die Tutoren nicht, daß ICH das hier geschrieben habe und meinen, ich hätte kopiert.
Vielleicht darf ich es Dir zusenden??
|
|
|
|
|
Die Tutoren lesen hier mit aber können nicht so weit denken zu sehen, dass du das geschrieben hast?^^
Komische Tutoren hast du da...
Aber zu deiner Frage:
Ja, als Methode übergibst du einfach a als Parameter und anstelle der System.out. gibst du dann eben kard zurück.
Wie weit genau die Schleife laufen muss musst du halt ein wenig testen, ich würde es wie gesagt mit Division durch 2 machen.
lg
Schadow
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:51 Do 03.11.2011 | Autor: | mikexx |
Man muss es nicht unbedingt ausgegeben oder?
Vorgesehen ist "return" und dann das, was die Methode macht.
Was ist "return"?
Da wird nichts ausgegeben, aber zurückgegebenb?
|
|
|
|
|
Du ersetzt deine letzte Zeile durch
return kard;
Damit wird das zurückgegeben, ja.
Du kannst dir das ganze wie eine mathematische Funktion denken.
Wenn du eine Funktion f hast dann steckst du ein x rein und bekommst f(x) zurück.
Der Vergleich hinkt zwar manchmal etwas, aber zur Anschauung ist er ganz praktisch.
Also in deinem Programm hast du etwa:
int x = 200;
int y = BerechneKard(x);
dann wird die Funktion BerechneKard (oder wie auch immer du sie nennst) aufgerufen, ihr wird der Wert x übergeben und das Ergebnis wird in der Variablen y gespeichert.
Deine Funktion BerechneKard sollte dann in etwa so aussehen:
public static int BerechneKard(int a)
[mm] $\{$
...dein Code...
return kard;
$\}$
[/mm]
lg
Schadow
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:01 Do 03.11.2011 | Autor: | mikexx |
Okay, ich sage lieber "Methode" statt Funktion.
Jetzt soll ich eine Methode bilden, die das Objekt zur leeren Menge macht.
Ist damit einfach
public void leereMenge(int a)
{
if(a!=0)
a=0;
}
gemeint?
(Das Wort "Objekt" irritiert mich nämlich ein bisschen.)
|
|
|
|
|
joa, würde ich so machen, auch wenn mich diese Fragestellung auch etwas wundert.
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 18:26 Do 03.11.2011 | Autor: | mikexx |
Und noch eine Frage.
Man soll der menge ein Element hinzufügen, wobei der parameter die nummer des elements sein soll, das man hinzufügen soll.
ich verstehe das so.
am anfang ist ein int a definiert.
sagen wir mal das wäre 4, also a=4.
dann ist das ja die menge {2}.
Nun versteh ich das so, daß man zum beispiel auch 17 in der menge haben will, das hieße meines erachtens :
public void einfuegen(int b)
{
a | [mm] 2^{b}
[/mm]
}
wäre das richtig?
kann man in der methode einfach a schreiben?
ich denke ja, a ist ja außerhalb der methode dann definiert?
Aber wie schreibt man in java [mm] 2^b, [/mm] wenn b eine Integerzahl sein soll... und 2 ist ja auch kein double. Math.pow(double,double) kanns also nicht sein...
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 21:44 Do 03.11.2011 | Autor: | dennis2 |
Ich befasse mich anscheinend mit der gleichen Aufgabe:
http://www.matheboard.de/thread.php?postid=1496269#post1496269
Bräuchte auch dringend Hilfe...
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:20 Sa 05.11.2011 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:20 Sa 05.11.2011 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|