Gyakorlati alapok

Virtuális traffipax


Napjaink legújabb és eleddig legrafináltabb traffipax-technológiája már nem az út szélén vagy a bokorban rejtőzve leselkedik a gyorshajtókra...

 

www.informatika-programozas.hu

 

...hanem adott útszakaszok között átlagsebességet számol és ha az nagyobb a megengedettnél, akkor szinte automatikusan megy is a bírság. Ehhez a járműnek jól beazonosítható módon először egy virtuális belépési pont előtt...

 

www.informatika-programozas.hu

 

...majd egy kilépési pont előtt is el kell haladnia...

 

www.informatika-programozas.hu

 

...amely pontokat autópályán alapjában véve nem nehéz kialakítani, bár a rendszámfelismerés nyilvánvalóan problematikus tényező. Ha a jármű gyorsabban megy a megengedett sebességnél, akkor hamarabb fog odaérni a kilépési ponthoz, amely egyértelmű bizonyítéka a gyorshajtásnak.

A rendszer sokféle módon játszható ki:

Magyar autópályán a sebességkorlátozás 130 km / h. Ez azt jelenti, hogy ha 1 óra alatt 130 km-nél messzebb jutottunk járművünkkel, akkor gyorshajtók voltunk. Mivel 1 óra 60 percből áll, nem nehéz ezt percre lebontani:
 

130 / 60 = 2.1666 km

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Tehát 1 perc alatt maximálisan 2.1666 km tehetünk meg, másként gyorshajtók vagyunk.

 

A feladat legyen most az, hogy meg kell írnunk egy olyan algoritmust, amelynek a specifikációja a következő:

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

 

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

 

 

 

 

 

 

 

 

import java.util.*;

public class Main {
public static void main(String[] args) {
    final double sebessegHatar = 2.1666;
    final double turesHatar = 0.1;
    Scanner scanner = new Scanner(System.in);
    System.out.println ("Kérem, hogy adja meg a kilométert!");
    String elem = scanner.nextLine();
    double km = Double.parseDouble(elem);
    while(km <= 0) {
        System.out.println("Kérem, hogy csak pozitív számot adjon meg!");
        elem = scanner.nextLine();
        km = Double.parseDouble(elem);
    }
    System.out.println("Kérem, hogy adja meg az eltelt időt!");
    elem = scanner.nextLine();
    double s = Integer.parseInt(elem);
    while(s <= 0) {
        System.out.println("Kérem, hogy csak pozitív számot adjon meg!");
        elem = scanner.nextLine();
        s = Double.parseDouble(elem);
    }
    double m = s / 60;
    double eredmeny = km / m;
    System.out.println(s + " másodperc = " + m + " perc");
    System.out.println("1 kilométer alatt megtett út: " + eredmeny);
    System.out.println("Az Ön sebessége " + (eredmeny * 60) + " km/h volt.");
    if(eredmeny > sebessegHatar + turesHatar){
        System.out.println("Ön gyorshajtó volt.");
    }
    else
        System.out.println("Ön szabályosan közlekedett.");
    }
}

 

130 kilométer 1 óra alatt:

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
3600
3600.0 másodperc = 60.0 perc
1 kilométer alatt megtett út: 2.1666666666666665
Az Ön sebessége 130.0 km/h volt.
Ön szabályosan közlekedett.

 

130 kilométer 1/2 óra alatt:

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
1800
1800.0 másodperc = 30.0 perc
1 kilométer alatt megtett út: 4.333333333333333
Az Ön sebessége 260.0 km/h volt.
Ön gyorshajtó volt.

 

130 kilométer 2 óra alatt:

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
7200
7200.0 másodperc = 120.0 perc
1 kilométer alatt megtett út: 1.0833333333333333
Az Ön sebessége 65.0 km/h volt.
Ön szabályosan közlekedett.

Ugyanakkor a megállapított 0.1 tűréshatár (final double turesHatar = 0.1;) nagyjából +5 kilométer / órás sebességtúllépést eredményezett:

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
3480
3480.0 másodperc = 58.0 perc
1 kilométer alatt megtett út: 2.2413793103448274
Az Ön sebessége 134.48275862068965 km/h volt.
Ön szabályosan közlekedett.

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
3420
3420.0 másodperc = 57.0 perc
1 kilométer alatt megtett út: 2.280701754385965
Az Ön sebessége 136.8421052631579 km/h volt.
Ön gyorshajtó volt.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A kódban 2 helyen is használtam a final módosítószót, erről részletesen olvashatunk az Ami a változót (és a többieket) változatlanná teszi: a final című fejezetben.

 

