Gyakorlati alapok

Prímszámkeresés alsó és felső határ között

 

Az előző 2 fejezetben...

...különböző feltételekkel a prímszámokat vizsgálgattuk, így a matematikai és programozási előzményeket már nem fejtjük ki újra.

 

Ebben a fejezetben a bekérés és a prímkeresés algoritmusát egyesítjük olyan módon, hogy bekérjük a keresés alsó és felső számhatárát. Az adatbekéréshez csupán 1 osztályt kell importálnunk:

Mivel ebben az esetben már a felhasználóval történő aktív kommunikációról beszélünk, számítani lehet félregépelésekre, egyéb értelmezhetetlen bemeneti adatokra. Ennek teljes lekezelése nem a fejezet tudásszintje, ezért csak a legjellegzetesebb hibákat kezeljük le. A felhasználó hibázhat, amikor:

A fenti feltételek többszörös és több szintű feltételmegadást fognak generálni a kódban. Először a határokat külön és lokálisan kezeljük le belső, hátultesztelő do - while ciklusokkal (while((alsoHatar < 0) || (alsoHatar > 2147483647))), majd a kapott értékeket hasonlítjuk össze a külső, hátultesztelő do - while ciklusban (while(alsoHatar >= felsoHatar)). Ha a felhasználó elköveti azt a hibát, hogy nagyobb alsó határt ad meg a felsőnél, akkor a ciklus elején lévő if elágazás le fog futni:

 

if(alsoHatar >= felsoHatar){
    System.out.println("A felső határ mindig nagyobb az alsó határnál!");
}

 

De felmerül más probléma is: mivel 0 és 1 nem prímszám, mi történik, ha a felhasználó gonoszkodva ilyen adatokat ad meg:

Ebben az esetben, amikor a prímkereső főciklusának i léptetője átveszi az adatot (i = alsoHatar;), rossz kimeneti adatot fog mutatni. A megoldás több szintű:

  1. a felhasználónak csak azt engedjük meg, hogy a legkisebb prímszám (2) legyen a felső határ ("Kérem, hogy adja meg a felső határt! (2 és 2147483647 között)");),

  2. ha a felső határ nagyobb 2 -nél, kissé drasztikusan az alsó határt egyszerűen 2-re állítjuk, mert akkor (helyesen) onnan fog indulni a prímszám-vizsgálat.

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int alsoHatar = 0;
    int felsoHatar = 1;
    int i = 0;
    do{
        if(alsoHatar >= felsoHatar){
            System.out.println("A felső határ mindig nagyobb az alsó határnál!");
        }
        do{
            System.out.println(

            "Kérem, hogy adja meg az alsó határt! (0 és 2147483647 között)");
            alsoHatar = in.nextInt();
        }while((alsoHatar < 0) || (alsoHatar > 2147483647));
        do{
            System.out.println(

            "Kérem, hogy adja meg a felső határt! (2 és 2147483647 között)");
            felsoHatar = in.nextInt();
        }while((felsoHatar < 2) || (felsoHatar > 2147483647));
    }while(alsoHatar >= felsoHatar);

System.out.print("A prímszámok " + alsoHatar + " és " + felsoHatar + " között: ");

if(alsoHatar == 0 || alsoHatar == 1){
alsoHatar = 2;
}

boolean prim = true;
    for(i = alsoHatar; i <= felsoHatar; i++){
        prim = true;
        for (int j = 2; j <= Math.sqrt(i); j++){
            if (i % j == 0){
                prim = false;
                break;
            }
        }
        if(prim == true){
            System.out.print(i + " ");
            }
        }
    }
}

 

Végeredmény (például):

Kérem, hogy adja meg az alsó határt! (0 és 2147483647 között)
0
Kérem, hogy adja meg a felső határt! (2 és 2147483647 között)
2
A prímszámok 0 és 2 között: 2