+1 Daumen
8,8k Aufrufe

ich bin noch ein Anfänger was Programmieren/Java betrifft und habe mich hier mal einem Primzahl-Test versucht, der auf dem Sieb des Eratosthenes basiert. Es wäre nett, wenn sich das jemand mal durchsehen könnte (z.B. auf (Logik-)Fehler überprüfen). Vielen Dank im Voraus :)

import java.util.Scanner;

public class Primzahltest {

public static void main(String[] args) {
Prim p = new Prim();
p.testePrim();
}
}

class Prim{
int prim;
public void testePrim(){

Scanner s = new Scanner(System.in);
System.out.println("Geben Sie eine Zahl ein: ");
prim = s.nextInt();
boolean isprim = true;

if(prim == 1) {
System.out.println(prim + " ist per Definition keine Primzahl.");
isprim = false;
}

for(int i = 2; i <= Math.sqrt(prim); i++) {
if(prim % i != 0) {
isprim = true;
}else if(prim % i == 0) {
System.out.println(prim + " ist keine Primzahl");
isprim = false;
break;
}else {
System.out.println("Fehler!");
break;
}
}

if(isprim == true) {
System.out.println(prim + " ist eine Primzahl!");
}
}
}
von

1 Antwort

+3 Daumen
 
Beste Antwort
public void testePrim()

Die Funktion macht zu viel. Sie testet nicht nur, ob eine Zahl Primzahl ist. Stattdessen

  1. fordert sie den Benutzer zu einer Eingabe auf
  2. prüft ob die eingegebenen Zahl eine Primzahl ist
  3. meldet das Ergebnis dem Benutzer.

Lagere den Test in eine eigene Funktion aus.

public boolean istPrim(int zahl) {
boolean isprim = true;

if(zahl <= 1) {
return false;
}

for(int i = 2; i <= Math.sqrt(zahl); i++) {
        if(zahl % i != 0) {
            isprim = true;
      } else {
          isprim = false;
          break;
    }
}

return isprim;
}

public void testePrim(){
    Scanner s = new Scanner(System.in);
    System.out.println("Geben Sie eine Zahl ein: ");
    prim = s.nextInt();

  if (istPrim(prim)) {
System.out.println(prim + " ist eine Primzahl!");
} else {
System.out.println(prim + " ist keine Primzahl");
}
}
Jetzt bauchst du dich nur um die Funktion istPrim kümmern, wenn du die Berechnung optimieren möchtest und nur um die Funktion testePrim, wenn du die Benutzerführung verbessern möchtest.
System.out.println("Fehler!");

Die einzige Möglichkeit, wie diese Zeile ausgeführt werden kann ist, wenn Java oder der Computer kaputt ist. Sollte das der Fall sein, dann gibt es keinen Anlass, zu glauben, die Meldung würde dort ankommen, wo sie ankommen soll. Ich halte den else-Teil deshalb für überflüssig.

Fehlermeldungen werden auch üblicherweise über System.err ausgegeben, nicht über System.out.

von 5,5 k

Danke für deine Antwort! :)

Ich habe noch eine kleine allgemeinere Frage:

Wie entscheidet man, ob man für eine neue Funktion des Programms eine neue Klasse erstellt, oder einfach eine neue Methode in der selben Klasse?

Ich hätte ja in meinem Beispiel die neue Klasse "Prim" weglassen können und einfach neue Methoden hinzufügen können.


Mein Gedanke für die Fehler-Ausgabe waren übrigens negative Zahlen, aber da kann man ja einfach auch ist nicht prim ausgeben.

Wie entscheidet man, ob man für eine neue Funktion des Programms eine neue Klasse erstellt, oder einfach eine neue Methode in der selben Klasse?

Beherrschung von Komplexität durch Trennung von Zuständigkeiten

Dein Programm ist so einfach, dass eine Aufteilung in eine Methode zur Benutzerführung und eine für die Berechnung ausreicht. Beide können als static Methoden in der Klasse Primzahltest bleiben.

Weiteres erfährst du in Büchern über Objektorientierte Softwarekonstruktion.

Mein Gedanke für die Fehler-Ausgabe waren übrigens negative Zahlen

Es gibt zwei Arten von Zahlen:

  1. Zahlen, die bei Division durch 17 den Rest 0 ergeben.
  2. Zahlen, die bei Division durch 17 nicht den Rest 0 ergeben.

Die erste Art hast du durch if(prim % i == 0) ... behandelt

Die zweite Art hast du durch if(prim % i != 0) ... behandelt

Eine Dritte Art gibt es nicht.

Vielen Dank für deine Mühe  :)

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community