A program működőképes, bár sok további lehetséges hibalehetőséget nem kezeltünk le benne, igaz, a jelen tanulási fázisban ez még nem is feladat. Azonban 1 hibalehetőséget kis logikus gondolkodással még gond nélkül lekezelhetünk.

 

Tételezzük fel, hogy rossz lesz valamelyik bemeneti adat, vagy km, vagy s megadása, hiszen nagyon könnyű +1 digittel többet vagy kevesebbet írni. 0 vagy kisebb szám esetén már lekezeltük őket, most viszont kissé bonyolultabb a helyzet.

 

Észrevehetjük, hogy a hibaszűrést inkább a 2 érték arányából kéne elkezdenünk, illetve kiindulópontként van itt még 1 fontos, szintén közlekedésrendészeti szabály:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Magyar autópályákon az alsó sebességkorlátozás 80 km / h. Ez azt jelenti, hogy extrém eseteket kivéve (például torlódás) alapjában véve tilos ennél kisebb sebességgel közlekednünk. Mivel 1 óra 60 percből áll, nem nehéz ezt percre lebontani:
 

80 / 60 = 1.3333 km

 

Foglaljuk össze:

Nézzünk meg 1 extrém sebességtúllépést is; BMW-k például gyárilag 250 km / óra sebességre vannak korlátozva. Természetesen más márkájú járművel lehetséges nagyobb sebességtúllépés, de a modellezéshez tökéletesen elég ez az adat:

 

250 / 60 = 4.1666 km

 

Tehát:

Kezd kirajzolódni egy olyan arányszám, amely alapja lehet a 3. ellenőrzésnek: nevezetesen, jól írtuk-e be a 2 db bemeneti adatot. Az ellenőrzéshez:

További járulékként egy kissé át is kell szerkeszteni a kódot, főként, hogy a változók értékei globálisan elérhetők legyenek. Nézzük meg a futtatható Java-kódot:

 

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

 

 

 

 

 

 

 

 

import java.util.*

public class Main {
public static void main(String[] args) {
    final double sebessegHatar = 2.1666;
    final double turesHatar = 0.1;
    double s, m, eredmeny;
    do{
        s = 0;
        m = 0;
        eredmeny = 0;
        Scanner scanner = new Scanner(System.in);
        System.out.println ("Kérem, hogy adja meg a kilométert!");
        String elem = scanner.nextLine();
        double km = Double.parseDouble(elem);
        while(km <= 0) {
            System.out.println("Kérem, hogy csak pozitív számot adjon meg!");
            elem = scanner.nextLine();
            km = Double.parseDouble(elem);
        }
        System.out.println("Kérem, hogy adja meg az eltelt időt!");
        elem = scanner.nextLine();
        s = Integer.parseInt(elem);
        while(s <= 0) {
            System.out.println("Kérem, hogy csak pozitív számot adjon meg!");
            elem = scanner.nextLine();
            s = Double.parseDouble(elem);
        }
        m = s / 60;
        eredmeny = km / m;
        if(eredmeny < 1.3333 || eredmeny > 4.1666){
            System.out.println("Rossz bemeneti adatok, ismételje meg!");
        }
    }while(eredmeny < 1.3333 || eredmeny > 4.1666);
    System.out.println(s + " másodperc = " + m + " perc");
    System.out.println("1 kilométer alatt megtett út: " + eredmeny);
    System.out.println("Az Ön sebessége " + (eredmeny * 60) + " km/h volt.");
    if(eredmeny > sebessegHatar + turesHatar){
        System.out.println("Ön gyorshajtó volt.");
    }
    else
    System.out.println("Ön szabályosan közlekedett.");
    }
}

 

Végeredmény:

Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
7000
Rossz bemeneti adatok, ismételje meg!
Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
2
Rossz bemeneti adatok, ismételje meg!
Kérem, hogy adja meg a kilométert!
130
Kérem, hogy adja meg az eltelt időt!
3600
3600.0 másodperc = 60.0 perc
1 kilométer alatt megtett út: 2.1666666666666665
Az Ön sebessége 130.0 km/h volt.
Ön szabályosan közlekedett.