Shanraq.org Shanraq.org
Логикалық мәндер
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 11-сабақ (барлығы 20)

Логикалық мәндер

Сабақ 11. Тапсырманы іріктеу шартын жазып, тексеру.

Мәтін ИИ көмегімен аударылды.

Алдын ала: 1–10 сабақтар. Айнымалы түсініксіз болса, 9-сабаққа оралыңыз.

Бұл не үшін керек?

10-сабақта тапсырмаларды санадық. Енді қай тапсырманы көрсету керегін анықтаймыз: іс аяқталмаған әрі маңызды немесе қысқа болуы керек. Логикалық мән (boolean) екі жауаптың бірін білдіреді: true — ақиқат, false — жалған. Бұл мәндердің деректер түрі — bool.

Екі күйі бар қосқышты елестетіңіз. Алайда false «тапсырма жаман» немесе «дерек жоқ» деген сөз емес: ол нақты сұраққа берілген теріс жауап қана. Әзірге деректерді кодта өзіміз белгілейміз, терминалдан оқымаймыз.

Мысалды іске қосу

6-сабақта жасалған organizer жобасында, Cargo.toml орналасқан бумада жұмыс істейміз. Бұрынғы жұмысыңызды бөлек сақтаңыз. src/main.rs файлының барлық мазмұнын төмендегі алғашқы мысалмен ауыстырып, сақтаңыз. Осы буманың терминалында cargo run орындаңыз. 6-сабақта түсіндірілгендей, бұл пәрмен бағдарламаны құрастырып, іске қосады. Басқа файлдар өзгермейді, сыртқы кітапханалар қосылмайды. Кейінгі әр толық мысал да файлды тұтас ауыстырады. Нәтиже блогында Cargo хабарлары емес, тек бағдарламаның шығарғаны берілген. Алдымен нәтижені болжаңыз, содан кейін іске қосыңыз.

Кодқа дейін жаңа таңбаларды түсінейік. >=, <= және != салыстырулары «кем емес», «артық емес» және «тең емес» деген сұрақтарға жауап береді; нәтиже түрі — bool. !done жауапты керісінше өзгертеді. && екі шарттың да ақиқат болуын, || кемінде біреуінің ақиқат болуын талап етеді. Жақшалар арифметикадағыдай шарттың бір бөлігін біріктіреді. slots != 0 && tasks / slots <= 2 жазуында алдымен бөлгіштің нөл еместігі тексеріледі: сол жағы false болса, оң жағы есептелмейді. Бұл — жазылу ретінің ережесі; компилятор қауіпті бөлуді өзі іздеп қорғамайды.

fn main() {
    let done: bool = false;
    let priority: u8 = 3;
    let minutes: u32 = 20;
    let show = !done && (priority >= 3 || minutes <= 15);
    println!("Көрсету: {show}");
    let slots: u32 = 0;
    let tasks: u32 = 6;
    let fits = slots != 0 && tasks / slots <= 2;
    println!("Сияды: {fits}");
}
Көрсету: true
Сияды: false

Талдау

done — аяқталғаны, priority — маңыздылығы, minutes — ұзақтығы, show — көрсету керегі. Осы мысалда маңыздылығы 3 не одан жоғары тапсырманы маңызды деп аламыз. let done: bool = false; түрді ашық көрсетеді; ал show түрін компилятор өрнектен анықтайды.

Жазылуы Қоятын сұрағы
a == b Мәндер тең бе?
a != b Мәндер әртүрлі ме?
a < b, a <= b Кіші ме? Кіші не тең бе?
a > b, a >= b Үлкен бе? Үлкен не тең бе?

= мән береді, ал == салыстырады. Салыстырудың нәтижесі — bool. Логикалық мән алдындағы ! жауапты кері өзгертеді: !false нәтижесі — true. Бұл белгі мұнда println! макросының атауындағы леп белгісінен басқа қызмет атқарады.

&& — «және»: екі шарт та ақиқат болуы керек. || — «немесе»: кемінде бір шарт ақиқат болса жеткілікті, екеуі де ақиқат болуы да жарайды. Кодта екі | белгісі арасына бос орын қойылмай жазылады. Алдымен !done, содан кейін жақшадағы топ қаралады. Амалдардың басымдығы: !, салыстырулар, &&, одан кейін ||. Жақша ойды анық көрсетеді. && орнына жалғыз & жазбаңыз: оның мағынасы басқа.

a b a && b a || b
false false false false
false true false true
true false false true
true true true true

Қажетсіз есепті орындамау

Қысқа тұйықталу (short-circuit evaluation) кезінде оң жақ тек қажет болса есептеледі. && сол жағында false болса, оң жағына өтпейді; || сол жағында true болса да, оң жағын өткізіп кетеді. Рұқсат қағазы жоқ адамнан бөлме нөмірін сұрамаған сияқты. Бірақ Rust қауіптің қайда екенін өзі болжамайды: жазылған ретті солдан оңға қарай орындайды.

slots — бос орындар саны, tasks — тапсырмалар саны, fits — тексеру нәтижесі. Орын саны нөл болса, slots != 0 жалған, сондықтан бөлу орындалмайды. Екі бөліктің орнын ауыстырсаңыз, бағдарлама нөлге бөлуге әрекет жасайды. Қорғаныс шарт дұрыс жазылғанда ғана жұмыс істейді.

Жиі кездесетін қате

Сан өздігінен логикалық мәнге айналмайды. Мына бөлек мысал әдейі қате берілген: E0308 деректер түрлерінің сәйкес келмейтінін білдіреді.

fn main() {
    let ready: bool = 1;
    println!("{ready}");
}

Мақсатқа қарай true жазыңыз немесе салыстыру қолданыңыз: мысалы, minutes жарияланған болса, minutes > 0. Қате хабарын кетіру үшін деректер түрін ойланбастан ауыстырмаңыз.

Тірек сызба

Деректер → салыстыру → bool → шарттарды біріктіру → шекараны тексеру.

Түсінгеніңізді тексеріңіз

  1. = пен == айырмасы қандай?
  2. false || true және !true нәтижелерін болжаңыз.
  3. slots = 0 болса, бөлу орындала ма?

Тексеру: мән беру және салыстыру; true және false; && сол жағы жалған болғандықтан бөлу өткізілмейді.

Тапсырма

Міндетті. Тапсырма аяқталмаған, мұрағатқа жіберілмеген және ұзақтығы 15 минуттан аспаған жағдайда ғана көрсетілсін. done = false, archived = false, minutes: u32 = 15 мәндерін жариялаңыз. Нәтиже: «Көрсету: true». Әрқайсысын бөлек тексеріңіз: done = true; archived = true; minutes = 16. Үшеуі де жеке-жеке false беруі керек. Әр тексеру алдында қалған мәндерді бастапқысына қайтарыңыз.

Шекараны тексеріңіз. 15 минут жарайды, 16 минут жарамайды. Неліктен < емес, <= қажет?

Көмек

Ережені бөліктерге бөліңіз: терістеу үшін !, барлық шартты бірге талап ету үшін &&. Төмендегі жауап бастапқы деректерге арналған; өзгертілген мәндерді өзіңіз тексеріңіз.

Өз бетіңізше орындағаннан кейінгі үлгі жауап

fn main() {
    let done: bool = false;
    let archived: bool = false;
    let minutes: u32 = 15;
    let show = !done && !archived && minutes <= 15;
    println!("Көрсету: {show}");
}
Көрсету: true

Тексеруге арналған дереккөз

Алдыңғы сабақ · Мазмұны · Келесі сабақ

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.