Cél és előfeltétel
Egy számítás gyakran attól függ, milyen bemenet érkezik. Egy csomag díja változhat a súlyával, egy foglalás pedig csak akkor fér el, ha van szabad hely. Ebben a leckében a hétköznapi mondatokat pontos, ellenőrizhető döntési szabályokká alakítod. A cél nem az if szintaxisának bemagolása, hanem az esetek hiánytalan szétválasztása.
Előbb végezd el a függvények és visszatérés leckét. Az önálló főprogramokat edition 2024 beállítással futtasd. Minden feladat előtt írj fel három bemenetet: egy egyértelműen elfogadottat, egy elutasítottat és egy olyat, amely pontosan a szabály határán van. Ezekből lesznek a megoldások állításai.
Egy feltétel igazságértéket ad
Az összehasonlítás eredménye logikai érték. Az egyenlőség ellenőrzése nem értékadás: két egyenlőségjel összehasonlít, az egyetlen jel kötést vagy értékadást szolgál. A kisebb és a kisebb vagy egyenlő megkülönböztetése különösen fontos, ha korhatárt, kapacitást vagy súlyhatárt írsz le. A pontosan határon álló bemenet gyakran mutatja meg a rosszul lefordított üzleti mondatot.
A Rust if feltétele valódi logikai értéket vár. Egy egész számot nem értelmez automatikusan igazként vagy hamisként. Ha azt kérdezed, van-e még hely, mondd ki a szükséges összehasonlítást. Ettől a kód olvasója látja a szabályt, és a fordító is megakadályoz néhány véletlen félreírást. A logikai eredményt önálló függvényből is visszaadhatod.
Több ág, egyértelmű sorrend
Az if, else if és else láncban az első igaz feltételhez tartozó ág fut le. Emiatt a sorrend nem pusztán formai kérdés. Ha előbb egy nagyon tág feltételt vizsgálsz, egy szűkebb későbbi ág soha nem kerül sorra. Súlyhatároknál például indulhatsz a legkisebb kategóriától, majd fokozatosan nagyobb tartományokat foghatsz meg.
Az else ág nem hibaüzenet rövidítése: egyszerűen a korábbi feltételek egyikéhez sem illeszkedő esetet kezeli. Egy teljes döntési láncban fogalmazd meg, ez pontosan milyen tartományt jelent. A feladatainkban nem minden függvény fogad tetszőleges adatot; ahol tartományt rögzítünk, azt a szöveg és az állítások együtt teszik láthatóvá.
Összetett feltétel olvashatóan
A logikai és mindkét feltétel teljesülését kéri, a logikai vagy legalább az egyikét. A tagadás megfordít egy igazságértéket. A műveletek rövidzárasak: az és jobb oldala csak akkor értékelődik ki, ha a bal oldal igaz, a vagy jobb oldala pedig akkor, ha a bal oldal hamis. Ez nem a példák megkerülésére való trükk, hanem a szabály része.
Ne zsúfolj minden feltételt egy hosszú sorba. Egy jól elnevezett köztes logikai változó segíthet kimondani, mit vizsgálsz. Ha az üzleti mondatban szerepel egy kivétel, azt is külön teszteld. A pozitív példa önmagában nem bizonyítja, hogy a kivétel működik, és a teljes elutasítás sem árulja el, melyik feltétel volt hibás.
1. feladat: csomagolási díj
A nem negatív, egész kilogrammban megadott súlyhoz rendelj díjat: nulla és két kilogramm között, a kettőt is beleértve, ötszáz forint; kettő fölött ötig nyolcszáz; öt fölött ezerkétszáz. A nulla itt egy könnyű küldemény egyszerűsített jelölése. Ellenőrizd a két kategóriahatárt és a közvetlenül utánuk következő értékeket.
Megoldás
fn dij(suly_kg: u32) -> u32 {
if suly_kg <= 2 { 500 }
else if suly_kg <= 5 { 800 }
else { 1200 }
}
fn main() {
assert_eq!(dij(0), 500);
assert_eq!(dij(2), 500);
assert_eq!(dij(3), 800);
assert_eq!(dij(5), 800);
assert_eq!(dij(6), 1200);
}
A második ágban nem kell újra ellenőrizni, hogy a súly nagyobb kettőnél: ha oda jutottunk, az első feltétel már hamis volt. Ezt az ágsorrend biztosítja.
2. feladat: foglalás túlcsorduló összeadás nélkül
Döntsd el, belefér-e egy új csoport a megadott kapacitásba. Ha a meglévő foglalás már hibás, vagyis nagyobb a kapacitásnál, az eredmény legyen hamis. Előbb ezt ellenőrizd, majd a szabad helyből indulj ki. Így nem szükséges két tetszőlegesen nagy darabszámot összeadni, és hibás meglévő állapot mellett sem vonunk ki nagyobbat kisebből.
Megoldás
fn belefer(kapacitas: u32, foglalt: u32, uj: u32) -> bool {
foglalt <= kapacitas && uj <= kapacitas - foglalt
}
fn main() {
assert!(belefer(10, 7, 3));
assert!(!belefer(10, 7, 4));
assert!(!belefer(10, 11, 0));
assert!(belefer(0, 0, 0));
assert!(!belefer(u32::MAX, 1, u32::MAX));
}
A rövidzár miatt hibás meglévő foglalásnál a kivonásig sem jutunk el. A legnagyobb egész számot használó próba a megválasztott számítási sorrend előnyét is megmutatja.
3. feladat: kedvezmény egy kivétellel
Kedvezmény jár, ha valaki diák vagy hatvanöt évesnél idősebb, de kiemelt rendezvényen senkinek sem jár. A pontosan hatvanöt éves, nem diák látogató még nem jogosult ebben a szándékosan választott szabályban. A zárójel tegye láthatóvá, hogy a rendezvény kivétele a diákokra és az idősebbekre egyaránt vonatkozik.
Megoldás
fn kedvezmenyes(eletkor: u32, diak: bool, kiemelt: bool) -> bool {
(diak || eletkor > 65) && !kiemelt
}
fn main() {
assert!(kedvezmenyes(20, true, false));
assert!(kedvezmenyes(66, false, false));
assert!(!kedvezmenyes(65, false, false));
assert!(!kedvezmenyes(20, true, true));
assert!(!kedvezmenyes(66, false, true));
}
Az életkorra választott határ feladatbeli szabály, nem valós jegyvásárlási előírás. A tesztek éppen ezt a kimondott szabályt teszik megismételhetővé.
Elfogadási feltételek
- A díjszámítás a két kilogrammos és öt kilogrammos határt az olcsóbb kategóriában kezeli.
- A foglalási döntés hibás meglévő darabszámnál hamis, pontosan elegendő helynél igaz, túlcsorduló összeadás nélkül.
- A kedvezmény kivétele mindkét jogosultsági csoportra érvényes; a hatvanöt éves határ külön ellenőrzött.
Továbblépés
A döntési szabályok után a ciklusok és akkumulátorok segítségével ugyanazt a szabályt több adatra alkalmazod. Ott is fontos marad a határ: melyik elem kerüljön még a feldolgozásba, és mikor álljon meg az ismétlés?