Shanraq.org Shanraq.org
Жиымдар
IT

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

Жиымдар

Сабақ 15. Ұзындығы бекітілген мәндер жиынын өңдеп, шекараны тексеру.

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

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

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

Бұған дейін әр тапсырмаға жеке айнымалы қолдандық. Жиым (array) — бір түрдегі элементтердің ұзындығы құрастыру кезінде белгілі реттелген тізбегі. Бірдей мәндер қайталана алады. Үш ұяшығы бар науаны елестетіңіз. Ішіндегісін ауыстыруға болады, бірақ сол жиымға төртінші ұяшық қоса алмайсыз. Барлық элементтің түрі бірдей болуы керек; мағыналары ұқсас болғанымен, әртүрлі деректер түрлері өздігінен біріге алмайды.

Үш тапсырманың ұзақтығын сақтап, жалпы уақытын есептейміз. 13-сабақтағы қайталауды қолданамыз. Бұл — әзірге сандарға негізделген есеп; атауы мен күйі бар толық тапсырма құрылымдар тақырыбында пайда болады.

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

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

Бірінші мысалға дейін жақшаларды талдаңыз. [u32; 3] түріндегі тік жақшалар жиымды сипаттайды: u32 түріндегі үш элемент; ішкі ; түрді ұзындықтан бөледі. [10, 20, 15] мәнінде үтірлер элементтерді бөледі. minutes[0] бірінші элементті алады, себебі орын нөмірі нөлден басталады. minutes.len() нүкте арқылы len әдісін шақырып, элемент санын береді. Үш ұяшығы бар науаны елестетіңіз: орындары 0, 1, 2 деп белгіленеді, ал ұяшық саны — 3.

fn main() {
    let minutes: [u32; 3] = [10, 20, 15];
    println!("Біріншісі: {}", minutes[0]);
    println!("Саны: {}", minutes.len());
    let mut total: u32 = 0;
    for value in minutes {
        total = total + value;
    }
    println!("Барлық минут: {total}");
}
Біріншісі: 10
Саны: 3
Барлық минут: 45

Талдау

[u32; 3] түрінде u32 элементтің деректер түрін, ал 3 элемент санын білдіреді. Тік жақшалар жиым сипаттамасын қоршайды; ішіндегі нүктелі үтір нұсқауды аяқтамай, түр мен ұзындықты ажыратады. [10, 20, 15] жиым мәнін жасайды: сандар үтірмен бөлінеді. Ұзындық түрдің құрамына кіреді, сондықтан [u32; 3] пен [u32; 4] — әртүрлі түрлер.

Индекс (index) — нөлден басталатын орын нөмірі. minutes[0] — бірінші элемент; екіншісі — minutes[1], үшіншісі — minutes[2]. Күнделікті тілдегі реттік нөмірді кодтағы индекспен шатастырмаңыз. Ұзындығы 3 жиымда индексі 3 болатын элемент жоқ.

minutes.len() ұзындықты береді. Мұнда алғаш рет әдісті шақыру (method call) кездеседі: нүкте len әрекетін minutes мәнімен байланыстырады, ал дөңгелек жақшалар оны қосымша аргументсіз шақырады. Өз әдістерімізді қазір жазбаймыз; оларды 28-сабақта қарастырамыз. len нәтижесі — usize, өлшемдер мен индекстерге арналған, платформаға тәуелді таңбасыз бүтін сан түрі. Мысалы, let index: usize = 1; индекстің түрін ашық береді. Ол u32 түріндегі минут санымен бірдей ұғым емес; оларды негізсіз қоспаңыз.

for value in minutes жиым мәндерін ретімен алады. value — индекс емес, кезекті сан. Сондықтан мұнда 0..minutes.len() орнына мәндерді тікелей аралаған ыңғайлы. Осы мысалдағы u32 сандары мен олардан тұратын жиым мән ретінде көшіріледі. Бұл мәтін жолдарының иелену ережесін түсіндірмейді; оны 18–22-сабақтарда өтеміз.

Өзгерту және шекараны тексеру

let mut элементтерді өзгертуге мүмкіндік береді, бірақ жиымның ұзындығын өзгертпейді. Келесі бөлек бағдарлама екінші элементті ауыстырып, сұралған индексті элементке жүгінуден бұрын тексереді:

fn print_at(minutes: [u32; 3], index: usize) {
    if index < minutes.len() {
        println!("{}", minutes[index]);
    } else {
        println!("Мұндай орын жоқ");
    }
}

