hi,
wen ich das hier
public static void streicheVielfache(int zahl, boolean[] liste) {
aufrufen will, was kommt dann anstelle der fragezeichen hin?
streicheVielfache(y, ???)
Sorry, hab null vorkenntnisse
Vielen Dank
€dit: siehe letzter post
hi,
wen ich das hier
public static void streicheVielfache(int zahl, boolean[] liste) {
aufrufen will, was kommt dann anstelle der fragezeichen hin?
streicheVielfache(y, ???)
Sorry, hab null vorkenntnisse
Vielen Dank
€dit: siehe letzter post
bool z [] = {1,0,0,0,1,1,0,1,1,0};
aufruf dann per
streicheVielfache(y, z);
und in der funktion
public static void streicheVielfache(int zahl, boolean[] liste) {
liste. // das übergebene array ansprechen
}
danke gashipashi!
Anscheinend hängt es bei mir woanders.
Falls jemand zeit und lust hat kann er ja mal drüberschauen.
Falls nicht, kann ich gut verstehn
hier ist mein code. ich kriege überall fehlermeldungen und falsche zahlen
Danke!
€dit: hier in übersichtlicher Form: http://pastie.org/313823
public class Eratosthenes {
/*
* Die Obergrenze für das Sieben wird durch den Parameter grenze bestimmt.
* Ist er ungueltig (grenze < 2), so wird null zurueckgeliefert.
* grenze ist in den Test eingeschlossen, d.h. getestet wird das Intervall [2; grenze].
* Die Rueckgabe der Methode ist die Liste der „Streichungen“ als Array. Wurde die Zahl i
* gestrichen, so ist der Wert des Arrays an Stelle i gleich true.
*/
public static boolean[] siebe(int grenze) {
if (grenze < 2)
return null;
erzeugeListe(grenze);
int y = 2;
while (y<grenze) {
y = findeKleinsteUngestricheneZahl(y, liste);
streicheVielfache(y, liste);
}
return null;
}
/*
* Diese Methode erzeugt die Liste fuer die Streichungen in der passenden Groesse
* und streicht die Zahlen 0 und 1 vorab. Fuer unzulaessige Eingaben (groesse < 2) liefert
* die Methode null zurück.
*/
public static boolean[] erzeugeListe(int groesse) {
if (groesse < 2)
return null;
boolean[] liste;
liste = new boolean[groesse];
liste[0] = true;
liste[1] = true;
return null;
}
/*
* Diese Methode streicht die Vielfachen der Zahl zahl bis zur Obergrenze im Array liste.
* Ist der Parameter zahl unzulaessig (zahl kleiner 1 oder zahl groesser als die Obergrenze),
* so bleibt die Liste unveraendert.
*/
public static void streicheVielfache(int zahl, boolean[] liste) {
int i = 2;
int x;
while (i<liste.length) {
x = zahl*i;
liste[x] = true;
i = i+1;}
}
/*
* Diese Methode gibt die kleinste ungestrichene Zahl in der Liste zurueck, die groeßer als beginn
* ist. Enthaelt die Liste keine solche Zahl, wird die Obergrenze zurueckgegeben, bei unzulässigen Eingaben
* ist -1 der Rückgabewert.
*/
public static int findeKleinsteUngestricheneZahl(int beginn, boolean[] liste) {
while (liste[beginn]!= false) {beginn = beginn + 1;}
return beginn;
}
/*
* main-Methode
*/
public static void main(String[] args) {
outputPrimes(siebe(25));
outputPrimes(siebe(49));
outputPrimes(siebe(2));
outputPrimes(siebe(997));
}
/*
* Hilfsmethode zur Ausgabe der Primzahlen
*/
private static void outputPrimes(boolean[] result) {
if (result == null)
return;
for (int i = 0; i < result.length; i++) {
if (!result)
System.out.print(i + " ");
}
System.out.println();
}
}
Hi Dauser, ich versuch mal ein bißchen zu helfen siehe kommentare
public static boolean[] siebe(int grenze) {
if (grenze < 2)
return null;
erzeugeListe(grenze); // was macht genau erzeuge liste, siehe später
int y = 2;
while (y<grenze) {
y = findeKleinsteUngestricheneZahl(y, liste);
streicheVielfache(y, liste);
}
return null;
}
// Sieht soweit ok aus
public static boolean[] erzeugeListe(int groesse) {
if (groesse < 2)
return null;
boolean[] liste;
liste = new boolean[groesse];
liste[0] = true; // solltest du hier nicht eine Schleife über die größe der Liste haben um sie vollständig zu füllen?
liste[1] = true;
return null; // hier solltest du dann wohl die Liste zurückgeben}
public static void streicheVielfache(int zahl, boolean[] liste) {
int i = 2;
int x;
while (i<liste.length) {
x = zahl*i; // x kann durch die Multiplikation größer length werden
liste[x] = true; // dann bekommst hier ne Exception
i = i+1;}
public static int findeKleinsteUngestricheneZahl(int beginn, boolean[] liste) {
while (liste[beginn]!= false) {beginn = beginn + 1;}
return beginn; // Was ist, wenn du durch die Liste durch bist und nichts gefunden hast???}
Soweit meine Anmerkungen, hoffe das Hilft.
krax78
Hab nicht mehr soviel Zeit. Gucke es mir aber zu hause gleich nochmal an. Was weiterhin auffällt ist, dass dein Methode siebe kein boolean-Array zurück liefert.
Weiterhin scheint, wie krax schon bemerkt hat, die Schleife in streicheVielfache nicht ganz hinzuhauen.
Original von krax78
...
Dake erstmal für die Antworten!
habe die erzeugeliste methode mal bisschen geändert. passt das jetzt?
public static boolean[] erzeugeListe(int groesse) {
if (groesse < 2)
return null;
boolean[] liste;
liste = new boolean[groesse];
liste[0] = true;
liste[1] = true;
int i = 2;
while (i<groesse) {
liste = false;
i++;}
return liste;
streicheVielfache hab cih auch mal bisschen verbessert:
public static void streicheVielfache(int zahl, boolean[] liste) {
int i = 2;
int x = 1;
while (i<liste.length & x<liste.length) {
x = zahl*i;
liste[x] = true;
i = i+1;}
bei findekleinsteZahl hab ich acuh noch was verändert:
public static int findeKleinsteUngestricheneZahl(int beginn, boolean[] liste) {
while (liste[beginn]!= false &beginn<liste.length) {beginn = beginn + 1;}
return beginn;
sind die Änderungen sinnvoll?
die streicheVielfaches kann so nicht richtig sein... Wenn die "zahl" z.B. 2 ist und i=liste.length/2 + 1, dann solltest du einen "index out of bounds"-Fehler verursachen mit dem Aufruf liste[(liste.length/ 2 + 1) * 2] = true;
Hab mir es jetzt angeguckt u. ein wenig verbessert.
public class Eratosthenes {
/*
* Die Obergrenze für das Sieben wird durch den Parameter grenze bestimmt.
* Ist er ungueltig (grenze < 2), so wird null zurueckgeliefert.
* grenze ist in den Test eingeschlossen, d.h. getestet wird das Intervall [2; grenze].
* Die Rueckgabe der Methode ist die Liste der „Streichungen“ als Array. Wurde die Zahl i
* gestrichen, so ist der Wert des Arrays an Stelle i gleich true.
*/
public static boolean[] siebe(int grenze) {
boolean[] liste = erzeugeListe(grenze+1); // Erzeuge die Liste gleich hier um das return null zu vermeiden. das +1 ergänzen, damit du nicht überall immer 1 wegen der array größe abziehen musst
if (grenze <= 2) {
return liste;
}
int y = 2;
while (y * y < grenze) { //hier auf y * y prüfen
y = findeKleinsteUngestricheneZahl(y, liste);
streicheVielfache(y, liste);
y++; //y um 1 erhöhen, also das nächste Element des Arrays
}
return liste;
}/*
* Diese Methode erzeugt die Liste fuer die Streichungen in der passenden Groesse
* und streicht die Zahlen 0 und 1 vorab. Fuer unzulaessige Eingaben (groesse < 2) liefert
* die Methode null zurück.
*/
public static boolean[] erzeugeListe(int groesse) {
boolean[] liste = new boolean[groesse];
java.util.Arrays.fill(liste,false); //spart dir die while-Schleife![]()
liste[0] = true; //0 ist keine Primzahl
liste[1] = true; //1 ist keine Primzahl
return liste;
}/*
* Diese Methode streicht die Vielfachen der Zahl zahl bis zur Obergrenze im Array liste.
* Ist der Parameter zahl unzulaessig (zahl kleiner 1 oder zahl groesser als die Obergrenze),
* so bleibt die Liste unveraendert.
*/
public static void streicheVielfache(int zahl, boolean[] liste) {
int i = 2;
int x = 0;
while (zahl * i < liste.length) { //hier musst du auf zahl * i prüfen, da du ja nur bis zu dem Vielfachen von zahl prüfen willst was kleiner als die grenze ist
x = zahl * i;
liste[x] = true;
i = i + 1;
}
}/*
* Diese Methode gibt die kleinste ungestrichene Zahl in der Liste zurueck, die groeßer als beginn
* ist. Enthaelt die Liste keine solche Zahl, wird die Obergrenze zurueckgegeben, bei unzulässigen Eingaben
* ist -1 der Rückgabewert.
*/
public static int findeKleinsteUngestricheneZahl(int beginn, boolean[] liste) {
while (liste[beginn] != false) {
beginn = beginn + 1;
}
return beginn;
}/*
* main-Methode
*/
public static void main(String[] args) {
outputPrimes(siebe(25));
outputPrimes(siebe(49));
outputPrimes(siebe(2));
outputPrimes(siebe(997));}
/*
* Hilfsmethode zur Ausgabe der Primzahlen
*/
private static void outputPrimes(boolean[] result) {if (result == null) {
return;
}
for (int i = 0; i < result.length; i++) {
if (!result) {
System.out.print(i + " ");
}
}System.out.println();
}
}
Danke!
jetzt gibt er zumindest mal etwas gescheites aus.
allerdings scheint bei findeKleinsteUngestricheneZahl noch ein fehler drinnen zu sein. Das gibt nämlich der Test aus:
http://pastie.org/314160
@asdsa: wenn ich dir pokertechnisch oder sonst wie mal helfen kann, sag einfach bescheid!
Andere Variablennamen verwenden!
"List" ist eine eigene Datenstruktur.
Das klingt so unlogisch wie:
String zahl = "Haus";
Edit: Die angesprochene Funktion durchläuft einen Array auf etwas grausame Weise. Hab den Code nicht inhaltlich verstehen versucht, aber syntaktisch stellst Du Dir das ca. so vor:
"Durchsuche die erste Schublade meines Kleiderschrankes und gucke, ob eine Socke enthalten ist. Durchsuche solange die nächsthöhere Schublade bis eine Socke gefunden wird".
Nun wirst Du irgendwann am Ende des Schranks angelangt sein -> Exception. Arrays sind begrenzt und mögen es nicht, wenn man nicht existente Felder absucht.
Ein Feld mit negativem Index gibt es übrigens auch nciht. Du musst also auf eine andere Art und Weise durch das FEld laufen (vorher Ranges prüfen).
Original von igel2006
Andere Variablennamen verwenden!
"List" ist eine eigene Datenstruktur.Das klingt so unlogisch wie:
String zahl = "Haus";
![]()
die Variablen waren zum großen Teil vorgegeben, weil der Test, der danach durchgeführt wird auf diese zurückgreift.
Edit: Die angesprochene Funktion durchläuft einen Array auf etwas grausame Weise. Hab den Code nicht inhaltlich verstehen versucht, aber syntaktisch stellst Du Dir das ca. so vor:
"Durchsuche die erste Schublade meines Kleiderschrankes und gucke, ob eine Socke enthalten ist. Durchsuche solange die nächsthöhere Schublade bis eine Socke gefunden wird".
Nun wirst Du irgendwann am Ende des Schranks angelangt sein -> Exception. Arrays sind begrenzt und mögen es nicht, wenn man nicht existente Felder absucht.
Ein Feld mit negativem Index gibt es übrigens auch nciht. Du musst also auf eine andere Art und Weise durch das FEld laufen (vorher Ranges prüfen).
![]()
Da hast du Recht. Bin eben auch noch totaler Programmieranfänger und soll nun solche Sachen programmieren...
Allerdings kann ich nicht nachvollziehen, wo bei dem code von asdsa noch (außer für negative Zahlen) ArrayIndexOutOfBoundsException vorkommen.
Der Test sagt ja unter anderem bei erzeugeliste. Versteh nicht warum.
Kannst du den TestCase mal posten?
Du müsstest jetzt noch in der Methode siebe abfangen, dass der Parameter grenze nicht negativ sein darf.
Das mit der Schleife stimmt natürlich, müsstest also noch abprüfen das beginn nicht größer werden darf als die Anzahl der Elemente in liste.
Was meinst du mit TestCase?
Wenn du damit den Code vom Test meinst. den hab ich nciht, der Test wird online durchgeführt und ich kriege nur das Ergebnis.
Das Ergebnis ist das hier: http://pastie.org/314160
Aso. Hast du die beiden Änderungen noch hinzugefügt? Wieso ein Fehler in findeKleinste... auftritt versteh ich atm nicht. Du hast auch keine Möglichkiet den Code einzusehen?
Leider ist der Code nicht öffentlich, damit man nicht nur auf die geprüften Werte hinprogrammeiren kann.
Das ist mein jetziger, und bisher bester Code: http://pastie.org/314755
und das hier sagt der Test dazu: http://pastie.org/314757
Wie der ArrayIndexOutOfBoundsException-Error zustande kommt versteh ich nicht...
aber immerhin funktioniert es jetzt auch für negative Zahlen und es kommt nur noch 1 Failure
Weitere Vorschläge?
Also der Error in erzeugeListe tritt wahrscheinlich deswegen auf, weil der Test die Methode direkt mit 0 od. 1 als Parameter aufruft. Du müsstest jetzt also noch überprüfen, ob groesse < 2 ist. Ist das der Fall gibst du auch eine Array der Länge groesse zurück, nur das halt alle Elemente true sind.
Bei dem Failure in FindeKleinste... hab ich jetzt auch keine Idee. Solange man nicht weiß, was der Test der Methode für einen Parameter übergibt wird das auch schwer.
Btw: Gib in der Methode siebe einfach nen leeres Array zurück u. nicht null.
stimmt! den ArrayIndexOutOfBoundsException-Error hab ich jetzt behoben.
Aber wann wird eine 6 als kleinste Zahl erwartet und mein vcode liefert ne 4 aus? macht ja irgendwie keinen sinn!?! eine 4 wird doch sowieso nie ausgeliefert, oder?
€dit: Habs endlich hingekriegt. Nachdem ich diesen Tipp bekommen habe:
Hi, liegt daran, dass du die nächste ungestrichene Zahl nach "beginn" ausgeben sollst, und nicht ab "beginn". Also die Schleife anpassen. Hatte den selben Fehler gemacht, wurde auch schon diskutiert(-> suchfunktion). Sinn macht das nur, wenn man die ungestrichene Zahl in einer Liste sucht, die irgendwie anders verändert wurde als mit der streicheVielfache-Methode. Viele Grüße
kann ich zwar nciht ganz nach vollziehen, wann da irgndwie etwas anders als mit der sreicheVielfache-Methode geändert wurde, aber das ist mir jetzt auch egal.
asdsa: wenn cih dir irgendetwas gutes tun kann... Nächste woche gibts neue aufgaben
Habs jetzt auch. Wie schon erwähnt musst das erhöhen des Zählers in der Methode findeKleinste... machen u, nicht in siebe. Dh die Methode siebe sollte jetzt so aussehen:
public static boolean[] siebe(int grenze) {
if(grenze > 0) {
boolean[] liste = erzeugeListe(grenze+1);
if (grenze <= 2) {
return liste;
}
int y = 2;
while (y * y < grenze) {
streicheVielfache(y, liste);
y = findeKleinsteUngestricheneZahl(y, liste);
}
return liste;
}
return new boolean[0];
}
Der Code des Testfalls wird in Etwa so aussehen:
boolean[] values = {true, true, true, true, false, true, false};
assertEquals(6, era.findeKleinsteUngestricheneZahl(4, values));
Das liefert dir natürlich erstmal die 4, was natürlich zu einem failure führt.
Erstmal selber probieren, nur so lernt man was. Wenn du dann wieder hängst etc. einfach posten.
€: Und schreib dir am Besten BEVOR du anfängst mit der Implementierung selber sinnvolle Testfälle u. implementiere dann gegen diese.