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:
-
import java.util.Scanner;
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:
-
alsó határként 0-nál kisebb számot ad meg,
-
felső határként 2-nél kisebb számot ad meg (mert 2 a legkisebb prímszám, alatta nincs értelme prímszám-vizsgálatot indítani),
-
az alsó határ nagyobb szám a felső határnál.
-
Ugyanakkor számba kell vennünk, hogy az int adattípus adattárolási felső határa +2,147,483,647. (Természetesen átmehetnénk 64 bites long adattípusra, de most a cél a probléma felvázolása és megoldása.)
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:
-
alsoHatar = 0;
-
felsoHatar = 1;
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ű:
-
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)");),
-
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.
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