Programmieren in/mit Java... Hilfe

van

Enthusiast
Thread Starter
Mitglied seit
27.12.2003
Beiträge
6.108
Ort
Bielefeld
Hallo,

vielleicht kennt sich ja jemand bestens mit java aus..?

Also die aufgabe wäre...:

Gegeben ist folgendes Problem: Es soll ein Algorithmus geschrieben werden (bzw. ein Bestehender
erweitert werden) der alle Primzahlen zwischen einer oberen und einer unteren
Grenze ausgiebt . Diese Grenzen sollen als Parameter ein gelesen wer den . Die Primzahlen
sollen am Ende auf dem Bildschirm ausgegeben werden.


Das ist schon vorgegeben:

public class Prim2{
2 // Programm zur Bestimmung von Primzahlen innerhalb eines Grenzbereichs
3 public static void main(String[] args) {
4 int ug = Integer.parseInt (args[0]); // Einlesen der oberen und unteren
Grenze und der zu berechnenenden Primzahlen
5 int og = Integer.parseInt (args[1]);

hab aber irgendwie noch kein plan von java
weiß weder wie ich weitermachen soll, noch was das da oben bedeutet.. hmm.. :rolleyes:

:heul:
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
van schrieb:
Hallo,

vielleicht kennt sich ja jemand bestens mit java aus..?

Also die aufgabe wäre...:

Gegeben ist folgendes Problem: Es soll ein Algorithmus geschrieben werden (bzw. ein Bestehender
erweitert werden) der alle Primzahlen zwischen einer oberen und einer unteren
Grenze ausgiebt . Diese Grenzen sollen als Parameter ein gelesen wer den . Die Primzahlen
sollen am Ende auf dem Bildschirm ausgegeben werden.


Das ist schon vorgegeben:

public class Prim2{
2 // Programm zur Bestimmung von Primzahlen innerhalb eines Grenzbereichs
3 public static void main(String[] args) {
4 int ug = Integer.parseInt (args[0]); // Einlesen der oberen und unteren
Grenze und der zu berechnenenden Primzahlen
5 int og = Integer.parseInt (args[1]);

hab aber irgendwie noch kein plan von java
weiß weder wie ich weitermachen soll, noch was das da oben bedeutet.. hmm.. :rolleyes:

:heul:


Schreib doch erstmal mit "Hand" die mathematische Formel auf,
dann helf ich dir auch weiter ...



Es nützt doch nix wenn man schon im ersten Sem. sich das machen lässt.
Hat euch der Prof ohne Java Kentnisse die Aufgabe angehängt oder habt ihr vorher schon in C++ was gemacht?


;)

Edit:

Wichtig ist dir auch zu überlegen welche "Eingabefehler" der User machen könnte und die du absichern musst. Klingelts?

Und überlege (rechne) dir gut aus welchen Datentyp du für die Primzahlen nimmst ...
 
Zuletzt bearbeitet:
vorab das ist informatik unterricht in der schule... kein studium.

Wir haben zwar zig blätter usw bekommen und auch viel drüber geredet usw. aber irgendwie sinds schon viele infos auf einmal.. :hmm:

was wir in den letzten blöcken gemacht haben war viel mit algorithmen erstellen, struktogramm dazu zeichnen usw. ich krieg echt zu viel mit diesen struktogrammen... und jetzt solche struktogramme in java programmieren. :fresse:
 
Zuletzt bearbeitet:
van schrieb:
vorab das informatik unterricht in der schule... kein studium.

Wir haben zwar blätter usw bekommen und auch drüber geredet usw. aber irgendwie sinds schon viele infos auf einmal.. :hmm:


okay ;)

aber Mathe is ja schon was gewesen ...

paar Hilfen schonmal.

Der Benutzer wird ja zur Eingabe der oberen und unteren Grenzen aufgefordert ...
in diesem Bereich sollen dann alle P-Zahlen ermittelt werden.

Ein DAU könnte nun für unter Grenze 900 und ober Grenze 20 eingeben.
Das geht natürlich nicht ;)

Und auch ist die obere Grenze durch den Datentyp INT mit der grössten pos. Zahl 2147483647 begrenzt (wehe ich verschreib mich das wäre peinlich )

Den Mathe Algorithmus für die Primzahl versuch mal wenigstens Ansatzweise ...

Welche Klasse bist du?
 
Ich brauche beispiele.. beispiele über beispiele....

was für ein mathe algorithmus für die primzahl meinst du? ich bin weder in mathe besonders gut noch in sachen programmieren :fresse:
 
warum hast du dann informatik? :d das ist doch kein pflichtfach.
er meint, du sollst dir überlegen, wie du von hand prüfen würdest, ob eine zahl eine primzahl ist.
 
also du musst den die zahlen von x bis y (1-10) prüfen lassen -> Grenze oben und unten. und den dann jede Zahl durch 1-sich selber teilen lassen. wenn dann aber nur durch 1 und sich selber (also erster und letzter teiler) ne gerade Zahl n ergibt ist die Zahl ne Primzahl. Wenn aber auch andere Teiler eine gerade Zahl n ergeben ist es keine. so muss der eben alle Zahlen in einem Invervall durchgehen. So würd ich da rangehen. Aber wie man das umsetzt weiß ich irgendiwe nicht mehr, wir hatten da mal Visual Basic.

Falls ich Stuss rede oder ka was auch immer, einfach ignorieren :fresse:

aber des Rätselslösung hätt ich gern gewusst :angel:
 
floechen schrieb:
also du musst den die zahlen von x bis y (1-10) prüfen lassen -> Grenze oben und unten. und den dann jede Zahl durch 1-sich selber teilen lassen. wenn dann aber nur durch 1 und sich selber (also erster und letzter teiler) ne gerade Zahl n ergibt ist die Zahl ne Primzahl. Wenn aber auch andere Teiler eine gerade Zahl n ergeben ist es keine. so muss der eben alle Zahlen in einem Invervall durchgehen. So würd ich da rangehen. Aber wie man das umsetzt weiß ich irgendiwe nicht mehr, wir hatten da mal Visual Basic.

Falls ich Stuss rede oder ka was auch immer, einfach ignorieren :fresse:

aber des Rätselslösung hätt ich gern gewusst :angel:


deine Vorgehensweise ist nicht verkehrt aber wenig effektiv.
Stell dir vor du prüfst alle Zahlen zwischen 2 und 2.000.000 einzeln durch ... das dauert ja ewig.

Es gibt da einen besseren Lösungsansatz (Sieb des Eratosthenes)

Man hat ja die Menge der Zahlen beschränkt durch untere und obere Grenze und fängt nun bei der kleinsten Zahl an (mind. der Zahl 2), alle Vielfachen davon rauszulöschen ... Und von den verbleibenden Zahlen dann auch . Die übriggebliebene Restmenge sind alles Primzahlen.

Also untere Grenze = 2 ober Grenze gleich 20

erster Schleifen-Durchlauf lösche alle Vielfachen von 2
Restmenge 2,3,5,7,9,11, ... ,19
zweiter Schleifen-Durchlauf lösche alle Vielfachen von 3
Restmenge 2,3,5,7,11, ... ,19
dritter Schleifen-Durchlauf lösche alle Vielfachen von 5
....
..


im ersten Durchlauf reduzierst du schon auf 50% !
im 2ten Durchlauf den Rest nochmal um ein Drittel usw...

;)


