Gyakorlati alapok II.
Római szám kitalálósdi teljesítménymérővel
Az előző 2, a római és arab számváltással foglalkozó fejezet...
...már bevezette az alapalgoritmusokat a jelen fejezet fő problémáinak megoldásához. A készülő alkalmazás menürendszere kiválóan reprezentálja a program funkcióit:
1 - 10 db
(arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
A több lehetséges implementációs irányból a számváltáshoz, illetve az ellenőrzésekhez (nagyobbrészt) a www.jodd.org által publikált, külső rutinokat fogjuk felhasználni. Amint már említettük a Külső (nem futárral hozott) csomagok importja: római-arab szám váltó II. című fejezetben, a római szám validálása (helyességi ellenőrzése) sajnos nem 100%-os, de az extrém eseteket nem számítva viszonylag pontos.
Tervezünk még 1 rövid kiértékelő rutint is, amelynek alapja szintén publikálásra került a Számolgatógép fejszámolós teljesítménymérővel című fejezetben.
A felhasználásra kerülő, illetve a keletkezett külső metódusok a következők lesznek:
www.jodd.org rutinjai...
-
convertToRoman(),
-
convertToArabic(),
-
isValidRomanNumber().
....saját metódusok...
-
veletlenSzamGenerator(),
-
ellenorzesSzam(),
-
bekeresRomaiString(),
-
help().
A kiértékelést rövidsége miatt a main() főprogram végén hagytuk, bár nyilvánvalóan megoldható külső függvényben is.
Nézzük meg a futtatható Java-kódot!
import java.util.Random;
import java.util.Scanner;
import jodd.format.*;
public class Main {
static int[]veletlenSzamGenerator(){
int[]tombFeltoltott = new int[10];
Random random = new Random();
for(int i = 0; i < tombFeltoltott.length; i++){
tombFeltoltott[i] =
random.nextInt(3999) + 1;
}
return tombFeltoltott;
}
static int ellenorzesSzam(){
System.out.println("Kérem, hogy adja meg az arab számot (1 és
3999 között)!");
boolean rosszAdat = false;
int ellenorzottSzam = 0;
String stringSzam = new String();
do{
rosszAdat = false;
Scanner in = new Scanner(System.in);
stringSzam = in.nextLine();
char karakter = stringSzam.charAt(0);
for(int j = 0; j < stringSzam.length();
j++){
karakter =
stringSzam.charAt(j);
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("Rossz bemeneti
karakter(ek)!"
+ " Kérem, hogy csak 1 és 3999
közötti egész arab számot adjon meg! Újra!");
}
}while(rosszAdat == true);
ellenorzottSzam = Integer.parseInt(stringSzam);
return ellenorzottSzam;
}
static String bekeresRomaiString(){
RomanNumber rn = new RomanNumber();
String romaiString = "";
boolean joAdat = false;
System.out.println("Kérem, hogy adja meg a római számot!");
do{
Scanner in = new Scanner(System.in);
romaiString = in.nextLine();
joAdat =
rn.isValidRomanNumber(romaiString);
if(joAdat == false){
System.out.println("\nKérem, hogy pontos és szabványos római számot adjon meg!
Újra!");
}
}while(joAdat == false);
return romaiString;
}
static void help(){
System.out.println("\nA számtartomány 1 és 3999 között
lehet."
+ "\nCsakis megfelelő karaktereket adhat meg:"
+ "\n-római számok esetében: I,V,X,L,C,D,M"
+ "\n-arab számok esetében: 0,1,2,3,4,5,6,7,8,9"
+ "\nA program a nem szabványosan bevitt római számformátumot is hibásnak
értékeli:"
+ "\n-például: IIII, IIV, MMMM, stb."
+ "\nA kiértékelésbe a rosszul vagy tévesen bevitt adatkörök nem számítanak
bele.");
System.out.println();
}
public static void main(String args[]) {
int[]tombFeltoltott = new int[10];
int szamlalo = 0;
int OK = 0;
int szamArabBecsult = 0;
String romaiStringValos = "";
String romaiStringBecsult = "";
RomanNumber rn = new RomanNumber();
String[] menu = new String[] {"1 - 10 db (arab)
véletlenszámból álló sorozat",
"2 - 10 db (római) véletlenszámból álló sorozat",
"3 - Egyedi arab számbecslés",
"4 - Egyedi római számbecslés",
"5 - Segítség",
"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]);
}
Scanner in = new Scanner(System.in);
String valasztas = in.nextLine();
if("1".equals(valasztas)) {
tombFeltoltott = veletlenSzamGenerator();
for(int i =
0; i < tombFeltoltott.length; i++){
System.out.println("\nA(z) " + (i+1) + ". arab szám: " + tombFeltoltott[i]);
romaiStringValos = rn.convertToRoman(tombFeltoltott[i]);
romaiStringBecsult = bekeresRomaiString();
szamlalo++;
if(romaiStringBecsult.equals(romaiStringValos)){
System.out.println("\nHelyes eredmény!");
OK++;
}
else
System.out.println("\nHelytelen eredmény! " + "(" + romaiStringValos + ")");
}
}
if ("2".equals(valasztas)) {
tombFeltoltott = veletlenSzamGenerator();
for(int i =
0; i < tombFeltoltott.length; i++){
romaiStringValos = RomanNumber.convertToRoman(tombFeltoltott[i]);
System.out.println("\nA(z) " + (i+1) + ". római szám: " + romaiStringValos);
szamArabBecsult = ellenorzesSzam();
szamlalo++;
if(szamArabBecsult == tombFeltoltott[i]){
System.out.println("\nHelyes eredmény!");
OK++;
}
else
System.out.println("\nHelytelen eredmény! " + "(" + tombFeltoltott[i] + ")");
}
}
if ("3".equals(valasztas)) {
tombFeltoltott = veletlenSzamGenerator();
System.out.println("Az arab szám: " + tombFeltoltott[0]);
romaiStringValos = RomanNumber.convertToRoman(tombFeltoltott[0]);
romaiStringBecsult = bekeresRomaiString();
szamlalo++;
if(romaiStringBecsult.equals(romaiStringValos)){
System.out.println("Helyes eredmény!");
System.out.println();
OK++;
}
else
System.out.println("Helytelen eredmény! " + "(" + romaiStringValos + ")");
System.out.println();
}
if ("4".equals(valasztas)) {
tombFeltoltott = veletlenSzamGenerator();
romaiStringValos = rn.convertToRoman(tombFeltoltott[0]);
System.out.println("A római szám: " + romaiStringValos);
szamArabBecsult = ellenorzesSzam();
szamlalo++;
if(szamArabBecsult == tombFeltoltott[0]){
System.out.println("\nHelyes eredmény!");
System.out.println();
OK++;
}
else
System.out.println("\nHelytelen eredmény! " + "(" + tombFeltoltott[0] + ")");
System.out.println();
}
if ("5".equals(valasztas)) {
help();
}
if ("0".equals(valasztas)) {
if(szamlalo
== 0){
System.out.println("\nNincsenek kiértékelhető eredmények. Viszlát!");
System.exit(0);
}
else{
float seged =
100 / (float) szamlalo;
System.out.println("\nAz Ön teljesítménye " + szamlalo + " számfeladványban "
+ (seged * (float) OK) + " százalékos volt.");
System.out.println("Viszlát!");
System.exit(0);
}
}
}
}
}
Végeredmény:
Kérem
válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
S
Kérem válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
2
A(z) 1. római szám: MMMCMXXV
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
3925
Helyes eredmény!
A(z) 2. római szám: MMCMLXXII
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
2922
Helytelen eredmény! (2972)
A(z) 3. római szám: MMCMLXXXIV
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
2984
Helyes eredmény!
A(z) 4. római szám: CCCLXXX
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
380
Helyes eredmény!
A(z) 5. római szám: CLX
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
160
Helyes eredmény!
A(z) 6. római szám: MCMLXXXI
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
1981
Helyes eredmény!
A(z) 7. római szám: MMDCCLXXIX
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
2779
Helyes eredmény!
A(z) 8. római szám: DCXCI
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
R
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 3999 közötti egész arab
számot adjon meg! Újra!
691
Helyes eredmény!
A(z) 9. római szám: MMMCCCLI
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
3351
Helyes eredmény!
A(z) 10. római szám: MMMDCXXXVII
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
3637
Helyes eredmény!
Kérem válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
3
Az arab szám: 1357
Kérem, hogy adja meg a római számot!
A
Kérem, hogy pontos és szabványos római számot adjon meg! Újra!
III
Helytelen eredmény! (MCCCLVII)
Kérem válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
4
A római szám: MMDXCVIII
Kérem, hogy adja meg az arab számot (1 és 3999 között)!
2500
Helytelen eredmény! (2598)
Kérem válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
5
A számtartomány 1 és 3999 között lehet.
Csakis megfelelő karaktereket adhat meg:
-római számok esetében: I,V,X,L,C,D,M
-arab számok esetében: 0,1,2,3,4,5,6,7,8,9
A program a nem szabványosan bevitt római számformátumot is hibásnak értékeli:
-például: IIII, IIV, MMMM, stb.
A kiértékelésbe a rosszul vagy tévesen bevitt adatkörök nem számítanak bele.
Kérem válasszon az alábbi lehetőségekből:
1 - 10 db (arab) véletlenszámból álló sorozat
2 - 10 db (római) véletlenszámból álló sorozat
3 - Egyedi arab számbecslés
4 - Egyedi római számbecslés
5 - Segítség
0 - Kiértékelés és kilépés
0
Az Ön teljesítménye 12 számfeladványban 75.0 százalékos volt.
Viszlát!