Gyakorlati alapok
Hányadik az autórendszám?
Figyelem!
A fejezet haladó szintű kódanyagot tartalmaz!
A magyar autórendszám témájával foglalkozó egyik fejezetben (A magyar autórendszám izgalmas rejtélyei) kilistáztuk a magyar autórendszámokat. Ennek matematikai kiindulópontja az a rövid számítás volt, amely megadta AAA-000 és ZZZ-999 közti rendszámtartomány összkombinációs lehetőségét: végeredménye 17 576 000 volt. Ezen rövid fejezetben arra keresünk választ, hogy ebben a tartományban 1 megadott rendszám vajon hányadik lehet, azaz mi a kiadási sorszáma. Rögtön 2 db rendszámnak tudjuk is:
1. - AAA-000
17 576 000. - ZZZ-999
Ez első pillantásra nagyon blőd megállapításnak tűnik, de mivel határértékek, nagyon fontosak és ezért a program velük kiválóan tesztelhető. (Voltaképpen minden különösebb erőfeszítés nélkül van 2 db elvárt eredményünk.)
A problémát Ficsor Gergely tanítványom oldotta meg, még pedig minősítésem szerint már haladó szintű, külön osztályos implementációban (Gyakorlati alapok III. (Az osztályok) című fejezetcsomag alapján). Röviden a programról:
-
a program teljes validálással bekér 1 szabványos autórendszámot,
-
rossz adatbevitel esetén hibaüzenetet küld és ismétlését kéri egészen addig, amíg az adatbevitel megfelelő nem lesz,
-
a program az objektumorientált alapelveknek igyekszik megfelelni, azaz funkciói osztályok szerint szétosztottak. Ebből a szempontból az üzenetek lehettek volna külön osztályban, mondjuk Messages néven, de természetesen a program enélkül is hatékony.
-
Külön érdekesség, hogy Gergely a rendszámsorszám generálását helyiérték számításával oldotta meg.
Nézzük meg a futtatható Java-kódot:
Main.java
public class Main {
public static void main(String[] args) {
String carNumber;
boolean isOk;
do {
System.out.println("Kerem adja meg a vizsgalando rendszamot a
kovetkezokeppen: abc123 vagy ABC123!");
carNumber = Input.inputString();
isOk = Validation.isValid(carNumber);
if (isOk == false) {
System.out.println("Nem megfelelo
bevitel!\n");
}
} while (isOk == false);
System.out.println("Az On altal megadott rendszam a "
+
Calculation.calculate(carNumber) + ".-kent kiadott magyar autorendszam.");
}
}
Calculation.java
public class Calculation {
public static int calculate(String carNumber) {
String ABC = "abcdefghijklmnopqrstuvwxyz";
String numbers = "0123456789";
int result = 1;
outer:
for (int i = 0; i < 3; i++ ) {
for (int j = 0; i < ABC.length(); j++) {
if (carNumber.charAt(i) ==
ABC.charAt(j)) {
if (i == 0) {
result = result + j * 676000;
continue outer;
}
else if (i ==
1) {
result = result + j * 26000;
continue outer;}
else if (i ==
2) {
result = result + j * 1000;
continue outer;
}
}
}
}
outer:
for (int i = 3; i < 6; i++ ) {
for (int j = 0; i < numbers .length(); j++) {
if (carNumber.charAt(i) == numbers
.charAt(j)) {
if (i == 3) {
result = result + j * 100;
continue outer;
}
else if (i ==
4) {
result = result + j * 10;
continue outer;
}
else if (i ==
5) {result = result + j;
continue
outer;
}
}
}
}
return result;
}
}
Input.java
import java.util.Scanner;
public class Input {
public static String inputString() {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
input = input.toLowerCase();
return input;
}
}
Validation.java
public class Validation {
private static boolean valid;
public static boolean isValid(String input) {
String ABC = "abcdefghijklmnopqrstuvwxyz";
String numbers = "0123456789";
if (input.length() == 6) {
if (input.isEmpty()) {
return valid;
}
else {
outer:
for (int i = 0; i <= 5; i++) {
valid =
false;
if (i <= 2){
for (int j = 0; j < ABC.length(); j++) {
if (input.charAt(i) == ABC.charAt(j)){
valid = true;
continue outer;
}
if ((j == ABC.length() - 1) && (valid == false)) {
break outer;
}
}
else {
for (int k = 0; k < numbers.length(); k++) {
if (input.charAt(i) == numbers.charAt(k)){
valid = true;
continue outer;
}
if ((k == numbers.length() - 1) && (valid == false)) {
break outer;
}
}
}
}
}
}
return valid;
}
}
Végeredmény:
Kerem adja meg a vizsgalando rendszamot a
kovetkezokeppen: abc123 vagy ABC123!
Nem megfelelo bevitel!
Kerem adja meg a vizsgalando rendszamot a kovetkezokeppen: abc123 vagy ABC123!
qqqqqqqdd
Nem megfelelo bevitel!
Kerem adja meg a vizsgalando rendszamot a kovetkezokeppen: abc123 vagy ABC123!
012
Nem megfelelo bevitel!
Kerem adja meg a vizsgalando rendszamot a kovetkezokeppen: abc123 vagy ABC123!
zzz999
Az On altal megadott rendszam a 17576000.-kent kiadott magyar autorendszam.