Der Code wird allerdings bei Zahlen oberhalb der Billiardengrenze langsam ineffektive, da gibts dann andere Ansätze als dieses "Streichverfahren"
...
 
Zuletzt bearbeitet:
Hallo,

so wir haben heute das prim programm auf papier bekommen... ich kopier das mal eben hier rein:

public class prim2{
// Programm zur Bestimmung von Primzahlen innerhalb eines
//Grenzbereichs
public static void main (String[ ] args){
//Einlesen der oberen und unteren
//Grenze und der zu berechnenden Primzahlen
int ug = Integer.parseInt (args[0]);
int og = Integer.parseInt (args[1]);
for(int i = ug; i<=og; i=i+1){
int t=2;
do {
if ((i % t)==0) {
System.out.println (i+" Nicht Prim");
break;
}
t = t+ 1;
} while (t<i);
if (t == i)
System.out.println (i+" Prim");
}
}
}


was sagst du dazu, charlie? Es ist ja schon ziemlich kürzer als deins... :hmm:
 
van schrieb:
Hallo,

so wir haben heute das prim programm auf papier bekommen... ich kopier das mal eben hier rein:

public class prim2{
// Programm zur Bestimmung von Primzahlen innerhalb eines
//Grenzbereichs
public static void main (String[ ] args){
//Einlesen der oberen und unteren
//Grenze und der zu berechnenden Primzahlen
int ug = Integer.parseInt (args[0]);
int og = Integer.parseInt (args[1]);
for(int i = ug; i<=og; i=i+1){
int t=2;
do {
if ((i % t)==0) {
System.out.println (i+" Nicht Prim");
break;
}
t = t+ 1;
} while (t<i);
if (t == i)
System.out.println (i+" Prim");
}
}
}


