Cél és előfeltétel

Öt napi mérés öt külön változóként hamar kényelmetlenné válik. A tömb egyetlen név alatt, meghatározott sorrendben tárol azonos típusú elemeket. Ebben a leckében a tárolás és a hozzáférés kapcsolatát vizsgálod: mit jelent egy elem sorszáma, mi történik hibás hely megadásakor, és mikor lehet teljesen elkerülni az indexek kézi kezelését.

Előfeltétel a ciklusok és akkumulátorok leckéje. A példák önálló edition 2024 programok. A tömbökben kis egész számok szerepelnek, hogy a figyelmedet a hozzáférés és a sorrend köthesse le. Mielőtt futtatsz, írd a tömb elemei alá az indexeket; ez a rövid rajz sok későbbi tévedést megelőz.

A hossz a típus része

A rögzített tömb típusában az elem típusa és az elemek száma is szerepel. Egy három egészből álló tömb és egy négy egészből álló tömb különböző típus. A hosszt nem tudod futás közben egyszerűen növelni. Ez jól illik az előre ismert számú napi méréshez, de nem feltétlenül egy tetszőleges hosszú bevásárlólistához; arra később más gyűjteményt választunk.

A tömb létrehozása nem rendez vagy válogat semmit: az elemek az általad megadott sorrendben kerülnek bele. Ismételt kezdőértéket is megadhatsz, például négy nullát. Azonos típusú adatok tárolása nem garantálja az adatok tartalmi helyességét. Öt hőmérsékleti érték lehet mind érvényes egész szám, miközben rossz naphoz rendelted őket.

Az első hely indexe nulla

Három elemhez a nulla, egy és kettő index tartozik. A hossz tehát nem az utolsó érvényes index, hanem az elemek száma. Az eléréshez használt index típusa usize, amelyet a fordító a környezetből gyakran ki tud következtetni. Ha a tömb hosszával egyező indexet kérsz, már a tömb után jársz, nem az utolsó eleménél.

Közvetlen indexelésnél a nem létező hely elérése pánikot okoz; egy nyilvánvalóan hibás, állandó indexet a fordító már előbb is jelezhet. A get ehelyett opcionális eredményt ad: létező helynél Some, máskor None érkezik. Itt először találkozunk ezzel a típussal. Most annyit használunk belőle, hogy a hiány is szabályosan visszaadott eredmény, nem kitalált szám.

Keresés helyett néha egyszerű bejárás kell

Ha minden érték összegére vagy darabszámára vagy kíváncsi, ne feltétlenül írj külön számlálót az indexhez. A tömb referenciájának bejárása közvetlenül hozzáférést ad az elemekhez. A kölcsönzés részletes szabályait a következő útvonal tanítja; ebben a leckében azt figyeld meg, hogy a tömb a bejárás után is rendelkezésre áll.

Amikor egy adott hely átírása a feladat, egyetlen módosítható tömb elég. A mut a kötésben engedi meg az elem módosítását is. Ne keverd ezt az új tömb készítésével: az eredeti név alatt tárolt adatok változnak. A jó ellenőrzés a célzott elem mellett egy szomszédos elemet is megvizsgál, hogy ne csak bármilyen változás történjen, hanem a megfelelő helyen.

1. feladat: az első és az utolsó mérés

Hozz létre három mérésből álló tömböt: tizenkettő, tizenöt és kilenc. Közvetlen indexeléssel olvasd ki az első és utolsó elemet. A hosszt is ellenőrizd, majd a get segítségével vizsgáld meg a harmadik indexet. Ne adj hozzá új elemet, és ne próbáld hibás közvetlen indexeléssel megállítani a programot.

Megoldás
fn main() {
    let meresek: [i32; 3] = [12, 15, 9];
    assert_eq!(meresek[0], 12);
    assert_eq!(meresek[2], 9);
    assert_eq!(meresek.len(), 3);
    assert_eq!(meresek.get(1), Some(&15));
    assert_eq!(meresek.get(3), None);
}

A második elem referenciája a tizenötös értékre mutat. A Some és None összehasonlítása a létező és a nem létező helyet egyaránt ellenőrzi, pánik nélkül.

2. feladat: javítás egyetlen helyen

Egy négy naphoz tartozó darabszámtömb minden értéke kezdetben nulla. A harmadik napra írj hetet, majd ellenőrizd az egész tömböt. Külön állítás is igazolja, hogy az első nap megmaradt nullának. A nap emberi sorszáma és a program indexe közötti eltérést a megoldás előtt mondd ki magadnak.

Megoldás
fn main() {
    let mut darabok: [u32; 4] = [0; 4];
    darabok[2] = 7;
    assert_eq!(darabok, [0, 0, 7, 0]);
    assert_eq!(darabok[0], 0);
    assert_eq!(darabok.len(), 4);
}

A harmadik naphoz a kettes index tartozik. A teljes tömb összehasonlítása a másik három hely változatlanságát is vizsgálja, így egy rosszul megválasztott index nem marad észrevétlen.

3. feladat: összegzés kézi index nélkül

A négy bejövő érték összege mellett számold meg a negatív értékeket. A két eredmény két külön akkumulátort igényel. A bejárás ne egy kézzel növelt indexre épüljön. A végén a tömböt is hasonlítsd össze az eredeti tartalmával, mert ez a művelet csak olvas, nem javítja át a méréseket.

Megoldás
fn main() {
    let meresek = [-2, 0, 5, -1];
    let mut osszeg = 0;
    let mut negativ = 0;
    for &meres in &meresek {
        osszeg += meres;
        if meres < 0 { negativ += 1; }
    }
    assert_eq!(osszeg, 2);
    assert_eq!(negativ, 2);
    assert_eq!(meresek, [-2, 0, 5, -1]);
}

A bejárásban használt minta az egész értéket veszi ki az adott referenciából másolással. Ez itt kicsi egész számoknál működik; nem általános recept minden saját típus másolására.

Elfogadási feltételek

  • A háromelemű tömb utolsó érvényes indexe kettő; a harmadik index get eredménye None.
  • A módosítás kizárólag a harmadik napot érinti, és a tömb hossza négy marad.
  • Az összeg kettő, a negatív elemek száma kettő, az eredeti tömb tartalma változatlan.

Továbblépés

A hőmérsékletnapló miniprojektben a tömböt, ciklust, függvényt és feltételt egy kis, teljes számításban kapcsolod össze. Ott már nemcsak egyetlen elemet keresel, hanem összefoglalást készítesz a teljes sorozatról.