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...

....saját metódusok...

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!

 

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

 

 

 

 

 

 

 

 

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!