was sagst du dazu, charlie? Es ist ja schon ziemlich kürzer als deins... :hmm:


also erstmal ist zu sagen: Kurz muss nicht immer gut sein,
obwohl ich das Programm auch in 3 Zeilen Perl-Code bekomme :fresse:

Das Programm wird ja folgendermassen gestartet:

java prim2 ug og // so aber was passiert wenn man zB garkeinen oder einen oder 3 Parameter angibt?

Solche einfachen Bedienfehler MÜSSEN abgefangen werden, darum hatte ich den kleinen try-catck-Block der das event-handling übernimmt.

Gut das war halt vllt schon zuviel des guten....

Ansonsten merke dir folgendes :
Es gibt nicht "DAS RICHTIGE PROGRAMM"

Dh, es gibt immer viele Lösungen, darunter bessere und schlechtere ...
Sollte euer Lehrer euch diesen Code als "Die Lösung" gegeben haben,
dann ist das hmmmm naja was soll ich sagen, das macht jeder Erst-Semester InformatikStudent, nach 8 Wochen Programmierunterricht besser.

Denn wenn ich ehrlich bin ist der Code sehr sehr schlecht :(

Der ganze Algorithmus hat in der main - Funktion überhaupt nix verloren.

Jeder sollte das tun wozu er da ist,
und main startet das Programm und überprüft den Programmaufruf,.
Nicht mehr und nicht weniger.

Ansonsten sollte der Code dokumentiert sein,
damit ihr ihn auch versteht ...
 
Hi, der code wurde von welchen aus meinem kurs geschrieben. Der lehrer hat da jetzt nichts mehr drann verändert soweit ich weiß... stimmt ja auch so weit und das prog funktioniert ja.

Wir konnten ja auch nur solche befehle die wir bis jetzt gelernt haben in das programm einbinden, von daher ist das klar das es nicht top ist...

Was ist denn genau schlecht an dem programm? kannst du das mal etwas erklären..? :)

edit:
hier noch der algor. zum programm:
1. Gib eine Zahl x ein
2. Setze den Teiler t auf 2
3. Ist die Zahl x durch t ohne Rest teilbar gib nicht prim aus
4. erhöhe den Teiler t um 1
5. Ist der Teiler kleiner als die Zahl x, fahre fort bei Schritt 2
6. Gib prim zurück
 
Zuletzt bearbeitet:
van schrieb:
Hi, der code wurde von welchen aus meinem kurs geschrieben. Der lehrer hat da jetzt nichts mehr drann verändert soweit ich weiß... stimmt ja auch so weit und das prog funktioniert ja.

Wir konnten ja auch nur solche befehle die wir bis jetzt gelernt haben in das programm einbinden, von daher ist das klar das es nicht top ist...

Was ist denn genau schlecht an dem programm? kannst du das mal etwas erklären..? :)

edit:
hier noch der algor. zum programm:
1. Gib eine Zahl x ein
2. Setze den Teiler t auf 2
3. Ist die Zahl x durch t ohne Rest teilbar gib nicht prim aus
4. erhöhe den Teiler t um 1
5. Ist der Teiler kleiner als die Zahl x, fahre fort bei Schritt 2
6. Gib prim zurück


okay ;)

also wie gesagt,
wenn ihr soweit mit der (java) - Programmierung fortgeschritten seid, sollte euch schon bewusst sein dass einer Funktion main zB nicht irgend ein Algo zur ausführung kommen darf.
Das ist halt ganz schlechter Stil den man sich erst garnicht angewöhnen darf.

Du musst dir über eins klar werden wenn du programmieren lernst.
Diese kleinen Programme die ihr schreibt, sind alles klitze kleine Stückwerke etwas Grösseren.

Dh. du hast ein Programm mit vielen 1000 Zeilen Code das zB dein Vorgänger in einer Firma geschrieben hat.

Nun sagt dein Chef:
Ich hab ne Idee, ich möchte die Ausgabe des Programms nicht auf der Konsole haben sondern in eine Datei umlenken,
bitte mach das mal schnell.

Bei einem guten Programm hat man die richtige Stelle schnell gefunden, niemals aber würde ich in der main-Methode suchen ;)

