Cél és előfeltétel
Az első útvonal végén egy kis hőmérsékletnaplót készítesz. A program egész Celsius fokban megadott mérésekből készít összefoglalást. Nem kapcsolódik érzékelőhöz, nem olvas fájlt, és nem rajzol grafikont: az adatok rögzített tömbből érkeznek. Ez a szűk keret segít abban, hogy a számítás helyességére figyelj, mielőtt külső bemenetet kapcsolnál hozzá.
Szükséged lesz a tömbök és indexelés, illetve a függvények leckére. A megoldások edition 2024 főprogramok, külön futtathatók. A korábbi leckék kis műveletei most összekapcsolódnak, de továbbra is érdemes egyenként ellenőrizni őket. Ne próbáld az összes eredményt egyetlen hosszú ciklustörzsben elsőre kitalálni.
Előbb írd le a napló szerződését
Pontosan öt nap mérését fogadjuk, mindegyik mínusz ötven és ötven egész fok közé esik. A rögzített hossz miatt most nincs üres bemenet; a jövőbeli, változó hosszú változatnak ezt külön kellene kezelnie. A kis tartomány miatt az összeg i32 típusba biztosan belefér. A megadott kód tehát nem tetszőleges hosszú vagy korlátlan értékű méréssorozat általános statisztikai könyvtára.
Fagyosnak a nulla fok alatti napot tekintjük, a pontosan nulla nem számít annak. A minimum és maximum valamelyik valódi mérés legyen. Az átlagot egész fokként adjuk vissza, nullához közelítő egész osztással. Ez az egyszerűsítés elveszíti a tört részt, ezért a kimenetet ne nevezd pontos mérési átlagnak. A kerekítési szabályt külön negatív összeggel is megvizsgáljuk.
Kezdőérték valódi adatból
A minimumot nem érdemes önkényesen nulláról indítani. Ha minden nap meleg volt, a nulla olyan minimum lenne, amely a naplóban nem is szerepelt. A maximum hasonlóan hibás lehet csupa negatív mérésnél. Mivel pontosan öt értéket fogadunk, az első elemet biztonságosan használhatjuk mindkét kezdőértéknek, majd a többi értékkel összehasonlítjuk.
Az összeg és a darabszám másféle akkumulátor: ezek a feldolgozás előtt nulláról indulnak. Nem létezik egyetlen, minden változóhoz megfelelő kezdőérték. A változó jelentése dönti el, honnan indulunk. Ezért jó gyakorlat minden akkumulátor mellé kimondani: melyik már feldolgozott adatról milyen igaz állítást őriz?
Kis eredményekből teljes összefoglalás
Az első két feladat külön vizsgál egy szabályt, a harmadik összerakja az összefoglalást. A kis példák nem felesleges ismétlések: könnyebb velük megmondani, hogy az előjel, a küszöb vagy az összekapcsolás hibás. Ha a teljes eredmény rossz, de az egyszerű számlálás és átlagolás már ellenőrzött, kisebb területen kell keresned.
A végső függvény több adatot egy zárójeles pár helyett hármasban ad vissza. Ez most áttekinthető, mert a három pozíció jelentése végig ugyanaz. Nagyobb modellben névvel ellátott mezőket használó struct lenne jobb; ezt a következő kezdő útvonalon sajátítod el. A miniprojekt szándékosan a már látott eszközökből épül, nem titkos előfeltételekkel oldja meg a feladatot.
1. feladat: a fagyos napok száma
Írj függvényt, amely öt mérésből megszámolja a nulla alatti értékeket. Először vegyes, majd csupa nullás naplót vizsgálj. A nulla szándékosan szerepel a példában: döntsd el a leírt szerződés alapján, melyik ágba tartozik. A bemenetet a függvény megkapja, az eredményt visszaadja; ne a képernyőre írt sorból próbálj következtetni.
Megoldás
fn fagyos_napok(meresek: [i32; 5]) -> u32 {
let mut darab = 0;
for meres in meresek {
if meres < 0 { darab += 1; }
}
darab
}
fn main() {
assert_eq!(fagyos_napok([-2, 0, 5, -1, 3]), 2);
assert_eq!(fagyos_napok([0; 5]), 0);
assert_eq!(fagyos_napok([-1; 5]), 5);
}
A csupa negatív próba az ötös felső eredményt is ellenőrzi. A visszaadott darabszám nem keveredik össze a hőmérsékletek összegével.
2. feladat: dokumentált egész átlag
Számold ki öt mérés összegét, majd oszd öttel. Válassz olyan pozitív és negatív bemenetet is, amelynek az összege nem osztható öttel. Így láthatóvá válik a tört rész elhagyása. A feladat eredménye szándékosan egész fok, nem lebegőpontos megközelítés és nem lefelé kerekített negatív átlag.
Megoldás
fn egesz_atlag(meresek: [i32; 5]) -> i32 {
let mut osszeg = 0;
for meres in meresek { osszeg += meres; }
osszeg / 5
}
fn main() {
assert_eq!(egesz_atlag([1, 2, 3, 4, 5]), 3);
assert_eq!(egesz_atlag([1, 1, 1, 1, 2]), 1);
assert_eq!(egesz_atlag([-1, -1, -1, -1, -2]), -1);
assert_eq!(egesz_atlag([0; 5]), 0);
}
A mínusz hat ötöde egész osztással mínusz egy. Ha lefelé kerekítést írtál volna elő, más eredmény és más művelet kellene; a megnevezett szabály ezért lényeges.
3. feladat: minimum, maximum és összeg
Készíts összefoglaló függvényt, amely ebben a sorrendben a minimumot, maximumot és összeget adja vissza. Ellenőrizd vegyes, csupa pozitív és csupa negatív adatokon. A két szélsőértéket az első mérésből indítsd, így egy kitalált nulla nem kerülhet az eredménybe. A tömb rögzített hossza garantálja, hogy az első elem létezik.
Megoldás
fn osszegzes(meresek: [i32; 5]) -> (i32, i32, i32) {
let mut minimum = meresek[0];
let mut maximum = meresek[0];
let mut osszeg = 0;
for meres in meresek {
if meres < minimum { minimum = meres; }
if meres > maximum { maximum = meres; }
osszeg += meres;
}
(minimum, maximum, osszeg)
}
fn main() {
assert_eq!(osszegzes([-2, 0, 5, -1, 3]), (-2, 5, 5));
assert_eq!(osszegzes([2, 4, 3, 6, 5]), (2, 6, 20));
assert_eq!(osszegzes([-2, -4, -3, -6, -5]), (-6, -2, -20));
}
Az utolsó két próba pontosan a rossz nullás kezdőértéket leplezné le. Vegyes bemenet önmagában ezt a hibát elfedhetné.
Elfogadási feltételek
- A nulla fok nem fagyos nap; a három számlálási példa eredménye kettő, nulla és öt.
- Az egész átlag negatív esetben is a dokumentált, nullához közelítő osztást követi.
- A minimum és maximum minden tesztben valódi mérés, az összegek pedig 5, 20 és mínusz 20.
Továbblépés
A programozási alapokat már egy közös feladatban használtad. Az értékmásolás és move leckében azt vizsgálod, mi kerül át egy függvényhez, és miért viselkedik másként egy egész szám és egy saját szöveget tároló érték.