fn main() {
    let mut minutes: [u32; 3] = [10, 20, 15];
    minutes[1] = 25;
    print_at(minutes, 3);
}
Мұндай орын жоқ

print_at — 14-сабақтағыдай жай функция. Оның бірінші параметрі — толық [u32; 3] жиымы, екіншісі — usize индексі. print_at(minutes, 3) шақыруы оларды ретімен береді; функция () қайтарып, индексті өзі тексереді. Кейін сырттан алынған индексті тексеруге болады, әзірге аргумент кодта берілген.

index = 3 болса, элемент оқылмайды. Индексті 1-ге ауыстырсаңыз, 25 шығады. Шарт қатаң: index < minutes.len(), <= емес. Бос жиымда жарамды индекс мүлде жоқ. Алдымен minutes[index] есептеп, кейін шекараны тексеруге болмайды: кеш болады.

Шекарадан тыс элементке жүгіну дүрбелеңге (panic) әкеледі: бағдарлама қалыпты орындалуын тоқтатып, қате туралы хабарлайды. Жарамсыз индекс құрастыру кезінде анық көрінсе, компилятор кодты алдын ала қабылдамауы да мүмкін. Rust көрші жадты жай оқуға рұқсат бермейді. Дегенмен күтпеген тоқтау пайдаланушыға қолайсыз, сондықтан алдымен индексті тексереміз. Шекарадан шықпай элемент алудың ыңғайлы тәсілін 31-сабақта үйренеміз.

Бірдей элементтерді қысқа жазуға болады: let minutes: [u32; 3] = [0; 3]; үш нөл жасайды. Мәндегі [0; 3] жазуының сол жағы — бастапқы мән, оң жағы — саны. Түрдегі [u32; 3] жазуының сол жағы — деректер түрі. Ұқсас белгілер екі түрлі міндет атқарады.

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

Үш элемент көрсетілуі тиіс, бірақ екеуі ғана берілген. Әдейі қате мысал E0308 хабарын шығарады:

fn main() {
    let minutes: [u32; 3] = [10, 20];
    println!("{}", minutes.len());
}

Есептің талабына қарай ұзындықты не ішіндегі мәндерді түзетіңіз. Пайдаланушы тапсырманы шектеусіз қоса алуы керек болса, ұзындығы бекітілген жиым жарамайды. Өсе алатын тізімді 24-сабақта үйренеміз.

Тірек сызба

Бір түр мен ұзындық → мәндер → аралау → функциямен іріктеу → нәтижені жинақтау.

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

  1. Ұзындығы 4 жиымның соңғы индексі қандай?
  2. mut ұзындықты өзгерте ме?
  3. for value in minutes ішіндегі мәннің индекстен айырмасы қандай?

Тексеру: 3; жоқ; value — ұзақтық, индекс — орын нөмірі. Өз шешіміңіздегі іріктеуді, қайталауды және функция шақыруын түсіндіре алсаңыз, келесі топтамаға дайынсыз. 16-сабақта есептеуді автоматты тесттермен тексереміз.

Тапсырма

Міндетті. [u32; 4] түріндегі [0, 10, 25, 15] мәндерін алыңыз. 14-сабақтағы is_short қолданыңыз: ұзақтығы 1–15 минут болатын тапсырма қысқа саналады. for арқылы қысқа тапсырмалар санын және олардың жалпы ұзақтығын есептеңіз. Нәтиже: «Қысқа тапсырмалар: 2» және «Барлық минут: 25».

Өз деректеріңізбен тексеріңіз. [0, 16, 25, 30] үшін 0 және 0, [1, 15, 2, 3] үшін 4 және 21 шығады. Ережеміз бойынша нөл минуттық мән тапсырма ретінде саналмайды. Формулаларды емес, тек деректерді өзгертіңіз.

Көмек

Қайталау алдында екі жинақтауыш жариялаңыз. if is_short(value) ішінде санын 1-ге, ал уақыт қосындысын value мәніне арттырыңыз. Алдыңғы сабақтағы функция main сыртында қалады.

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

fn is_short(minutes: u32) -> bool {
    minutes > 0 && minutes <= 15
}

fn main() {
    let minutes: [u32; 4] = [0, 10, 25, 15];
    let mut count: u32 = 0;
    let mut total: u32 = 0;
    for value in minutes {
        if is_short(value) {
            count = count + 1;
            total = total + value;
        }
    }
    println!("Қысқа тапсырмалар: {count}");
    println!("Барлық минут: {total}");
}
Қысқа тапсырмалар: 2
Барлық минут: 25

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

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

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

Пікірлер (0)

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