Gyakorlati alapok II.
Számolgatógép fejszámolós teljesítménymérővel
Ebben a fejezetben a 4 alapművelet című fejezetben ismertetett implementációs megoldásokat gondoljuk tovább. A már meglévő, alapszintű, korrekten működő számolgatógéphez egy apró teljesítménymérő algoritmust illesztünk, amely fejszámolásunk eredményességét értékeli ki. Megpróbáljuk ezt külön metódusban implementálni, amely persze még látatlanban is megvalósítható, bár hogy milyen konkrét technikákkal, az még kérdéses. Természetesen erre is sokféle megoldás lehetséges.
Először megismételjük a számolgatógép futtatható Java-kódját, hiszen ez lesz a kiindulópontunk:
import java.util.Scanner;
public class Main {
static double osszeadas(double elsoSzam, double masodikSzam){
return elsoSzam + masodikSzam;
}
static double kivonas(double elsoSzam, double masodikSzam){
return elsoSzam - masodikSzam;
}
static double szorzas(double elsoSzam, double masodikSzam){
return elsoSzam * masodikSzam;
}
static double osztas(double elsoSzam, double masodikSzam){
return elsoSzam / masodikSzam;
}
static String[] adatBekeres(){
Scanner in = new Scanner (System.in);
String[] bemenetiAdatTomb = new String[3];
boolean rosszAdat = false;
System.out.println ("Kérem adja meg az 1. számot!");
do{
bemenetiAdatTomb[0] = in.nextLine();
rosszAdat =
ellenorzesSzam(bemenetiAdatTomb[0]);
}while (rosszAdat == true);
rosszAdat = false;
System.out.println ("Kérem adja meg a műveleti jelet!");
do{
bemenetiAdatTomb[1] = in.nextLine();
rosszAdat =
ellenorzesMuveletiJel(bemenetiAdatTomb[1]);
}while (rosszAdat == true);
rosszAdat = false;
System.out.println ("Kérem adja meg a 2. számot!");
do{
bemenetiAdatTomb[2] = in.nextLine();
rosszAdat =
ellenorzesSzam(bemenetiAdatTomb[2]);
}while (rosszAdat == true);
return bemenetiAdatTomb;
}
static boolean ellenorzesSzam(String bemenetiAdat){
boolean rosszAdat = false;
char karakter = bemenetiAdat.charAt(0);
if(karakter == '0'){
rosszAdat = true;
}
for(int i = 0; i < bemenetiAdat.length(); i++){
karakter = bemenetiAdat.charAt(i);
if(karakter != '0'
&& karakter
!= '1'
&& karakter
!= '2'
&& karakter
!= '3'
&& karakter
!= '4'
&& karakter
!= '5'
&& karakter
!= '6'
&& karakter
!= '7'
&& karakter
!= '8'
&& karakter
!= '9'){
rosszAdat =
true;
break;
}
}
if(rosszAdat == true){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
}
return rosszAdat;
}
static boolean ellenorzesMuveletiJel(String bemenetiAdat){
boolean rosszAdat = false;
char karakter = bemenetiAdat.charAt(0);
if((karakter != '+' && karakter != '-' && karakter != '*' &&
karakter != '/')){
rosszAdat = true;
}
if(rosszAdat == true){
System.out.println("Kérem, hogy csak
+ - * / jeleket adjon meg!");
}
return rosszAdat;
}
static double kiertekeles(double elsoSzam, double masodikSzam, String
muveletiJel){
double eredmeny = 0;
switch(muveletiJel){
case("+"): eredmeny =
osszeadas(elsoSzam, masodikSzam); break;
case("-"): eredmeny =
kivonas(elsoSzam, masodikSzam); break;
case("*"): eredmeny =
szorzas(elsoSzam, masodikSzam); break;
case("/"): eredmeny = osztas(elsoSzam,
masodikSzam); break;
}
return eredmeny;
}
public static void main(String[] args) {
String[] bemenetiAdatTomb = new String[3];
bemenetiAdatTomb = adatBekeres();
double elsoSzam = Double.parseDouble(bemenetiAdatTomb[0]);
double masodikSzam = Double.parseDouble(bemenetiAdatTomb[2]);
String muveletiJel = bemenetiAdatTomb[1];
System.out.println(elsoSzam + " " + muveletiJel + " " +
masodikSzam + " = " +
kiertekeles(elsoSzam, masodikSzam, muveletiJel));
}
}
Végeredmény:
Kérem adja
meg az 1. számot!
w
Kérem, hogy csak pozitív egész számot adjon meg!
qwert
Kérem, hogy csak pozitív egész számot adjon meg!
0
Kérem, hogy csak pozitív egész számot adjon meg!
120
Kérem adja meg a műveleti jelet!
sde
Kérem, hogy csak + - * / jeleket adjon meg!
b
Kérem, hogy csak + - * / jeleket adjon meg!
/
Kérem adja meg a 2. számot!
0
Kérem, hogy csak pozitív egész számot adjon meg!
hj
Kérem, hogy csak pozitív egész számot adjon meg!
23
120.0 / 23.0 = 5.217391304347826
A kód nagyobbik része és tartalmi jellemzői szinte változtatás nélkül felhasználhatók. A legfontosabb különbségek a következők (a kisebbek nem lesznek megemlítve):
-
a műveletek választása egy alapszintű menüből történik (String[] menu = new String[] {"1 - Összeadás", "2 - Kivonás", "3 - Szorzás", "4 - Osztás", "0 - Kiértékelés és kilépés"};). A menü adatbevitele legyen ellenőrzött.
-
A menürendszerből következően felesleges a ellenorzesMuveletiJel(String bemenetiAdat) metódus, mert a műveleti jel másmódon, közvetlenül a menüben kerül be a kódba,
-
szükséges implementálni egy egyszerű kiértékelő metódust (kiertekelesFelhasznalo(double szamFelhasznalo, double eredmeny)), amelyik a felhasználó által megbecsült végeredményt veti össze a valós végeredménnyel. Fontos, hogy a felhasználó által megbecsült végeredmény lehet 0 vagy annál kisebb, ezért egy külön, szamBekeresEredmeny() nevű metódust kell alkotunk a már meglévő szamBekeres() metódusból. A kiértékelés, mint példakód működőképes, de természetesen tovább lehetne finomítani. A magam részéről az algoritmust mélyebben nem teszteltem.
-
A felhasználó teljesítmény százalékos arányban kell kiértékelni. Ehhez folyamatosan tárolni kell az összes művelet számát (int szamlalo = 0;), és a jó becslések számát (int OK = 0;). Például 4 feladatos kör esetén 3 eltalált, 1 hibás becslés 75%-ot adjon.
import java.util.Scanner;
public class Main {
static double osszeadas(double elsoSzam, double masodikSzam){
return elsoSzam + masodikSzam;
}
static double kivonas(double elsoSzam, double masodikSzam){
return elsoSzam - masodikSzam;
}
static double szorzas(double elsoSzam, double masodikSzam){
return elsoSzam * masodikSzam;
}
static double osztas(double elsoSzam, double masodikSzam){
return elsoSzam / masodikSzam;
}
static double szamBekeres(){
Scanner in = new Scanner (System.in);
String bemenetiAdatFelhasznalo = new String();
boolean rosszAdat = false;
do{
bemenetiAdatFelhasznalo = in.nextLine();
rosszAdat =
ellenorzesSzam(bemenetiAdatFelhasznalo);
}while (rosszAdat == true);
double szam = Double.parseDouble(bemenetiAdatFelhasznalo);
return szam;
}
static double szamBekeresEredmeny(){
Scanner in = new Scanner (System.in);
String bemenetiAdatFelhasznalo = new String();
bemenetiAdatFelhasznalo = in.nextLine();
double szam = Double.parseDouble(bemenetiAdatFelhasznalo);
return szam;
}
static boolean ellenorzesSzam(String bemenetiAdat){
boolean rosszAdat = false;
char karakter = bemenetiAdat.charAt(0);
if(karakter == '0'){
rosszAdat = true;
}
for(int i = 0; i < bemenetiAdat.length(); i++){
karakter = bemenetiAdat.charAt(i);
if(karakter != '0'
&& karakter
!= '1'
&& karakter
!= '2'
&& karakter
!= '3'
&& karakter
!= '4'
&& karakter
!= '5'
&& karakter
!= '6'
&& karakter
!= '7'
&& karakter
!= '8'
&& karakter
!= '9'){
rosszAdat =
true;
break;
}
}
if(rosszAdat == true){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
}
return rosszAdat;
}
static double kiertekeles(double elsoSzam, double masodikSzam, String
muveletiJel){
double eredmeny = 0;
switch(muveletiJel){
case("+"): eredmeny =
osszeadas(elsoSzam, masodikSzam); break;
case("-"): eredmeny =
kivonas(elsoSzam, masodikSzam); break;
case("*"): eredmeny =
szorzas(elsoSzam, masodikSzam); break;
case("/"): eredmeny = osztas(elsoSzam,
masodikSzam); break;
}
return eredmeny;
}
static boolean kiertekelesFelhasznalo(double szamFelhasznalo, double eredmeny){
boolean OK = false;
if (szamFelhasznalo != eredmeny){
System.out.println("Az összeg: (" +
eredmeny + ") és az Ön száma nem egyezik." + "\n");
}
else{
System.out.println("Az összeg
valóban: " + eredmeny + "\n");
OK = true;
}
return OK;
}
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
double elsoSzam = 0;
double masodikSzam = 0;
double eredmeny = 0;
double szamFelhasznalo = 0;
String muveletiJel = null;
boolean joBecsles = false;
int szamlalo = 0;
int OK = 0;
String[] menu = new String[] {"1 - Összeadás", "2 - Kivonás", "3 - Szorzás",
"4 - Osztás", "0 - Kiértékelés és kilépés"};
while(true) {
System.out.println("Kérem válasszon
az alábbi lehetőségekből: ");
for(int i=0; i<menu.length; i++) {
System.out.println(menu[i]);
}
String valasztas = in.nextLine();
if ("1".equals(valasztas)) {
muveletiJel = "+";
szamlalo++;
System.out.println ("\nKérem, hogy
adja meg az 1. számot!");
elsoSzam = szamBekeres();
System.out.println ("\nKérem, hogy
adja meg a 2. számot!");
masodikSzam = szamBekeres();
eredmeny = kiertekeles(elsoSzam,
masodikSzam, muveletiJel);
System.out.println("\nÖn szerint
mennyi a végeredmény?");
szamFelhasznalo = szamBekeresEredmeny();
joBecsles =
kiertekelesFelhasznalo(szamFelhasznalo, eredmeny);
if(joBecsles == true){
OK++;
}
}
if ("2".equals(valasztas)) {
muveletiJel = "-";
szamlalo++;
System.out.println ("\nKérem, hogy
adja meg az 1. számot!");
elsoSzam = szamBekeres();
System.out.println ("\nKérem, hogy
adja meg a 2. számot!");
masodikSzam = szamBekeres();
eredmeny = kiertekeles(elsoSzam,
masodikSzam, muveletiJel);
System.out.println("\nÖn szerint
mennyi a végeredmény?");
szamFelhasznalo = szamBekeresEredmeny();
joBecsles =
kiertekelesFelhasznalo(szamFelhasznalo, eredmeny);
if(joBecsles == true){
OK++;
}
}
if ("3".equals(valasztas)) {
muveletiJel = "*";
szamlalo++;
System.out.println ("\nKérem, hogy
adja meg az 1. számot!");
elsoSzam = szamBekeres();
System.out.println ("\nKérem, hogy
adja meg a 2. számot!");
masodikSzam = szamBekeres();
eredmeny = kiertekeles(elsoSzam,
masodikSzam, muveletiJel);
System.out.println("\nÖn szerint
mennyi a végeredmény?");
szamFelhasznalo = szamBekeresEredmeny();
joBecsles =
kiertekelesFelhasznalo(szamFelhasznalo, eredmeny);
if(joBecsles == true){
OK++;
}
}
if ("4".equals(valasztas)) {
muveletiJel = "/";
szamlalo++;
System.out.println ("\nKérem, hogy
adja meg az 1. számot!");
elsoSzam = szamBekeres();
System.out.println ("\nKérem, hogy
adja meg a 2. számot!");
masodikSzam = szamBekeres();
eredmeny = kiertekeles(elsoSzam,
masodikSzam, muveletiJel);
System.out.println("\nÖn szerint
mennyi a végeredmény?");
szamFelhasznalo = szamBekeresEredmeny();
joBecsles =
kiertekelesFelhasznalo(szamFelhasznalo, eredmeny);
if(joBecsles == true){
OK++;
}
}
if ("0".equals(valasztas)) {
if(szamlalo == 0){
System.out.println("\nNincsenek kiértékelhető eredmények. Viszlát!");
break;
}
else{
double seged = 100 / szamlalo;
System.out.println("\nAz Ön
teljesítménye " + szamlalo + " feladatban "
+ (seged * OK) + " százalékos volt.");
System.out.println("Viszlát!");
break;
}
}
}
}
}
Végeredmény:
Kérem
válasszon az alábbi lehetőségekből:
1 - Összeadás
2 - Kivonás
3 - Szorzás
4 - Osztás
0 - Kiértékelés és kilépés
1
Kérem, hogy adja meg az 1. számot!
120
Kérem, hogy adja meg a 2. számot!
sdsd
Kérem, hogy csak pozitív egész számot adjon meg!
w
Kérem, hogy csak pozitív egész számot adjon meg!
0
Kérem, hogy csak pozitív egész számot adjon meg!
120
Ön szerint mennyi a végeredmény?
240
Az összeg valóban: 240.0
Kérem válasszon az alábbi lehetőségekből:
1 - Összeadás
2 - Kivonás
3 - Szorzás
4 - Osztás
0 - Kiértékelés és kilépés
2
Kérem, hogy adja meg az 1. számot!
50
Kérem, hogy adja meg a 2. számot!
-1
Kérem, hogy csak pozitív egész számot adjon meg!
100
Ön szerint mennyi a végeredmény?
-50
Az összeg valóban: -50.0
Kérem válasszon az alábbi lehetőségekből:
1 - Összeadás
2 - Kivonás
3 - Szorzás
4 - Osztás
0 - Kiértékelés és kilépés
3
Kérem, hogy adja meg az 1. számot!
30
Kérem, hogy adja meg a 2. számot!
20
Ön szerint mennyi a végeredmény?
600
Az összeg valóban: 600.0
Kérem válasszon az alábbi lehetőségekből:
1 - Összeadás
2 - Kivonás
3 - Szorzás
4 - Osztás
0 - Kiértékelés és kilépés
4
Kérem, hogy adja meg az 1. számot!
45
Kérem, hogy adja meg a 2. számot!
63
Ön szerint mennyi a végeredmény?
0.8
Az összeg: (0.7142857142857143) és az Ön száma nem egyezik.
Kérem válasszon az alábbi lehetőségekből:
1 - Összeadás
2 - Kivonás
3 - Szorzás
4 - Osztás
0 - Kiértékelés és kilépés
0
Az Ön teljesítménye 4 feladatban 75.0 százalékos volt.
Viszlát!