Shanraq.org Shanraq.org
Әрекеттерді қайталау
IT

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

Әрекеттерді қайталау

Сабақ 13. Әрекетті артық не кем қайталамай, қайталанудың аяқталуын қамтамасыз ету.

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

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

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

Осыған дейін бағдарлама жеткен әр жол бір рет орындалатын. Қайталау құрылымы (loop) блокты бірнеше рет орындайды. Оның бір орындалуы бір айналым (iteration) деп аталады. Күнтізбедегі күнделікті белгіні елестетіңіз: ереже біреу, күндер ауысады. Бірақ күнтізбенің соңғы беті бар, ал тоқтау шарты жоқ бағдарлама шексіз жұмыс істеуі мүмкін.

Үш күнге күніне он минуттан жоспар құрайық. Бағдарлама үш күн күтпейді, берілген сандарды ғана есептейді. 9-сабақтағы mut пен 12-сабақтағы шарттарды еске түсіріңіз.

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

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

Іске қоспас бұрын жаңа жазылымды оқыңыз. for day in 1..=3 1-ден 3-ке дейінгі сандарды екі шетімен қоса кезекпен алады. for қайталауды бастайды, day — кезектегі санның атауы, in дерек қайдан алынатынын көрсетеді, ..= оң жақ шекті де қосады. Күнтізбедегі үш ұяшықты саусақпен кезек басқандай елестетіңіз; бағдарлама шын күндерді күтпейді. { ... } блогының әр орындалуы — бір айналым.

fn main() {
    let mut total_minutes: u32 = 0;
    for day in 1..=3 {
        println!("Күн: {day}");
        total_minutes = total_minutes + 10;
    }
    println!("Барлық минут: {total_minutes}");
}
Күн: 1
Күн: 2
Күн: 3
Барлық минут: 30

Талдау

for мәндерді кезекпен алып қайталайды, ал in сол мәндердің қайдан алынатынын көрсетеді. Аралық (range) шекаралар арқылы беріледі. 1..=3 ішінде 1, 2, 3 бар; 1..3 ішінде тек 1 мен 2 бар. ..= ішіндегі = оң жақ шекараны қосады; бұл жерде ол мән беру емес. Өсу ретімен берілетін осы бүтін сан аралықтарында 3..3 пен 3..1 бос: кері санау осылай жазылмайды.

day — ағымдағы күннің мәні; ол тек қайталау блогында қолжетімді. Оны қолмен өсіру қажет емес. total_minutesжинақтауыш, яғни әр айналымның нәтижесін қосып отыратын айнымалы. Оны блоктың алдында жариялаймыз; ішіне қойсақ, әр жолы нөлден басталар еді. total_minutes = total_minutes + 10 бұрынғы мәнді оқып, оған 10 қосады да, жаңасын сақтайды. Үш айналымнан кейінгі мәндер: 10, 20, 30. Блоктан тыс println! бір-ақ рет орындалады.

while және loop қашан керек?

while шарт ақиқат болғанша қайталайды: шарт әр айналымның алдында тексеріледі. Басында жалған болса, блок бір рет те орындалмайды. loop шартсыз қайталайды. break ең жақын қайталау құрылымынан бірден шығады; continue ағымдағы айналымның қалған әрекеттерін өткізіп, келесі айналымға өтеді. while шартты қайта тексереді, ал for келесі мәнді алады.

Келесі мысал — бөлек бағдарлама. src/main.rs мазмұнын уақытша толық ауыстырыңыз, екінші main қоспаңыз.

fn main() {
    let mut remaining: u32 = 3;
    while remaining > 0 {
        println!("Қалғаны: {remaining}");
        remaining = remaining - 1;
    }
    let mut attempt: u32 = 0;
    loop {
        attempt = attempt + 1;
        if attempt == 2 {
            continue;
        }
        println!("Әрекет: {attempt}");
        if attempt == 3 {
            break;
        }
    }
}
Қалғаны: 3
Қалғаны: 2
Қалғаны: 1
Әрекет: 1
Әрекет: 3

while ішінде remaining нөлге дейін кемиді; дәл осы өзгеріс шартты жалған етеді. loop ішіндегі attempt — әрекет нөмірі. Ол ықтимал continue нұсқауына дейін өседі: екінші айналым басылмайды, үшіншісі break арқылы аяқталады. Осындай белгілі тізбекке for ыңғайлырақ; мұнда loop қайталануды басқаруды көрсету үшін берілді.

Шексіз қайталанудан сақтану

remaining мәнін кемітуді алып тастасаңыз, while аяқталмайды. attempt мәнін өсіруді continue жолынан кейін қойсаңыз, бір мәнде тұрып қалуы мүмкін. Іске қоспай тұрып, қай әрекет шығуға жақындататынын табыңыз. Байқаусыз шексіз басып шығаруды бастасаңыз, терминалда Ctrl+C басыңыз: ол бағдарламаны тоқтатады, бірақ кодты түзетпейді.

Шекарадан бір санға қателесу жиі кездеседі: 1..3 үш емес, екі айналым береді. Кодты өзгертпес бұрын бірінші және соңғы мәнді қағазға жазып көріңіз.

Тірек сызба

Бастапқы күй → кезекті мән не шарт → блок → өзгеріс → аяқталу.

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

  1. 0..3 пен 0..=3 неше айналым береді?
  2. break пен continue айырмасы қандай?
  3. Жинақтауышты блоктың ішінде жарияласаңыз не болады?

Тексеру: 3 және 4; қайталаудан шығу және келесі айналымға өту; жинақтауыш әр жолы қайта жасалып, жалпы нәтиже сақталмайды.

Тапсырма

Міндетті. 1–5 күндерге күніне 15 минуттан жоспар құрыңыз. 3-күнді continue арқылы өткізіңіз. Тек 1, 2, 4, 5 күндері және «Барлық минут: 60» жолы шықсын. Жинақтаудың орнына дайын санды баспаңыз.

Шекараны тексеріңіз. Уақытша 1..1 жазыңыз: ешбір күн шықпауы, қорытынды 0 болуы керек. Кейін 1..=5 қалпына келтіріңіз. Күнді тексеру неліктен басып шығару мен қосудан бұрын тұруы керек?

Көмек

Минут жинақтауышын for алдында жариялаңыз. Блокта алдымен day == 3 шартын тексеріңіз. Үлгі жауап өткізіліп кеткен күнді есепке қоспайды.

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

fn main() {
    let mut total_minutes: u32 = 0;
    for day in 1..=5 {
        if day == 3 {
            continue;
        }
        println!("Күн: {day}");
        total_minutes = total_minutes + 15;
    }
    println!("Барлық минут: {total_minutes}");
}
Күн: 1
Күн: 2
Күн: 4
Күн: 5
Барлық минут: 60

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

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

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

Пікірлер (0)

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