Gyakorlati alapok

Hányadik az autórendszám?

 

www.informatika-programozas.hu - Ez a programozási feladat nehéz lesz!

 

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:

Nézzük meg a futtatható Java-kódot:

 

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

 

 

 

 

 

 

 

 

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.