Schleife im Primzahlrechner Java

Benjamin52

Cadet 2nd Year
Registriert
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 :)
 
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);
 
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 :)
 
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 :)
 
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.
 
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
 
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.");
}
}
 
@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
}
 
F.b hats erkannt. Ich mache das erst seit gestern lol Aber ich versteh schon viel, es ist nur soviel Informationen auf einmal.
 
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:
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 :)
 
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 ^^
 
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. ;)
 
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
 
div++ ? beim ersten Durchlauf wird Modulo 2 gerechnet, dann 3, dann 4??? Warum sollte man hier durch 4 teilen wollen?
 
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!
 
@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
 
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
 
InEv1L schrieb:
...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 ;)

CoolHandLuke schrieb:
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.

Benjamin52 schrieb:
@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:
Zurück
Oben