Shanraq.org Shanraq.org
Тармақталу және өрнектер
IT

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

Тармақталу және өрнектер

Сабақ 12. Қауіпсіз әрекетті таңдап, блоктан мән алу.

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

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

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

11-сабақта true не false жауабын алдық. Тармақталу сол жауапқа қарай бағдарламаның қай бөлігін орындау керегін таңдайды. Жол айрығын елестетіңіз: бір жол жабық болса, басқасына түсесіз. Бірақ компьютер жолды өзі іздемейді, жазылған шарттарды ретімен тексереді.

10-сабақтағы есепке оралайық. Орындалған тапсырмалар жалпы саннан көп болса, оларды u32 түріндегі жалпы саннан азайтуға болмайды. Алдымен деректерді тексеріп, содан кейін ғана тиісті тармақта қалдығын есептейміз.

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

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

Мысалға дейін жаңа жазылымды қараңыз. if түрі bool болатын шартты тексеріп, ол ақиқат болса, келесі { ... } блогын орындайды. else if келесі мүмкіндікті тексереді, ал шарты жоқ else қалған жағдайды алады. Мұндай бір тізбекте ең көбі бір тармақ орындалады. let urgent: bool = if ... { true } else { false }; жолында тізбек мән таңдайды; екі блок та bool беруі керек. Іске қосқан соң егжей-тегжейін талдаймыз.

fn main() {
    let total: u32 = 7;
    let done: u32 = 2;
    if done > total {
        println!("Қате: аяқталғаны жалпы саннан көп");
    } else if done == total {
        println!("Барлық тапсырма аяқталды");
    } else {
        let remaining = total - done;
        println!("Қалғаны: {remaining}");
    }
    let priority: u8 = 3;
    let urgent: bool = if priority >= 3 { true } else { false };
    println!("Шұғыл: {urgent}");
}
Қалғаны: 5
Шұғыл: true

Талдау

if — «егер»: одан кейін bool түріндегі шарт, ал { ... } ішінде әрекеттер блогы жазылады. Шарт жалған болса, else if келесі шартты тексереді. else — «әйтпесе», оның жеке шарты жоқ. Бір тізбекте шартқа сай келген алғашқы тармақ қана орындалады. Одан кейінгі шарттар тексерілмейді.

done = 2 болғанда алғашқы екі шарт та жалған, сондықтан азайту орындалады. done = 7 болса, ортаңғы тармақ; done = 8 болса, бірінші тармақ орындалып, қауіпті азайтуға жол берілмейді. Екі бөлек if мұндай тізбекке тең емес: екеуі де орындалуы мүмкін. Шарттың сыртына дөңгелек жақша қою міндетті емес, ал блоктың ирек жақшалары қажет. 1 саны true орнына жүрмейді.

Өрнектің мәні бар

Өрнек (expression) мән есептейді: total - done, салыстыру, тіпті if те өрнек бола алады. Нұсқау (statement) әрекет орындайды; let арқылы жариялау — соның мысалы. let urgent: bool = if ...; жолында true мен false мәндерінің бірі таңдалады.

Блоктың соңғы өрнегінен кейін ; болмаса, сол өрнек блоктың мәнін береді. Мән алатын тармақтардың түрлері сәйкес болуы керек: біреуі bool, екіншісі сан бола алмайды. Бізде екеуі де bool береді. Ал толық let жариялауының соңындағы нүктелі үтір қажет. Осы қарапайым есепті қысқаша let urgent = priority >= 3; деп те жазуға болады. Ұзын нұсқа if құрылысын көруге арналған.

Соңында мән беретін өрнегі жоқ блок () мәнін береді. Ол бірлік мән (unit) деп аталады, түрі де () деп жазылады. Бұл пайдалы сан не логикалық жауап емес; нөлге де, false мәніне де тең емес. println! мәтінді экранға шығарады, бірақ оны нәтиже ретінде қайтармайды. 14-сабақта бұл ұғым функциямен бірге қайта кездеседі.

Жай блок та мән есептей алады:

fn main() {
    let minutes = {
        let preparation = 5;
        preparation + 10
    };
    println!("{minutes}");
}
15

preparation — дайындық уақыты. Бұл айнымалы тек өзінің ирек жақшаларының ішінде қолжетімді; есептелген сан сырттағы minutes атауына беріледі. 9-сабақтағы көріну аймағы аралық есептеуді нәтижеден осылай ажыратады.

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

Артық нүктелі үтір бірінші тармақтың мәнін жойды. Бөлек берілген осы қате мысал E0308 хабарын шығарады:

fn main() {
    let priority: u8 = 3;
    let urgent: bool = if priority >= 3 { true; } else { false };
    println!("{urgent}");
}

true соңындағы ; белгісін өшіріңіз: екі тармақ та қайтадан bool береді. Толық жариялаудың соңындағы нүктелі үтірді сақтаңыз.

Тірек сызба

Деректерді тексеру → алғашқы сәйкес тармақ → әрекет не мән.

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

  1. Бір тізбектің неше тармағы орындалады?
  2. { 5 + 2 } және { 5 + 2; } не береді?
  3. remaining қай жерде қолжетімді?

Тексеру: біреуден артық емес; 7 және (); тек else блогында. Бірінші салыстыру >= болса, теңдік те жарамсыз дерек болып саналады.

Тапсырма

Міндетті. total = 4, done = 6 үшін тапсырмалар санын тексеріңіз. Тек «Қате: аяқталғаны жалпы саннан көп» жолы шығуы керек. Кейін done = 4 → «Барлық тапсырма аяқталды» және done = 1 → «Қалғаны: 3» жағдайларын тексеріңіз. Айырманы тексеруден бұрын есептемеңіз.

Қосымша. Бірінші шартты done >= total деп өзгертсеңіз, қай жағдай екінші тармаққа жетпей қалады?

Көмек

Алдымен жарамсыз деректерді ажыратыңыз, кейін теңдігін тексеріңіз. Қалған санды тек else ішінде есептеңіз. Үлгі жауапта бағдарлама дұрыс жұмыс істеп, қате бастапқы деректі анықтайды.

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

fn main() {
    let total: u32 = 4;
    let done: u32 = 6;
    if done > total {
        println!("Қате: аяқталғаны жалпы саннан көп");
    } else if done == total {
        println!("Барлық тапсырма аяқталды");
    } else {
        println!("Қалғаны: {}", total - done);
    }
}
Қате: аяқталғаны жалпы саннан көп

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

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

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

Пікірлер (0)

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