Schleife im Primzahlrechner Java

Benjamin52

Cadet 2nd Year
Dabei seit
Apr. 2011
Beiträge
29
Hi Leute,

ich mach grad ein Praktikum in einer Firma und bin grad am programmieren und bin leider der totale Anfänger. Mein Hauptproblem ist das ich zwar verstehe wie alles funktioniert aber ich einfach nicht weiss wie ich da ran gehen soll und wo was stehen muss.

Hier ist mein konkretes Problem:

import java.io.*;
public class Primzahl
{
public static void main(String argv[]) throws IOException
{

BufferedReader in = new BufferedReader (new InputStreamReader(System.in));

int zahl =0;
int div;
int erg;
boolean prim;
prim = true;
div = 2;

boolean zahlgueltig=false;

System.out.print("Bitte Zahl eingeben:");
try {
zahl = Integer.parseInt(in.readLine());
}catch(NumberFormatException e) {
System.out.println ("Fehler: Sie haben keine Zahl eingegeben.");

}

while((zahl-1)>=div)
{
erg = zahl % div;
if (erg == 0)
{
System.out.println(zahl+ " ist keine Primzahl.");
prim = false;
break;
}
div++;
}
if (prim==true)
System.out.println(zahl+ " ist eine Primzahl.");
}
}

Das ist ein Primzahlrechner der eigentlich funktioniert. Ich bin jetzt auch so weit dass er mir ansagt das ich keine Zahl eingegeben habe als Fehler.

Was ich brauche ist das wenn ich Buchstaben eingebe und es kommt "Fehler: bla" dann soll er ab der Stelle wieder bei "Bitte Zahl eingeben:" beginnen.
Also es soll eine schleife sein die immer wenn der Fehler kommt mich wieder auffordert eine Zahl einzugeben bis man es dann tut. Und erst dann soll gerechnet werden.

So wie es im moment ist funktioniert es nicht richtig. Bitte helft mir, ich muss einen guten Eindruck hinterlassen :)

Danke schonmal :)
 

F.b

Lieutenant
Dabei seit
Feb. 2008
Beiträge
513
wie wärs mit:
Code:
boolean gelungen = false;
do {
 System.out.print("Bitte Zahl eingeben:");
 try {
  zahl = Integer.parseInt(in.readLine());
  gelungen = true;
 }catch(NumberFormatException e) {
  System.out.println ("Fehler: Sie haben keine Zahl eingegeben.");
  gelungen = false;
 }
}
while(!gelungen);
 

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
Achso ich muss unter der Operation dann reinschreiben "wenn dass stimmt dann ist es true".
Verstehe. Danke es hat super geklappt und ich kann damit glänzen :D

Ist echt schwer wenn man (noch) keine Ahnung hat :)
 

hasugoon

Commander
Dabei seit
Juni 2004
Beiträge
2.797
Du könntest für den entsprechenden Code eine do-while Schleife verwenden, die solange ausgeführt wird, bis der Benutzer eine Zahl eingegeben hat.
edit: # F.b :)
 

FunnyName

Lt. Commander
Dabei seit
Feb. 2011
Beiträge
1.036
alternativ wäre die möglichkeit gewesen die abfrage in eine endlosschleife zu packen und an der stelle von "gelungen = true" ein break einzufügen. spart man sich die variable.
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
erstmal Codefeld benutzt und Code bissl stylen damit man ihn auch ohne probleme lesen kann xD

ansonsten einfach schleife um die eingabe und solange wiederholen bis der input ne zahl ist
dann brauchst auch deine exception nichtmehr ;P