Stichwort --> MVC (Model-View-Control), kannst dir schonmal merken, wirst bald davon hören.




Zum Algorithmus lies meinen obigen Beitrag, da hab ich schon erklärt warum dieser Erbsenzähl-Algo nicht besonders effektiv ist.



zur for-Schleif:
for(int i = ug; i<=og; i=i+1) {
besser
for(int i = ug; i<=og; i++){

Wenn ich das richtig lese gibt der Algo für jede Zahl nun auf der Konsole aus

Zahl Nicht Prim oder Zahl Prim

Ich will das jetzt nicht testen aber ich bin mir sicher, dass er die Zahl 2 als Primzahl UND Nicht-Primzahl ausgibt, also zweimal.

Das ist ein echter Fehler.

Und ausserdem lässt die Eingabe Minuszahlen zu, das sollte unterbunden werden.

Ist 1 eine Primzahl? oder Nicht? Die Frage wird wohl nicht durch dein Programm beantwortet, oder ich bin betriebsblind :heul:



So jeze aber erstmal genug ;)
 
hmm, sollte ich mal schnell meinem lehrer ne mail schreiben und das anmerken dass das prog die 2 als primzahl und nicht-primzahl ausgibt, sowie minuszahlen bei der eingabe zulässt? :)) würd gern wissen was er sagt..

wie sicher bist du dir bei der 2 als prim/nicht primzahl..?

da muss also nur das for(int i = ug; i<=og; i=i+1) {
zu dem for(int i = ug; i<=og; i++){ verändert werden?
 
van schrieb:
hmm, sollte ich mal schnell meinem lehrer ne mail schreiben und das anmerken dass das prog die 2 als primzahl und nicht-primzahl ausgibt, sowie minuszahlen bei der eingabe zulässt? :)) würd gern wissen was er sagt..

wie sicher bist du dir bei der 2 als prim/nicht primzahl..?

ich sitz grad an einem PC ohne jdk, aber ich bin mir zu 99,5%sicher dass:
- negative Zahlen als Parameter zugelassen werden, dabei ist eine Primzahl klar definiert:
größer als 1 ist und nicht als Produkt von zwei kleineren Zahlen ;)
- die Zahl 2 als Primzahl und als Nichtprimzahl ausgegeben wird


Ausserdem seh ich gerade den Klassennamen "prim2"
ganz klar: Klassennamen fangen in Java mit einem Grossbuchstaben an.
Also muss das "Prim2" heissen ;)

Gib mal als obere Grenze 2222222222222222222222222222222222222 ein ;)
Garantiert schmeisst dir der Compiler ne Exception und das ist nicht gut.
Muss geprüft werden und der User drauf hingewiesen dass nur der Zahlenraum von * bis * zur Verfügung steht.




van schrieb:
da muss also nur das for(int i = ug; i<=og; i=i+1) {
zu dem for(int i = ug; i<=og; i++){ verändert werden?

ja
 
ok, gut. Dann noch eine kleine Frage.. du hast geschrieben:

"wenn ihr soweit mit der (java) - Programmierung fortgeschritten seid, sollte euch schon bewusst sein dass einer Funktion main zB nicht irgend ein Algo zur ausführung kommen darf."

kannst du das etwas anders beschreiben? worauf bezieht sich das genau? (zeile)

thx ;)
 
CharlieB schrieb:
deine Vorgehensweise ist nicht verkehrt aber wenig effektiv.
Stell dir vor du prüfst alle Zahlen zwischen 2 und 2.000.000 einzeln durch ... das dauert ja ewig.

Es gibt da einen besseren Lösungsansatz (Sieb des Eratosthenes)

...

Der Code wird allerdings bei Zahlen oberhalb der Billiardengrenze langsam ineffektive, da gibts dann andere Ansätze als dieses "Streichverfahren"
...

schon bei den prims zwischen 1 und 250.000.000 bräuchste du aber mind. 1 GB :d
 
Roland schrieb:
schon bei den prims zwischen 1 und 250.000.000 bräuchste du aber mind. 1 GB :d

geht ja nur um efektiv oder nicht,
also Streichverfahren oder eher Lösungsansätze nach Mersenne/Fermat/Goldbach etc ....

Ausserdem macht man doch sowas nicht mit einem "PersonalComputer" !

mein Itanium hat 12GB :drool:


Fakt ist aber, jedwege Modulo-Operation ist bei laufzeitintensiven Berechnungen zu vermeiden ....
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh