| 03.11.2011, 13:13 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Okay...
Was ist mit der Methode, ist die korrekt?
Und dann noch eine andere Frage.
Eine Integerzahl steht ja für eine Menge.
[Steht an der i-ten Stelle in der Binärdarstellung eine 1, so gehört i in die durch die Integerzahl repträsentierte Menge).
Wenn ich jetzt zählen will, wie viele Elemente in der Menge sind, könnte man ja mit einer Schleife einfach die 1-en aufaddieren.
Aber wie bekomme ich die Binärdarstellung einer Integerzahl für diese Methode??
Ich kann ja nicht einfach eine Zahl von 0 bis 31 laufen lassen (für int) und gucken, ob die Stellen 0 oder 1 sind. Irgendwie muss da ja die Binärdarstellung der zu untersuchenden Zahl rein... |
| 03.11.2011, 13:34 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Oder anders gefragt:
Woher weiß der PC, daß ich mit dem Index die Binärstellen der betrachteten Zahl meine?? |
| 03.11.2011, 14:26 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Sorry, wenn ich so drängle.
Aber mir ist einfach nicht klar, wie ich die Bitpositionen durchwandern kann, um zu schauen, ob die Bitposition jeweils 0 oder 1 ist.
Wenn da eine 1 steht, erhöhe ich die Kardinalität einfach jeweils um 1.
Wie kann man das in einen Algorithmus packen?
Irgendwas mit bitweisem Verschieben?
Meine Idee wäre, jeweils um 32-i stellen nach rechts zu verschieben und dann zu schauen ob 1 oder 0 heraus kommt (for-Schleife). |
| 03.11.2011, 15:37 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Wieso geht das hier nicht?
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
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); |
|
Ich verstehe das nicht.
|
| 03.11.2011, 16:40 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Wieso geht das hier nicht?
Ich verstehe das nicht.
|
Was heißt hier "geht nicht"?
|
| 03.11.2011, 16:42 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Hallo, ich habe folgendes Anliegen.
Und zwar wurde eine Klasse definiert und darin sollen bestimmte Methoden programmiert werden:
Soll die Integer-Zahl a hier für alle Methoden benutzt werden?
Ich würde das so verstehen.
Eine der Methode soll "true" anzeigen, wenn die Menge leer ist.
Ich verstehe das nun so, daß ja jede Integer-Zahl via ihrer Binärdarstellung eine Menge repräsentiert. Wenn die Zahl 0 ist, handelt es sich also um die leere Menge, sonst nicht.
Meine Idee wäre:
Wäre das so korrekt? |
Poste mal die komplette Aufgabenstellung
|
| Anzeige | |
|
|
| 03.11.2011, 16:43 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Das kann ich leider nicht, weil ich Sorge habe, daß der Tutor dann denkt, ich hätte geklaut oder so. |
| 03.11.2011, 16:45 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Das kann ich leider nicht, weil ich Sorge habe, daß der Tutor dann denkt, ich hätte geklaut oder so. |
Ok, dann lassen wirs eben.
Ich verstehe die Aufgabe nämlich überhaupt nicht, und so alleine verstehe ich nicht, worauf sich deine Ausführungen beziehen. |
| 03.11.2011, 16:54 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Dann eine andere Frage, was macht man, wenn da steht:
"The method println(boolean) is not applicable for the arguments void."
Kann man das dann nicht ausgeben? |
| 03.11.2011, 17:10 |
Wetal |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Sorry, wenn ich so drängle.
Aber mir ist einfach nicht klar, wie ich die Bitpositionen durchwandern kann, um zu schauen, ob die Bitposition jeweils 0 oder 1 ist.
Wenn da eine 1 steht, erhöhe ich die Kardinalität einfach jeweils um 1.
Wie kann man das in einen Algorithmus packen?
Irgendwas mit bitweisem Verschieben?
Meine Idee wäre, jeweils um 32-i stellen nach rechts zu verschieben und dann zu schauen ob 1 oder 0 heraus kommt (for-Schleife). |
das überprüfen ob element k in x enthalten ist, kann auch so durchgeführt werden, dass man abfragt, ob
| code: |
1:
|
x & (1<<k) == (1 <<k) |
|
da wird bitweise verglichen |
| 03.11.2011, 17:16 |
Ibn Batuta |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Dann eine andere Frage, was macht man, wenn da steht:
"The method println(boolean) is not applicable for the arguments void."
Kann man das dann nicht ausgeben? |
In Java wird für Methoden ohne Rückgabewert benutzt. Das ist kein Datentyp, den du als Parameter in irgendeine Funktion übergeben kannst. Du musst dir eine Funktion basteln, die einen Rückgabewert besitzt und die dann in aufrufen.
Ibn Batuta |
| 03.11.2011, 17:17 |
Ibn Batuta |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Das kann ich leider nicht, weil ich Sorge habe, daß der Tutor dann denkt, ich hätte geklaut oder so. |
Du sollst ja nicht den Quellcode an sich posten, sondern die Aufgabenstellung. Hilfe zu suchen ist ja noch erlaubt.
Ibn Batuta |
| 03.11.2011, 17:21 |
vex |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Ibn Batuta
Hilfe zu suchen ist ja noch erlaubt. |
… solange man dies in der Lösung offenlegt. Ansonsten gibt es auch eine Liste von E-Mail-Adressen von Tutoren die sicher auch auf gut gestellte und durchdachte Fragen antworten werden. |
| 03.11.2011, 17:25 |
Ibn Batuta |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von vex
… solange man dies in der Lösung offenlegt. Ansonsten gibt es auch eine Liste von E-Mail-Adressen von Tutoren die sicher auch auf gut gestellte und durchdachte Fragen antworten werden. |
Klar gibt es so eine Liste und ich bin mir sicher, dass auch Dennis2010 die Mail-Addy seines Übungsleiters/Tutors hat.
Wenn man allerdings nicht unbedingt den Tutor wegen jeder Aufgabe "nerven" möchte, dann kann man auch in Foren Hilfe suchen. Sonst würde ja z.B. dieses Forum gar nicht existieren. Aber das soll nicht unsere Diskussion in diesem Thread sein. Hier geht es um Java.
Ibn Batuta |
| 03.11.2011, 17:39 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Ich schick Dir mal eine pn, Ibn Batuta. Ist das okay?
An Dich, Math1986, habe ich auch eine geschickt.
Ich hoffe, das ist okay und ihr könnt meine bisherigen Ideen korrigieren. |
| 03.11.2011, 18:35 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Wie kann man in Java potenzieren, wenn man keine double-Werte hat? |
| 03.11.2011, 18:46 |
Airblader |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Ich schick Dir mal eine pn, Ibn Batuta. Ist das okay? |
Nein, ist es eigentlich nicht. Hilfe, die sich der "Öffentlichkeit" entzieht, ist nicht erwünscht, denn auch andere sollen was davon haben. Wo ist denn eigentlich das Problem? Du sollst hier nicht abschreiben, sondern Hilfe bekommen. Dagegen ist nichts einzuwenden.
air |
| 03.11.2011, 18:51 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Also zum Beispiel soll eine Methode geschrieben werden, die Folgendes macht:
Fuege ein Element in die Menge ein
*
* @param elem Nummer des Elements, welches in die Menge einzufuegen ist
* Wenn das Element bereits in der Menge enthalten ist,
* hat die Operation keine Wirkung. Wenn das Element nicht im Wertebereich
* 0..31 liegt, wird dies still ignoriert.
Es ist also eine Integerzahl gegeben, die ja für eine Menge steht, und man soll, so wie ichs verstanden habe, eine Methode schreiben, die ein beliebiges Element zu dieser Menge hinzufügt.
Sei zum Beispiel
int a=4.
Dann steht 4 ja für die Menge {2}.
Jetzt will man zum Beispiel 12 in der Menge haben.
Ich würde meinen, daß man dann a mit 2^(12) vereinigen muss.
| code: |
1:
2:
3:
4:
5:
|
public void einfuegen(int b)
{
a | 2^(b);
} |
|
Da aber a eine Integerzahl sein soll und b auch, weiß ich nicht wie man 2^(b) programmiert, denn ich kenne nur Math.powe(double,double)
Stimmt das denn ansonsten?! |
| 03.11.2011, 19:30 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Okay, dann poste ich doch jetzt mal alles, weil ich einfach nicht weiter weiß.
Dies ist mein Resultat:
Zu ergänzen waren nach den darüber stehenden Kommentaren:
1.) public boolean empty()
2.) public int card()
3.) public void erase()
4.) public void insert()
5.) public void (union)
6.) public void intersection()
7.) public void setMinus()
8.) public boolean hasElem()
Alles Andere war vorgegeben.
Ich habe das so gut gemacht, wie ich konnte.
Könnte jemand 1.) bis 8.) anschauen und mir meine Fehler sagen?
[Zum Beispiel weiß ich eben nicht, wie man bei Int-Zahlen potenziert, da habe ich einfach intuitiv das nur in den Code geschrieben, aber das klappt natürlich nicht.]
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
|
class MyBitSet {
public int setState;
/**
* Konstruktor erzeugt eine leere Menge
*/
MyBitSet() {
setState = 0;
}
/**
* Der sogenannte Copy-Konstruktor liest die Attribute
* eines Referenzobjektes desselben Typs und kopiert die Werte auf
* die Attribute des neu erzeugten Objektes
*/
public MyBitSet(MyBitSet theOtherSet) {
setState = theOtherSet.toInt();
}
public MyBitSet(int m) {
setState = m;
}
/**
* Gibt true zurueck, falls die Menge leer ist
*/
public boolean empty( int a )
{
boolean isEmpty = true;
if ( a==0 )
return isEmpty;
}
/**
* Gib die Anzahl der Elemente ("Kardinalität") in der Menge zurück,
* die vom Objekt repräsentiert wird
*/
public int card(int a) {
int numElements = 0;
for(int i=0; i<32; i++)
{
int c=a>>>(32-i);
if (c%2==1)
numElements++;
}
return numElements;
}
/**
* Gib den Zustand der Menge als Integer zurück
*/
public int toInt() {
return setState;
}
/**
* Mache das Objekt zur leeren Menge
*/
public void erase(int a)
{
if(a!=0)
a=0;
}
/**
* Fuege ein Element in die Menge ein
*
* @param elem Nummer des Elements, welches in die Menge einzufuegen ist
* Wenn das Element bereits in der Menge enthalten ist,
* hat die Operation keine Wirkung. Wenn das Element nicht im Wertebereich
* 0..31 liegt, wird dies still ignoriert.
*/
public void insert(int elem)
{
setState | Math.pow(2, elem);
}
/**
* Vereinige die durch das Objekt repräsentierte Menge
* mit einer zweiten Menge, die als Parameter übergeben wird.
*
* @param theOtherSet Objektinstanz vom Typ MyBitSet.
* Es wird die Vereinigung aus setState und theOtherSet gebildet.
*/
public void union(MyBitSet theOtherSet) {
setState | theOtherSet;
}
/**
* Bilde aus dem aktuellen Objekt den Durchschnitt mit der als Parameter
* mit gegebenen zweiten Menge
*/
public void intersection(MyBitSet theOtherSet) {
setState & theOtherSet;
}
/**
* Bilde aus dem aktuellen Objekt O1 die Mengendifferenz
* O1 \ theOtherSet mit der als Parameter eingegebene Menge
*/
public void setMinus(MyBitSet theOtherSet) {
a & ~theOtherSet;
}
public boolean hasElem(int elem) {
boolean haveThisElem = false;
if((setState & 2^(elem))=2^(elem))
haveThisElem=true;
return haveThisElem;
}
/**
* Repräsentiere die Menge als String, in der üblichen Notation
*/
public String toString() {
String theSetAsString;
boolean isFirst = true;
theSetAsString = "{ ";
for ( int i = 0; i < 32; i++ ) {
if ( (setState & (1 << i)) != 0 ) {
if ( ! isFirst )
theSetAsString = theSetAsString + ", ";
isFirst = false;
Integer e = new Integer(i);
String theElemAsString = new String(e.toString());
theSetAsString = theSetAsString + theElemAsString;
}
}
theSetAsString = theSetAsString + " }";
return theSetAsString;
}
}
class Uebung1 {
public static void tassert(String aStr, boolean a, MyBitSet b0, MyBitSet b1) {
if ( a ) {
System.out.println("PASS: " + aStr);
}
else {
System.out.println("FAIL: " + aStr);
System.out.println("b0: " + b0.toString());
System.out.println("b1: " + b1.toString());
}
}
/**
* Methode zum Test der eigentlich zu entwickelnden Klasse
*/
public static void main(String[] args) {
MyBitSet b0 = new MyBitSet();
MyBitSet b1 = new MyBitSet();
tassert("b0.empty()",b0.empty(),b0,b1);
tassert("b0.card() == 0",b0.card() == 0,b0,b1);
b0.insert(31);
tassert("b0.elem(31)",b0.hasElem(31),b0,b1);
b1.insert(0);
b1.insert(10);
b1.insert(320);
b1.insert(31);
b1.insert(20);
b1.insert(17);
b1.insert(19);
b1.insert(3);
tassert("b1.card() == 7", b1.card() == 7, b0, b1);
b0.setMinus(b1);
tassert("b0.empty()",b0.empty(),b0,b1);
b0.insert(31);
b0.insert(17);
b0.insert(23);
b0.insert(1);
b0.setMinus(b1);
tassert("!b0.empty()",!b0.empty(),b0,b1);
tassert("b0.toString() equals { 1, 23 }",b0.toString().equals("{ 1, 23 }"),b0,b1);
}
} |
|
Fehlermeldung, die ich bekomme:
85: not a statement
98: not a statement
100: not a statement
118: not a statement |
| 03.11.2011, 20:33 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Kurze Nachfrage:
Steigt da überhaupt jemand durch und macht es Sinn auf Antworten zu warten oder schaut man sich das nur an und klickt sowieso weg?!
Ich frage mich, wie man sowas nach 1 Vorlesung können soll.
|
| 03.11.2011, 21:01 |
Calvin |
Auf diesen Beitrag antworten » |
Es ist schwierig, dir zu folgen, weil die Aufgabenstellung (zumindest mir) nicht ganz klar ist.
Aber mal ein paar Anmerkungen zu Dingen, die mir beim Überfliegen deines letzten Postings aufgefallen sind.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
/**
* Gibt true zurueck, falls die Menge leer ist
*/
public boolean empty( int a )
{
boolean isEmpty = true;
if ( a==0 )
return isEmpty;
}
|
|
Sobald der Rückgabewert nicht void ist, muss in jedem Fall ein Wert zurückgegeben werden. In deiner Funktion wird nur etwas zurückgegeben, wenn die Menge leer ist.
Deine Funktion werde ich mal in drei Schritten korrigieren
1) nicht so gut:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
public boolean empty(int a) {
boolean isEmpty=true;
if(a==0) {
isEmpty = true;
} else {
isEmpty = false
}
return isEmpty;
} |
|
2) Alternative:
| code: |
1:
2:
3:
4:
5:
6:
7:
|
public boolean empty(int a) {
boolean isEmpty=true;
if(a==0) {
return true;
}
return false
} |
|
3) besser und kürzer
| code: |
1:
2:
3:
4:
|
public boolean empty(int a) {
return (a==0);
}
|
|
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
|
/**
* Fuege ein Element in die Menge ein
*
* @param elem Nummer des Elements, welches in die Menge einzufuegen ist
* Wenn das Element bereits in der Menge enthalten ist,
* hat die Operation keine Wirkung. Wenn das Element nicht im Wertebereich
* 0..31 liegt, wird dies still ignoriert.
*/
public void insert(int elem)
{
setState | Math.pow(2, elem);
}
|
|
Zwei Sachen:
1) Die Methode Math.pow gibt einen double-Wert zurück. Der |-Operator geht aber nur für Integer-Werte. Du musst also explizit casten.
2) Der Ausdruck setState | theOtherSet gibt ein Ergebnis zurück. Das musst du noch einer Variable zuweisen, in deinem Fall setState
| code: |
1:
2:
3:
4:
5:
6:
|
public void insert(int elem)
{
setState = setState | (int) Math.pow(2, elem);
}
|
|
Oder kürzer
| code: |
1:
2:
3:
4:
5:
6:
|
public void insert(int elem)
{
setState |= (int) Math.pow(2, elem);
}
|
|
Gleiches gilt auch für die anderen Methoden, die bei dir Fehler bringen. |
| 03.11.2011, 21:04 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Die Aufgabe lautete einfach so, daß der Quellcode gegeben war mit den Methoden, die ich aufgezählt hatte, die man zu schreiben hatte.
Danke für Deine Hinweise, ich muss sie mir in Ruhe durchlesen.
Kannst Du mir vielleicht bei den beiden Methoden weiterhelfen, wo ich Potenzen benutzt habe? Wie macht man das bei Java? |
| 03.11.2011, 21:12 |
Calvin |
Auf diesen Beitrag antworten » |
Potenzen von 2 sind in Java (bzw. Programmiersprachen allgemein) übrigens sehr gut mit dem <<-Operator zu erledigen.
Folgende zwei Methoden sind also für exponent >=0 äquivalent
| code: |
1:
2:
3:
|
public int zweiHoch(int exponent) {
return (int) Math.pow(2,exponent);
} |
|
| code: |
1:
2:
3:
|
public int zweiHoch(int exponent) {
return (1 << exponent);
} |
|
|
| 03.11.2011, 21:16 |
Math1986 |
Auf diesen Beitrag antworten » |
Bitte keine ungefragten PMs.
Mir ist zB der Sinn von empty(int a) unklar:
Selbst wenn ich die korrigierte Version von Calvin nehme:
| code: |
1:
2:
3:
|
public boolean empty(int a) {
return (a==0);
} |
|
Was ist der Sinn dahinter?
Es wird true zurückgegeben, wenn der von mir selbst eingegebene Wert 0 ist?
Was genau ist die Bedeutung des Parameters?
Genauso die Methode setState:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
/**
* Mache das Objekt zur leeren Menge
*/
public void erase(int a)
{
if(a!=0)
a=0;
} |
|
Es macht keinen Sinn, den Eingabeparameter zu überschreiben, diesen aber auch nirgens zu speichern.
Also was die Variable setState und die Methoden machen sollen, das ist mir nicht klar, und ich werde hier auch nicht raten.
Ich will die Original-Aufgabe sehen, ich will sehen, was du ergänzt hast und was vorgegeben war. |
| 03.11.2011, 21:25 |
Calvin |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Math1986
Mir ist zB der Sinn von empty(int a) zurück:
Selbst wenn ich die korrigierte Version von Calvin nehme:
| code: |
1:
2:
3:
|
public boolean empty(int a) {
return (a==0);
} |
|
Was ist der Sinn dahinter?
Es wird true zurückgegeben, wenn der von mir selbst eingegebene Wert 0 ist?
Was genau ist die Bedeutung des Parameters? |
Oh ja, das habe ich komplett übersehen. Danke fürs Aufpassen.
Gruß
Calvin, der jetzt ins Bett geht *schnarch*
|
| 03.11.2011, 22:07 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Ich weiß leider selbst nicht, was der genaue Sinn ist.
Vor allem weiß ich nicht, wieso man manchmal setState nimmt und manche nicht.
Oder muss man IMMER alles mit setState gleichsetzen, weil sichalles darauf beziehen soll . |
| 03.11.2011, 22:10 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Ich weiß leider selbst nicht, was der genaue Sinn ist.
Vor allem weiß ich nicht, wieso man manchmal setState nimmt und manche nicht. |
Mir wird so langsam klar, was es machen soll, dbisher hast du aber immer noch nicht die Originalaufgabe oder zumindest die Originalvorlage gepostet, von daher lasse ich das hier.
Erstmal solltest du dir über den genauen Sinn der Methoden klar werden, bevor du hier irgendwas anfängst zu programmieren.
Welche Funktion macht was, und welche Bedeutung haben die Parameter? |
| 03.11.2011, 22:11 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Es gab keine Originalaufgabe!
Dieser Code wurde zur Verfügung gestellt und die Lüken sollten geschlossen werden.
Ich verstehe zum Beispiel die Methide insert nicht... |
| 03.11.2011, 22:12 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Es gab keine Originalaufgabe!
Dieser Code wurde zur Verfügung gestellt und die Lüken sollten geschlossen werden. |
Der Code wurde also so, wie du ihn ins Forum gestellt hast, inklusive sämtlicher Fehler, zur Verfügung gestellt?
Soll das ein Scherz sein? |
| 03.11.2011, 22:14 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Nein, aber da, wo mein Code steht stand einfach nur:
Vorgehesen für Übung 1.
Und ich habe ja extra hingeschrieben, welche Methode ausgefüllt werden sollen.
Ich verstehe nicht: Oben ist ja diese int setState festgelegt.
Und in den Methoden soll man das dann immer benutzen?=! |
| 03.11.2011, 22:17 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Original:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
|
class MyBitSet {
public int setState;
/**
* Konstruktor erzeugt eine leere Menge
*/
MyBitSet() {
setState = 0;
}
/**
* Der sogenannte Copy-Konstruktor liest die Attribute
* eines Referenzobjektes desselben Typs und kopiert die Werte auf
* die Attribute des neu erzeugten Objektes
*/
public MyBitSet(MyBitSet theOtherSet) {
setState = theOtherSet.toInt();
}
public MyBitSet(int m) {
setState = m;
}
/**
* Gib true zurueck, falls die Menge leer ist
*/
public boolean empty() {
boolean isEmpty = true;
// Im Rahmen von Uebung 1 zu entwickeln
return isEmpty;
}
/**
* Gib die Anzahl der Elemente ("Kardinalität") in der Menge zurück,
* die vom Objekt repräsentiert wird
*/
public int card() {
int numElements = 0;
// Im Rahmen von Uebung 1 zu entwickeln
return numElements;
}
/**
* Gib den Zustand der Menge als Integer zurück
*/
public int toInt() {
return setState;
}
/**
* Mache das Objekt zur leeren Menge
*/
public void erase() {
// Im Rahmen von Uebung 1 zu entwickeln
}
/**
* Fuege ein Element in die Menge ein
*
* @param elem Nummer des Elements, welches in die Menge einzufuegen ist
* Wenn das Element bereits in der Menge enthalten ist,
* hat die Operation keine Wirkung. Wenn das Element nicht im Wertebereich
* 0..31 liegt, wird dies still ignoriert.
*/
public void insert(int elem) {
// Im Rahmen von Uebung 1 zu entwickeln
}
/**
* Vereinige die durch das Objekt repräsentierte Menge
* mit einer zweiten Menge, die als Parameter übergeben wird.
*
* @param theOtherSet Objektinstanz vom Typ MyBitSet.
* Es wird die Vereinigung aus setState und theOtherSet gebildet.
*/
public void union(MyBitSet theOtherSet) {
// Im Rahmen von Uebung 1 zu entwickeln
}
/**
* Bilde aus dem aktuellen Objekt den Durchschnitt mit der als Parameter
* mit gegebenen zweiten Menge
*/
public void intersection(MyBitSet theOtherSet) {
// Im Rahmen von Uebung 1 zu entwickeln
}
/**
* Bilde aus dem aktuellen Objekt O1 die Mengendifferenz
* O1 \ theOtherSet mit der als Parameter eingegebene Menge
*/
public void setMinus(MyBitSet theOtherSet) {
// Im Rahmen von Uebung 1 zu entwickeln
}
public boolean hasElem(int elem) {
boolean haveThisElem = false;
// Im Rahmen von Uebung 1 zu entwickeln
return haveThisElem;
}
/**
* Repräsentiere die Menge als String, in der üblichen Notation
*/
public String toString() {
String theSetAsString;
boolean isFirst = true;
theSetAsString = "{ ";
for ( int i = 0; i < 32; i++ ) {
if ( (setState & (1 << i)) != 0 ) {
if ( ! isFirst )
theSetAsString = theSetAsString + ", ";
isFirst = false;
Integer e = new Integer(i);
String theElemAsString = new String(e.toString());
theSetAsString = theSetAsString + theElemAsString;
}
}
theSetAsString = theSetAsString + " }";
return theSetAsString;
}
}
class Uebung1 {
public static void tassert(String aStr, boolean a, MyBitSet b0, MyBitSet b1) {
if ( a ) {
System.out.println("PASS: " + aStr);
}
else {
System.out.println("FAIL: " + aStr);
System.out.println("b0: " + b0.toString());
System.out.println("b1: " + b1.toString());
}
}
/**
* Methode zum Test der eigentlich zu entwickelnden Klasse
*/
public static void main(String[] args) {
MyBitSet b0 = new MyBitSet();
MyBitSet b1 = new MyBitSet();
tassert("b0.empty()",b0.empty(),b0,b1);
tassert("b0.card() == 0",b0.card() == 0,b0,b1);
b0.insert(31);
tassert("b0.elem(31)",b0.hasElem(31),b0,b1);
b1.insert(0);
b1.insert(10);
b1.insert(320);
b1.insert(31);
b1.insert(20);
b1.insert(17);
b1.insert(19);
b1.insert(3);
tassert("b1.card() == 7", b1.card() == 7, b0, b1);
b0.setMinus(b1);
tassert("b0.empty()",b0.empty(),b0,b1);
b0.insert(31);
b0.insert(17);
b0.insert(23);
b0.insert(1);
b0.setMinus(b1);
tassert("!b0.empty()",!b0.empty(),b0,b1);
tassert("b0.toString() equals { 1, 23 }",b0.toString().equals("{ 1, 23 }"),b0,b1);
}
} |
|
Können wir bitte gemeinsam alle Methoden, die ich entwickeln soll, durchgehen? Möchte das so gerne hinbekommen. Ich wollte wirklich niemanden verägern, ich dachte nur, daß ich es alleine hinbekomme.
Die erste Methode, die ich entwickeln muss, ist
| code: |
1:
2:
|
public boolean empty() |
|
Meine Idee war es, daß man einen Parameter übergibt und dann schaut, ob dieser leer ist. Aber das war wohl daneben. |
| 03.11.2011, 22:37 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Nein, aber da, wo mein Code steht stand einfach nur:
Vorgehesen für Übung 1.
Und ich habe ja extra hingeschrieben, welche Methode ausgefüllt werden sollen. |
Ja, nur dass du bei deinen Funktionen willkürlich Parameter hinzugefügt hast, genau das war das Problem bei deinem Code.
bspw empty(int a) hast du hinzugefügt - gegeben war aber empty()!
Füge keine Funktionsparameter selbstständig hinzu!
Du solltest dir erstmal klar darüber werden, wie ein int intern repräsentiert wird, und wie die Verknüpfungen wie BitShift usw. funktionieren.
Aufgabe der Klasse ist, so wie ich das sehe, die Darstellung einer Menge im Wertebereich {0,..,31}.
Ein int ist dabei eine 32bit Dezimalzahl, und es ist n genau dann in der Menge, wenn das n-te Bit eine 1 ist.
Die Menge {3,5,7} entspräche dann ...1010100 (führende Nullen weggelassen)
Mach dir klar, wie das Funktioniert, und was die Bit-Operationen darauf bewirken.
Lies dir zu den Funktionen die Kommentare durch, um zu verstehen, was diese bewirken.
Ansonsten werde ich hier sicher keine Komplettlösung posten.
| Zitat: |
| Meine Idee war es, daß man einen Parameter übergibt und dann schaut, ob dieser leer ist. Aber das war wohl daneben. |
Welchen Sinn hätte dies auch?
Du möchtest wissen, ob die gegebene Menge leer ist, also übergibst du der Menge eine Zahl, wenn die Zahl, die du übergeben hast, "leer" ist, dann ist die Menge leer
Richtig wäre: return (this.setState==0), alternativ könnte man auch die Funktion card() verwenden. |
| 03.11.2011, 22:41 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Ich möchte auch keine Komplettlösungen.
Aber es würde mir helfen, wenn wir das schrittweise durchgehen könnten.
Würdest Du da mitmachen?
Methode 1: public boolean empty()
Ich habe im Grunde verstanden, dass eine int-Zahl für eine Menge steht und sehe, dass man am Anfang eine int-Zahl hinschreibt, dieses setState.
Aber ich verstehe einfach nichtm, wie ich jetzt diese Methode aufschreibe.
Soll als Parameter eine int-Zahl übergeben werden?`
Oder soll es gar kein Parameter geben und man soll einfach nur die gegebene Menge setState daraufhin kontrollieren, ob sie die leere Menge ist, sprich, ob setstate gleich 0 ist?
Wo kommt denn das this.setState jetzt plötzlich her? |
| 03.11.2011, 22:45 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Oder soll es gar kein Parameter geben und man soll einfach nur die gegebene Menge setState daraufhin kontrollieren, ob sie die leere Menge ist, sprich, ob setstate gleich 0 ist? |
Genau das.
Noch einmal:
Füge keine Funktionsparameter selbstständig hinzu!
| Zitat: |
Original von Dennis2010
Wo kommt denn das this.setState jetzt plötzlich her? |
this.setState meint den Parameter setState in der selben Klassen. Man könnte auch nur setState dafür schreiben. |
| 03.11.2011, 22:49 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Okay, eine Sache schonmal mehr verstanden.
Aber wieso ist da dieser boolean Variable auf true schon gesetzt?
Und inwiefern nur
| code: |
1:
2:
|
return(setState==0) |
|
|
| 03.11.2011, 22:54 |
Math1986 |
Auf diesen Beitrag antworten » |
| Zitat: |
Original von Dennis2010
Aber wieso ist da dieser boolean Variable auf true schon gesetzt? |
Es gibt da keine boolean-Variable.
Schau einfach mal ein paar Beiträge vorher, Calvin hat 3 verschiedene Realisationen dieser Funktion geliefert - nur dass auch er von dem Parameter a verwirrt wurde.
a ist dabei bei ihm durch setState zu ersetzen.
| Zitat: |
Original von Dennis2010
Und inwiefern nur
| code: |
1:
2:
|
return(setState==0) |
|
|
Das ist der ganze Code, der in die Funktion empty() eingefügt werden soll.
Schau dir den Rest einfach mal selbst an und beschäftige dich mit den Bit-Operationen, die wurden sicher in der Veranstaltung erwähnt, für heute habe ich keine Lust mehr, umd ob ich morgen welche habe weiß ich noch nicht. |
| 03.11.2011, 22:58 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Hm, dann habe ich das alles total missverstanden...
Ich schau' es mir dahingehend an.
Danke! |
| 03.11.2011, 23:20 |
Gast11022013 |
Auf diesen Beitrag antworten » |
So langsam fällt bei mir der Groschen!
So ist m.E. zum Beispiel
| code: |
1:
2:
3:
4:
5:
|
public void insert (int elem)
{
setState=setState | (1<<elem);
} |
|
|
| 04.11.2011, 07:33 |
Gast11022013 |
Auf diesen Beitrag antworten » |
Guten Morgen, ich habe das noch mal ein bisschen Revue passieren lassen und hier meine Ideen zu den einzelnen Methoden:
1. Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public boolean empty()
{
return(setState == 0);
}
|
|
2. Methode
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
|
public int card()
{
int numElements=0;
for(int i=0;i<32;i++)
{
if((setState & (1<<i))!=0)
numElements++
}
return numElements;
}
|
|
3. Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public void erase()
{
setState=0;
}
|
|
4.Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public void insert(int elem)
{
setState=setState | (1<<elem);
}
|
|
5. Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public void union(MyBitSet theOtherSet)
{
setState=setState | theOtherSet;
}
|
|
6. Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public void intersection(MyBitSet theOtherSet)
{
setState=setState & theOtherSet;
}
|
|
7. Methode
| code: |
1:
2:
3:
4:
5:
6:
|
public void setMinus(MyBitSet theOtherSet)
{
setState=setState & ~theOtherSet;
}
|
|
8. Methode
| code: |
1:
2:
|
public boolean hasElement(int elem) |
|
habe ich noch nicht
Könnte das sich mal bitte jemand vielleicht ansehen auf noch vorhandene Denkfehler und Schreibfehler? |
| 04.11.2011, 09:12 |
Ibn Batuta |
Auf diesen Beitrag antworten » |
Hallo Dennis2010,
sorry, dass ich dir erst jetzt antworte. Bin gestern schon um kurz nach 21 Uhr schlafen gegangen...
Ich werde es mir heute Nachmittag / Abend anschauen, da ich im Moment in der Arbeit bin. Oder ich schau's mir in der Mittagspause an.
Falls Math1986 oder Calvin dir schon eher helfen können, ist das natürlich für dich noch besser.
Ibn Batuta |