und mit einer solchen Exception den programmlauf zu steuern is ned so toll =(
mach nen string draus und ne regex drüber um zu testen obs eine zahl ist

Tobi
 

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
Die erste Antwort hat schon geholfen :D

Ich soll jetzt das "Bitte Zahl eingeben" als Methode erstellen damit es dann oben eingefügt werden kann.
Mein Chef hat mir gerade das "zahl=LeseZahl" eingetippt.

Also soll ich jetzt diese Methoder erstellen als "LeseZahl" damit ich sie dann verwenden kann.

Wie geht das?

So siehst jetzt aus:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PrimzahlMitMethode {
public static void main(String argv[]) throws IOException
{

BufferedReader in = new BufferedReader (new InputStreamReader(System.in));

int zahl =0;
int div;
int erg;
boolean prim;
prim = true;
div = 2;

boolean zahlgueltig=false;
do {
System.out.print("Bitte Zahl eingeben:");
try {
zahl = Integer.parseInt(in.readLine());
zahlgueltig=true;
}catch(NumberFormatException e) {
System.out.println ("Fehler: Sie haben keine Zahl eingegeben.");
}
}
while(!zahlgueltig);

zahl=LeseZahl();



while((zahl-1)>=div)
{
erg = zahl % div;
if (erg == 0)
{
System.out.println(zahl+ " ist keine Primzahl.");
prim = false;
break;
}
div++;
}
if (prim==true)
System.out.println(zahl+ " ist eine Primzahl.");
}
}
 

F.b

Lieutenant
Dabei seit
Feb. 2008
Beiträge
513
@InEv1L: ich glaube das übersteigt seine Möglichkeiten doch etwas, wenn er noch Anfänger ist;)
und das jetzige Konstrukt tut es ja auch
EDIT: Du nimmst den Teil mit der do-while-Schleife und packst ihn in ne Methode mit dem Rückgabetyp int:
Code:
public int LeseZahl() {
 Die Do-While-Schleife
}
 

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
F.b hats erkannt. Ich mache das erst seit gestern lol Aber ich versteh schon viel, es ist nur soviel Informationen auf einmal.
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
naja find eigentlich nicht das es all zu schwer is was ich gesagt hab is ja auch ganze einfach mit if/else zu lösen alles andere bringt java ja mitsich und eine regex sollte es fertig bei google um lau geben ;P

jo laufen tuts auf jeden ;P

@Benjamin verstehen und verstehen sind 2 verschiedene sachen ;P
ich wollt dir damit nur klar machen das es nicht das beste ist einen programm ablauf über eine exception zu steuern ;P sondern das programm sollte von alleine eine fehlsituation erkennen und einen anderen weg wählen in diesem fall zum erneuten auffordern der eingabe ;P

des gleiche programm war bei uns in der schulaufgabe letztma dran xD zwar in C++ aba is ja im endefekt des gleiche ;P
 
Zuletzt bearbeitet:

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
Ist doch egal jetzt, hilf mir einfach beim nächsten Schritt das "Gebe Zahl ein:" in eine Methode umzuwandeln.
Und mach es bitte Noobfreundlich, also mit so sachen richtig ausschreiben und erklären wenn du magst :)
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
naja ich find nicht das es sinn und zweck is hier nach der lösung zu fragen xD
schau in die java api (have fun)
oder google dichn bissl durch da is der lerneffekt viel größer ^^
 

Tumbleweed

Captain
Dabei seit
März 2008
Beiträge
3.598
Code:
    private static int leseZahl(BufferedReader in, int zahl)
    {
        boolean korrekteEingabe = false;
        while (!korrekteEingabe)
        {
            System.out.print("Bitte Zahl eingeben:");
            try
            {
                zahl = Integer.parseInt(in.readLine());
                korrekteEingabe = true;
            }
            catch (NumberFormatException e)
            {
                System.out.println("Fehler: Sie haben keine Zahl eingegeben.");
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return zahl;
    }
    
    public static void main(String[] args)
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        int zahl = 0;
        int div = 2;
        int erg = 0;
        boolean prim = true;

        zahl = leseZahl(in, zahl);
        
        while ((zahl - 1) >= div)
        {
            erg = zahl % div;
            if (erg == 0)
            {
                System.out.println(zahl + " ist keine Primzahl.");
                prim = false;
                break;
            }
            div++;
        }
        if (prim)
            System.out.println(zahl + " ist eine Primzahl.");
    }
Wenig Hokuspokus. Ich denke du verstehst das schon. ;)
 

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
Ich google seit Stunden. Ich mache das alles wie gesagt erst seit gestern.
Ausserdem ist das nicht nur ein Praktikum sondern die aussicht auf die betriebliche Ausbildung mit späterer übernahme.
Du verstehen? Ich verstehe ja vieles aber ich will auch zeigen das ich es einsetzen kann und dabei happerts noch.
Ausserdem musst du mir ja nicht helfen. Die anderen tun es und das finde ich echt toll :D
 

