Gyakorlati alapok II.
Amikor a hócipőnk tele van és előbb ki akarunk lépni (a függvényből)
Most már kezdjük átlátni a külön metódusok működési elvét: ők voltaképpen a Turing-gép miniatűr megvalósításai, hiszen a bemeneti adatokat a beléjük táplált program szerint kimeneti adatokká alakítják át:
Bemeneti adatok → Program → Kimeneti adatok
(Tervezett) miniatűr méretükből következik, hogy sokszor csupán 1 funkcionalitást szolgálnak ki, például százalékszámítás (Különutas százalékszámítás című fejezet).
Nézzük meg a százalékszámító függvény Turing-elvű vázlatát:
Bemeneti adatok → Program → Kimeneti adatok
Szám, ? százalék → Százalékszámítás → Eredmény
A függvénynek lehet 1 vagy több bemeneti adata, ám ezeket beadagolhatjuk összetett adatszerkezetben is (például tömbben). A bemeneti adatokat a függvény fejlécének paramétermezőjébe pakoljuk, például:
static void kiiras(double adat, double eredmeny, String valasztas)
{ ...kód ...}
A függvénynek 1 db kimeneti adata lehet (ez a return utáni rész), bár lehetőségünk van arra, hogy itt is összetett adatszerkezetben, például tömbben juttassuk ki a kimeneti adatokat:
static boolean adatEllenorzes(String bemenetiAdat){
boolean rosszAdat = false;
if(bemenetiAdat.length() < 1){
rosszAdat = true;
return rosszAdat;
}
Viszont a függvénynek lehet több kilépési pontja is, azaz a return utasítást többször felhasználhatjuk, hiszen sok esetben nem szükséges az egész függvénynek lefutnia. Tipikusan ilyenek az ellenőrző-validáló függvények.
Ennek demonstrálására képzeljük el a következő feladatot: olyan függvényt kell írnunk, amelyik ellenőriz egy, a felhasználó által begépelt számot. Legyen az elfogadható számtartomány...
-
lebegőpontos (például 3,14),
-
valamint 1 és 20 közötti.
Minden más számot vagy próbálkozást hibának kell értékelnünk, ám azt sem szabad megengednünk, hogy emiatt összedőljön a rendszer, helyette a felhasználót hibaüzenettel kell értesíteni, valamint egyúttal lehetőséget kell adnunk az újbóli adatbevitelre. Láthatóan már nemcsak a fenti alapkövetelmények viszonylag egyszerű ellenőrzésével kell foglalkoznunk, ha a függvényt valóban "bolondbiztossá" kívánjuk tenni.
Ebben a kibővített esetben a standardnak mondható ellenőrzési rutinok a következők:
-
nem megengedett, ha felhasználó nem ad meg bemeneti adatot,
-
ne írjon be 1-nél kevesebbet, felső határként pedig 20-at állapítottunk meg,
-
csakis numerikus értékek és tizedespont (.) fogadása,
-
maximum 10 karakterszám, másként a gonoszkodó felhasználó elkezdhet tesztelgetni, például: 3,1444444444444444444,
-
tizedespont nem lehet az első és utolsó karakterpozícióban, illetve nem szerepelhet 1-nél többször.
Mindezt az adatEllenorzes() függvénybe gyömöszöljük be több kilépési ponttal, még pontosabban: ellenőrzésenként (tehát almetódusként) 1 db kilépési ponttal és addig nem is engedjük a programot továbblépni, amíg a felhasználó a fenti hibák egyikét elköveti.
Szinte "filozofikus" a kérdés, hogy egyetlen ellenőrző metódus, amelyik funkcionálisan valóban nem tesz mást, mint ellenőriz, ám azt többféle almetódussal, vajon 1 funkciójú vagy több?
Programozás-technikai nézőpont kérdése, amint én is kissé más vagyok elölről és hátulról nézve, ezért szerintem nem érdemes sok időt pazarolni megvitatására. Az elveket értjük és ezek után már szinte csak az számít, hogy a problémát meg tudjuk-e oldani.
Nézzük meg a futtatható Java-kódot!
import java.util.*;
public class Main {
static double szamBekeres(){
double adat = 0;
boolean rosszBemenetiAdat = false;
Scanner in = new Scanner(System.in);
String bemenetiAdat = new String();
System.out.println ("\nKérem, hogy adja meg az értéket!");
bemenetiAdat = in.nextLine();
rosszBemenetiAdat = adatEllenorzes(bemenetiAdat);
while(rosszBemenetiAdat == true){
rosszBemenetiAdat = false;
System.out.println("Kérem, hogy csak
megfelelő karaktereket
(max.
9 numerikus karakter + 1 tizedespont),"
+ "\n1-nél nagyobb és 20-nál kisebb
értéket adjon meg!");
bemenetiAdat = in.nextLine();
rosszBemenetiAdat =
adatEllenorzes(bemenetiAdat);
}
adat = Double.parseDouble(bemenetiAdat);
return adat;
}
static boolean adatEllenorzes(String bemenetiAdat){
Scanner in = new Scanner(System.in);
boolean rosszAdat = false;
char karakter;
double adat = 0;
if(bemenetiAdat.length() < 1 || bemenetiAdat.length() > 10){
rosszAdat = true;
return rosszAdat;
}
for(int i = 0; i < bemenetiAdat.length(); i++){
karakter = bemenetiAdat.charAt(i);
if(karakter == '1'
|| karakter
== '2'
|| karakter
== '3'
|| karakter
== '4'
|| karakter
== '5'
|| karakter
== '6'
|| karakter
== '7'
|| karakter
== '8'
|| karakter
== '9'
|| karakter
== '0'
|| karakter
== '.'){
continue;
}
else
rosszAdat =
true;
return
rosszAdat;
}
if((bemenetiAdat.charAt(0) == '.') || (bemenetiAdat.charAt(bemenetiAdat.length()
- 1) == '.')){
rosszAdat = true;
return rosszAdat;
}
int szamlalo = 0;
for(int i = 0; i < bemenetiAdat.length(); i++){
if(bemenetiAdat.charAt(i) == '.'){
szamlalo++;
}
}
if(szamlalo > 1){
rosszAdat = true;
return rosszAdat;
}
adat = Double.parseDouble(bemenetiAdat);
if(adat < 1 || adat > 20){
rosszAdat = true;
return rosszAdat;
}
return rosszAdat;
}
static void kiiras(double adat){
System.out.println("Az adat (" + adat + ") ellenőrizve!");
}
public static void main(String[] args){
double adat = 0;
adat = szamBekeres();
kiiras(adat);
}
}
Végeredmény:
Kérem, hogy adja meg az értéket!
0
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
21
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
3.14.5
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
.0
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
23.
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
33333333333333
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
3.222222222222
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
qwertz
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
a1
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
234f
Kérem, hogy csak megfelelő karaktereket (max. 9 numerikus karakter + 1
tizedespont),
1-nél nagyobb és 20-nál kisebb értéket adjon meg!
3.14
Az adat (3.14) ellenőrizve!