CoolHandLuke

Lt. Commander
Dabei seit
März 2008
Beiträge
1.634
div++ ? beim ersten Durchlauf wird Modulo 2 gerechnet, dann 3, dann 4??? Warum sollte man hier durch 4 teilen wollen?
 

Tumbleweed

Captain
Dabei seit
März 2008
Beiträge
3.598
Ist bei einem Praktikum nicht eigentlich auch enthalten, dass dir jemand was beibringt?

Da du das alles in recht kurzer Zeit verstanden hast, sehe ich zumindest nicht schwarz. Allerdings musst du noch enorm viel Eigenleistung bringen, denn davon, dass andere dir die Lösung präsentieren, lernst du leider nicht viel.
Viel schlimmer ist, dass die Firma, bei der du da praktizierst dich dann vielleicht völlig falsch einschätzt und dich mit Aufgaben belädt, die du eigenständig niemals bewältigen kannst. Ein Teufelskreis!
 

Benjamin52

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Apr. 2011
Beiträge
29
@CoolHandLuke
Ich weiss es nicht, die Formal habe ich kopiert. Sie funktioniert also ist alles gut.

@Tumbleweed
Du hast schon recht. Ich will niemand betrügen usw. Und ich verstehe echt viel nur wenn ich den halben Tag nicht weiter komme weil ich nicht weiss wo eine Zeil hinkommt und es nach 3 Stunden immer noch nicht weiss finde ich das ok.
Ich kopier das ja nicht stumpf und freu mich. Ich schaue es mir an und verstehe zu versuchen wo mein Fehler war usw.
Ausserdem will ich den Chef nicht die ganze Zeit rufen. So zeige ich das ich was verstanden habe auch wenn ich hilfe von euch brauche. Also sei mal nicht so :p
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
ich hab letzma 30 min nach nem ; gesucht ....
der zu wenig war ... oder einen klammerpaar ....
so sachen dauern einfach hin und wieder
und das ohne debug umgebung
 

FunnyName

Lt. Commander
Dabei seit
Feb. 2011
Beiträge
1.036
Zitat von InEv1L:
...ansonsten einfach schleife um die eingabe und solange wiederholen bis der input ne zahl ist
dann brauchst auch deine exception nichtmehr ;P
...

und wie prüfst du mit wenig aufwand eine eingabe darauf obs ne zahl ist ;)

Zitat von CoolHandLuke:
div++ ? beim ersten Durchlauf wird Modulo 2 gerechnet, dann 3, dann 4??? Warum sollte man hier durch 4 teilen wollen?

macht mathematisch zwar nicht viel Sinn, aber ist wohl die programmiertechnisch einfachste Lösung ohne viele weitere Bedinungen.

Zitat von Benjamin52:
@CoolHandLuke
Ich weiss es nicht, die Formal habe ich kopiert. Sie funktioniert also ist alles gut.
...
Und ich verstehe echt viel nur wenn ich den halben Tag nicht weiter komme weil ich nicht weiss wo eine Zeil hinkommt und es nach 3 Stunden immer noch nicht weiss finde ich das ok.
...

sorry lies dir mal diese beiden Zeilen durch. Du hast nichtmal den Algorithmus hinterfragt/verstanden.
Selbst als relativ blutiger Anfänger solltest du per Google innerhalb weniger als 1 Stunde halbwegs verstehen was eine Methode ist, wie man sie schreibt und aufruft. Zumal du ja schon die main-Methode hast. Damit will ich dich jetzt nicht angreifen, aber das solltest du bedenken bei deinem "Ich verstehs schon". Zumal deine beiden Anfragen keine 30 Minuten auseinander liegen.
Du solltest dir auch bewusst sein dass "um Hilfe bitten können/mit Kollegen kommunizieren" mindestens genauso wichtig ist wie toll programmieren im späteren Praktikum und dass du u.U. 'ne ganz falsche Erwartungshaltung bei deinem Chef weckst, wenn du jetzt alles scheinbar locker aus dem Ärmel schüttelst
 
Zuletzt bearbeitet:
Top