From ab690cb2ec98b219c1379c19d18502675285490a Mon Sep 17 00:00:00 2001 From: Bakhtier Gaibulloev Date: Mon, 17 Nov 2025 19:22:41 +0000 Subject: [PATCH 1/2] feat: add comprehensive SomonScript programming book in Tajik language Created a complete programming book in Tajik (Cyrillic script) with 12 chapters: - Chapter 1: Introduction to SomonScript - Chapter 2: Language basics (variables, constants, data types) - Chapter 3: Data types (primitive, special, complex types) - Chapter 4: Operators and expressions - Chapter 5: Control structures (if-else, loops, switch-case) - Chapter 6: Functions (declarations, recursion, higher-order) - Chapter 7: Objects and arrays - Chapter 8: Classes and OOP (inheritance, interfaces, abstract classes) - Chapter 9: Module system (import/export) - Chapter 10: Type system (union, intersection, generics, utility types) - Chapter 11: Error handling and exceptions - Chapter 12: Practical examples (complete projects) All code examples are exclusively in SomonScript. Each chapter includes: - Detailed explanations in Tajik - Progressive difficulty suitable for all skill levels - Practical code examples - Exercises for practice Added README.md with navigation and table of contents. --- ...20\264\320\264\320\270\320\274\320\260.md" | 112 +++++ ...20\267\320\260\320\261\320\276\320\275.md" | 222 +++++++++ ...20\273\321\203\320\274\320\276\321\202.md" | 307 ++++++++++++ ...20\276\321\200\320\260\322\263\320\276.md" | 328 +++++++++++++ ...20\267\320\276\321\200\320\260\321\202.md" | 369 ++++++++++++++ ...21\201\320\270\321\217\322\263\320\276.md" | 344 +++++++++++++ ...21\201\320\270\320\262\322\263\320\276.md" | 370 ++++++++++++++ ...0\262\320\260-\320\276\320\276\320\277.md" | 460 ++++++++++++++++++ ...20\264\321\203\320\273\322\263\320\276.md" | 362 ++++++++++++++ ...20\274\321\203\320\264\322\263\320\276.md" | 358 ++++++++++++++ ...20\275\320\276\320\272\322\263\320\276.md" | 308 ++++++++++++ ...20\260\320\274\320\260\320\273\323\243.md" | 393 +++++++++++++++ book/README.md | 152 ++++++ 13 files changed, 4085 insertions(+) create mode 100644 "book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" create mode 100644 "book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" create mode 100644 "book/03-\320\275\320\260\320\274\321\203\320\264\322\263\320\276\320\270-\320\274\320\260\321\212\320\273\321\203\320\274\320\276\321\202.md" create mode 100644 "book/04-\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\322\263\320\276-\320\262\320\260-\320\270\320\261\320\276\321\200\320\260\322\263\320\276.md" create mode 100644 "book/05-\321\201\320\276\321\205\321\202\320\276\321\200\322\263\320\276\320\270-\320\275\320\260\320\267\320\276\321\200\320\260\321\202.md" create mode 100644 "book/06-\321\204\321\203\320\275\320\272\321\201\320\270\321\217\322\263\320\276.md" create mode 100644 "book/07-\320\276\320\261\321\212\320\265\320\272\321\202\322\263\320\276-\320\262\320\260-\320\274\320\260\321\201\321\201\320\270\320\262\322\263\320\276.md" create mode 100644 "book/08-\321\201\320\270\320\275\321\204\322\263\320\276-\320\262\320\260-\320\276\320\276\320\277.md" create mode 100644 "book/09-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\274\320\276\320\264\321\203\320\273\322\263\320\276.md" create mode 100644 "book/10-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\275\320\260\320\274\321\203\320\264\322\263\320\276.md" create mode 100644 "book/11-\321\205\320\260\321\202\320\276\320\263\320\270\322\263\320\276-\320\262\320\260-\320\270\321\201\321\202\320\270\321\201\320\275\320\276\320\272\322\263\320\276.md" create mode 100644 "book/12-\320\274\320\270\321\201\320\276\320\273\322\263\320\276\320\270-\320\260\320\274\320\260\320\273\323\243.md" create mode 100644 book/README.md diff --git "a/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" "b/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" new file mode 100644 index 0000000..dfc9e0c --- /dev/null +++ "b/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" @@ -0,0 +1,112 @@ +# Боби 1: Муқаддима ба SomonScript + +## 1.1. Хуш омадед ба дунёи SomonScript + +SomonScript забони барномасозии муосир аст, ки бо истифода аз алифбои кириллии тоҷикӣ таҳия шудааст. Ин забон имкон медиҳад, ки барномасозӣ ба забони модарӣ анҷом диҳед ва барномаҳои JavaScript эҷод кунед. + +## 1.2. Чаро SomonScript? + +SomonScript барои он таҳия шудааст, ки: +- Омӯзиши барномасозиро ба забони тоҷикӣ осонтар созад +- Барномасозӣ ба забони модарӣ имкон медиҳад +- Бо экосистемаи JavaScript мувофиқат дорад +- Системаи намудҳои пешрафта (Type System) дорад + +## 1.3. Насби SomonScript + +Барои насби SomonScript шумо бояд Node.js дошта бошед (версияи 20 ё болотар). + +```bash +npm install -g somon-script +``` + +Барои тафтиши версия: + +```bash +somon --version +``` + +## 1.4. Аввалин барномаи шумо + +Биёед аввалин барномаи худро нависем. Файли нави бо номи `салом.som` эҷод кунед ва коди зеринро нависед: + +```somonscript +// Ин аввалин барномаи мо дар SomonScript аст +чоп.сабт("Салом ҷаҳон!"); +``` + +Барои иҷрои барнома: + +```bash +somon run салом.som +``` + +Натиҷа: +``` +Салом ҷаҳон! +``` + +## 1.5. Сохтори барнома + +Барномаҳои SomonScript метавонанд аз қисмҳои зерин иборат бошанд: + +1. **Шарҳҳо** - барои тавзеҳот (бо `//` ё `/* */`) +2. **Эълонҳои тағйирёбанда** - барои нигоҳдории маълумот +3. **Функсияҳо** - барои коди такроршаванда +4. **Синфҳо** - барои объектҳои мураккаб +5. **Модулҳо** - барои ташкили код + +## 1.6. Мисоли содда + +```somonscript +// Эълони тағйирёбанда +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; + +// Намоиши маълумот +чоп.сабт("Ном: " + ном); +чоп.сабт("Синну сол: " + синну_сол); + +// Функсия барои салом додан +функсия салом(ном: сатр): холӣ { + чоп.сабт("Салом, " + ном + "!"); +} + +салом(ном); +``` + +## 1.7. Фармонҳои асосии CLI + +SomonScript фармонҳои зиёди фоиданокро пешниҳод мекунад: + +### Компилятсия +```bash +somon compile барнома.som +``` + +### Иҷро +```bash +somon run барнома.som +``` + +### Бастабандӣ (Bundle) +```bash +somon bundle src/main.som -o dist/app.js +``` + +### Маълумот дар бораи модулҳо +```bash +somon module-info src/main.som --graph +``` + +## 1.8. Хулоса + +Дар ин боб шумо бо SomonScript шинос шудед ва аввалин барномаи худро навиштед. Дар бобҳои минбаъда мо ба таври муфассал бо имкониятҳои забон шинос мешавем. + +--- + +**Машқҳо:** + +1. Барномае нависед, ки номи шумо ва синну соли шуморо нишон медиҳад +2. Барномаи "Салом ҷаҳон" -ро бо паёми дигар тағйир диҳед +3. Функсияе эҷод кунед, ки ду адад қабул мекунад ва ҷамъи онҳоро нишон медиҳад diff --git "a/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" "b/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" new file mode 100644 index 0000000..0921cfa --- /dev/null +++ "b/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" @@ -0,0 +1,222 @@ +# Боби 2: Асосҳои забони SomonScript + +## 2.1. Тағйирёбандаҳо ва собитҳо + +Дар SomonScript барои нигоҳдории маълумот аз тағйирёбандаҳо ва собитҳо истифода мебаранд. + +### Тағйирёбандаҳо (Variables) + +Тағйирёбанда - ин контейнере аст, ки қимати онро метавон тағйир дод: + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда дуруст_аст: мантиқӣ = дуруст; + +// Тағйир додани қимат +ном = "Фотима"; +синну_сол = 22; + +чоп.сабт("Ном: " + ном); // Ном: Фотима +чоп.сабт("Синну сол: " + синну_сол); // Синну сол: 22 +``` + +### Собитҳо (Constants) + +Собит - ин контейнере аст, ки қимати онро тағйир дода наметавонанд: + +```somonscript +собит ПИ: рақам = 3.14159; +собит НОМИ_БАРНОМА: сатр = "Барномаи ман"; + +чоп.сабт("ПИ = " + ПИ); +// ПИ = 10; // ХАТО! Собитро тағйир дода наметавонанд +``` + +## 2.2. Намудҳои асосӣ + +SomonScript панҷ намуди асосиро дастгирӣ мекунад: + +### Сатр (String) + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда фамилия: сатр = "Раҳимов"; +тағйирёбанда номи_пурра: сатр = ном + " " + фамилия; + +чоп.сабт(номи_пурра); // Аҳмад Раҳимов +``` + +### Рақам (Number) + +```somonscript +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда қимат: рақам = 99.99; +тағйирёбанда манфӣ: рақам = -10; + +тағйирёбанда ҷамъ: рақам = синну_сол + 5; +чоп.сабт(ҷамъ); // 30 +``` + +### Мантиқӣ (Boolean) + +```somonscript +тағйирёбанда дуруст_аст: мантиқӣ = дуруст; +тағйирёбанда нодуруст_аст: мантиқӣ = нодуруст; + +чоп.сабт(дуруст_аст); // true +чоп.сабт(нодуруст_аст); // false +``` + +### Холӣ (Null) + +```somonscript +тағйирёбанда қимат: холӣ = холӣ; +чоп.сабт(қимат); // null +``` + +### Беқимат (Undefined) + +```somonscript +тағйирёбанда қимат: беқимат = беқимат; +чоп.сабт(қимат); // undefined +``` + +## 2.3. Шарҳҳо (Comments) + +Шарҳҳо барои тавзеҳоти код истифода мешаванд ва ҳангоми иҷрои барнома нодида гирифта мешаванд. + +### Шарҳи яксатрӣ + +```somonscript +// Ин шарҳи яксатрӣ аст +тағйирёбанда ном: сатр = "Аҳмад"; // Шарҳ дар охири сатр +``` + +### Шарҳи бисёрсатрӣ + +```somonscript +/* + Ин шарҳи бисёрсатрӣ аст. + Он метавонад якчанд сатрро ишғол кунад. + Барои тавзеҳоти муфассал фоиданок аст. +*/ +тағйирёбанда синну_сол: рақам = 25; +``` + +## 2.4. Номгузории тағйирёбандаҳо + +Ҳангоми номгузории тағйирёбандаҳо қоидаҳои зеринро риоя кунед: + +### Қоидаҳои номгузорӣ: + +1. Ном бояд бо ҳарф ё `_` оғоз шавад +2. Ном метавонад аз ҳарфҳо, рақамҳо ва `_` иборат бошад +3. Ном набояд калидвожаи забон бошад +4. Ном ба калон ва хурди ҳарфҳо ҳассос аст + +```somonscript +// Номҳои дуруст: +тағйирёбанда номи_корбар: сатр = "Аҳмад"; +тағйирёбанда синну_сол1: рақам = 25; +тағйирёбанда _қимати_пинҳонӣ: рақам = 100; + +// Номҳои нодуруст: +// тағйирёбанда 1ном: сатр = "Хато"; // Бо рақам оғоз шудааст +// тағйирёбанда ном-корбар: сатр = "Хато"; // Аломати - ғайриқонунӣ +``` + +## 2.5. Чопи маълумот + +Барои намоиши маълумот дар консол аз `чоп.сабт` истифода мебаранд: + +```somonscript +чоп.сабт("Салом ҷаҳон!"); + +тағйирёбанда ном: сатр = "Аҳмад"; +чоп.сабт("Ном: " + ном); + +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 20; +чоп.сабт("Ҷамъ: " + (а + б)); +``` + +## 2.6. Ибораҳои литералӣ (Template Literals) + +Барои сохтани сатрҳои мураккаб: + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; + +чоп.сабт(`Ном: ${ном}, Синну сол: ${синну_сол}`); +// Натиҷа: Ном: Аҳмад, Синну сол: 25 + +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 20; +чоп.сабт(`${а} + ${б} = ${а + б}`); +// Натиҷа: 10 + 20 = 30 +``` + +## 2.7. Табдили намуд + +SomonScript табдили худкори намудро дастгирӣ мекунад: + +```somonscript +тағйирёбанда рақам1: рақам = 10; +тағйирёбанда сатр1: сатр = "20"; + +// Ҳангоми пайваст, рақам ба сатр табдил меёбад +тағйирёбанда натиҷа1: сатр = рақам1 + сатр1; +чоп.сабт(натиҷа1); // "1020" + +// Ҳангоми ҷамъ, агар ҳар ду рақам бошанд +тағйирёбанда рақам2: рақам = 10; +тағйирёбанда рақам3: рақам = 20; +тағйирёбанда натиҷа2: рақам = рақам2 + рақам3; +чоп.сабт(натиҷа2); // 30 +``` + +## 2.8. Мисоли комплексӣ + +```somonscript +// Барномаи маълумоти шахсӣ +собит НОМИ_БАРНОМА: сатр = "Системаи маълумоти шахсӣ"; + +// Маълумоти шахс +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда фамилия: сатр = "Раҳимов"; +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда мизони_маош: рақам = 5000; +тағйирёбанда кормандӣ: мантиқӣ = дуруст; + +// Намоиши маълумот +чоп.сабт("=== " + НОМИ_БАРНОМА + " ==="); +чоп.сабт(""); +чоп.сабт("Номи пурра: " + ном + " " + фамилия); +чоп.сабт("Синну сол: " + синну_сол); +чоп.сабт("Маош: " + мизони_маош + " сомонӣ"); +чоп.сабт("Кормандӣ: " + кормандӣ); + +// Ҳисобҳо +тағйирёбанда маоши_солона: рақам = мизони_маош * 12; +чоп.сабт("Маоши солона: " + маоши_солона + " сомонӣ"); +``` + +## 2.9. Хулоса + +Дар ин боб шумо омӯхтед: +- Чӣ тавр тағйирёбанда ва собит эълон кардан +- Намудҳои асосии маълумот +- Чӣ тавр шарҳ навиштан +- Қоидаҳои номгузории тағйирёбандаҳо +- Чӣ тавр маълумотро чоп кардан + +--- + +**Машқҳо:** + +1. Барномае нависед, ки маълумоти шахсии шуморо (ном, фамилия, синну сол) нишон медиҳад +2. Ду тағйирёбанда бо арзишҳои рақамӣ эҷод кунед ва ҷамъ, тарҳ, зарб ва тақсими онҳоро ҳисоб кунед +3. Се собит эҷод кунед: номи донишгоҳ, соли таъсис ва шумораи донишҷӯён +4. Бо истифода аз template literals маълумотро дар як сатр нишон диҳед diff --git "a/book/03-\320\275\320\260\320\274\321\203\320\264\322\263\320\276\320\270-\320\274\320\260\321\212\320\273\321\203\320\274\320\276\321\202.md" "b/book/03-\320\275\320\260\320\274\321\203\320\264\322\263\320\276\320\270-\320\274\320\260\321\212\320\273\321\203\320\274\320\276\321\202.md" new file mode 100644 index 0000000..f0a24c4 --- /dev/null +++ "b/book/03-\320\275\320\260\320\274\321\203\320\264\322\263\320\276\320\270-\320\274\320\260\321\212\320\273\321\203\320\274\320\276\321\202.md" @@ -0,0 +1,307 @@ +# Боби 3: Намудҳои маълумот дар SomonScript + +## 3.1. Намудҳои ибтидоӣ (Primitive Types) + +### 3.1.1. Сатр (String) + +Сатр барои нигоҳдории матн истифода мешавад. Онро дар байни кавычкаҳои дукарата `"..."` ё `'...'` менависанд. + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда шаҳр: сатр = 'Душанбе'; +тағйирёбанда паём: сатр = "Салом ҷаҳон!"; + +чоп.сабт(ном); // Аҳмад +чоп.сабт(шаҳр); // Душанбе +чоп.сабт(паём); // Салом ҷаҳон! +``` + +**Амалиёт бо сатрҳо:** + +```somonscript +// Пайваст кардани сатрҳо +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда фамилия: сатр = "Раҳимов"; +тағйирёбанда номи_пурра: сатр = ном + " " + фамилия; +чоп.сабт(номи_пурра); // Аҳмад Раҳимов + +// Дарозии сатр +тағйирёбанда матн: сатр = "SomonScript"; +чоп.сабт(матн.дарозӣ); // 12 + +// Ибораҳои литералӣ (Template Literals) +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда маълумот: сатр = `Ман ${ном} ҳастам ва ${синну_сол} сола дорам.`; +чоп.сабт(маълумот); // Ман Аҳмад ҳастам ва 25 сола дорам. +``` + +### 3.1.2. Рақам (Number) + +Рақам барои нигоҳдории арзишҳои ададӣ (бутун ва касрӣ) истифода мешавад. + +```somonscript +// Ададҳои бутун +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда шумораи_донишҷӯён: рақам = 1000; + +// Ададҳои касрӣ +тағйирёбанда қимат: рақам = 99.99; +собит ПИ: рақам = 3.14159; + +// Ададҳои манфӣ +тағйирёбанда харораҷот: рақам = -50; +тағйирёбанда маблағ: рақам = -1000.50; + +чоп.сабт(синну_сол); // 25 +чоп.сабт(қимат); // 99.99 +чоп.сабт(ПИ); // 3.14159 +``` + +**Амалиёти риёзӣ:** + +```somonscript +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 3; + +чоп.сабт("Ҷамъ: " + (а + б)); // Ҷамъ: 13 +чоп.сабт("Тарҳ: " + (а - б)); // Тарҳ: 7 +чоп.сабт("Зарб: " + (а * б)); // Зарб: 30 +чоп.сабт("Тақсим: " + (а / б)); // Тақсим: 3.333... +чоп.сабт("Боқимонда: " + (а % б)); // Боқимонда: 1 +``` + +### 3.1.3. Мантиқӣ (Boolean) + +Мантиқӣ танҳо ду қимат метавонад дошта бошад: `дуруст` (true) ё `нодуруст` (false). + +```somonscript +тағйирёбанда донишҷӯ_аст: мантиқӣ = дуруст; +тағйирёбанда устод_аст: мантиқӣ = нодуруст; + +чоп.сабт(донишҷӯ_аст); // true +чоп.сабт(устод_аст); // false + +// Истифода дар шартҳо +тағйирёбанда синну_сол: рақам = 20; +тағйирёбанда калонсол_аст: мантиқӣ = синну_сол >= 18; +чоп.сабт(калонсол_аст); // true +``` + +### 3.1.4. Холӣ (Null) + +`холӣ` маънои дорад, ки тағйирёбанда қимат надорад (холӣ аст). + +```somonscript +тағйирёбанда маълумот: холӣ = холӣ; +чоп.сабт(маълумот); // null + +// Истифода барои нишон додани набудани қимат +тағйирёбанда натиҷа: рақам | холӣ = холӣ; +чоп.сабт(натиҷа); // null +``` + +### 3.1.5. Беқимат (Undefined) + +`беқимат` маънои дорад, ки тағйирёбанда ҳанӯз қимат нагирифтааст. + +```somonscript +тағйирёбанда маълумот: беқимат; +чоп.сабт(маълумот); // undefined +``` + +### 3.1.6. Калонрақам (BigInt) + +Барои кор бо ададҳои хеле калон. + +```somonscript +тағйирёбанда калон_адад: калонрақам = 9007199254740991n; +чоп.сабт(калон_адад); // 9007199254740991n +``` + +### 3.1.7. Рамз (Symbol) + +Барои эҷоди идентификаторҳои беназир. + +```somonscript +тағйирёбанда калид1: рамз = Рамз("калид"); +тағйирёбанда калид2: рамз = Рамз("калид"); +// калид1 ва калид2 мухталифанд +``` + +## 3.2. Намудҳои махсус (Special Types) + +### 3.2.1. Ҳар (Any) + +`ҳар` маънои дорад, ки тағйирёбанда метавонад ҳар намуди қиматро дошта бошад. + +```somonscript +тағйирёбанда қимат: ҳар = "сатр"; +чоп.сабт(қимат); // сатр + +қимат = 123; +чоп.сабт(қимат); // 123 + +қимат = дуруст; +чоп.сабт(қимат); // true +``` + +### 3.2.2. Ношинос (Unknown) + +Монанди `ҳар`, вале бехатартар. Пеш аз истифода бояд намудашро санҷид. + +```somonscript +тағйирёбанда қимат: ношинос = "сатр"; + +// Пеш аз истифода бояд намудро санҷид +агар (навъи қимат === "сатр") { + чоп.сабт(қимат); +} +``` + +### 3.2.3. Беджавоб (Void) + +Истифода мешавад барои нишон додани он ки функсия ҳеҷ чиз бармегардонад. + +```somonscript +функсия салом(): беджавоб { + чоп.сабт("Салом!"); + // ҳеҷ чиз бармегардонад +} +``` + +### 3.2.4. Абадан (Never) + +Барои функсияҳое ки ҳеҷ гоҳ тамом намешаванд ё ҳамеша хато мепартоянд. + +```somonscript +функсия хатои_фоҷиавӣ(паём: сатр): абадан { + партофтан нав Хато(паём); +} +``` + +## 3.3. Намудҳои мураккаб (Complex Types) + +### 3.3.1. Массив (Array) + +Массив барои нигоҳдории рӯйхати қиматҳо истифода мешавад. + +```somonscript +// Массиви ададҳо +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; +чоп.сабт(ададҳо[0]); // 1 +чоп.сабт(ададҳо[2]); // 3 + +// Массиви сатрҳо +тағйирёбанда номҳо: сатр[] = ["Аҳмад", "Фотима", "Ҳасан"]; +чоп.сабт(номҳо[1]); // Фотима + +// Дарозии массив +чоп.сабт(ададҳо.дарозӣ); // 5 + +// Илова кардан ба массив +ададҳо.илова(6); +чоп.сабт(ададҳо); // [1, 2, 3, 4, 5, 6] +``` + +### 3.3.2. Объект (Object) + +Объект барои нигоҳдории маълумоти мураккаб бо калидҳо истифода мешавад. + +```somonscript +// Эҷоди объект +тағйирёбанда шахс: объект = { + ном: "Аҳмад", + фамилия: "Раҳимов", + синну_сол: 25, + донишҷӯ_аст: дуруст +}; + +// Дастрасӣ ба хосиятҳо +чоп.сабт(шахс.ном); // Аҳмад +чоп.сабт(шахс.синну_сол); // 25 + +// Тағйир додани хосиятҳо +шахс.синну_сол = 26; +чоп.сабт(шахс.синну_сол); // 26 + +// Илова кардани хосияти нав +шахс.шаҳр = "Душанбе"; +чоп.сабт(шахс.шаҳр); // Душанбе +``` + +### 3.3.3. Tuple (Кортеж) + +Массиви бо шумораи муайян ва намудҳои муайяни элементҳо. + +```somonscript +// Эҷоди tuple +тағйирёбанда маълумот: [сатр, рақам, мантиқӣ] = ["Аҳмад", 25, дуруст]; + +чоп.сабт(маълумот[0]); // Аҳмад +чоп.сабт(маълумот[1]); // 25 +чоп.сабт(маълумот[2]); // true +``` + +## 3.4. Муайян кардани намуди тағйирёбанда + +Барои муайян кардани намуди тағйирёбанда оператори `навъи` истифода мешавад: + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда дуруст_аст: мантиқӣ = дуруст; + +чоп.сабт(навъи ном); // сатр +чоп.сабт(навъи синну_сол); // рақам +чоп.сабт(навъи дуруст_аст); // мантиқӣ +``` + +## 3.5. Мисоли комплексӣ + +```somonscript +// Системаи маълумоти донишҷӯ +собит НОМИ_ДОНИШГОҲ: сатр = "Донишгоҳи миллии Тоҷикистон"; + +// Маълумоти донишҷӯ +тағйирёбанда донишҷӯ: объект = { + ном: "Аҳмад", + фамилия: "Раҳимов", + синну_сол: 20, + донишкада: "Математика ва механика", + курс: 3, + бахоҳо: [5, 4, 5, 5, 4], + фаъол_аст: дуруст +}; + +// Намоиши маълумот +чоп.сабт("=== " + НОМИ_ДОНИШГОҲ + " ==="); +чоп.сабт(`Донишҷӯ: ${донишҷӯ.ном} ${донишҷӯ.фамилия}`); +чоп.сабт(`Синну сол: ${донишҷӯ.синну_сол}`); +чоп.сабт(`Донишкада: ${донишҷӯ.донишкада}`); +чоп.сабт(`Курс: ${донишҷӯ.курс}`); + +// Ҳисоби миёнаи бахо +тағйирёбанда ҷамъи_бахоҳо: рақам = 0; +барои (тағйирёбанда и: рақам = 0; и < донишҷӯ.бахоҳо.дарозӣ; и++) { + ҷамъи_бахоҳо = ҷамъи_бахоҳо + донишҷӯ.бахоҳо[и]; +} +тағйирёбанда миёнаи_бахо: рақам = ҷамъи_бахоҳо / донишҷӯ.бахоҳо.дарозӣ; +чоп.сабт(`Миёнаи бахо: ${миёнаи_бахо}`); +``` + +## 3.6. Хулоса + +Дар ин боб шумо омӯхтед: +- Намудҳои ибтидоӣ: сатр, рақам, мантиқӣ, холӣ, беқимат +- Намудҳои махсус: ҳар, ношинос, беджавоб, абадан +- Намудҳои мураккаб: массив, объект, tuple +- Чӣ тавр бо намудҳои гуногун кор кардан + +--- + +**Машқҳо:** + +1. Массиве эҷод кунед, ки 5 адади дӯстдоштаи шумо дорад ва онҳоро як ба як чоп кунед +2. Объекте созед барои китоб бо хосиятҳои: ном, муаллиф, соли нашр, саҳифаҳо +3. Ду массиви ададҳо эҷод кунед ва ҷамъи ҳамаи элементҳои онҳоро ҳисоб кунед +4. Объекте барои автомобил созед бо маълумоти тафсилӣ ва онро чоп кунед diff --git "a/book/04-\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\322\263\320\276-\320\262\320\260-\320\270\320\261\320\276\321\200\320\260\322\263\320\276.md" "b/book/04-\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\322\263\320\276-\320\262\320\260-\320\270\320\261\320\276\321\200\320\260\322\263\320\276.md" new file mode 100644 index 0000000..9bf2dfc --- /dev/null +++ "b/book/04-\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\322\263\320\276-\320\262\320\260-\320\270\320\261\320\276\321\200\320\260\322\263\320\276.md" @@ -0,0 +1,328 @@ +# Боби 4: Операторҳо ва ибораҳо + +## 4.1. Операторҳои риёзӣ + +Операторҳои риёзӣ барои анҷом додани амалиёти ҳисобӣ истифода мешаванд. + +### 4.1.1. Операторҳои асосӣ + +```somonscript +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 3; + +// Ҷамъ (+) +тағйирёбанда ҷамъ: рақам = а + б; +чоп.сабт("10 + 3 = " + ҷамъ); // 13 + +// Тарҳ (-) +тағйирёбанда тарҳ: рақам = а - б; +чоп.сабт("10 - 3 = " + тарҳ); // 7 + +// Зарб (*) +тағйирёбанда зарб: рақам = а * б; +чоп.сабт("10 * 3 = " + зарб); // 30 + +// Тақсим (/) +тағйирёбанда тақсим: рақам = а / б; +чоп.сабт("10 / 3 = " + тақсим); // 3.333... + +// Боқимонда (%) +тағйирёбанда боқимонда: рақам = а % б; +чоп.сабт("10 % 3 = " + боқимонда); // 1 + +// Дараҷа (**) +тағйирёбанда дараҷа: рақам = а ** 2; +чоп.сабт("10 ** 2 = " + дараҷа); // 100 +``` + +### 4.1.2. Операторҳои инкремент ва декремент + +```somonscript +тағйирёбанда шумора: рақам = 5; + +// Инкремент (зиёд кардан ба 1) +шумора++; +чоп.сабт(шумора); // 6 + +// Декремент (кам кардан ба 1) +шумора--; +чоп.сабт(шумора); // 5 + +// Пеш-инкремент +тағйирёбанда х: рақам = 5; +тағйирёбанда ҷавоб: рақам = ++х; +чоп.сабт("х = " + х); // 6 +чоп.сабт("ҷавоб = " + ҷавоб); // 6 + +// Пас-инкремент +тағйирёбанда у: рақам = 5; +тағйирёбанда натиҷа: рақам = у++; +чоп.сабт("у = " + у); // 6 +чоп.сабт("натиҷа = " + натиҷа); // 5 +``` + +## 4.2. Операторҳои таъиноти + +Операторҳои таъиноти барои доли қимат ба тағйирёбандаҳо истифода мешаванд. + +```somonscript +тағйирёбанда х: рақам = 10; + +// Таъиноти оддӣ +х = 20; +чоп.сабт(х); // 20 + +// Таъинот бо ҷамъ (+=) +х += 5; // х = х + 5 +чоп.сабт(х); // 25 + +// Таъинот бо тарҳ (-=) +х -= 5; // х = х - 5 +чоп.сабт(х); // 20 + +// Таъинот бо зарб (*=) +х *= 2; // х = х * 2 +чоп.сабт(х); // 40 + +// Таъинот бо тақсим (/=) +х /= 4; // х = х / 4 +чоп.сабт(х); // 10 + +// Таъинот бо боқимонда (%=) +х %= 3; // х = х % 3 +чоп.сабт(х); // 1 +``` + +## 4.3. Операторҳои муқоиса + +Операторҳои муқоиса барои муқоиса кардани ду қимат истифода мешаванд ва натиҷаи мантиқӣ (дуруст ё нодуруст) медиҳанд. + +```somonscript +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 5; +тағйирёбанда в: рақам = 10; + +// Баробар (==) +чоп.сабт(а == б); // false +чоп.сабт(а == в); // true + +// Баробари қатъӣ (===) +чоп.сабт(а === 10); // true +чоп.сабт(а === "10"); // false + +// Нобаробар (!=) +чоп.сабт(а != б); // true +чоп.сабт(а != в); // false + +// Нобаробари қатъӣ (!==) +чоп.сабт(а !== 10); // false +чоп.сабт(а !== "10"); // true + +// Калонтар (>) +чоп.сабт(а > б); // true +чоп.сабт(б > а); // false + +// Хурдтар (<) +чоп.сабт(б < а); // true +чоп.сабт(а < б); // false + +// Калонтар ё баробар (>=) +чоп.сабт(а >= в); // true +чоп.сабт(б >= а); // false + +// Хурдтар ё баробар (<=) +чоп.сабт(б <= а); // true +чоп.сабт(а <= б); // false +``` + +## 4.4. Операторҳои мантиқӣ + +Операторҳои мантиқӣ барои кор бо қиматҳои мантиқӣ истифода мешаванд. + +```somonscript +тағйирёбанда а: мантиқӣ = дуруст; +тағйирёбанда б: мантиқӣ = нодуруст; + +// ВА (&&) - ҳарду шарт бояд дуруст бошанд +чоп.сабт(а && а); // true +чоп.сабт(а && б); // false +чоп.сабт(б && б); // false + +// Ё (||) - ҳадди ақал яке аз шартҳо бояд дуруст бошад +чоп.сабт(а || а); // true +чоп.сабт(а || б); // true +чоп.сабт(б || б); // false + +// НА (!) - баръакси қимат +чоп.сабт(!а); // false +чоп.сабт(!б); // true + +// Мисоли мураккаб +тағйирёбанда синну_сол: рақам = 20; +тағйирёбанда шаҳрвандӣ: мантиқӣ = дуруст; + +тағйирёбанда метавонад_овоз_диҳад: мантиқӣ = синну_сол >= 18 && шаҳрвандӣ; +чоп.сабт(метавонад_овоз_диҳад); // true +``` + +## 4.5. Операторҳои сатрӣ + +Операторҳо барои кор бо сатрҳо. + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда фамилия: сатр = "Раҳимов"; + +// Пайвасти сатрҳо (+) +тағйирёбанда номи_пурра: сатр = ном + " " + фамилия; +чоп.сабт(номи_пурра); // Аҳмад Раҳимов + +// Пайвасти якҷояи таъинот (+=) +тағйирёбанда матн: сатр = "Салом"; +матн += " ҷаҳон"; +матн += "!"; +чоп.сабт(матн); // Салом ҷаҳон! + +// Ибораҳои литералӣ +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда маълумот: сатр = `${ном} ${фамилия} ${синну_сол} сола дорад.`; +чоп.сабт(маълумот); // Аҳмад Раҳимов 25 сола дорад. +``` + +## 4.6. Операторҳои битӣ + +Операторҳои битӣ барои кор бо рақамҳо дар сатҳи битҳо истифода мешаванд. + +```somonscript +тағйирёбанда а: рақам = 5; // 0101 дар двоичӣ +тағйирёбанда б: рақам = 3; // 0011 дар двоичӣ + +// ВА битӣ (&) +чоп.сабт(а & б); // 1 (0001) + +// Ё битӣ (|) +чоп.сабт(а | б); // 7 (0111) + +// Ё истисноӣ битӣ (^) +чоп.сабт(а ^ б); // 6 (0110) + +// НА битӣ (~) +чоп.сабт(~а); // -6 + +// Ҷобаҷокунии чап (<<) +чоп.сабт(а << 1); // 10 (1010) + +// Ҷобаҷокунии рост (>>) +чоп.сабт(а >> 1); // 2 (0010) +``` + +## 4.7. Оператори шартӣ (тернарӣ) + +Оператори тернарӣ як усули мухтасари навиштани шарти `агар-вагарна` аст. + +```somonscript +// Синтаксис: шарт ? қимат_агар_дуруст : қимат_агар_нодуруст + +тағйирёбанда синну_сол: рақам = 20; +тағйирёбанда ҳолат: сатр = синну_сол >= 18 ? "калонсол" : "хурдсол"; +чоп.сабт(ҳолат); // калонсол + +// Мисоли дигар +тағйирёбанда бахо: рақам = 4; +тағйирёбанда натиҷа: сатр = бахо >= 3 ? "Гузашт" : "Нагузашт"; +чоп.сабт(натиҷа); // Гузашт + +// Оператори тернарии лона +тағйирёбанда адад: рақам = 15; +тағйирёбанда тавсиф: сатр = адад > 0 ? "мусбат" : адад < 0 ? "манфӣ" : "сифр"; +чоп.сабт(тавсиф); // мусбат +``` + +## 4.8. Оператори навъ (typeof) + +Барои муайян кардани намуди тағйирёбанда. + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда дуруст_аст: мантиқӣ = дуруст; +тағйирёбанда массив: рақам[] = [1, 2, 3]; + +чоп.сабт(навъи ном); // сатр +чоп.сабт(навъи синну_сол); // рақам +чоп.сабт(навъи дуруст_аст); // мантиқӣ +чоп.сабт(навъи массив); // объект +``` + +## 4.9. Приоритети операторҳо + +Операторҳо аз рӯи приоритет иҷро мешаванд (аз калон ба хурд): + +1. `()` - қавсҳо +2. `++`, `--`, `!`, `~` - унарӣ +3. `**` - дараҷа +4. `*`, `/`, `%` - зарб ва тақсим +5. `+`, `-` - ҷамъ ва тарҳ +6. `<<`, `>>` - ҷобаҷокунӣ +7. `<`, `<=`, `>`, `>=` - муқоиса +8. `==`, `!=`, `===`, `!==` - баробарӣ +9. `&`, `^`, `|` - битӣ +10. `&&` - мантиқии ВА +11. `||` - мантиқии Ё +12. `? :` - тернарӣ +13. `=`, `+=`, `-=`, ... - таъинот + +```somonscript +// Бе қавсҳо +тағйирёбанда натиҷа1: рақам = 2 + 3 * 4; +чоп.сабт(натиҷа1); // 14 (3*4=12, 2+12=14) + +// Бо қавсҳо +тағйирёбанда натиҷа2: рақам = (2 + 3) * 4; +чоп.сабт(натиҷа2); // 20 (2+3=5, 5*4=20) +``` + +## 4.10. Мисоли комплексӣ + +```somonscript +// Калькулятори оддӣ +тағйирёбанда адад1: рақам = 15; +тағйирёбанда адад2: рақам = 4; +тағйирёбанда оператор: сатр = "+"; + +тағйирёбанда натиҷа: рақам = 0; + +агар (оператор === "+") { + натиҷа = адад1 + адад2; +} вагарна агар (оператор === "-") { + натиҷа = адад1 - адад2; +} вагарна агар (оператор === "*") { + натиҷа = адад1 * адад2; +} вагарна агар (оператор === "/") { + натиҷа = адад1 / адад2; +} вагарна { + чоп.сабт("Оператори номаълум!"); +} + +чоп.сабт(`${адад1} ${оператор} ${адад2} = ${натиҷа}`); +``` + +## 4.11. Хулоса + +Дар ин боб шумо омӯхтед: +- Операторҳои риёзӣ барои ҳисобҳо +- Операторҳои таъиноти +- Операторҳои муқоиса +- Операторҳои мантиқӣ +- Операторҳои сатрӣ +- Оператори тернарӣ +- Приоритети операторҳо + +--- + +**Машқҳо:** + +1. Барномае нависед, ки майдони доира ва периметри онро бо радиуси додашуда ҳисоб мекунад +2. Ду адад гиред ва ҳамаи амалиёти риёзӣ (ҷамъ, тарҳ, зарб, тақсим, боқимонда) -ро бо онҳо иҷро кунед +3. Бо истифода аз оператори тернарӣ муайян кунед, ки адади додашуда ҷуфт ё тоқ аст +4. Синну соли шахсро гиред ва бо истифода аз операторҳои мантиқӣ муайян кунед, ки ӯ барои ронандагӣ мувофиқ аст (синну сол >= 18) diff --git "a/book/05-\321\201\320\276\321\205\321\202\320\276\321\200\322\263\320\276\320\270-\320\275\320\260\320\267\320\276\321\200\320\260\321\202.md" "b/book/05-\321\201\320\276\321\205\321\202\320\276\321\200\322\263\320\276\320\270-\320\275\320\260\320\267\320\276\321\200\320\260\321\202.md" new file mode 100644 index 0000000..269f741 --- /dev/null +++ "b/book/05-\321\201\320\276\321\205\321\202\320\276\321\200\322\263\320\276\320\270-\320\275\320\260\320\267\320\276\321\200\320\260\321\202.md" @@ -0,0 +1,369 @@ +# Боби 5: Сохторҳои назорат + +## 5.1. Шарти АГАР-ВАГАРНА + +Шарти `агар-вагарна` имкон медиҳад, ки код танҳо дар ҳолати муайян иҷро шавад. + +### 5.1.1. Шарти оддӣ + +```somonscript +тағйирёбанда синну_сол: рақам = 20; + +агар (синну_сол >= 18) { + чоп.сабт("Шумо калонсол ҳастед"); +} +``` + +### 5.1.2. Шарти бо ВАГАРНА + +```somonscript +тағйирёбанда синну_сол: рақам = 15; + +агар (синну_сол >= 18) { + чоп.сабт("Шумо калонсол ҳастед"); +} вагарна { + чоп.сабт("Шумо хурдсол ҳастед"); +} +``` + +### 5.1.3. Шартҳои якчанд + +```somonscript +тағйирёбанда бахо: рақам = 85; + +агар (бахо >= 90) { + чоп.сабт("Баҳои аълӣ - А"); +} вагарна агар (бахо >= 80) { + чоп.сабт("Баҳои хуб - Б"); +} вагарна агар (бахо >= 70) { + чоп.сабт("Баҳои миёна - В"); +} вагарна агар (бахо >= 60) { + чоп.сабт("Баҳои қаноатбахш - Г"); +} вагарна { + чоп.сабт("Баҳои номуносиб - Д"); +} +``` + +### 5.1.4. Шартҳои мураккаб + +```somonscript +тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда парол: сатр = "12345"; +тағйирёбанда дастрасӣ: мантиқӣ = дуруст; + +// Истифодаи оператори ВА (&&) +агар (ном === "Аҳмад" && парол === "12345" && дастрасӣ === дуруст) { + чоп.сабт("Хуш омадед!"); +} вагарна { + чоп.сабт("Дастрасӣ рад карда шуд"); +} + +// Истифодаи оператори Ё (||) +тағйирёбанда рӯз: сатр = "Шанбе"; +агар (рӯз === "Шанбе" || рӯз === "Якшанбе") { + чоп.сабт("Имрӯз рӯзи истироҳат аст"); +} вагарна { + чоп.сабт("Имрӯз рӯзи корӣ аст"); +} +``` + +### 5.1.5. Шартҳои лона + +```somonscript +тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда шаҳрвандӣ: мантиқӣ = дуруст; + +агар (синну_сол >= 18) { + агар (шаҳрвандӣ === дуруст) { + чоп.сабт("Шумо метавонед овоз диҳед"); + } вагарна { + чоп.сабт("Шумо шаҳрванд нестед"); + } +} вагарна { + чоп.сабт("Шумо ҳанӯз калонсол нестед"); +} +``` + +## 5.2. Шарти ИНТИХОБ-ҲОЛАТ (Switch-Case) + +Оператори `интихоб` барои санҷиши як тағйирёбанда бо арзишҳои гуногун истифода мешавад. + +```somonscript +тағйирёбанда рӯз: рақам = 3; + +интихоб (рӯз) { + ҳолат 1: + чоп.сабт("Душанбе"); + шикастан; + ҳолат 2: + чоп.сабт("Сешанбе"); + шикастан; + ҳолат 3: + чоп.сабт("Чоршанбе"); + шикастан; + ҳолат 4: + чоп.сабт("Панҷшанбе"); + шикастан; + ҳолат 5: + чоп.сабт("Ҷумъа"); + шикастан; + ҳолат 6: + чоп.сабт("Шанбе"); + шикастан; + ҳолат 7: + чоп.сабт("Якшанбе"); + шикастан; + пешфарз: + чоп.сабт("Рақами нодуруст"); +} +``` + +### Интихоб бо шартҳои якҷоя + +```somonscript +тағйирёбанда баҳо: сатр = "Б"; + +интихоб (баҳо) { + ҳолат "А": + чоп.сабт("Аъло!"); + шикастан; + ҳолат "Б": + ҳолат "В": + чоп.сабт("Хуб кор кардед!"); + шикастан; + ҳолат "Г": + чоп.сабт("Қаноатбахш"); + шикастан; + пешфарз: + чоп.сабт("Бояд беҳтар кор кунед"); +} +``` + +## 5.3. Давраи ТО (While Loop) + +Давраи `то` кодро то вақте ки шарт дуруст аст, такрор мекунад. + +```somonscript +// Давраи оддӣ +тағйирёбанда и: рақам = 1; + +то (и <= 5) { + чоп.сабт("Адад: " + и); + и++; +} + +// Натиҷа: +// Адад: 1 +// Адад: 2 +// Адад: 3 +// Адад: 4 +// Адад: 5 +``` + +### Мисоли ҳисоби факториал + +```somonscript +тағйирёбанда рақам: рақам = 5; +тағйирёбанда факториал: рақам = 1; +тағйирёбанда и: рақам = 1; + +то (и <= рақам) { + факториал = факториал * и; + и++; +} + +чоп.сабт(`Факториали ${рақам} = ${факториал}`); // Факториали 5 = 120 +``` + +## 5.4. Давраи БАРОИ (For Loop) + +Давраи `барои` барои такрори шумораи муайяни маротиба истифода мешавад. + +```somonscript +// Давраи оддӣ +барои (тағйирёбанда и: рақам = 0; и < 5; и++) { + чоп.сабт("Такрор: " + и); +} + +// Натиҷа: +// Такрор: 0 +// Такрор: 1 +// Такрор: 2 +// Такрор: 3 +// Такрор: 4 +``` + +### Гузариш ба массив + +```somonscript +тағйирёбанда номҳо: сатр[] = ["Аҳмад", "Фотима", "Ҳасан", "Марям"]; + +барои (тағйирёбанда и: рақам = 0; и < номҳо.дарозӣ; и++) { + чоп.сабт(`Донишҷӯи ${и + 1}: ${номҳо[и]}`); +} + +// Натиҷа: +// Донишҷӯи 1: Аҳмад +// Донишҷӯи 2: Фотима +// Донишҷӯи 3: Ҳасан +// Донишҷӯи 4: Марям +``` + +### Давраҳои лона + +```somonscript +// Ҷадвали зарб +чоп.сабт("=== Ҷадвали Зарб ==="); + +барои (тағйирёбанда х: рақам = 1; х <= 5; х++) { + барои (тағйирёбанда у: рақам = 1; у <= 5; у++) { + тағйирёбанда натиҷа: рақам = х * у; + чоп.сабт(`${х} × ${у} = ${натиҷа}`); + } + чоп.сабт(""); // Сатри холӣ +} +``` + +## 5.5. ШИКАСТАН ва ДАВОМ + +### ШИКАСТАН (break) + +`шикастан` давраро пеш аз вақт қатъ мекунад. + +```somonscript +// Ҷустуҷӯи адад +тағйирёбанда ададҳо: рақам[] = [1, 5, 8, 12, 15, 20]; +тағйирёбанда адади_ҷустуҷӯшуда: рақам = 12; +тағйирёбанда ёфт_шуд: мантиқӣ = нодуруст; + +барои (тағйирёбанда и: рақам = 0; и < ададҳо.дарозӣ; и++) { + агар (ададҳо[и] === адади_ҷустуҷӯшуда) { + ёфт_шуд = дуруст; + чоп.сабт(`Адад ${адади_ҷустуҷӯшуда} дар индекси ${и} ёфт шуд`); + шикастан; // Давраро қатъ мекунем + } +} + +агар (!ёфт_шуд) { + чоп.сабт("Адад ёфт нашуд"); +} +``` + +### ДАВОМ (continue) + +`давом` такрори ҷориро нодида мегузарад ва ба такрори навбатӣ мегузарад. + +```somonscript +// Чопи ададҳои тоқ +чоп.сабт("Ададҳои тоқ аз 1 то 10:"); + +барои (тағйирёбанда и: рақам = 1; и <= 10; и++) { + // Агар адад ҷуфт бошад, ба навбатӣ мегузарем + агар (и % 2 === 0) { + давом; + } + чоп.сабт(и); +} + +// Натиҷа: 1, 3, 5, 7, 9 +``` + +## 5.6. Мисолҳои амалӣ + +### Мисоли 1: Барномаи ҳисоби миёнаи бахо + +```somonscript +тағйирёбанда бахоҳо: рақам[] = [85, 90, 78, 92, 88]; +тағйирёбанда ҷамъ: рақам = 0; + +// Ҳисоби ҷамъ +барои (тағйирёбанда и: рақам = 0; и < бахоҳо.дарозӣ; и++) { + ҷамъ += бахоҳо[и]; +} + +// Ҳисоби миёна +тағйирёбанда миёна: рақам = ҷамъ / бахоҳо.дарозӣ; +чоп.сабт(`Миёнаи бахо: ${миёна}`); + +// Муайян кардани дараҷа +агар (миёна >= 90) { + чоп.сабт("Дараҷа: А (Аълӣ)"); +} вагарна агар (миёна >= 80) { + чоп.сабт("Дараҷа: Б (Хуб)"); +} вагарна агар (миёна >= 70) { + чоп.сабт("Дараҷа: В (Миёна)"); +} вагарна { + чоп.сабт("Дараҷа: Г (Қаноатбахш)"); +} +``` + +### Мисоли 2: Барномаи тафтиши адади содда + +```somonscript +тағйирёбанда адад: рақам = 17; +тағйирёбанда содда_аст: мантиқӣ = дуруст; + +агар (адад < 2) { + содда_аст = нодуруст; +} вагарна { + барои (тағйирёбанда и: рақам = 2; и < адад; и++) { + агар (адад % и === 0) { + содда_аст = нодуруст; + шикастан; + } + } +} + +агар (содда_аст) { + чоп.сабт(`${адад} адади содда аст`); +} вагарна { + чоп.сабт(`${адад} адади мураккаб аст`); +} +``` + +### Мисоли 3: Менюи интерактивӣ + +```somonscript +тағйирёбанда интихоб: рақам = 2; + +чоп.сабт("=== Менюи асосӣ ==="); +чоп.сабт("1. Эҷоди ҳисоб"); +чоп.сабт("2. Намоиши маълумот"); +чоп.сабт("3. Тағйири танзимот"); +чоп.сабт("4. Баромад"); + +интихоб (интихоб) { + ҳолат 1: + чоп.сабт("Шумо 'Эҷоди ҳисоб' -ро интихоб кардед"); + шикастан; + ҳолат 2: + чоп.сабт("Шумо 'Намоиши маълумот' -ро интихоб кардед"); + шикастан; + ҳолат 3: + чоп.сабт("Шумо 'Тағйири танзимот' -ро интихоб кардед"); + шикастан; + ҳолат 4: + чоп.сабт("Хайр! То дидор!"); + шикастан; + пешфарз: + чоп.сабт("Интихоби нодуруст!"); +} +``` + +## 5.7. Хулоса + +Дар ин боб шумо омӯхтед: +- Шарти `агар-вагарна` барои иҷрои шартӣ +- Шарти `интихоб-ҳолат` барои санҷиши якчанд қимат +- Давраи `то` барои такрори шартӣ +- Давраи `барои` барои такрори шумораи муайян +- Операторҳои `шикастан` ва `давом` + +--- + +**Машқҳо:** + +1. Барномае нависед, ки ададҳои аз 1 то 100 -ро чоп мекунад, вале барои ададҳои бахши 3 "Физз", барои ададҳои бахши 5 "Базз" ва барои ададҳои бахши ҳам 3 ва ҳам 5 "ФиззБазз" чоп мекунад +2. Барномаи ҳисоби силсилаи Фибоначчӣ то 10 адади аввал нависед +3. Барномае эҷод кунед, ки аз корбар рақами рӯзро мегирад (1-7) ва номи рӯзро чоп мекунад +4. Массиви ададҳо эҷод кунед ва калонтарин ва хурдтарин ададҳоро пайдо кунед diff --git "a/book/06-\321\204\321\203\320\275\320\272\321\201\320\270\321\217\322\263\320\276.md" "b/book/06-\321\204\321\203\320\275\320\272\321\201\320\270\321\217\322\263\320\276.md" new file mode 100644 index 0000000..a0ef9e0 --- /dev/null +++ "b/book/06-\321\204\321\203\320\275\320\272\321\201\320\270\321\217\322\263\320\276.md" @@ -0,0 +1,344 @@ +# Боби 6: Функсияҳо + +## 6.1. Муқаддима ба функсияҳо + +Функсия - ин блоки коде аст, ки барои иҷрои вазифаи муайян навишта шудааст. Функсияҳо имкон медиҳанд, ки кодро такроран истифода бурда, онро беҳтар ташкил кунем. + +### 6.1.1. Эълони функсия + +```somonscript +// Функсияи оддӣ бе параметрҳо +функсия салом(): холӣ { + чоп.сабт("Салом ҷаҳон!"); +} + +// Садо кардани функсия +салом(); // Салом ҷаҳон! +``` + +### 6.1.2. Функсия бо параметрҳо + +```somonscript +// Функсия бо як параметр +функсия салом_ба_шахс(ном: сатр): холӣ { + чоп.сабт("Салом, " + ном + "!"); +} + +салом_ба_шахс("Аҳмад"); // Салом, Аҳмад! +салом_ба_шахс("Фотима"); // Салом, Фотима! + +// Функсия бо якчанд параметр +функсия маълумоти_шахс(ном: сатр, синну_сол: рақам): холӣ { + чоп.сабт(`Ном: ${ном}, Синну сол: ${синну_сол}`); +} + +маълумоти_шахс("Аҳмад", 25); // Ном: Аҳмад, Синну сол: 25 +``` + +### 6.1.3. Функсия бо бозгашти қимат + +```somonscript +// Функсияе ки қимат бармегардонад +функсия ҷамъ_кардан(а: рақам, б: рақам): рақам { + бозгашт а + б; +} + +тағйирёбанда натиҷа: рақам = ҷамъ_кардан(10, 20); +чоп.сабт("Натиҷа: " + натиҷа); // Натиҷа: 30 + +// Истифодаи мустақими натиҷа +чоп.сабт("5 + 7 = " + ҷамъ_кардан(5, 7)); // 5 + 7 = 12 +``` + +## 6.2. Параметрҳои функсия + +### 6.2.1. Параметрҳои пешфарз + +```somonscript +// Параметрҳо бо қиматҳои пешфарз +функсия салом(ном: сатр = "меҳмон"): холӣ { + чоп.сабт("Салом, " + ном + "!"); +} + +салом(); // Салом, меҳмон! +салом("Аҳмад"); // Салом, Аҳмад! + +// Якчанд параметри пешфарз +функсия маълумот(ном: сатр = "Ношинос", синну_сол: рақам = 0): холӣ { + чоп.сабт(`Ном: ${ном}, Синну сол: ${синну_сол}`); +} + +маълумот(); // Ном: Ношинос, Синну сол: 0 +маълумот("Аҳмад"); // Ном: Аҳмад, Синну сол: 0 +маълумот("Фотима", 22); // Ном: Фотима, Синну сол: 22 +``` + +### 6.2.2. Параметрҳои боқимонда + +```somonscript +// Қабули шумораи номуайяни параметрҳо +функсия ҷамъи_ҳама(...ададҳо: рақам[]): рақам { + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < ададҳо.дарозӣ; и++) { + ҷамъ += ададҳо[и]; + } + бозгашт ҷамъ; +} + +чоп.сабт(ҷамъи_ҳама(1, 2, 3)); // 6 +чоп.сабт(ҷамъи_ҳама(10, 20, 30, 40)); // 100 +чоп.сабт(ҷамъи_ҳама(5)); // 5 +``` + +## 6.3. Доираи функсия + +### 6.3.1. Тағйирёбандаҳои маҳаллӣ + +```somonscript +функсия ҳисоб(): холӣ { + // Тағйирёбандаи маҳаллӣ + тағйирёбанда х: рақам = 10; + чоп.сабт("Дар дохили функсия: " + х); +} + +ҳисоб(); // Дар дохили функсия: 10 +// чоп.сабт(х); // ХАТО! х дар берун намерасад +``` + +### 6.3.2. Тағйирёбандаҳои умумӣ + +```somonscript +// Тағйирёбандаи умумӣ +тағйирёбанда шумора: рақам = 0; + +функсия афзоиш(): холӣ { + шумора++; + чоп.сабт("Шумора: " + шумора); +} + +афзоиш(); // Шумора: 1 +афзоиш(); // Шумора: 2 +афзоиш(); // Шумора: 3 +``` + +## 6.4. Функсияҳои калимаи калидӣ + +### 6.4.1. Функсияи аноним + +```somonscript +// Таъини функсияи аноним ба тағйирёбанда +тағйирёбанда зарб: функсия = функсия(а: рақам, б: рақам): рақам { + бозгашт а * б; +}; + +чоп.сабт(зарб(5, 3)); // 15 +``` + +### 6.4.2. Функсияи тири калон (Arrow Function) + +```somonscript +// Синтаксиси тири калон +тағйирёбанда квадрат: функсия = (х: рақам): рақам => { + бозгашт х * х; +}; + +чоп.сабт(квадрат(5)); // 25 + +// Шакли мухтасар (барои як ифода) +тағйирёбанда дукарат: функсия = (х: рақам): рақам => х * 2; + +чоп.сабт(дукарат(10)); // 20 +``` + +## 6.5. Функсияҳои рекурсивӣ + +Функсияи рекурсивӣ функсияе аст, ки худаш худро садо мезанад. + +```somonscript +// Ҳисоби факториал бо усули рекурсия +функсия факториал(н: рақам): рақам { + агар (н <= 1) { + бозгашт 1; + } + бозгашт н * факториал(н - 1); +} + +чоп.сабт("Факториали 5: " + факториал(5)); // 120 +чоп.сабт("Факториали 6: " + факториал(6)); // 720 + +// Силсилаи Фибоначчӣ +функсия фибоначчӣ(н: рақам): рақам { + агар (н <= 1) { + бозгашт н; + } + бозгашт фибоначчӣ(н - 1) + фибоначчӣ(н - 2); +} + +// Намоиши 10 адади аввали силсилаи Фибоначчӣ +барои (тағйирёбанда и: рақам = 0; и < 10; и++) { + чоп.сабт(`Фибоначчӣ(${и}) = ${фибоначчӣ(и)}`); +} +``` + +## 6.6. Функсияҳои дараҷаи баланд + +Функсияҳои дараҷаи баланд функсияҳое ҳастанд, ки функсияҳои дигарро ҳамчун параметр мегиранд ё функсия бармегардонанд. + +```somonscript +// Функсия ки функсияи дигарро ҳамчун параметр мегирад +функсия амалиёт(а: рақам, б: рақам, амал: функсия): рақам { + бозгашт амал(а, б); +} + +функсия ҷамъ(х: рақам, у: рақам): рақам { + бозгашт х + у; +} + +функсия зарб(х: рақам, у: рақам): рақам { + бозгашт х * у; +} + +чоп.сабт(амалиёт(10, 5, ҷамъ)); // 15 +чоп.сабт(амалиёт(10, 5, зарб)); // 50 +``` + +## 6.7. Функсияҳо бо массивҳо + +### 6.7.1. харита (map) + +```somonscript +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; + +// Дукарат кардани ҳар адад +тағйирёбанда дукаратҳо: рақам[] = ададҳо.харита((х: рақам): рақам => х * 2); +чоп.сабт(дукаратҳо); // [2, 4, 6, 8, 10] +``` + +### 6.7.2. филтр (filter) + +```somonscript +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + +// Интихоби ададҳои ҷуфт +тағйирёбанда ҷуфтҳо: рақам[] = ададҳо.филтр((х: рақам): мантиқӣ => х % 2 === 0); +чоп.сабт(ҷуфтҳо); // [2, 4, 6, 8, 10] +``` + +### 6.7.3. кофтан (reduce) + +```somonscript +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; + +// Ҷамъи ҳамаи элементҳо +тағйирёбанда ҷамъ: рақам = ададҳо.кофтан((акк: рақам, х: рақам): рақам => акк + х, 0); +чоп.сабт("Ҷамъи ҳама: " + ҷамъ); // 15 +``` + +## 6.8. Мисолҳои амалӣ + +### Мисоли 1: Функсия барои санҷиши адади содда + +```somonscript +функсия содда_аст(адад: рақам): мантиқӣ { + агар (адад < 2) { + бозгашт нодуруст; + } + + барои (тағйирёбанда и: рақам = 2; и < адад; и++) { + агар (адад % и === 0) { + бозгашт нодуруст; + } + } + + бозгашт дуруст; +} + +// Санҷиш +чоп.сабт("2 содда аст: " + содда_аст(2)); // дуруст +чоп.сабт("4 содда аст: " + содда_аст(4)); // нодуруст +чоп.сабт("17 содда аст: " + содда_аст(17)); // дуруст +``` + +### Мисоли 2: Калькулятор + +```somonscript +функсия калькулятор(а: рақам, б: рақам, оператор: сатр): рақам { + интихоб (оператор) { + ҳолат "+": + бозгашт а + б; + ҳолат "-": + бозгашт а - б; + ҳолат "*": + бозгашт а * б; + ҳолат "/": + агар (б === 0) { + чоп.сабт("Хато: Тақсим ба сифр!"); + бозгашт 0; + } + бозгашт а / б; + пешфарз: + чоп.сабт("Оператори номаълум!"); + бозгашт 0; + } +} + +чоп.сабт("10 + 5 = " + калькулятор(10, 5, "+")); // 15 +чоп.сабт("10 - 5 = " + калькулятор(10, 5, "-")); // 5 +чоп.сабт("10 * 5 = " + калькулятор(10, 5, "*")); // 50 +чоп.сабт("10 / 5 = " + калькулятор(10, 5, "/")); // 2 +``` + +### Мисоли 3: Коркарди массивҳо + +```somonscript +// Ёфтани калонтарин адад +функсия калонтарин(массив: рақам[]): рақам { + агар (массив.дарозӣ === 0) { + бозгашт 0; + } + + тағйирёбанда макс: рақам = массив[0]; + барои (тағйирёбанда и: рақам = 1; и < массив.дарозӣ; и++) { + агар (массив[и] > макс) { + макс = массив[и]; + } + } + бозгашт макс; +} + +// Ҳисоби миёна +функсия миёна(массив: рақам[]): рақам { + агар (массив.дарозӣ === 0) { + бозгашт 0; + } + + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < массив.дарозӣ; и++) { + ҷамъ += массив[и]; + } + бозгашт ҷамъ / массив.дарозӣ; +} + +тағйирёбанда ададҳо: рақам[] = [10, 25, 5, 30, 15]; +чоп.сабт("Калонтарин: " + калонтарин(ададҳо)); // 30 +чоп.сабт("Миёна: " + миёна(ададҳо)); // 17 +``` + +## 6.9. Хулоса + +Дар ин боб шумо омӯхтед: +- Чӣ тавр функсия эълон кардан +- Кор бо параметрҳо ва қиматҳои бозгаштӣ +- Доираи тағйирёбандаҳо +- Функсияҳои аноним ва тири калон +- Рекурсия +- Функсияҳои дараҷаи баланд + +--- + +**Машқҳо:** + +1. Функсияе нависед, ки рақами саҳифаҳои китобро мегирад ва баҳои китобро ҳисоб мекунад (ҳар саҳифа 100 дирам) +2. Функсияи рекурсивӣ эҷод кунед, ки ҷамъи ададҳоро аз 1 то н ҳисоб мекунад +3. Функсияе нависед, ки массиви ададҳоро мегирад ва танҳо ададҳои тоқро бармегардонад +4. Калькулятори пешрафтатар созед, ки амалиётҳои зиёдро дастгирӣ мекунад (квадрат, дараҷа, ва ғайра) diff --git "a/book/07-\320\276\320\261\321\212\320\265\320\272\321\202\322\263\320\276-\320\262\320\260-\320\274\320\260\321\201\321\201\320\270\320\262\322\263\320\276.md" "b/book/07-\320\276\320\261\321\212\320\265\320\272\321\202\322\263\320\276-\320\262\320\260-\320\274\320\260\321\201\321\201\320\270\320\262\322\263\320\276.md" new file mode 100644 index 0000000..1b9861f --- /dev/null +++ "b/book/07-\320\276\320\261\321\212\320\265\320\272\321\202\322\263\320\276-\320\262\320\260-\320\274\320\260\321\201\321\201\320\270\320\262\322\263\320\276.md" @@ -0,0 +1,370 @@ +# Боби 7: Объектҳо ва массивҳо + +## 7.1. Массивҳо + +Массив - ин маҷмӯи тартибдодаи элементҳо аст, ки ба воситаи индекс дастрас мешаванд. + +### 7.1.1. Эҷоди массив + +```somonscript +// Массиви холӣ +тағйирёбанда массив1: рақам[] = []; + +// Массив бо элементҳо +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; +тағйирёбанда номҳо: сатр[] = ["Аҳмад", "Фотима", "Ҳасан"]; +тағйирёбанда муxtалif: ҳар[] = [1, "сатр", дуруст, 3.14]; + +чоп.сабт(ададҳо); // [1, 2, 3, 4, 5] +чоп.сабт(номҳо); // ["Аҳмад", "Фотима", "Ҳасан"] +``` + +### 7.1.2. Дастрасӣ ба элементҳо + +```somonscript +тағйирёбанда мевahо: сатр[] = ["себ", "банан", "ангур", "шафтолӣ"]; + +// Дастрасӣ бо индекс (индекс аз 0 оғоз мешавад) +чоп.сабт(мевahо[0]); // себ +чоп.сабт(мевaҳо[2]); // ангур + +// Элементи охирин +чоп.сабт(мевaҳо[мевaҳо.дарозӣ - 1]); // шафтолӣ +``` + +### 7.1.3. Тағйир додани элементҳо + +```somonscript +тағйирёбанда рақамҳо: рақам[] = [10, 20, 30]; + +рақамҳо[0] = 15; +рақамҳо[1] = 25; + +чоп.сабт(рақамҳо); // [15, 25, 30] +``` + +### 7.1.4. Дарозии массив + +```somonscript +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; +чоп.сабт("Дарозӣ: " + ададҳо.дарозӣ); // Дарозӣ: 5 +``` + +### 7.1.5. Усулҳои массив + +```somonscript +тағйирёбанда рӯйхат: рақам[] = [1, 2, 3]; + +// илова - илова кардани элемент ба охир +рӯйхат.илова(4); +рӯйхат.илова(5); +чоп.сабт(рӯйхат); // [1, 2, 3, 4, 5] + +// баровардан - хориҷ кардани элементи охирин +тағйирёбанда охирин: рақам = рӯйхат.баровардан(); +чоп.сабт("Охирин: " + охирин); // Охирин: 5 +чоп.сабт(рӯйхат); // [1, 2, 3, 4] +``` + +### 7.1.6. Гузариш ба массив + +```somonscript +тағйирёбанда номҳо: сатр[] = ["Аҳмад", "Фотима", "Ҳасан", "Марям"]; + +// Бо давраи барои +чоп.сабт("=== Феҳристи донишҷӯён ==="); +барои (тағйирёбанда и: рақам = 0; и < номҳо.дарозӣ; и++) { + чоп.сабт(`${и + 1}. ${номҳо[и]}`); +} +``` + +### 7.1.7. Харита, филтр ва кофтан + +```somonscript +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; + +// харита - табдил додани ҳар элемент +тағйирёбанда квадратҳо: рақам[] = ададҳо.харита((х: рақам): рақам => х * х); +чоп.сабт(квадратҳо); // [1, 4, 9, 16, 25] + +// филтр - интихоби элементҳо аз рӯи шарт +тағйирёбанда ҷуфтҳо: рақам[] = ададҳо.филтр((х: рақам): мантиқӣ => х % 2 === 0); +чоп.сабт(ҷуфтҳо); // [2, 4] + +// кофтан - кам кардан ба як қимат +тағйирёбанда ҷамъ: рақам = ададҳо.кофтан((акк: рақам, х: рақам): рақам => акк + х, 0); +чоп.сабт("Ҷамъ: " + ҷамъ); // Ҷамъ: 15 +``` + +## 7.2. Объектҳо + +Объект - ин маҷмӯи хосиятҳо аст, ки ҳар яке дорои калид ва қимат аст. + +### 7.2.1. Эҷоди объект + +```somonscript +// Объекти холӣ +тағйирёбанда объ1: объект = {}; + +// Объект бо хосиятҳо +тағйирёбанда шахс: объект = { + ном: "Аҳмад", + фамилия: "Раҳимов", + синну_сол: 25, + шаҳр: "Душанбе" +}; + +чоп.сабт(шахс); +``` + +### 7.2.2. Дастрасӣ ба хосиятҳо + +```somonscript +тағйирёбанда китоб: объект = { + ном: "Барномасозӣ бо SomonScript", + муаллиф: "Аҳмад Раҳимов", + сол: 2024, + саҳифаҳо: 350 +}; + +// Дастрасӣ бо нуқта +чоп.сабт("Ном: " + китоб.ном); +чоп.сабт("Муаллиф: " + китоб.муаллиф); + +// Дастрасӣ бо қавсҳои квадратӣ +чоп.сабт("Сол: " + китоб["сол"]); +чоп.сабт("Саҳифаҳо: " + китоб["саҳифаҳо"]); +``` + +### 7.2.3. Тағйир ва илова кардани хосиятҳо + +```somonscript +тағйирёбанда донишҷӯ: объект = { + ном: "Фотима", + синну_сол: 20 +}; + +// Тағйир додан +донишҷӯ.синну_сол = 21; + +// Илова кардан +донишҷӯ.донишкада = "Математика"; +донишҷӯ.курс = 3; + +чоп.сабт(донишҷӯ); +``` + +### 7.2.4. Объектҳо бо усулҳо + +```somonscript +тағйирёбанда ҳисоб: объект = { + балансвладелец: "Аҳмад Раҳимов", + баланс: 1000, + + депозит: функсия(маблағ: рақам): холӣ { + ин.баланс += маблағ; + чоп.сабт(`Депозит: ${маблағ}. Нави баланс: ${ин.баланс}`); + }, + + бардоштан: функсия(маблағ: рақам): холӣ { + агар (маблағ <= ин.баланс) { + ин.баланс -= маблағ; + чоп.сабт(`Бардошт: ${маблағ}. Нави баланс: ${ин.баланс}`); + } вагарна { + чоп.сабт("Маблағи нокифоя!"); + } + }, + + намоиш: функсия(): холӣ { + чоп.сабт(`Ҳисоби ${ин.соҳиб}: ${ин.баланс} сомонӣ`); + } +}; + +ҳисоб.намоиш(); +ҳисоб.депозит(500); +ҳисоб.бардоштан(200); +ҳисоб.намоиш(); +``` + +### 7.2.5. Гузариш ба хосиятҳои объект + +```somonscript +тағйирёбанда донишҷӯ: объект = { + ном: "Ҳасан", + синну_сол: 22, + донишкада: "Физика", + курс: 4 +}; + +// Калидҳо - рӯйхати калидҳо +тағйирёбанда калидҳо: сатр[] = Объект.калидҳо(донишҷӯ); +барои (тағйирёбанда и: рақам = 0; и < калидҳо.дарозӣ; и++) { + тағйирёбанда калид: сатр = калидҳо[и]; + чоп.сабт(`${калид}: ${донишҷӯ[калид]}`); +} + +// Қиматҳо - рӯйхати қиматҳо +тағйирёбанда қиматҳо: ҳар[] = Объект.қиматҳо(донишҷӯ); +чоп.сабт("Қиматҳо: " + қиматҳо); +``` + +## 7.3. Массивҳои объектҳо + +```somonscript +// Рӯйхати донишҷӯён +тағйирёбанда донишҷӯён: объект[] = [ + { + ном: "Аҳмад", + синну_сол: 20, + бахо: 4.5 + }, + { + ном: "Фотима", + синну_сол: 19, + бахо: 4.8 + }, + { + ном: "Ҳасан", + синну_сол: 21, + бахо: 4.2 + } +]; + +// Намоиши маълумот +чоп.сабт("=== Рӯйхати донишҷӯён ==="); +барои (тағйирёбанда и: рақам = 0; и < донишҷӯён.дарозӣ; и++) { + тағйирёбанда д: объект = донишҷӯён[и]; + чоп.сабт(`${и + 1}. ${д.ном} (${д.синну_сол} сол) - Бахо: ${д.бахо}`); +} + +// Ҳисоби миёнаи бахо +тағйирёбанда ҷамъи_бахоҳо: рақам = 0; +барои (тағйирёбанда и: рақам = 0; и < донишҷӯён.дарозӣ; и++) { + ҷамъи_бахоҳо += донишҷӯён[и].бахо; +} +тағйирёбанда миёна: рақам = ҷамъи_бахоҳо / донишҷӯён.дарозӣ; +чоп.сабт(`Миёнаи бахо: ${миёна}`); +``` + +## 7.4. Мисолҳои амалӣ + +### Мисоли 1: Китобхона + +```somonscript +тағйирёбанда китобҳо: объект[] = [ + { ном: "Шоҳнома", муаллиф: "Фирдавсӣ", сол: 1010, саҳифаҳо: 800 }, + { ном: "Гулистон", муаллиф: "Саъдӣ", сол: 1258, саҳифаҳо: 200 }, + { ном: "Бӯстон", муаллиф: "Саъдӣ", сол: 1257, саҳифаҳо: 180 } +]; + +функсия намоиши_китобҳо(китобҳо: объект[]): холӣ { + чоп.сабт("=== Китобхона ==="); + барои (тағйирёбанда и: рақам = 0; и < китобҳо.дарозӣ; и++) { + тағйирёбанда к: объект = китобҳо[и]; + чоп.сабт(`${и + 1}. "${к.ном}" - ${к.муаллиф} (${к.сол})`); + чоп.сабт(` Саҳифаҳо: ${к.саҳифаҳо}`); + } +} + +функсия ҷустуҷӯи_китоб(китобҳо: объект[], ном: сатр): объект | холӣ { + барои (тағйирёбанда и: рақам = 0; и < китобҳо.дарозӣ; и++) { + агар (китобҳо[и].ном === ном) { + бозгашт китобҳо[и]; + } + } + бозгашт холӣ; +} + +намоиши_китобҳо(китобҳо); + +тағйирёбанда китоб: объект | холӣ = ҷустуҷӯи_китоб(китобҳо, "Гулистон"); +агар (китоб !== холӣ) { + чоп.сабт(`\nКитоб ёфт шуд: ${китоб.ном} - ${китоб.муаллиф}`); +} +``` + +### Мисоли 2: Системаи идораи донишҷӯён + +```somonscript +тағйирёбанда синф: объект = { + ном: "Синфи 11-А", + донишҷӯён: [], + + илова_кардан: функсия(ном: сатр, синну_сол: рақам): холӣ { + тағйирёбанда донишҷӯ: объект = { + ном: ном, + синну_сол: синну_сол, + бахоҳо: [] + }; + ин.донишҷӯён.илова(донишҷӯ); + чоп.сабт(`Донишҷӯ ${ном} илова карда шуд`); + }, + + илова_кардани_бахо: функсия(номи_донишҷӯ: сатр, бахо: рақам): холӣ { + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + агар (ин.донишҷӯён[и].ном === номи_донишҷӯ) { + ин.донишҷӯён[и].бахоҳо.илова(бахо); + чоп.сабт(`Бахо ${бахо} ба ${номи_донишҷӯ} илова карда шуд`); + бозгашт; + } + } + чоп.сабт("Донишҷӯ ёфт нашуд!"); + }, + + ҳисоби_миёна: функсия(номи_донишҷӯ: сатр): рақам { + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + агар (ин.донишҷӯён[и].ном === номи_донишҷӯ) { + тағйирёбанда бахоҳо: рақам[] = ин.донишҷӯён[и].бахоҳо; + агар (бахоҳо.дарозӣ === 0) бозгашт 0; + + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда ҷ: рақам = 0; ҷ < бахоҳо.дарозӣ; ҷ++) { + ҷамъ += бахоҳо[ҷ]; + } + бозгашт ҷамъ / бахоҳо.дарозӣ; + } + } + бозгашт 0; + }, + + намоиш: функсия(): холӣ { + чоп.сабт(`\n=== ${ин.ном} ===`); + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + тағйирёбанда д: объект = ин.донишҷӯён[и]; + тағйирёбанда миёна: рақам = ин.ҳисоби_миёна(д.ном); + чоп.сабт(`${и + 1}. ${д.ном} (${д.синну_сол} сол) - Миёна: ${миёна}`); + } + } +}; + +// Истифодаи система +синф.илова_кардан("Аҳмад", 17); +синф.илова_кардан("Фотима", 16); + +синф.илова_кардани_бахо("Аҳмад", 5); +синф.илова_кардани_бахо("Аҳмад", 4); +синф.илова_кардани_бахо("Аҳмад", 5); + +синф.илова_кардани_бахо("Фотима", 5); +синф.илова_кардани_бахо("Фотима", 5); + +синф.намоиш(); +``` + +## 7.5. Хулоса + +Дар ин боб шумо омӯхтед: +- Кор бо массивҳо ва усулҳои онҳо +- Эҷод ва коркарди объектҳо +- Гузариш ба массивҳо ва объектҳо +- Массивҳои объектҳо +- Усулҳои харита, филтр ва кофтан + +--- + +**Машқҳо:** + +1. Массиве эҷод кунед, ки 10 адади тасодуфӣ дорад ва калонтарин ва хурдтарин ададҳоро пайдо кунед +2. Объекте барои автомобил созед бо хосиятҳо ва усулҳо (оғоз кардан, истодан, тезонидан) +3. Рӯйхати донишҷӯён бо номҳо ва бахоҳо эҷод кунед ва донишҷӯёни бо бахои болои 4.5 -ро пайдо кунед +4. Системаи рӯйхати харидҳо созед, ки метавонед мол илова/нест кунед ва ҷамъи қиматро ҳисоб кунед diff --git "a/book/08-\321\201\320\270\320\275\321\204\322\263\320\276-\320\262\320\260-\320\276\320\276\320\277.md" "b/book/08-\321\201\320\270\320\275\321\204\322\263\320\276-\320\262\320\260-\320\276\320\276\320\277.md" new file mode 100644 index 0000000..32876d7 --- /dev/null +++ "b/book/08-\321\201\320\270\320\275\321\204\322\263\320\276-\320\262\320\260-\320\276\320\276\320\277.md" @@ -0,0 +1,460 @@ +# Боби 8: Синфҳо ва барномасозии объектӣ-мутамарказ (ООП) + +## 8.1. Муқаддима ба синфҳо + +Синф - ин қолабе аст, ки объектҳоро тавсиф мекунад. Он хосиятҳо (маълумот) ва усулҳо (рафтор) -ро дар худ муттаҳид мекунад. + +### 8.1.1. Эҷоди синфи оддӣ + +```somonscript +синф Шахс { + // Хосиятҳои хосусӣ + хосусӣ ном: сатр; + хосусӣ синну_сол: рақам; + + // Конструктор + конструктор(ном: сатр, синну_сол: рақам) { + ин.ном = ном; + ин.синну_сол = синну_сол; + } + + // Усулҳои ҷамъиятӣ + ҷамъиятӣ гирифтани_ном(): сатр { + бозгашт ин.ном; + } + + ҷамъиятӣ гирифтани_синну_сол(): рақам { + бозгашт ин.синну_сол; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт(`Ном: ${ин.ном}, Синну сол: ${ин.синну_сол}`); + } +} + +// Эҷоди намуд (instance) +тағйирёбанда шахс1 = нав Шахс("Аҳмад", 25); +тағйирёбанда шахс2 = нав Шахс("Фотима", 22); + +шахс1.намоиш(); // Ном: Аҳмад, Синну сол: 25 +шахс2.намоиш(); // Ном: Фотима, Синну сол: 22 +``` + +## 8.2. Дастрасӣ ба хосиятҳо ва усулҳо + +### 8.2.1. Сатҳҳои дастрасӣ + +```somonscript +синф Ҳисоби_банкӣ { + // Хосусӣ - танҳо дар дохили синф дастрас + хосусӣ баланс: рақам; + хосусӣ рақами_ҳисоб: сатр; + + // Ҷамъиятӣ - ба ҳама дастрас + ҷамъиятӣ соҳиб: сатр; + + конструктор(соҳиб: сатр, рақами_ҳисоб: сатр) { + ин.соҳиб = соҳиб; + ин.рақами_ҳисоб = рақами_ҳисоб; + ин.баланс = 0; + } + + ҷамъиятӣ депозит(маблағ: рақам): холӣ { + ин.баланс += маблағ; + чоп.сабт(`Депозит: ${маблағ}. Баланс: ${ин.баланс}`); + } + + ҷамъиятӣ бардоштан(маблағ: рақам): мантиқӣ { + агар (маблағ <= ин.баланс) { + ин.баланс -= маблағ; + чоп.сабт(`Бардошт: ${маблағ}. Баланс: ${ин.баланс}`); + бозгашт дуруст; + } вагарна { + чоп.сабт("Маблағи нокифоя!"); + бозгашт нодуруст; + } + } + + ҷамъиятӣ гирифтани_баланс(): рақам { + бозгашт ин.баланс; + } +} + +тағйирёбанда ҳисоб = нав Ҳисоби_банкӣ("Аҳмад Раҳимов", "TJ1234567890"); +ҳисоб.депозит(1000); +ҳисоб.бардоштан(200); +чоп.сабт(`Баланс: ${ҳисоб.гирифтани_баланс()}`); +``` + +## 8.3. Меросбарӣ (Inheritance) + +Меросбарӣ имкон медиҳад, ки синфи нав хосиятҳо ва усулҳои синфи мавҷударо гирад. + +```somonscript +// Синфи асосӣ (базавӣ) +синф Ҳайвон { + хосусӣ ном: сатр; + + конструктор(ном: сатр) { + ин.ном = ном; + } + + ҷамъиятӣ овоз_додан(): холӣ { + чоп.сабт("Ҳайвон овоз медиҳад"); + } + + ҷамъиятӣ гирифтани_ном(): сатр { + бозгашт ин.ном; + } +} + +// Синфи меросбар +синф Саг мерос Ҳайвон { + хосусӣ зот: сатр; + + конструктор(ном: сатр, зот: сатр) { + супер(ном); // Садо кардани конструктори синфи асосӣ + ин.зот = зот; + } + + // Аз нав муайян кардани усул (Override) + ҷамъиятӣ овоз_додан(): холӣ { + чоп.сабт(`${ин.гирифтани_ном()} мегӯяд: Вов-вов!`); + } + + ҷамъиятӣ гирифтани_зот(): сатр { + бозгашт ин.зот; + } +} + +синф Гурба мерос Ҳайвон { + конструктор(ном: сатр) { + супер(ном); + } + + ҷамъиятӣ овоз_додан(): холӣ { + чоп.сабт(`${ин.гирифтани_ном()} мегӯяд: Мяу-мяу!`); + } +} + +// Истифода +тағйирёбанда саг = нав Саг("Рекс", "Овчарка"); +тағйирёбанда гурба = нав Гурба("Мурка"); + +саг.овоз_додан(); // Рекс мегӯяд: Вов-вов! +гурба.овоз_додан(); // Мурка мегӯяд: Мяу-мяу! +``` + +## 8.4. Интерфейсҳо + +Интерфейс контракте аст, ки синф бояд риоя кунад. + +```somonscript +// Таърифи интерфейс +интерфейс Ҳаракаткунанда { + ҳаракат_кардан(): холӣ; + истодан(): холӣ; +} + +// Татбиқи интерфейс +синф Автомобил татбиқ Ҳаракаткунанда { + хосусӣ номбаланд: сатр; + хосусӣ тезӣ: рақам; + + конструктор(номбаланд: сатр) { + ин.номбаланд = номбаланд; + ин.тезӣ = 0; + } + + ҷамъиятӣ ҳаракат_кардан(): холӣ { + ин.тезӣ = 60; + чоп.сабт(`${ин.номбаланд} ҳаракат кард. Тезӣ: ${ин.тезӣ} км/с`); + } + + ҷамъиятӣ истодан(): холӣ { + ин.тезӣ = 0; + чоп.сабт(`${ин.номбаланд} истод`); + } + + ҷамъиятӣ тезонидан(): холӣ { + ин.тезӣ += 20; + чоп.сабт(`Тезӣ: ${ин.тезӣ} км/с`); + } +} + +тағйирёбанда мошин = нав Автомобил("Toyota"); +мошин.ҳаракат_кардан(); +мошин.тезонидан(); +мошин.истодан(); +``` + +## 8.5. Синфҳои мавҳум (Abstract Classes) + +Синфи мавҳум синфе аст, ки наметавон аз он мустақиман намуд эҷод кард. + +```somonscript +// Синфи мавҳум +мавҳум синф Шакл { + хосусӣ ранг: сатр; + + конструктор(ранг: сатр) { + ин.ранг = ранг; + } + + // Усули мавҳум - бояд дар синфҳои меросбар татбиқ шавад + мавҳум майдон(): рақам; + мавҳум периметр(): рақам; + + ҷамъиятӣ гирифтани_ранг(): сатр { + бозгашт ин.ранг; + } +} + +// Татбиқи синфи мавҳум +синф Тӯртбурчӣ мерос Шакл { + хосусӣ паҳнӣ: рақам; + хосусӣ баландӣ: рақам; + + конструктор(паҳнӣ: рақам, баландӣ: рақам, ранг: сатр) { + супер(ранг); + ин.паҳнӣ = паҳнӣ; + ин.баландӣ = баландӣ; + } + + ҷамъиятӣ майдон(): рақам { + бозгашт ин.паҳнӣ * ин.баландӣ; + } + + ҷамъиятӣ периметр(): рақам { + бозгашт 2 * (ин.паҳнӣ + ин.баландӣ); + } +} + +синф Доира мерос Шакл { + хосусӣ радиус: рақам; + собит ПИ: рақам = 3.14159; + + конструктор(радиус: рақам, ранг: сатр) { + супер(ранг); + ин.радиус = радиус; + } + + ҷамъиятӣ майдон(): рақам { + бозгашт Доира.ПИ * ин.радиус * ин.радиус; + } + + ҷамъиятӣ периметр(): рақам { + бозгашт 2 * Доира.ПИ * ин.радиус; + } +} + +// Истифода +тағйирёбанда тӯртбурчӣ = нав Тӯртбурчӣ(5, 10, "сурх"); +тағйирёбанда доира = нав Доира(7, "кабуд"); + +чоп.сабт(`Майдони тӯртбурчӣ: ${тӯртбурчӣ.майдон()}`); +чоп.сабт(`Периметри доира: ${доира.периметр()}`); +``` + +## 8.6. Хосиятҳо ва усулҳои статикӣ + +Хосиятҳо ва усулҳои статикӣ ба худи синф тааллуқ доранд, на ба намудҳои он. + +```somonscript +синф Математика { + статикӣ ПИ: рақам = 3.14159; + статикӣ Е: рақам = 2.71828; + + статикӣ макс(а: рақам, б: рақам): рақам { + бозгашт а > б ? а : б; + } + + статикӣ мин(а: рақам, б: рақам): рақам { + бозгашт а < б ? а : б; + } + + статикӣ майдони_доира(радиус: рақам): рақам { + бозгашт Математика.ПИ * радиус * радиус; + } + + статикӣ дараҷа(адад: рақам, дараҷа: рақам): рақам { + бозгашт адад ** дараҷа; + } +} + +// Истифодаи усулҳои статикӣ (бе эҷоди намуд) +чоп.сабт("ПИ: " + Математика.ПИ); +чоп.сабт("Макс(10, 5): " + Математика.макс(10, 5)); +чоп.сабт("Майдони доира: " + Математика.майдони_доира(5)); +чоп.сабт("2^3: " + Математика.дараҷа(2, 3)); +``` + +## 8.7. Мисолҳои амалӣ + +### Мисоли 1: Системаи идораи китобхона + +```somonscript +синф Китоб { + хосусӣ номбаланд: сатр; + хосусӣ муаллиф: сатр; + хосусӣ ISBN: сатр; + хосусӣ қарз_дода_шудааст: мантиқӣ; + + конструктор(ном: сатр, муаллиф: сатр, ISBN: сатр) { + ин.ном = ном; + ин.муаллиф = муаллиф; + ин.ISBN = ISBN; + ин.қарз_дода_шудааст = нодуруст; + } + + ҷамъиятӣ қарз_додан(): мантиқӣ { + агар (!ин.қарз_дода_шудааст) { + ин.қарз_дода_шудааст = дуруст; + бозгашт дуруст; + } + бозгашт нодуруст; + } + + ҷамъиятӣ баргардондан(): холӣ { + ин.қарз_дода_шудааст = нодуруст; + } + + ҷамъиятӣ дастрас_аст(): мантиқӣ { + бозгашт !ин.қарз_дода_шудааст; + } + + ҷамъиятӣ намоиш(): холӣ { + тағйирёбанда ҳолат: сатр = ин.қарз_дода_шудааст ? "Қарз дода шуд" : "Дастрас"; + чоп.сабт(`"${ин.ном}" - ${ин.муаллиф} [${ҳолат}]`); + } +} + +синф Китобхона { + хосусӣ ном: сатр; + хосусӣ китобҳо: Китоб[]; + + конструктор(ном: сатр) { + ин.ном = ном; + ин.китобҳо = []; + } + + ҷамъиятӣ илова_кардани_китоб(китоб: Китоб): холӣ { + ин.китобҳо.илова(китоб); + чоп.сабт(`Китоб "${китоб.гирифтани_ном()}" илова карда шуд`); + } + + ҷамъиятӣ намоиши_китобҳо(): холӣ { + чоп.сабт(`\n=== Китобхонаи "${ин.ном}" ===`); + барои (тағйирёбанда и: рақам = 0; и < ин.китобҳо.дарозӣ; и++) { + чоп.сабт(`${и + 1}. `); + ин.китобҳо[и].намоиш(); + } + } +} + +// Истифода +тағйирёбанда китобхона = нав Китобхона("Китобхонаи миллӣ"); + +тағйирёбанда китоб1 = нав Китоб("Шоҳнома", "Фирдавсӣ", "123-456"); +тағйирёбанда китоб2 = нав Китоб("Гулистон", "Саъдӣ", "789-012"); + +китобхона.илова_кардани_китоб(китоб1); +китобхона.илова_кардани_китоб(китоб2); + +китоб1.қарз_додан(); +китобхона.намоиши_китобҳо(); +``` + +### Мисоли 2: Системаи идораи донишҷӯён + +```somonscript +мавҳум синф Шахс { + муҳофизатшуда ном: сатр; + муҳофизатшуда синну_сол: рақам; + + конструктор(ном: сатр, синну_сол: рақам) { + ин.ном = ном; + ин.синну_сол = синну_сол; + } + + мавҳум намоиш(): холӣ; +} + +синф Донишҷӯ мерос Шахс { + хосусӣ рақами_донишҷӯӣ: сатр; + хосусӣ донишкада: сатр; + хосусӣ бахоҳо: рақам[]; + + конструктор(ном: сатр, синну_сол: рақам, рақами_донишҷӯӣ: сатр, донишкада: сатр) { + супер(ном, синну_сол); + ин.рақами_донишҷӯӣ = рақами_донишҷӯӣ; + ин.донишкада = донишкада; + ин.бахоҳо = []; + } + + ҷамъиятӣ илова_кардани_бахо(бахо: рақам): холӣ { + ин.бахоҳо.илова(бахо); + } + + ҷамъиятӣ ҳисоби_миёна(): рақам { + агар (ин.бахоҳо.дарозӣ === 0) бозгашт 0; + тағйирёбанда ҷамъ: рақам = ин.бахоҳо.кофтан((а: рақам, б: рақам): рақам => а + б, 0); + бозгашт ҷамъ / ин.бахоҳо.дарозӣ; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт(`Донишҷӯ: ${ин.ном} (${ин.синну_сол} сол)`); + чоп.сабт(`Рақами донишҷӯӣ: ${ин.рақами_донишҷӯӣ}`); + чоп.сабт(`Донишкада: ${ин.донишкада}`); + чоп.сабт(`Миёнаи бахо: ${ин.ҳисоби_миёна()}`); + } +} + +синф Устод мерос Шахс { + хосусӣ фанн: сатр; + хосусӣ таҷриба: рақам; + + конструктор(ном: сатр, синну_сол: рақам, фанн: сатр, таҷриба: рақам) { + супер(ном, синну_сол); + ин.фанн = фанн; + ин.таҷриба = таҷриба; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт(`Устод: ${ин.ном} (${ин.синну_сол} сол)`); + чоп.сабт(`Фанн: ${ин.фанн}`); + чоп.сабт(`Таҷриба: ${ин.таҷриба} сол`); + } +} + +// Истифода +тағйирёбанда донишҷӯ = нав Донишҷӯ("Аҳмад Раҳимов", 20, "D12345", "Математика"); +донишҷӯ.илова_кардани_бахо(5); +донишҷӯ.илова_кардани_бахо(4); +донишҷӯ.илова_кардани_бахо(5); +донишҷӯ.намоиш(); + +чоп.сабт(""); + +тағйирёбанда устод = нав Устод("Фаридун Каримов", 45, "Физика", 20); +устод.намоиш(); +``` + +## 8.8. Хулоса + +Дар ин боб шумо омӯхтед: +- Эҷод ва истифодаи синфҳо +- Сатҳҳои дастрасӣ (хосусӣ, ҷамъиятӣ, муҳофизатшуда) +- Меросбарӣ ва аз нав муайянкунӣ +- Интерфейсҳо +- Синфҳои мавҳум +- Усулҳо ва хосиятҳои статикӣ + +--- + +**Машқҳо:** + +1. Синфе эҷод кунед барои "Автомобил" бо хосиятҳо (ном, модел, тезӣ) ва усулҳо (оғоз, истодан, тезонидан) +2. Синфе барои "Ҳисоби банкӣ" созед, ки амалиёти депозит, бардошт ва гузаронидани маблағро иҷро мекунад +3. Системаи меросбарии "Ҳайвон" → "Парранда" → "Тӯтӣ" созед +4. Интерфейси "Чоп кунанда" эҷод кунед ва онро дар якчанд синф татбиқ кунед diff --git "a/book/09-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\274\320\276\320\264\321\203\320\273\322\263\320\276.md" "b/book/09-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\274\320\276\320\264\321\203\320\273\322\263\320\276.md" new file mode 100644 index 0000000..3ce319c --- /dev/null +++ "b/book/09-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\274\320\276\320\264\321\203\320\273\322\263\320\276.md" @@ -0,0 +1,362 @@ +# Боби 9: Системаи модулҳо + +## 9.1. Муқаддима ба модулҳо + +Модулҳо имкон медиҳанд, ки кодро ба қисмҳои ҷудогона тақсим кунед ва дар файлҳои гуногун нигоҳ доред. Ин кодро мураттаб, аз нав истифодашаванда ва осон барои идоракунӣ мегардонад. + +## 9.2. Содир кардан (Export) + +### 9.2.1. Содири оддӣ + +```somonscript +// math-utils.som +содир функсия ҷамъ(а: рақам, б: рақам): рақам { + бозгашт а + б; +} + +содир функсия зарб(а: рақам, б: рақам): рақам { + бозгашт а * б; +} + +содир собит ПИ: рақам = 3.14159; +``` + +### 9.2.2. Содири якҷояи чанд элемент + +```somonscript +// string-utils.som +функсия калон_кардан(сатр: сатр): сатр { + бозгашт сатр.toUpperCase(); +} + +функсия хурд_кардан(сатр: сатр): сатр { + бозгашт сатр.toLowerCase(); +} + +функсия баръакс_кардан(сатр: сатр): сатр { + бозгашт сатр.split('').reverse().join(''); +} + +// Содири якҷоя +содир { калон_кардан, хурд_кардан, баръакс_кардан }; +``` + +### 9.2.3. Содири пешфарз + +```somonscript +// calculator.som +функсия ҳисоб_кардан(а: рақам, б: рақам, амал: сатр): рақам { + интихоб (амал) { + ҳолат "+": бозгашт а + б; + ҳолат "-": бозгашт а - б; + ҳолат "*": бозгашт а * б; + ҳолат "/": бозгашт а / б; + пешфарз: бозгашт 0; + } +} + +содир пешфарз ҳисоб_кардан; +``` + +## 9.3. Ворид кардан (Import) + +### 9.3.1. Вориди оддӣ + +```somonscript +// main.som +ворид { ҷамъ, зарб, ПИ } аз "./math-utils.som"; + +тағйирёбанда натиҷа: рақам = ҷамъ(10, 20); +чоп.сабт("Ҷамъ: " + натиҷа); // 30 + +чоп.сабт("ПИ: " + ПИ); // 3.14159 +``` + +### 9.3.2. Вориди пешфарз + +```somonscript +// main.som +ворид ҳисоб_кардан аз "./calculator.som"; + +тағйирёбанда натиҷа: рақам = ҳисоб_кардан(10, 5, "+"); +чоп.сабт(натиҷа); // 15 +``` + +### 9.3.3. Вориди ҳамаи чиз + +```somonscript +// main.som +ворид * чун математика аз "./math-utils.som"; + +чоп.сабт(математика.ҷамъ(5, 3)); // 8 +чоп.сабт(математика.ПИ); // 3.14159 +``` + +### 9.3.4. Вориди бо номи дигар + +```somonscript +// main.som +ворид { ҷамъ чун ҷамъ_кардан, зарб чун зарб_кардан } аз "./math-utils.som"; + +чоп.сабт(ҷамъ_кардан(10, 20)); // 30 +чоп.сабт(зарб_кардан(5, 6)); // 30 +``` + +## 9.4. Мисолҳои амалӣ + +### Мисоли 1: Модули математикӣ + +```somonscript +// math.som +содир собит ПИ: рақам = 3.14159; +содир собит Е: рақам = 2.71828; + +содир функсия квадрат(х: рақам): рақам { + бозгашт х * х; +} + +содир функсия куб(х: рақам): рақам { + бозгашт х * х * х; +} + +содир функсия факториал(н: рақам): рақам { + агар (н <= 1) бозгашт 1; + бозгашт н * факториал(н - 1); +} + +содир функсия дараҷа(асос: рақам, дараҷа: рақам): рақам { + бозгашт асос ** дараҷа; +} +``` + +```somonscript +// main.som +ворид { квадрат, куб, факториал, дараҷа, ПИ } аз "./math.som"; + +чоп.сабт("Квадрати 5: " + квадрат(5)); +чоп.сабт("Куби 3: " + куб(3)); +чоп.сабт("Факториали 5: " + факториал(5)); +чоп.сабт("2^8: " + дараҷа(2, 8)); +чоп.сабт("ПИ: " + ПИ); +``` + +### Мисоли 2: Модули коркарди массивҳо + +```somonscript +// array-utils.som +содир функсия калонтарин(массив: рақам[]): рақам { + агар (массив.дарозӣ === 0) бозгашт 0; + + тағйирёбанда макс: рақам = массив[0]; + барои (тағйирёбанда и: рақам = 1; и < массив.дарозӣ; и++) { + агар (массив[и] > макс) { + макс = массив[и]; + } + } + бозгашт макс; +} + +содир функсия хурдтарин(массив: рақам[]): рақам { + агар (массив.дарозӣ === 0) бозгашт 0; + + тағйирёбанда мин: рақам = массив[0]; + барои (тағйирёбанда и: рақам = 1; и < массив.дарозӣ; и++) { + агар (массив[и] < мин) { + мин = массив[и]; + } + } + бозгашт мин; +} + +содир функсия миёна(массив: рақам[]): рақам { + агар (массив.дарозӣ === 0) бозгашт 0; + + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < массив.дарозӣ; и++) { + ҷамъ += массив[и]; + } + бозгашт ҷамъ / массив.дарозӣ; +} + +содир функсия ҷамъи_ҳама(массив: рақам[]): рақам { + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < массив.дарозӣ; и++) { + ҷамъ += массив[и]; + } + бозгашт ҷамъ; +} +``` + +```somonscript +// main.som +ворид { калонтарин, хурдтарин, миёна, ҷамъи_ҳама } аз "./array-utils.som"; + +тағйирёбанда ададҳо: рақам[] = [10, 25, 5, 30, 15, 20]; + +чоп.сабт("Массив: " + ададҳо); +чоп.сабт("Калонтарин: " + калонтарин(ададҳо)); +чоп.сабт("Хурдтарин: " + хурдтарин(ададҳо)); +чоп.сабт("Миёна: " + миёна(ададҳо)); +чоп.сабт("Ҷамъи ҳама: " + ҷамъи_ҳама(ададҳо)); +``` + +### Мисоли 3: Модули идораи корбарон + +```somonscript +// user-manager.som +содир синф Корбар { + хосусӣ ном: сатр; + хосусӣ email: сатр; + хосусӣ синну_сол: рақам; + + конструктор(ном: сатр, email: сатр, синну_сол: рақам) { + ин.ном = ном; + ин.email = email; + ин.синну_сол = синну_сол; + } + + ҷамъиятӣ гирифтани_ном(): сатр { + бозгашт ин.ном; + } + + ҷамъиятӣ гирифтани_email(): сатр { + бозгашт ин.email; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт(`Корбар: ${ин.ном} (${ин.email}) - ${ин.синну_сол} сол`); + } +} + +содир синф Идоракунандаи_корбарон { + хосусӣ корбарон: Корбар[]; + + конструктор() { + ин.корбарон = []; + } + + ҷамъиятӣ илова_кардан(корбар: Корбар): холӣ { + ин.корбарон.илова(корбар); + чоп.сабт(`Корбар ${корбар.гирифтани_ном()} илова карда шуд`); + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт("\n=== Рӯйхати корбарон ==="); + барои (тағйирёбанда и: рақам = 0; и < ин.корбарон.дарозӣ; и++) { + чоп.сабт(`${и + 1}. `); + ин.корбарон[и].намоиш(); + } + } + + ҷамъиятӣ гирифтани_шумора(): рақам { + бозгашт ин.корбарон.дарозӣ; + } +} +``` + +```somonscript +// main.som +ворид { Корбар, Идоракунандаи_корбарон } аз "./user-manager.som"; + +тағйирёбанда идоракунанда = нав Идоракунандаи_корбарон(); + +тағйирёбанда корбар1 = нав Корбар("Аҳмад", "ahmad@example.com", 25); +тағйирёбанда корбар2 = нав Корбар("Фотима", "fatima@example.com", 22); + +идоракунанда.илова_кардан(корбар1); +идоракунанда.илова_кардан(корбар2); + +идоракунанда.намоиш(); +чоп.сабт(`\nШумораи корбарон: ${идоракунанда.гирифтани_шумора()}`); +``` + +## 9.5. Фармонҳои CLI барои модулҳо + +### Компилятсияи модул + +```bash +somon compile main.som +``` + +### Бастабандии модулҳо + +```bash +somon bundle main.som -o dist/app.js +``` + +### Маълумот дар бораи модулҳо + +```bash +somon module-info main.som --graph +``` + +### Ҳалли масири модул + +```bash +somon resolve "./utils" --from main.som +``` + +## 9.6. Сохтори лоиҳа + +Лоиҳаи хуби SomonScript мумкин аст чунин сохтор дошта бошад: + +``` +мої_лоиҳа/ +├── src/ +│ ├── main.som +│ ├── utils/ +│ │ ├── math.som +│ │ ├── array-utils.som +│ │ └── string-utils.som +│ └── models/ +│ ├── user.som +│ └── product.som +├── dist/ +│ └── app.js +├── package.json +└── somon.config.json +``` + +## 9.7. Танзими системаи модулҳо + +Файли `somon.config.json`: + +```json +{ + "compilerOptions": { + "target": "es2020", + "sourceMap": true + }, + "moduleSystem": { + "resolution": { + "baseUrl": ".", + "extensions": [".som", ".js"] + }, + "loading": { + "circularDependencyStrategy": "warn" + } + }, + "bundle": { + "format": "commonjs", + "minify": false + } +} +``` + +## 9.8. Хулоса + +Дар ин боб шумо омӯхтед: +- Чӣ тавр кодро содир кардан (export) +- Чӣ тавр модулҳоро ворид кардан (import) +- Усулҳои гуногуни ворид/содир +- Ташкили лоиҳа бо модулҳо +- Фармонҳои CLI барои кор бо модулҳо + +--- + +**Машқҳо:** + +1. Модуле эҷод кунед, ки функсияҳои коркарди сатрҳоро дорад (калон кардан, хурд кардан, ҷойивазкунӣ) +2. Системаи модулҳо барои идораи китобхона созед (модулҳои Китоб, Муаллиф, Китобхона) +3. Модули математикии мукаммал эҷод кунед бо функсияҳои тригонометрия ва геометрия +4. Лоиҳае бо чанд модул созед ва онро бо `somon bundle` баста кунед diff --git "a/book/10-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\275\320\260\320\274\321\203\320\264\322\263\320\276.md" "b/book/10-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\275\320\260\320\274\321\203\320\264\322\263\320\276.md" new file mode 100644 index 0000000..379dae8 --- /dev/null +++ "b/book/10-\321\201\320\270\321\201\321\202\320\265\320\274\320\260\320\270-\320\275\320\260\320\274\321\203\320\264\322\263\320\276.md" @@ -0,0 +1,358 @@ +# Боби 10: Системаи намудҳо (Type System) + +## 10.1. Муқаддима + +SomonScript системаи намудҳои пешрафтаеро дорад, ки аз TypeScript илҳом гирифтааст. Ин система имкон медиҳад, ки хатогиҳоро пеш аз иҷрои барнома пайдо кунед. + +## 10.2. Намудҳои Union (Иттиҳодӣ) + +Намудҳои union имкон медиҳанд, ки тағйирёбанда метавонад яке аз чанд намуд дошта бошад. + +```somonscript +// Тағйирёбанда метавонад сатр ё рақам бошад +тағйирёбанда қимат: сатр | рақам; + +қимат = "Салом"; +чоп.сабт(қимат); // Салом + +қимат = 42; +чоп.сабт(қимат); // 42 + +// Функсия бо намуди union +функсия чопи_идентификатор(ид: сатр | рақам): холӣ { + агар (навъи ид === "сатр") { + чоп.сабт("ID (сатр): " + ид); + } вагарна { + чоп.сабт("ID (рақам): " + ид); + } +} + +чопи_идентификатор("ABC123"); +чопи_идентификатор(12345); +``` + +## 10.3. Намудҳои Intersection (Кисмҳои якҷоя) + +Намудҳои intersection якчанд намудро ба як намуд муттаҳид мекунанд. + +```somonscript +// Таърифи намудҳо +навъ Ном = { + ном: сатр; + фамилия: сатр; +}; + +навъ Тамос = { + email: сатр; + телефон: сатр; +}; + +// Иттиҳоди намудҳо +навъ Корбар = Ном & Тамос; + +// Истифода +тағйирёбанда корбар: Корбар = { + ном: "Аҳмад", + фамилия: "Раҳимов", + email: "ahmad@example.com", + телефон: "+992901234567" +}; + +чоп.сабт(корбар.ном); +чоп.сабт(корбар.email); +``` + +## 10.4. Намудҳои Tuple (Кортеж) + +Tuple массиви бо шумораи муайян ва намудҳои муайяни элементҳо аст. + +```somonscript +// Эълони tuple +тағйирёбанда нуқта: [рақам, рақам] = [10, 20]; +тағйирёбанда шахс: [сатр, рақам, мантиқӣ] = ["Аҳмад", 25, дуруст]; + +чоп.сабт("Координатаҳо: " + нуқта[0] + ", " + нуқта[1]); +чоп.сабт("Ном: " + шахс[0]); +чоп.сабт("Синну сол: " + шахс[1]); +чоп.сабт("Фаъол: " + шахс[2]); + +// Tuple дар функсия +функсия гирифтани_координатаҳо(): [рақам, рақам] { + бозгашт [100, 200]; +} + +тағйирёбанда макон: [рақам, рақам] = гирифтани_координатаҳо(); +чоп.сабт(`х: ${макон[0]}, у: ${макон[1]}`); +``` + +## 10.5. Намуди Partial (Қисмӣ) + +Намуди partial ҳамаи хосиятҳоро ихтиёрӣ мегардонад. + +```somonscript +интерфейс Корбар { + ном: сатр; + синну_сол: рақам; + email: сатр; +} + +// Истифодаи қисмӣ - на ҳамаи хосиятҳо ҳатмӣ +тағйирёбанда тағйиротҳо: қисмӣ<Корбар> = { + синну_сол: 26 // Танҳо синну солро тағйир медиҳем +}; + +чоп.сабт(тағйиротҳо.синну_сол); +``` + +## 10.6. Намуди Required (Ҳатмӣ) + +Намуди required ҳамаи хосиятҳоро ҳатмӣ мегардонад. + +```somonscript +интерфейс Танзимот { + ранг?: сатр; + андоза?: рақам; +} + +// Ҳамаи хосиятҳоро ҳатмӣ мекунем +тағйирёбанда танзимоти_пурра: ҳатмӣ<Танзимот> = { + ранг: "сурх", + андоза: 14 +}; +``` + +## 10.7. Намуди Readonly (Танҳохонӣ) + +Намуди readonly хосиятҳоро ғайриқобили тағйир мегардонад. + +```somonscript +интерфейс Нуқта { + танҳохонӣ х: рақам; + танҳохонӣ у: рақам; +} + +тағйирёбанда нуқта: Нуқта = { х: 10, у: 20 }; + +чоп.сабт(нуқта.х); // 10 + +// нуқта.х = 30; // ХАТО! Хосияти танҳохонӣ +``` + +## 10.8. Навъҳои шартӣ (Conditional Types) + +```somonscript +// Намуди шартӣ +навъ Навъи_бозгашт<Т> = Т мерос сатр ? рақам : мантиқӣ; + +// Истифода +тағйирёбанда натиҷа1: Навъи_бозгашт<сатр> = 42; // рақам +тағйирёбанда натиҷа2: Навъи_бозгашт<рақам> = дуруст; // мантиқӣ +``` + +## 10.9. Намудҳои utility + +### 10.9.1. Pick (Интихоб) + +```somonscript +интерфейс Корбар { + ном: сатр; + синну_сол: рақам; + email: сатр; + телефон: сатр; +} + +// Интихоби танҳо баъзе хосиятҳо +навъ Намуди_корбар = Pick<Корбар, "ном" | "email">; + +тағйирёбанда корбар: Намуди_корбар = { + ном: "Аҳмад", + email: "ahmad@example.com" +}; +``` + +### 10.9.2. Omit (Ҳазф) + +```somonscript +интерфейс Корбар { + ном: сатр; + синну_сол: рақам; + парол: сатр; +} + +// Ҳазфи баъзе хосиятҳо +навъ Корбари_ҷамъиятӣ = Omit<Корбар, "парол">; + +тағйирёбанда корбар: Корбари_ҷамъиятӣ = { + ном: "Аҳмад", + синну_сол: 25 + // парол нест +}; +``` + +### 10.9.3. Record (Сабт) + +```somonscript +// Эҷоди объект бо калидҳои муайян +навъ Бахоҳо = сабт<сатр, рақам>; + +тағйирёбанда бахоҳои_донишҷӯ: Бахоҳо = { + математика: 5, + физика: 4, + химия: 5 +}; + +чоп.сабт(бахоҳои_донишҷӯ.математика); // 5 +``` + +## 10.10. Generic Types (Намудҳои умумӣ) + +Generics имкон медиҳанд, ки компонентҳои аз нав истифодашавандаро эҷод кунед. + +```somonscript +// Функсияи generic +функсия охирин<Т>(массив: Т[]): Т | беқимат { + агар (массив.дарозӣ === 0) { + бозгашт беқимат; + } + бозгашт массив[массив.дарозӣ - 1]; +} + +тағйирёбанда ададҳо: рақам[] = [1, 2, 3, 4, 5]; +тағйирёбанда номҳо: сатр[] = ["Аҳмад", "Фотима", "Ҳасан"]; + +чоп.сабт(охирин(ададҳо)); // 5 +чоп.сабт(охирин(номҳо)); // Ҳасан + +// Синфи generic +синф Нигоҳдорандаи_қимат<Т> { + хосусӣ қимат: Т; + + конструктор(қимат: Т) { + ин.қимат = қимат; + } + + ҷамъиятӣ гирифтан(): Т { + бозгашт ин.қимат; + } + + ҷамъиятӣ танзим_кардан(қимат: Т): холӣ { + ин.қимат = қимат; + } +} + +тағйирёбанда нигоҳдорандаи_рақам = нав Нигоҳдорандаи_қимат<рақам>(42); +тағйирёбанда нигоҳдорандаи_сатр = нав Нигоҳдорандаи_қимат<сатр>("Салом"); + +чоп.сабт(нигоҳдорандаи_рақам.гирифтан()); // 42 +чоп.сабт(нигоҳдорандаи_сатр.гирифтан()); // Салом +``` + +## 10.11. Type Guards (Муҳофизатҳои намуд) + +```somonscript +функсия сатр_аст(қимат: ҳар): қимат аст сатр { + бозгашт навъи қимат === "сатр"; +} + +функсия коркарди_қимат(қимат: сатр | рақам): холӣ { + агар (сатр_аст(қимат)) { + чоп.сабт("Дарозӣ: " + қимат.дарозӣ); + } вагарна { + чоп.сабт("Дукарат: " + (қимат * 2)); + } +} + +коркарди_қимат("Салом"); // Дарозӣ: 5 +коркарди_қимат(10); // Дукарат: 20 +``` + +## 10.12. Мисоли амалӣ + +```somonscript +// Системаи намудҳо барои идораи маҳсулот + +интерфейс Маҳсулот { + ид: рақам; + ном: сатр; + қимат: рақам; + дар_ҷой: мантиқӣ; +} + +навъ Эҷоди_маҳсулот = Omit<Маҳсулот, "ид">; +навъ Тағйири_маҳсулот = қисмӣ<Маҳсулот>; + +синф Идоракунандаи_маҳсулот { + хосусӣ маҳсулот: Маҳсулот[]; + хосусӣ шумораи_навбатӣ: рақам; + + конструктор() { + ин.маҳсулот = []; + ин.шумораи_навбатӣ = 1; + } + + ҷамъиятӣ илова_кардан(маълумот: Эҷоди_маҳсулот): Маҳсулот { + тағйирёбанда маҳсулоти_нав: Маҳсулот = { + ид: ин.шумораи_навбатӣ++, + ...маълумот + }; + ин.маҳсулот.илова(маҳсулоти_нав); + бозгашт маҳсулоти_нав; + } + + ҷамъиятӣ тағйир_додан(ид: рақам, тағйиротҳо: Тағйири_маҳсулот): мантиқӣ { + тағйирёбанда индекс: рақам = ин.маҳсулот.findIndex((м: Маҳсулот): мантиқӣ => м.ид === ид); + агар (индекс !== -1) { + ин.маҳсулот[индекс] = { ...ин.маҳсулот[индекс], ...тағйиротҳо }; + бозгашт дуруст; + } + бозгашт нодуруст; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт("\n=== Феҳристи маҳсулот ==="); + барои (тағйирёбанда и: рақам = 0; и < ин.маҳсулот.дарозӣ; и++) { + тағйирёбанда м: Маҳсулот = ин.маҳсулот[и]; + тағйирёбанда ҳолат: сатр = м.дар_ҷой ? "Дар ҷой" : "Тамом шуд"; + чоп.сабт(`${м.ид}. ${м.ном} - ${м.қимат} сомонӣ [${ҳолат}]`); + } + } +} + +// Истифода +тағйирёбанда идоракунанда = нав Идоракунандаи_маҳсулот(); + +идоракунанда.илова_кардан({ + ном: "Китоб", + қимат: 50, + дар_ҷой: дуруст +}); + +идоракунанда.илова_кардан({ + ном: "Қалам", + қимат: 5, + дар_ҷой: дуруст +}); + +идоракунанда.намоиш(); +идоракунанда.тағйир_додан(1, { қимат: 45 }); +идоракунанда.намоиш(); +``` + +## 10.13. Хулоса + +Дар ин боб шумо омӯхтед: +- Намудҳои union ва intersection +- Намудҳои tuple +- Намудҳои utility (Partial, Required, Pick, Omit, Record) +- Generic types +- Type guards +- Системаи пешрафтаи намудҳо + +--- + +**Машқҳо:** + +1. Интерфейсе барои "Китоб" эҷод кунед ва бо намудҳои utility кор кунед +2. Функсияи generic созед, ки ду массивро якҷоя мекунад +3. Системаи намудҳо барои идораи донишҷӯён бо union ва intersection types эҷод кунед +4. Синфи generic барои Queue (навбат) созед diff --git "a/book/11-\321\205\320\260\321\202\320\276\320\263\320\270\322\263\320\276-\320\262\320\260-\320\270\321\201\321\202\320\270\321\201\320\275\320\276\320\272\322\263\320\276.md" "b/book/11-\321\205\320\260\321\202\320\276\320\263\320\270\322\263\320\276-\320\262\320\260-\320\270\321\201\321\202\320\270\321\201\320\275\320\276\320\272\322\263\320\276.md" new file mode 100644 index 0000000..96ec123 --- /dev/null +++ "b/book/11-\321\205\320\260\321\202\320\276\320\263\320\270\322\263\320\276-\320\262\320\260-\320\270\321\201\321\202\320\270\321\201\320\275\320\276\320\272\322\263\320\276.md" @@ -0,0 +1,308 @@ +# Боби 11: Хатогиҳо ва истиснокҳо + +## 11.1. Муқаддима + +Идораи хатогиҳо яке аз ҷанбаҳои муҳими барномасозӣ аст. SomonScript механизми пурқувват барои коркарди хатогиҳо пешниҳод мекунад. + +## 11.2. Блоки КӮШИШ-ГИРИФТАН-НИҲОЯТ + +### 11.2.1. Сохтори асосӣ + +```somonscript +кӯшиш { + // Коде ки метавонад хато диҳад + тағйирёбанда натиҷа: рақам = 10 / 0; + чоп.сабт(натиҷа); +} гирифтан (хато) { + // Коркарди хато + чоп.хато("Хато рӯй дод: " + хато); +} +``` + +### 11.2.2. Блоки НИҲОЯТ + +Блоки `ниҳоят` ҳамеша иҷро мешавад, на аз он ки хато рӯй дода бошад ё не. + +```somonscript +функсия хондани_файл(номи_файл: сатр): холӣ { + тағйирёбанда файл: ҳар = холӣ; + + кӯшиш { + файл = кушодани_файл(номи_файл); + тағйирёбанда маълумот: сатр = хондан(файл); + чоп.сабт(маълумот); + } гирифтан (хато) { + чоп.хато("Хато ҳангоми хондани файл: " + хато); + } ниҳоят { + агар (файл !== холӣ) { + бастани_файл(файл); + чоп.сабт("Файл баста шуд"); + } + } +} +``` + +## 11.3. Партофтани истиснокҳо + +Шумо метавонед худатон истиснок партоед бо истифода аз `партофтан`. + +```somonscript +функсия тақсим_кардан(а: рақам, б: рақам): рақам { + агар (б === 0) { + партофтан нав Хато("Тақсим ба сифр ғайриқонунӣ аст!"); + } + бозгашт а / б; +} + +кӯшиш { + тағйирёбанда натиҷа: рақам = тақсим_кардан(10, 0); + чоп.сабт(натиҷа); +} гирифтан (хато) { + чоп.хато("Хато: " + хато.паём); +} +``` + +## 11.4. Синфҳои хатогии фармоишӣ + +Шумо метавонед синфҳои хатогии худро эҷод кунед. + +```somonscript +// Синфи хатогии фармоишӣ +синф Хатои_тасдиқ мерос Хато { + конструктор(паём: сатр) { + супер(паём); + ин.ном = "Хатои_тасдиқ"; + } +} + +синф Хатои_дастрасӣ мерос Хато { + конструктор(паём: сатр) { + супер(паём); + ин.ном = "Хатои_дастрасӣ"; + } +} + +// Истифода +функсия тасдиқи_синну_сол(синну_сол: рақам): холӣ { + агар (синну_сол < 0) { + партофтан нав Хатои_тасдиқ("Синну сол набояд манфӣ бошад"); + } + агар (синну_сол > 150) { + партофтан нав Хатои_тасдиқ("Синну соли беҳад калон"); + } + чоп.сабт("Синну сол дуруст аст: " + синну_сол); +} + +кӯшиш { + тасдиқи_синну_сол(-5); +} гирифтан (хато) { + агар (хато instanceof Хатои_тасдиқ) { + чоп.хато("Хатои тасдиқ: " + хато.паём); + } вагарна { + чоп.хато("Хатои номаълум: " + хато); + } +} +``` + +## 11.5. Санҷиши намуди хато + +```somonscript +функсия коркарди_хато(хато: ҳар): холӣ { + агар (хато instanceof Хатои_тасдиқ) { + чоп.хато("Тасдиқ ғайридуруст: " + хато.паём); + } вагарна агар (хато instanceof Хатои_дастрасӣ) { + чоп.хато("Дастрасӣ рад карда шуд: " + хато.паём); + } вагарна агар (хато instanceof Хато) { + чоп.хато("Хато: " + хато.паём); + } вагарна { + чоп.хато("Хатои номаълум"); + } +} + +кӯшиш { + партофтан нав Хатои_тасдиқ("Маълумоти нодуруст"); +} гирифтан (хато) { + коркарди_хато(хато); +} +``` + +## 11.6. Мисолҳои амалӣ + +### Мисоли 1: Тасдиқи маълумоти корбар + +```somonscript +синф Хатои_маълумоти_корбар мерос Хато { + конструктор(паём: сатр) { + супер(паём); + ин.ном = "Хатои_маълумоти_корбар"; + } +} + +функсия тасдиқи_email(email: сатр): мантиқӣ { + // Тасдиқи оддӣ + агар (!email.дорад("@")) { + партофтан нав Хатои_маълумоти_корбар("Email бояд @ дошта бошад"); + } + бозгашт дуруст; +} + +функсия тасдиқи_парол(парол: сатр): мантиқӣ { + агар (парол.дарозӣ < 8) { + партофтан нав Хатои_маълумоти_корбар("Парол бояд ҳадди ақал 8 аломат дошта бошад"); + } + бозгашт дуруст; +} + +функсия сабти_корбар(email: сатр, парол: сатр): холӣ { + кӯшиш { + тасдиқи_email(email); + тасдиқи_парол(парол); + чоп.сабт("Корбар бомуваффақият сабт карда шуд!"); + } гирифтан (хато) { + агар (хато instanceof Хатои_маълумоти_корбар) { + чоп.хато("Хатои тасдиқ: " + хато.паём); + } вагарна { + чоп.хато("Хатои номаълум рӯй дод"); + } + } +} + +// Санҷиш +сабти_корбар("test@example.com", "password123"); // Дуруст +сабти_корбар("test-example.com", "password123"); // Хато: email +сабти_корбар("test@example.com", "123"); // Хато: парол +``` + +### Мисоли 2: Идораи хатогиҳои асинхронӣ + +```somonscript +ҳамзамон функсия гирифтани_маълумот(ид: рақам): ваъда<объект> { + кӯшиш { + // Симулятсияи дархост ба сервер + агар (ид <= 0) { + партофтан нав Хато("ID бояд мусбат бошад"); + } + + // Симулятсияи интизорӣ + интизор таваққуф(1000); + + бозгашт { + ид: ид, + ном: "Корбари " + ид, + синну_сол: 20 + ид + }; + } гирифтан (хато) { + чоп.хато("Хато ҳангоми гирифтани маълумот: " + хато.паём); + партофтан хато; + } +} + +// Истифода +ҳамзамон функсия асосӣ(): холӣ { + кӯшиш { + тағйирёбанда маълумот: объект = интизор гирифтани_маълумот(5); + чоп.сабт("Маълумот гирифта шуд:", маълумот); + + // Кӯшиш бо ID нодуруст + тағйирёбанда маълумоти_нодуруст: объект = интизор гирифтани_маълумот(-1); + } гирифтан (хато) { + чоп.хато("Хатои умумӣ: " + хато.паём); + } +} + +асосӣ(); +``` + +### Мисоли 3: Системаи идораи хатогиҳо + +```somonscript +синф Сабткунандаи_хатогиҳо { + хосусӣ хатогиҳо: объект[]; + + конструктор() { + ин.хатогиҳо = []; + } + + ҷамъиятӣ сабт_кардан(хато: Хато, контекст: сатр = ""): холӣ { + тағйирёбанда сабт: объект = { + вақт: нав Сана(), + ном: хато.ном, + паём: хато.паём, + контекст: контекст + }; + ин.хатогиҳо.илова(сабт); + чоп.хато(`[${сабт.вақт}] ${хато.ном}: ${хато.паём}`); + } + + ҷамъиятӣ гирифтани_хатогиҳо(): объект[] { + бозгашт ин.хатогиҳо; + } + + ҷамъиятӣ полиз(): холӣ { + ин.хатогиҳо = []; + } + + ҷамъиятӣ намоиш(): холӣ { + чоп.сабт("\n=== Сабти хатогиҳо ==="); + барои (тағйирёбанда и: рақам = 0; и < ин.хатогиҳо.дарозӣ; и++) { + тағйирёбанда х: объект = ин.хатогиҳо[и]; + чоп.сабт(`${и + 1}. [${х.ном}] ${х.паём}`); + агар (х.контекст) { + чоп.сабт(` Контекст: ${х.контекст}`); + } + } + } +} + +// Истифода +тағйирёбанда сабткунанда = нав Сабткунандаи_хатогиҳо(); + +функсия амалиёти_хавфнок(): холӣ { + кӯшиш { + партофтан нав Хато("Хатои симулятсияшуда"); + } гирифтан (хато) { + сабткунанда.сабт_кардан(хато, "амалиёти_хавфнок()"); + } +} + +амалиёти_хавфнок(); +сабткунанда.намоиш(); +``` + +## 11.7. Хатогиҳои маъмул + +### Хатогиҳои синтаксисӣ + +```somonscript +// Ин хато ҳангоми компилятсия муайян карда мешавад +// тағйирёбанда х = ; // ХАТО: Ибораи нодуруст +``` + +### Хатогиҳои ҳангоми иҷро + +```somonscript +кӯшиш { + тағйирёбанда х: холӣ = холӣ; + чоп.сабт(х.ном); // Хато: Намешавад хосияти 'ном'-ро аз холӣ хонд +} гирифтан (хато) { + чоп.хато("Хатои ҳангоми иҷро: " + хато.паём); +} +``` + +## 11.8. Хулоса + +Дар ин боб шумо омӯхтед: +- Блокҳои кӯшиш-гирифтан-ниҳоят +- Партофтани истиснокҳо +- Синфҳои хатогии фармоишӣ +- Санҷиши намуди хато +- Усулҳои беҳтарин барои идораи хатогиҳо + +--- + +**Машқҳо:** + +1. Функсияе нависед, ки синну солро тасдиқ мекунад ва дар ҳолати нодуруст истиснок мепартояд +2. Системаи сабти хатогиҳо эҷод кунед, ки хатогиҳоро ба файл менависад +3. Синфи хатогии фармоишӣ барои "Хатои базаи маълумот" созед +4. Функсияи асинхронӣ эҷод кунед, ки хатогиҳоро дуруст коркард мекунад diff --git "a/book/12-\320\274\320\270\321\201\320\276\320\273\322\263\320\276\320\270-\320\260\320\274\320\260\320\273\323\243.md" "b/book/12-\320\274\320\270\321\201\320\276\320\273\322\263\320\276\320\270-\320\260\320\274\320\260\320\273\323\243.md" new file mode 100644 index 0000000..80ec637 --- /dev/null +++ "b/book/12-\320\274\320\270\321\201\320\276\320\273\322\263\320\276\320\270-\320\260\320\274\320\260\320\273\323\243.md" @@ -0,0 +1,393 @@ +# Боби 12: Мисолҳои амалӣ + +Дар ин боб мо барномаҳои комили амалиро месозем, ки ҳамаи мавзӯъҳои омӯхтаро истифода мебаранд. + +## 12.1. Лоиҳа 1: Системаи идораи китобхона + +Системаи пурраи идораи китобхона бо имкониятҳои зиёд. + +```somonscript +// kitobxona.som + +// Синфи Китоб +синф Китоб { + хосусӣ ид: рақам; + хосусӣ ном: сатр; + хосусӣ муаллиф: сатр; + хосусӣ соли_нашр: рақам; + хосусӣ қарз_дода_шудааст: мантиқӣ; + хосусӣ қарзгир: сатр | холӣ; + + конструктор(ид: рақам, ном: сатр, муаллиф: сатр, соли_нашр: рақам) { + ин.ид = ид; + ин.ном = ном; + ин.муаллиф = муаллиф; + ин.соли_нашр = соли_нашр; + ин.қарз_дода_шудааст = нодуруст; + ин.қарзгир = холӣ; + } + + ҷамъиятӣ гирифтани_ид(): рақам { + бозгашт ин.ид; + } + + ҷамъиятӣ қарз_додан(ном_қарзгир: сатр): мантиқӣ { + агар (!ин.қарз_дода_шудааст) { + ин.қарз_дода_шудааст = дуруст; + ин.қарзгир = ном_қарзгир; + чоп.сабт(`Китоби "${ин.ном}" ба ${ном_қарзгир} қарз дода шуд`); + бозгашт дуруст; + } + чоп.хато("Китоб аллакай қарз дода шудааст"); + бозгашт нодуруст; + } + + ҷамъиятӣ баргардондан(): мантиқӣ { + агар (ин.қарз_дода_шудааст) { + чоп.сабт(`Китоби "${ин.ном}" баргардонда шуд`); + ин.қарз_дода_шудааст = нодуруст; + ин.қарзгир = холӣ; + бозгашт дуруст; + } + чоп.хато("Китоб қарз дода нашудааст"); + бозгашт нодуруст; + } + + ҷамъиятӣ намоиш(): холӣ { + тағйирёбанда ҳолат: сатр = ин.қарз_дода_шудааст + ? `Қарз ба ${ин.қарзгир}` + : "Дастрас"; + чоп.сабт(`${ин.ид}. "${ин.ном}" - ${ин.муаллиф} (${ин.соли_нашр}) [${ҳолат}]`); + } +} + +// Синфи Китобхона +синф Китобхона { + хосусӣ ном: сатр; + хосусӣ китобҳо: Китоб[]; + хосусӣ идентификатори_навбатӣ: рақам; + + конструктор(ном: сатр) { + ин.ном = ном; + ин.китобҳо = []; + ин.идентификатори_навбатӣ = 1; + } + + ҷамъиятӣ илова_кардани_китоб(ном: сатр, муаллиф: сатр, сол: рақам): Китоб { + тағйирёбанда китоби_нав = нав Китоб(ин.идентификатори_навбатӣ++, ном, муаллиф, сол); + ин.китобҳо.илова(китоби_нав); + чоп.сабт(`Китоб "${ном}" илова карда шуд`); + бозгашт китоби_нав; + } + + ҷамъиятӣ ҷустуҷӯи_китоб(ид: рақам): Китоб | холӣ { + барои (тағйирёбанда и: рақам = 0; и < ин.китобҳо.дарозӣ; и++) { + агар (ин.китобҳо[и].гирифтани_ид() === ид) { + бозгашт ин.китобҳо[и]; + } + } + бозгашт холӣ; + } + + ҷамъиятӣ намоиши_ҳамаи_китобҳо(): холӣ { + чоп.сабт(`\n=== Китобхонаи "${ин.ном}" ===`); + агар (ин.китобҳо.дарозӣ === 0) { + чоп.сабт("Китобҳо нестанд"); + бозгашт; + } + барои (тағйирёбанда и: рақам = 0; и < ин.китобҳо.дарозӣ; и++) { + ин.китобҳо[и].намоиш(); + } + } + + ҷамъиятӣ намоиши_китобҳои_дастрас(): холӣ { + чоп.сабт("\n=== Китобҳои дастрас ==="); + тағйирёбанда шумора: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < ин.китобҳо.дарозӣ; и++) { + агар (!ин.китобҳо[и].қарз_дода_шудааст) { + ин.китобҳо[и].намоиш(); + шумора++; + } + } + агар (шумора === 0) { + чоп.сабт("Китобҳои дастрас нестанд"); + } + } +} + +// Истифода +тағйирёбанда китобхона = нав Китобхона("Китобхонаи миллӣ"); + +// Илова кардани китобҳо +китобхона.илова_кардани_китоб("Шоҳнома", "Фирдавсӣ", 1010); +китобхона.илова_кардани_китоб("Гулистон", "Саъдӣ", 1258); +китобхона.илова_кардани_китоб("Бӯстон", "Саъдӣ", 1257); + +китобхона.намоиши_ҳамаи_китобҳо(); + +// Қарз додан +тағйирёбанда китоб1: Китоб | холӣ = китобхона.ҷустуҷӯи_китоб(1); +агар (китоб1 !== холӣ) { + китоб1.қарз_додан("Аҳмад Раҳимов"); +} + +китобхона.намоиши_китобҳои_дастрас(); + +// Баргардондан +агар (китоб1 !== холӣ) { + китоб1.баргардондан(); +} + +китобхона.намоиши_китобҳои_дастрас(); +``` + +## 12.2. Лоиҳа 2: Калькулятори пешрафта + +```somonscript +// calculator.som + +синф Калькулятор { + хосусӣ таърихи_амалиётҳо: сатр[]; + + конструктор() { + ин.таърихи_амалиётҳо = []; + } + + ҷамъиятӣ ҷамъ(а: рақам, б: рақам): рақам { + тағйирёбанда натиҷа: рақам = а + б; + ин.сабти_амалиёт(`${а} + ${б} = ${натиҷа}`); + бозгашт натиҷа; + } + + ҷамъиятӣ тарҳ(а: рақам, б: рақам): рақам { + тағйирёбанда натиҷа: рақам = а - б; + ин.сабти_амалиёт(`${а} - ${б} = ${натиҷа}`); + бозгашт натиҷа; + } + + ҷамъиятӣ зарб(а: рақам, б: рақам): рақам { + тағйирёбанда натиҷа: рақам = а * б; + ин.сабти_амалиёт(`${а} × ${б} = ${натиҷа}`); + бозгашт натиҷа; + } + + ҷамъиятӣ тақсим(а: рақам, б: рақам): рақам { + кӯшиш { + агар (б === 0) { + партофтан нав Хато("Тақсим ба сифр ғайриқонунӣ аст!"); + } + тағйирёбанда натиҷа: рақам = а / б; + ин.сабти_амалиёт(`${а} ÷ ${б} = ${натиҷа}`); + бозгашт натиҷа; + } гирифтан (хато) { + чоп.хато("Хато: " + хато.паём); + бозгашт 0; + } + } + + ҷамъиятӣ дараҷа(асос: рақам, дараҷа: рақам): рақам { + тағйирёбанда натиҷа: рақам = асос ** дараҷа; + ин.сабти_амалиёт(`${асос}^${дараҷа} = ${натиҷа}`); + бозгашт натиҷа; + } + + ҷамъиятӣ квадрати_реша(х: рақам): рақам { + кӯшиш { + агар (х < 0) { + партофтан нав Хато("Квадрати решаи адади манфӣ вуҷуд надорад!"); + } + тағйирёбанда натиҷа: рақам = Математика.sqrt(х); + ин.сабти_амалиёт(`√${х} = ${натиҷа}`); + бозгашт натиҷа; + } гирифтан (хато) { + чоп.хато("Хато: " + хато.паём); + бозгашт 0; + } + } + + хосусӣ сабти_амалиёт(амалиёт: сатр): холӣ { + ин.таърихи_амалиётҳо.илова(амалиёт); + } + + ҷамъиятӣ намоиши_таърих(): холӣ { + чоп.сабт("\n=== Таърихи амалиётҳо ==="); + агар (ин.таърихи_амалиётҳо.дарозӣ === 0) { + чоп.сабт("Таърих холӣ аст"); + бозгашт; + } + барои (тағйирёбанда и: рақам = 0; и < ин.таърихи_амалиётҳо.дарозӣ; и++) { + чоп.сабт(`${и + 1}. ${ин.таърихи_амалиётҳо[и]}`); + } + } + + ҷамъиятӣ полиз_кардани_таърих(): холӣ { + ин.таърихи_амалиётҳо = []; + чоп.сабт("Таърих полиз карда шуд"); + } +} + +// Истифода +тағйирёбанда калькулятор = нав Калькулятор(); + +калькулятор.ҷамъ(10, 5); +калькулятор.тарҳ(20, 7); +калькулятор.зарб(6, 8); +калькулятор.тақсим(100, 4); +калькулятор.дараҷа(2, 10); +калькулятор.квадрати_реша(16); + +калькулятор.намоиши_таърих(); + +// Кӯшиши амалиёти нодуруст +калькулятор.тақсим(10, 0); +калькулятор.квадрати_реша(-4); + +калькулятор.намоиши_таърих(); +``` + +## 12.3. Лоиҳа 3: Системаи идораи донишҷӯён + +Системаи пурра бо намудҳои пешрафта, интерфейсҳо ва модулҳо. + +```somonscript +// student-system.som + +интерфейс Чопшаванда { + чоп_кардан(): холӣ; +} + +синф Донишҷӯ татбиқ Чопшаванда { + хосусӣ ид: сатр; + хосусӣ ном: сатр; + хосусӣ фамилия: сатр; + хосусӣ синну_сол: рақам; + хосусӣ бахоҳо: рақам[]; + + конструктор(ид: сатр, ном: сатр, фамилия: сатр, синну_сол: рақам) { + ин.ид = ид; + ин.ном = ном; + ин.фамилия = фамилия; + ин.синну_сол = синну_сол; + ин.бахоҳо = []; + } + + ҷамъиятӣ илова_кардани_бахо(бахо: рақам): холӣ { + агар (бахо >= 2 && бахо <= 5) { + ин.бахоҳо.илова(бахо); + } вагарна { + чоп.хато("Бахо бояд аз 2 то 5 бошад"); + } + } + + ҷамъиятӣ ҳисоби_миёнаи_бахо(): рақам { + агар (ин.бахоҳо.дарозӣ === 0) бозгашт 0; + + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < ин.бахоҳо.дарозӣ; и++) { + ҷамъ += ин.бахоҳо[и]; + } + бозгашт ҷамъ / ин.бахоҳо.дарозӣ; + } + + ҷамъиятӣ гирифтани_ид(): сатр { + бозгашт ин.ид; + } + + ҷамъиятӣ чоп_кардан(): холӣ { + чоп.сабт(`ID: ${ин.ид}`); + чоп.сабт(`Ном: ${ин.ном} ${ин.фамилия}`); + чоп.сабт(`Синну сол: ${ин.синну_сол}`); + чоп.сабт(`Бахоҳо: ${ин.бахоҳо.пайвастан(", ")}`); + чоп.сабт(`Миёна: ${ин.ҳисоби_миёнаи_бахо().toFixed(2)}`); + } +} + +синф Синф { + хосусӣ ном: сатр; + хосусӣ донишҷӯён: Донишҷӯ[]; + + конструктор(ном: сатр) { + ин.ном = ном; + ин.донишҷӯён = []; + } + + ҷамъиятӣ илова_кардани_донишҷӯ(донишҷӯ: Донишҷӯ): холӣ { + ин.донишҷӯён.илова(донишҷӯ); + чоп.сабт(`Донишҷӯ ${донишҷӯ.гирифтани_ид()} ба синфи "${ин.ном}" илова карда шуд`); + } + + ҷамъиятӣ ҷустуҷӯи_донишҷӯ(ид: сатр): Донишҷӯ | холӣ { + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + агар (ин.донишҷӯён[и].гирифтани_ид() === ид) { + бозгашт ин.донишҷӯён[и]; + } + } + бозгашт холӣ; + } + + ҷамъиятӣ намоиши_донишҷӯён(): холӣ { + чоп.сабт(`\n=== Синфи ${ин.ном} ===`); + чоп.сабт(`Шумораи донишҷӯён: ${ин.донишҷӯён.дарозӣ}`); + чоп.сабт(""); + + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + чоп.сабт(`Донишҷӯи №${и + 1}:`); + ин.донишҷӯён[и].чоп_кардан(); + чоп.сабт(""); + } + } + + ҷамъиятӣ ҳисоби_миёнаи_синф(): рақам { + агар (ин.донишҷӯён.дарозӣ === 0) бозгашт 0; + + тағйирёбанда ҷамъ: рақам = 0; + барои (тағйирёбанда и: рақам = 0; и < ин.донишҷӯён.дарозӣ; и++) { + ҷамъ += ин.донишҷӯён[и].ҳисоби_миёнаи_бахо(); + } + бозгашт ҷамъ / ин.донишҷӯён.дарозӣ; + } +} + +// Истифода +тағйирёбанда синф = нав Синф("11-А"); + +тағйирёбанда донишҷӯ1 = нав Донишҷӯ("D001", "Аҳмад", "Раҳимов", 17); +донишҷӯ1.илова_кардани_бахо(5); +донишҷӯ1.илова_кардани_бахо(4); +донишҷӯ1.илова_кардани_бахо(5); + +тағйирёбанда донишҷӯ2 = нав Донишҷӯ("D002", "Фотима", "Каримова", 16); +донишҷӯ2.илова_кардани_бахо(5); +донишҷӯ2.илова_кардани_бахо(5); +донишҷӯ2.илова_кардани_бахо(5); + +синф.илова_кардани_донишҷӯ(донишҷӯ1); +синф.илова_кардани_донишҷӯ(донишҷӯ2); + +синф.намоиши_донишҷӯён(); + +чоп.сабт(`Миёнаи синф: ${синф.ҳисоби_миёнаи_синф().toFixed(2)}`); +``` + +## 12.4. Хулоса + +Дар ин китоб шумо омӯхтед: +- Асосҳои забони SomonScript +- Тағйирёбандаҳо, намудҳои маълумот ва операторҳо +- Сохторҳои назорат ва давраҳо +- Функсияҳо ва синфҳо +- Системаи модулҳо ва намудҳо +- Идораи хатогиҳо +- Барномаҳои амалӣ + +SomonScript забони пурқуввате аст, ки имкон медиҳад барномасозиро ба забони тоҷикӣ анҷом диҳед. Бо омӯхтани ин китоб шумо тавонистед асосҳои барномасозиро фаҳмед ва метавонед барномаҳои худро эҷод кунед. + +--- + +**Лоиҳаҳои пешниҳодӣ барои машқ:** + +1. Системаи идораи мағозаи китобфурӯшӣ +2. Бозии компютерии оддӣ (масалан, Ҳадси адад) +3. Системаи идораи корҳои рӯзона (Todo List) +4. Калькулятори конвертатсияи асъор +5. Системаи идораи маҳсулоти анбор diff --git a/book/README.md b/book/README.md new file mode 100644 index 0000000..2234bdf --- /dev/null +++ b/book/README.md @@ -0,0 +1,152 @@ +# Китоб дар бораи барномасозӣ бо SomonScript + +Хуш омадед ба китоби омӯзиши забони барномасозии SomonScript! Ин китоб барои омӯхтани барномасозӣ ба забони тоҷикӣ таҳия шудааст. + +## Дар бораи китоб + +Ин китоб шуморо аз асосҳои забон то мавзӯъҳои пешрафта роҳнамоӣ мекунад. Ҳар як боб дорои тавзеҳоти муфассал, мисолҳои амалӣ ва машқҳои фоиданок аст. + +## Сарлавҳа + +### Қисми 1: Асосҳо + +**[Боби 1: Муқаддима](./01-муқаддима.md)** +- Хуш омадед ба дунёи SomonScript +- Чаро SomonScript? +- Насби SomonScript +- Аввалин барномаи шумо +- Фармонҳои асосии CLI + +**[Боби 2: Асосҳои забон](./02-асосҳои-забон.md)** +- Тағйирёбандаҳо ва собитҳо +- Намудҳои асосӣ (сатр, рақам, мантиқӣ) +- Шарҳҳо +- Номгузории тағйирёбандаҳо +- Чопи маълумот + +**[Боби 3: Намудҳои маълумот](./03-намудҳои-маълумот.md)** +- Намудҳои ибтидоӣ +- Намудҳои махсус +- Намудҳои мураккаб +- Массивҳо ва объектҳо +- Tuple (кортеж) + +### Қисми 2: Сохторҳои асосӣ + +**[Боби 4: Операторҳо ва ибораҳо](./04-операторҳо-ва-ибораҳо.md)** +- Операторҳои риёзӣ +- Операторҳои таъиноти +- Операторҳои муқоиса +- Операторҳои мантиқӣ +- Оператори тернарӣ + +**[Боби 5: Сохторҳои назорат](./05-сохторҳои-назорат.md)** +- Шарти АГАР-ВАГАРНА +- Шарти ИНТИХОБ-ҲОЛАТ (Switch-Case) +- Давраи ТО (While Loop) +- Давраи БАРОИ (For Loop) +- ШИКАСТАН ва ДАВОМ + +**[Боби 6: Функсияҳо](./06-функсияҳо.md)** +- Эълони функсия +- Параметрҳо ва қиматҳои бозгаштӣ +- Функсияҳои аноним +- Функсияҳои рекурсивӣ +- Функсияҳои дараҷаи баланд + +### Қисми 3: Сохторҳои пешрафта + +**[Боби 7: Объектҳо ва массивҳо](./07-объектҳо-ва-массивҳо.md)** +- Кор бо массивҳо +- Усулҳои массив (харита, филтр, кофтан) +- Эҷод ва коркарди объектҳо +- Массивҳои объектҳо +- Гузариш ба объектҳо + +**[Боби 8: Синфҳо ва ООП](./08-синфҳо-ва-ооп.md)** +- Эҷоди синфҳо +- Сатҳҳои дастрасӣ +- Меросбарӣ +- Интерфейсҳо +- Синфҳои мавҳум +- Усулҳои статикӣ + +**[Боби 9: Системаи модулҳо](./09-системаи-модулҳо.md)** +- Содир кардан (Export) +- Ворид кардан (Import) +- Ташкили лоиҳа +- Фармонҳои CLI барои модулҳо +- Танзими системаи модулҳо + +### Қисми 4: Мавзӯъҳои махсус + +**[Боби 10: Системаи намудҳо](./10-системаи-намудҳо.md)** +- Намудҳои Union ва Intersection +- Намудҳои Tuple +- Намудҳои Utility (Partial, Required, Pick, Omit) +- Generic Types +- Type Guards + +**[Боби 11: Хатогиҳо ва истиснокҳо](./11-хатогиҳо-ва-истиснокҳо.md)** +- Блоки КӮШИШ-ГИРИФТАН-НИҲОЯТ +- Партофтани истиснокҳо +- Синфҳои хатогии фармоишӣ +- Идораи хатогиҳо + +**[Боби 12: Мисолҳои амалӣ](./12-мисолҳои-амалӣ.md)** +- Системаи идораи китобхона +- Калькулятори пешрафта +- Системаи идораи донишҷӯён +- Лоиҳаҳои комили амалӣ + +## Чӣ тавр китобро хонед + +1. **Аз ибтидо оғоз кунед**: Агар шумо навомӯзанда бошед, бобҳоро аз ибтидо то охир хонед +2. **Ҳар як мисолро озмоед**: Барои ҳар як мисол кодро худатон нависед ва иҷро кунед +3. **Машқҳоро ҳаллу фасл кунед**: Ҳар боб дорои машқҳои фоиданок аст +4. **Лоиҳаҳои худро созед**: Баъд аз хондани китоб, лоиҳаҳои худро эҷод кунед + +## Талаботҳо + +- Node.js 20.x ё болотар +- SomonScript compiler + +## Насби SomonScript + +```bash +npm install -g somon-script +``` + +## Мисоли оддӣ + +```somonscript +// Салом ҷаҳон! +чоп.сабт("Салом ҷаҳон!"); + +// Функсия +функсия салом(ном: сатр): холӣ { + чоп.сабт("Салом, " + ном + "!"); +} + +салом("Тоҷикистон"); +``` + +## Манбаъҳо + +- [Мавқеи расмӣ](https://github.com/lindentechde/Somon-Script) +- [Ҳуҷҷатгузорӣ](../README.md) +- [Мисолҳо](../examples/) + +## Муаллиф + +Ин китоб аз тарафи ҷомеаи SomonScript таҳия шудааст. + +## Иҷозатнома + +Ин китоб дар асоси иҷозатномаи MIT интишор ёфтааст. + +--- + +**Муваффақият дар омӯзиши барномасозӣ!** 🚀 + +Агар савол дошта бошед ё кӯмак лозим бошад, лутфан ба мавқеи расмии лоиҳа муроҷиат кунед. From 5ebd420bb70ba2f91d6ba11cada66448f00b798e Mon Sep 17 00:00:00 2001 From: Bakhtier Gaibulloev Date: Mon, 17 Nov 2025 19:42:06 +0000 Subject: [PATCH 2/2] refine: improve chapters 1-2 with comprehensive examples and explanations Enhanced Chapter 1 (Introduction): - Added detailed explanations of what programming is with real-life examples - Expanded installation instructions with step-by-step guide - Added 10+ code examples with expected outputs - Included 5 practical exercises for beginners - Added explanations of program structure and CLI commands Enhanced Chapter 2 (Language Basics): - Expanded from 8 to 22 detailed code examples - Added real-world analogies for better understanding - Included expected outputs for every example - Added comprehensive coverage of variables, constants, and data types - Expanded exercises from 4 to 8 practical tasks - Added naming conventions and best practices - Included type conversion examples Both chapters now suitable for complete beginners with: - Simple Tajik language throughout - Progressive difficulty levels - Practical, real-world scenarios - Detailed comments in every example - Clear expected outputs --- ...20\264\320\264\320\270\320\274\320\260.md" | 394 ++++++++++++++-- ...20\267\320\260\320\261\320\276\320\275.md" | 438 ++++++++++++++---- 2 files changed, 714 insertions(+), 118 deletions(-) diff --git "a/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" "b/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" index dfc9e0c..1280d2c 100644 --- "a/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" +++ "b/book/01-\320\274\321\203\322\233\320\260\320\264\320\264\320\270\320\274\320\260.md" @@ -4,109 +4,439 @@ SomonScript забони барномасозии муосир аст, ки бо истифода аз алифбои кириллии тоҷикӣ таҳия шудааст. Ин забон имкон медиҳад, ки барномасозӣ ба забони модарӣ анҷом диҳед ва барномаҳои JavaScript эҷод кунед. +### Барномасозӣ чист? + +Барномасозӣ раванди навиштани дастурҳо (коди барнома) барои компютер аст. Ҳамчун он ки мо ба одамон ба забони тоҷикӣ дастур медиҳем, барномасозӣ низ усули супориши фармон ба компютер мебошад, вале ба забони махсус. + +**Мисол аз зиндагӣ:** +- Агар шумо ба дӯст мегӯед: "Биё ба мағоза рав ва нон харид" - ин дастури оддӣ аст +- Дар барномасозӣ низ мо ба компютер мегӯем: "Ин ададро хонда, бо он адад ҷамъ кун ва натиҷаро нишон деҳ" + +### Чаро SomonScript муҳим аст? + +1. **Омӯзиш ба забони модарӣ** - Шумо метавонед калидвожаҳоро ба забони тоҷикӣ бинед ва беҳтар фаҳмед +2. **Осонтар барои шурӯъкунандагон** - На ҳама одамон забони англисиро хуб медонанд +3. **Созгорӣ бо JavaScript** - Барномаҳои шумо ба JavaScript табдил меёбанд ва дар ҳама ҷо кор мекунанд + ## 1.2. Чаро SomonScript? SomonScript барои он таҳия шудааст, ки: -- Омӯзиши барномасозиро ба забони тоҷикӣ осонтар созад -- Барномасозӣ ба забони модарӣ имкон медиҳад -- Бо экосистемаи JavaScript мувофиқат дорад -- Системаи намудҳои пешрафта (Type System) дорад + +### Афзалиятҳо: + +1. **Омӯзиши осонтар** - Забони тоҷикӣ барои тоҷикзабонҳо табиӣ аст +2. **Барномасозӣ ба забони модарӣ** - Шумо бо забони худ фикр мекунед +3. **Мувофиқат бо JavaScript** - Ҳама китобхонаҳо ва асбобҳои JavaScript истифода мешаванд +4. **Системаи намудҳои пешрафта** - Хатогиҳоро пеш аз иҷро пайдо мекунад + +### Истифодаҳои амалӣ: + +- Сохтани барномаҳои веб-сайт +- Эҷоди барномаҳои мобилӣ +- Таҳияи барномаҳои сервер +- Автоматикунонии корҳо ## 1.3. Насби SomonScript -Барои насби SomonScript шумо бояд Node.js дошта бошед (версияи 20 ё болотар). +### Қадам 1: Насби Node.js + +Барои кор бо SomonScript шумо бояд Node.js дошта бошед (версияи 20 ё болотар). + +**Чӣ тавр Node.js -ро насб кунем:** + +1. Ба сомонаи [nodejs.org](https://nodejs.org) равед +2. Версияи LTS -ро зеркашӣ кунед +3. Файли зеркашӣшударо иҷро кунед ва дастурҳоро пайравӣ намоед + +### Қадам 2: Насби SomonScript + +Пас аз насби Node.js, терминалро (ё командной қатор) -ро кушоед ва фармони зеринро иҷро кунед: ```bash npm install -g somon-script ``` -Барои тафтиши версия: +**Маънои ин фармон:** +- `npm` - Идоракунандаи бастаҳои Node.js +- `install` - Насб кардан +- `-g` - Глобалӣ (дар тамоми компютер дастрас мешавад) +- `somon-script` - Номи барномаи мо + +### Қадам 3: Тафтиши насб + +Барои тафтиши он ки насб дуруст анҷом ёфтааст: ```bash somon --version ``` +Агар рақами версияро бинед (масалан `0.3.49`) - насб муваффақ буд! + ## 1.4. Аввалин барномаи шумо -Биёед аввалин барномаи худро нависем. Файли нави бо номи `салом.som` эҷод кунед ва коди зеринро нависед: +Биёед аввалин барномаи худро нависем. Ин барномаи "Салом ҷаҳон" аст - анъанаи ҳама барномасозон! + +### Қадам 1: Эҷоди файл + +1. Папкаи нав эҷод кунед, масалан `барномаҳои-ман` +2. Дар он папка файли нав бо номи `салом.som` созед + +**Эзоҳ:** Файлҳои SomonScript бояд бо `.som` тамом шаванд + +### Қадам 2: Навиштани код + +Файли `салом.som` -ро дар муҳаррири матн кушоед ва коди зеринро нависед: ```somonscript // Ин аввалин барномаи мо дар SomonScript аст чоп.сабт("Салом ҷаҳон!"); ``` -Барои иҷрои барнома: +**Шарҳи код:** +- `//` - Ин шарҳ (изоҳот) аст. Компютер онро нодида мегирад +- `чоп.сабт()` - Фармоне ки чизеро дар экран нишон медиҳад +- `"Салом ҷаҳон!"` - Матне ки нишон дода мешавад + +### Қадам 3: Иҷрои барнома + +Дар терминал ба папкаи барномаатон равед ва фармонро иҷро кунед: ```bash somon run салом.som ``` -Натиҷа: +**Натиҷа:** ``` Салом ҷаҳон! ``` -## 1.5. Сохтори барнома +Табрик мегӯям! Шумо аввалин барномаи худро навиштед! 🎉 + +## 1.5. Мисолҳои бештар барои фаҳмидан + +### Мисоли 1: Салом ба шахси муайян + +```somonscript +// Салом додан ба шахси муайян +чоп.сабт("Салом, Аҳмад!"); +чоп.сабт("Чӣ хел ҳастӣ?"); +``` + +**Натиҷа:** +``` +Салом, Аҳмад! +Чӣ хел ҳастӣ? +``` + +### Мисоли 2: Чопи якчанд сатр + +```somonscript +// Чопи маълумоти гуногун +чоп.сабт("=== Маълумоти барнома ==="); +чоп.сабт("Ном: Барномаи аввалини ман"); +чоп.сабт("Сол: 2024"); +чоп.сабт("Забон: SomonScript"); +чоп.сабт("========================"); +``` + +**Натиҷа:** +``` +=== Маълумоти барнома === +Ном: Барномаи аввалини ман +Сол: 2024 +Забон: SomonScript +======================== +``` + +### Мисоли 3: Ҳисобҳои оддӣ + +```somonscript +// Компютер метавонад ҳисоб кунад! +чоп.сабт("10 + 20 ="); +чоп.сабт(10 + 20); + +чоп.сабт("50 - 15 ="); +чоп.сабт(50 - 15); +``` + +**Натиҷа:** +``` +10 + 20 = +30 +50 - 15 = +35 +``` + +## 1.6. Сохтори барнома Барномаҳои SomonScript метавонанд аз қисмҳои зерин иборат бошанд: -1. **Шарҳҳо** - барои тавзеҳот (бо `//` ё `/* */`) -2. **Эълонҳои тағйирёбанда** - барои нигоҳдории маълумот -3. **Функсияҳо** - барои коди такроршаванда -4. **Синфҳо** - барои объектҳои мураккаб -5. **Модулҳо** - барои ташкили код +### 1. Шарҳҳо (Изоҳот) + +Барои тавзеҳоти код истифода мешаванд. Компютер онҳоро нодида мегирад. + +```somonscript +// Ин шарҳи яксатрӣ аст + +/* + Ин шарҳи бисёрсатрӣ аст. + Шумо метавонед якчанд сатр нависед. + Ин барои тавзеҳоти муфассал хуб аст. +*/ +``` + +### 2. Тағйирёбандаҳо (Variables) -## 1.6. Мисоли содда +Ҷойҳое ки маълумотро нигоҳ медоранд: ```somonscript // Эълони тағйирёбанда -тағйирёбанда ном: сатр = "Аҳмад"; -тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда ном = "Аҳмад"; +чоп.сабт(ном); // Аҳмад +``` + +**Маънӣ:** Мо ҷойе бо номи "ном" сохтем ва дар он "Аҳмад" -ро гузоштем. + +### 3. Функсияҳо + +Блокҳои коде ки корҳои муайянро иҷро мекунанд: + +```somonscript +// Эълони функсия +функсия салом() { + чоп.сабт("Салом!"); +} + +// Истифодаи функсия +салом(); // Салом! +салом(); // Салом! +``` + +**Маънӣ:** Функсия монанди дастури омодашуда аст. Шумо як бор менависед ва чанд маротиба истифода мебаред. + +### 4. Синфҳо + +Қолабҳое барои эҷоди объектҳои мураккаб: + +```somonscript +// Синфи оддӣ +синф Шахс { + ном: сатр; + + конструктор(ном: сатр) { + ин.ном = ном; + } +} +``` + +### 5. Модулҳо + +Тақсимкунии код ба файлҳои гуногун барои ташкили беҳтар. + +## 1.7. Мисоли комплексӣ + +Биёед барномаи бештар муфассал нависем: + +```somonscript +// Барномаи маълумоти шахсӣ + +// Шарҳ: Маълумоти шахс +тағйирёбанда ном = "Аҳмад"; +тағйирёбанда фамилия = "Раҳимов"; +тағйирёбанда синну_сол = 25; +тағйирёбанда шаҳр = "Душанбе"; // Намоиши маълумот +чоп.сабт("======================"); +чоп.сабт(" МАЪЛУМОТИ ШАХСӢ"); +чоп.сабт("======================"); чоп.сабт("Ном: " + ном); +чоп.сабт("Фамилия: " + фамилия); чоп.сабт("Синну сол: " + синну_сол); +чоп.сабт("Шаҳр: " + шаҳр); +чоп.сабт("======================"); // Функсия барои салом додан -функсия салом(ном: сатр): холӣ { - чоп.сабт("Салом, " + ном + "!"); +функсия салом_додан(ном_шахс) { + чоп.сабт("Салом, " + ном_шахс + "! Хуш омадӣ!"); } -салом(ном); +// Садо кардани функсия +салом_додан(ном); +салом_додан("Фотима"); +салом_додан("Ҳасан"); +``` + +**Натиҷа:** +``` +====================== + МАЪЛУМОТИ ШАХСӢ +====================== +Ном: Аҳмад +Фамилия: Раҳимов +Синну сол: 25 +Шаҳр: Душанбе +====================== +Салом, Аҳмад! Хуш омадӣ! +Салом, Фотима! Хуш омадӣ! +Салом, Ҳасан! Хуш омадӣ! ``` -## 1.7. Фармонҳои асосии CLI +## 1.8. Фармонҳои асосии CLI SomonScript фармонҳои зиёди фоиданокро пешниҳод мекунад: -### Компилятсия +### 1. Компилятсия (Табдил ба JavaScript) + ```bash somon compile барнома.som ``` -### Иҷро +Ин фармон файли `.js` эҷод мекунад. + +### 2. Иҷро (Компилятсия ва иҷро якҷоя) + ```bash somon run барнома.som ``` -### Бастабандӣ (Bundle) +Ин фармон барномаро фавран иҷро мекунад. + +### 3. Бастабандӣ (Bundle - Якҷоя кардани файлҳо) + ```bash somon bundle src/main.som -o dist/app.js ``` -### Маълумот дар бораи модулҳо +Ҳамаи файлҳоро ба як файл якҷоя мекунад. + +### 4. Маълумот дар бораи модулҳо + ```bash somon module-info src/main.som --graph ``` -## 1.8. Хулоса +Намуди вобастагии модулҳоро нишон медиҳад. + +### 5. Ёрӣ гирифтан + +```bash +somon --help +``` + +Феҳристи ҳамаи фармонҳоро нишон медиҳад. -Дар ин боб шумо бо SomonScript шинос шудед ва аввалин барномаи худро навиштед. Дар бобҳои минбаъда мо ба таври муфассал бо имкониятҳои забон шинос мешавем. +## 1.9. Мисолҳои амалӣ барои машқ + +### Машқи 1: Маълумоти худатон + +Барномае нависед, ки маълумоти шуморо нишон медиҳад: + +```somonscript +тағйирёбанда номи_ман = "..."; // Номи худро нависед +тағйирёбанда синну_соли_ман = ...; // Синну соли худро нависед +тағйирёбанда шаҳри_ман = "..."; // Шаҳри худро нависед + +чоп.сабт("Ман " + номи_ман + " ҳастам"); +чоп.сабт("Ман " + синну_соли_ман + " сола дорам"); +чоп.сабт("Ман дар " + шаҳри_ман + " зиндагӣ мекунам"); +``` + +### Машқи 2: Калькулятори оддӣ + +```somonscript +// Ду адад гиред +тағйирёбанда адади_1 = 15; +тағйирёбанда адади_2 = 7; + +// Ҳисобҳоро иҷро кунед +чоп.сабт("Адади 1: " + адади_1); +чоп.сабт("Адади 2: " + адади_2); +чоп.сабт("Ҷамъ: " + (адади_1 + адади_2)); +чоп.сабт("Тарҳ: " + (адади_1 - адади_2)); +чоп.сабт("Зарб: " + (адади_1 * адади_2)); +чоп.сабт("Тақсим: " + (адади_1 / адади_2)); +``` + +### Машқи 3: Функсияи салом + +```somonscript +функсия салом_ба_донишҷӯ(ном, донишкада) { + чоп.сабт("Салом, " + ном + "!"); + чоп.сабт("Хуш омадӣ ба донишкадаи " + донишкада); +} + +салом_ба_донишҷӯ("Фотима", "Математика"); +салом_ба_донишҷӯ("Ҳасан", "Физика"); +``` + +## 1.10. Хулоса + +Дар ин боб шумо омӯхтед: + +✅ SomonScript чист ва барои чӣ истифода мешавад +✅ Чӣ тавр SomonScript -ро насб кунед +✅ Чӣ тавр аввалин барномаро нависед +✅ Сохтори асосии барнома +✅ Фармонҳои CLI +✅ Мисолҳои амалӣ + +### Қадамҳои навбатӣ: + +Дар боби минбаъда мо ба таври муфассал бо асосҳои забон (тағйирёбандаҳо, намудҳои маълумот, ва ғайра) шинос мешавем. --- -**Машқҳо:** +## Машқҳо барои тамрин + +### Машқи 1: Маълумоти шахсӣ +Барномае нависед, ки номи шумо, синну соли шумо, донишгоҳ/мактаб ва шаҳратонро нишон медиҳад. + +### Машқи 2: Паёми нав +Барномаи "Салом ҷаҳон" -ро бо паёми дигар тағйир диҳед (масалан, "Ман барномасоз шудан мехоҳам!"). + +### Машқи 3: Ҳисоби оддӣ +Ду адад гиред ва ҷамъи онҳоро ҳисоб кунед ва натиҷаро нишон диҳед. + +### Машқи 4: Функсияи оддӣ +Функсияе эҷод кунед, ки ду адад қабул мекунад ва ҷамъи онҳоро нишон медиҳад. + +```somonscript +функсия ҷамъ_кардан(а, б) { + тағйирёбанда натиҷа = а + б; + чоп.сабт(а + " + " + б + " = " + натиҷа); +} + +ҷамъ_кардан(10, 20); // 10 + 20 = 30 +ҷамъ_кардан(5, 7); // 5 + 7 = 12 +``` + +### Машқи 5: Барномаи бештар мураккаб + +Барномае созед, ки: +1. Маълумоти 3 донишҷӯро нигоҳ медорад (ном, синну сол, донишкада) +2. Барои ҳар донишҷӯ салом медиҳад +3. Миёнаи синну соли онҳоро ҳисоб мекунад + +**Роҳнамо:** +```somonscript +// Донишҷӯи 1 +тағйирёбанда ном1 = "Аҳмад"; +тағйирёбанда синну_сол1 = 20; + +// Донишҷӯи 2 +тағйирёбанда ном2 = "Фотима"; +тағйирёбанда синну_сол2 = 19; + +// Донишҷӯи 3 +тағйирёбанда ном3 = "Ҳасан"; +тағйирёбанда синну_сол3 = 21; + +// Миёнаи синну сол +тағйирёбанда миёна = (синну_сол1 + синну_сол2 + синну_сол3) / 3; +чоп.сабт("Миёнаи синну сол: " + миёна); +``` + +--- -1. Барномае нависед, ки номи шумо ва синну соли шуморо нишон медиҳад -2. Барномаи "Салом ҷаҳон" -ро бо паёми дигар тағйир диҳед -3. Функсияе эҷод кунед, ки ду адад қабул мекунад ва ҷамъи онҳоро нишон медиҳад +**Эзоҳи муҳим:** Агар дар ҷойе гир монда бошед ё савол дошта бошед, мисолҳоро аз нав кушиш кунед ва таҷрибаҳои гуногун гузаронед. Барномасозӣ бо машқ омӯхта мешавад! diff --git "a/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" "b/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" index 0921cfa..cc087c1 100644 --- "a/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" +++ "b/book/02-\320\260\321\201\320\276\321\201\322\263\320\276\320\270-\320\267\320\260\320\261\320\276\320\275.md" @@ -1,222 +1,488 @@ # Боби 2: Асосҳои забони SomonScript +## Муқаддима + +SomonScript забони барномасозӣ барои тоҷикон аст, ки имкон медиҳад барномаҳоро ба забони модарӣ нависед. Дар ин боб мо асосҳои забонро омӯзем. + ## 2.1. Тағйирёбандаҳо ва собитҳо -Дар SomonScript барои нигоҳдории маълумот аз тағйирёбандаҳо ва собитҳо истифода мебаранд. +### Чӣ тавр тағйирёбандаҳо кор мекунанд? + +**Ташбеҳи зиндагӣ:** Тағйирёбанда монанди қуттии андозаест, ки шумо метавонед чизе дар он нигоҳ доред ва баъдан тағйир диҳед. ### Тағйирёбандаҳо (Variables) Тағйирёбанда - ин контейнере аст, ки қимати онро метавон тағйир дод: ```somonscript +// Мисоли 1: Эълони тағйирёбандаҳои гуногун тағйирёбанда ном: сатр = "Аҳмад"; тағйирёбанда синну_сол: рақам = 25; тағйирёбанда дуруст_аст: мантиқӣ = дуруст; -// Тағйир додани қимат -ном = "Фотима"; -синну_сол = 22; +чоп.сабт("Ном: " + ном); // Натиҷа: Ном: Аҳмад +чоп.сабт("Синну сол: " + синну_сол); // Натиҷа: Синну сол: 25 +чоп.сабт("Дуруст аст: " + дуруст_аст); // Натиҷа: Дуруст аст: true +``` -чоп.сабт("Ном: " + ном); // Ном: Фотима -чоп.сабт("Синну сол: " + синну_сол); // Синну сол: 22 +```somonscript +// Мисоли 2: Тағйир додани қиматҳо +тағйирёбанда шаҳр: сатр = "Душанбе"; +чоп.сабт("Шаҳри аслӣ: " + шаҳр); // Натиҷа: Шаҳри аслӣ: Душанбе + +шаҳр = "Хуҷанд"; +чоп.сабт("Шаҳри нав: " + шаҳр); // Натиҷа: Шаҳри нав: Хуҷанд +``` + +```somonscript +// Мисоли 3: Якчанд тағйирёбанда дар як сатр +тағйирёбанда а: рақам = 10; +тағйирёбанда б: рақам = 20; +тағйирёбанда в: рақам = 30; + +тағйирёбанда ҷамъ: рақам = а + б + в; +чоп.сабт("Ҷамъ: " + ҷамъ); // Натиҷа: Ҷамъ: 60 +``` + +```somonscript +// Мисоли 4: Тағйирёбандаҳо бо маълумоти шахсӣ +тағйирёбанда номи_донишҷӯ: сатр = "Фотима Раҳимова"; +тағйирёбанда курс: рақам = 3; +тағйирёбанда миёнаи_бахо: рақам = 4.5; + +чоп.сабт("Донишҷӯ: " + номи_донишҷӯ); +чоп.сабт("Курс: " + курс); +чоп.сабт("Миёнаи бахо: " + миёнаи_бахо); +// Натиҷа: +// Донишҷӯ: Фотима Раҳимова +// Курс: 3 +// Миёнаи бахо: 4.5 ``` ### Собитҳо (Constants) -Собит - ин контейнере аст, ки қимати онро тағйир дода наметавонанд: +Собит - ин контейнере аст, ки қимати онро тағйир дода наметавонанд. Ҳамчун қоида, собитҳо бо ҳарфҳои калон менависанд. ```somonscript +// Мисоли 5: Собитҳои математикӣ собит ПИ: рақам = 3.14159; -собит НОМИ_БАРНОМА: сатр = "Барномаи ман"; +собит Е: рақам = 2.71828; + +чоп.сабт("ПИ = " + ПИ); // Натиҷа: ПИ = 3.14159 +чоп.сабт("Е = " + Е); // Натиҷа: Е = 2.71828 -чоп.сабт("ПИ = " + ПИ); // ПИ = 10; // ХАТО! Собитро тағйир дода наметавонанд ``` -## 2.2. Намудҳои асосӣ +```somonscript +// Мисоли 6: Собитҳо барои танзимот +собит НОМИ_БАРНОМА: сатр = "Системаи маълумоти донишҷӯён"; +собит ВЕРСИЯ: сатр = "1.0.0"; +собит МАКСИМУМИ_ДОНИШҶӮЁН: рақам = 100; + +чоп.сабт(НОМИ_БАРНОМА + " - Версия " + ВЕРСИЯ); +чоп.сабт("Максимуми донишҷӯён: " + МАКСИМУМИ_ДОНИШҶӮЁН); +// Натиҷа: +// Системаи маълумоти донишҷӯён - Версия 1.0.0 +// Максимуми донишҷӯён: 100 +``` -SomonScript панҷ намуди асосиро дастгирӣ мекунад: +**Чаро собитҳоро истифода мебаранд:** +- Пешгирии тағйироти тасодуфӣ +- Код аз фаҳмидан осонтар мешавад +- Хатогиҳоро кам мекунад + +## 2.2. Намудҳои асосӣ ### Сатр (String) +Сатр барои нигоҳдории матн истифода мешавад. + ```somonscript +// Мисоли 7: Кор бо сатрҳо тағйирёбанда ном: сатр = "Аҳмад"; тағйирёбанда фамилия: сатр = "Раҳимов"; тағйирёбанда номи_пурра: сатр = ном + " " + фамилия; -чоп.сабт(номи_пурра); // Аҳмад Раҳимов +чоп.сабт(номи_пурра); // Натиҷа: Аҳмад Раҳимов ``` -### Рақам (Number) - ```somonscript -тағйирёбанда синну_сол: рақам = 25; -тағйирёбанда қимат: рақам = 99.99; -тағйирёбанда манфӣ: рақам = -10; +// Мисоли 8: Пайванди сатрҳо +тағйирёбанда саром: сатр = "Салом"; +тағйирёбанда ҷаҳон: сатр = "ҷаҳон"; +тағйирёбанда паём: сатр = саром + ", " + ҷаҳон + "!"; -тағйирёбанда ҷамъ: рақам = синну_сол + 5; -чоп.сабт(ҷамъ); // 30 +чоп.сабт(паём); // Натиҷа: Салом, ҷаҳон! ``` -### Мантиқӣ (Boolean) - ```somonscript -тағйирёбанда дуруст_аст: мантиқӣ = дуруст; -тағйирёбанда нодуруст_аст: мантиқӣ = нодуруст; - -чоп.сабт(дуруст_аст); // true -чоп.сабт(нодуруст_аст); // false +// Мисоли 9: Сатрҳои бисёрсатрӣ +тағйирёбанда суроға: сатр = "шаҳри Душанбе, кӯчаи Рӯдакӣ, хонаи 10"; +тағйирёбанда маълумот: сатр = "Ном: Аҳмад\nСуроға: " + суроға; + +чоп.сабт(маълумот); +// Натиҷа: +// Ном: Аҳмад +// Суроға: шаҳри Душанбе, кӯчаи Рӯдакӣ, хонаи 10 ``` -### Холӣ (Null) +### Рақам (Number) + +Рақам барои нигоҳдории ададҳо истифода мешавад (ҳам бутун, ҳам касрӣ). ```somonscript -тағйирёбанда қимат: холӣ = холӣ; -чоп.сабт(қимат); // null +// Мисоли 10: Ададҳои гуногун +тағйирёбанда шумораи_донишҷӯён: рақам = 30; +тағйирёбанда қимати_китоб: рақам = 45.50; +тағйирёбанда ҳарорат: рақам = -5; +тағйирёбанда фоиз: рақам = 99.99; + +чоп.сабт("Шумораи донишҷӯён: " + шумораи_донишҷӯён); // Натиҷа: 30 +чоп.сабт("Қимати китоб: " + қимати_китоб); // Натиҷа: 45.50 +чоп.сабт("Ҳарорат: " + ҳарорат); // Натиҷа: -5 +чоп.сабт("Фоиз: " + фоиз); // Натиҷа: 99.99 ``` -### Беқимат (Undefined) +```somonscript +// Мисоли 11: Амалиёти риёзӣ бо ададҳо +тағйирёбанда нархи_асосӣ: рақам = 100; +тағйирёбанда тахфиф: рақам = 20; +тағйирёбанда нархи_ниҳоӣ: рақам = нархи_асосӣ - тахфиф; + +чоп.сабт("Нархи асосӣ: " + нархи_асосӣ + " сомонӣ"); +чоп.сабт("Тахфиф: " + тахфиф + " сомонӣ"); +чоп.сабт("Нархи ниҳоӣ: " + нархи_ниҳоӣ + " сомонӣ"); +// Натиҷа: +// Нархи асосӣ: 100 сомонӣ +// Тахфиф: 20 сомонӣ +// Нархи ниҳоӣ: 80 сомонӣ +``` + +### Мантиқӣ (Boolean) + +Намуди мантиқӣ танҳо ду қимат дорад: дуруст (true) ё нодуруст (false). ```somonscript -тағйирёбанда қимат: беқимат = беқимат; -чоп.сабт(қимат); // undefined +// Мисоли 12: Истифодаи қиматҳои мантиқӣ +тағйирёбанда донишҷӯ_аст: мантиқӣ = дуруст; +тағйирёбанда тамом_шудааст: мантиқӣ = нодуруст; +тағйирёбанда синну_сол: рақам = 20; +тағйирёбанда калонсол_аст: мантиқӣ = синну_сол >= 18; + +чоп.сабт("Донишҷӯ аст: " + донишҷӯ_аст); // Натиҷа: Донишҷӯ аст: true +чоп.сабт("Тамом шудааст: " + тамом_шудааст); // Натиҷа: Тамом шудааст: false +чоп.сабт("Калонсол аст: " + калонсол_аст); // Натиҷа: Калонсол аст: true ``` ## 2.3. Шарҳҳо (Comments) -Шарҳҳо барои тавзеҳоти код истифода мешаванд ва ҳангоми иҷрои барнома нодида гирифта мешаванд. - -### Шарҳи яксатрӣ +Шарҳҳо барои тавзеҳи код истифода мешаванд. Компилятор онҳоро нодида мегузарад. ```somonscript +// Мисоли 13: Навъҳои гуногуни шарҳҳо + // Ин шарҳи яксатрӣ аст тағйирёбанда ном: сатр = "Аҳмад"; // Шарҳ дар охири сатр -``` - -### Шарҳи бисёрсатрӣ -```somonscript /* Ин шарҳи бисёрсатрӣ аст. Он метавонад якчанд сатрро ишғол кунад. - Барои тавзеҳоти муфассал фоиданок аст. + Барои тавзеҳоти муфассал хуб аст. */ тағйирёбанда синну_сол: рақам = 25; + +/** + * Ин шарҳи ҳуҷҷатӣ аст + * Маълумот дар бораи барнома медиҳад + */ +тағйирёбанда версия: сатр = "1.0.0"; ``` ## 2.4. Номгузории тағйирёбандаҳо -Ҳангоми номгузории тағйирёбандаҳо қоидаҳои зеринро риоя кунед: - -### Қоидаҳои номгузорӣ: +**Қоидаҳои номгузорӣ:** -1. Ном бояд бо ҳарф ё `_` оғоз шавад -2. Ном метавонад аз ҳарфҳо, рақамҳо ва `_` иборат бошад -3. Ном набояд калидвожаи забон бошад -4. Ном ба калон ва хурди ҳарфҳо ҳассос аст +1. Бояд бо ҳарф ё `_` оғоз шавад +2. Метавонад ҳарфҳо, рақамҳо ва `_` дошта бошад +3. Набояд калидвожа бошад +4. Ҳассос ба калон ва хурди ҳарфҳо ```somonscript -// Номҳои дуруст: +// Мисоли 14: Номҳои дуруст ва нодуруст + +// ✓ Номҳои дуруст: тағйирёбанда номи_корбар: сатр = "Аҳмад"; -тағйирёбанда синну_сол1: рақам = 25; +тағйирёбанда синну_сол_1: рақам = 25; тағйирёбанда _қимати_пинҳонӣ: рақам = 100; +тағйирёбанда маблағиУмумӣ: рақам = 5000; -// Номҳои нодуруст: -// тағйирёбанда 1ном: сатр = "Хато"; // Бо рақам оғоз шудааст -// тағйирёбанда ном-корбар: сатр = "Хато"; // Аломати - ғайриқонунӣ +// ✗ Номҳои нодуруст: +// тағйирёбанда 1ном: сатр = "Хато"; // Бо рақам оғоз нашавад +// тағйирёбанда ном-корбар: сатр = "Хато"; // Аломати - ғайриқонунӣ +// тағйирёбанда ном корбар: сатр = "Хато"; // Фосила ғайриқонунӣ ``` -## 2.5. Чопи маълумот +**Усулҳои номгузорӣ:** + +```somonscript +// Мисоли 15: Усулҳои гуногуни номгузорӣ + +// snake_case (маъмултарин дар SomonScript) +тағйирёбанда номи_донишҷӯ: сатр = "Аҳмад"; +тағйирёбанда миёнаи_бахоҳо: рақам = 4.5; + +// camelCase +тағйирёбанда номиДонишҷӯ: сатр = "Фотима"; +тағйирёбанда синнуСолиКорбар: рақам = 22; -Барои намоиши маълумот дар консол аз `чоп.сабт` истифода мебаранд: +// Номҳои маънодор +тағйирёбанда шумораи_донишҷӯёни_фаъол: рақам = 45; // ✓ Хуб +тағйирёбанда а: рақам = 45; // ✗ Бад +``` + +## 2.5. Чопи маълумот ```somonscript +// Мисоли 16: Усулҳои гуногуни чоп + +// Чопи оддӣ чоп.сабт("Салом ҷаҳон!"); +// Натиҷа: Салом ҷаҳон! +// Чопи тағйирёбандаҳо тағйирёбанда ном: сатр = "Аҳмад"; +тағйирёбанда синну_сол: рақам = 25; чоп.сабт("Ном: " + ном); +чоп.сабт("Синну сол: " + синну_сол); +// Натиҷа: +// Ном: Аҳмад +// Синну сол: 25 +// Чопи якчанд қимат тағйирёбанда а: рақам = 10; тағйирёбанда б: рақам = 20; чоп.сабт("Ҷамъ: " + (а + б)); +// Натиҷа: Ҷамъ: 30 ``` ## 2.6. Ибораҳои литералӣ (Template Literals) -Барои сохтани сатрҳои мураккаб: +Ибораҳои литералӣ имкон медиҳанд сатрҳои мураккабро осонтар созед. ```somonscript +// Мисоли 17: Истифодаи template literals тағйирёбанда ном: сатр = "Аҳмад"; тағйирёбанда синну_сол: рақам = 25; +тағйирёбанда шаҳр: сатр = "Душанбе"; -чоп.сабт(`Ном: ${ном}, Синну сол: ${синну_сол}`); -// Натиҷа: Ном: Аҳмад, Синну сол: 25 +чоп.сабт(`Ман ${ном} ҳастам, ${синну_сол} сола дорам ва дар ${шаҳр} зиндагӣ мекунам.`); +// Натиҷа: Ман Аҳмад ҳастам, 25 сола дорам ва дар Душанбе зиндагӣ мекунам. +``` -тағйирёбанда а: рақам = 10; -тағйирёбанда б: рақам = 20; -чоп.сабт(`${а} + ${б} = ${а + б}`); -// Натиҷа: 10 + 20 = 30 +```somonscript +// Мисоли 18: Ҳисобҳо дар дохили template literals +тағйирёбанда нарх: рақам = 100; +тағйирёбанда миқдор: рақам = 5; + +чоп.сабт(`Нархи як дона: ${нарх} сомонӣ`); +чоп.сабт(`Миқдор: ${миқдор} дона`); +чоп.сабт(`Ҷамъ: ${нарх * миқдор} сомонӣ`); +// Натиҷа: +// Нархи як дона: 100 сомонӣ +// Миқдор: 5 дона +// Ҷамъ: 500 сомонӣ ``` ## 2.7. Табдили намуд -SomonScript табдили худкори намудро дастгирӣ мекунад: - ```somonscript +// Мисоли 19: Табдили худкор тағйирёбанда рақам1: рақам = 10; тағйирёбанда сатр1: сатр = "20"; // Ҳангоми пайваст, рақам ба сатр табдил меёбад тағйирёбанда натиҷа1: сатр = рақам1 + сатр1; -чоп.сабт(натиҷа1); // "1020" +чоп.сабт(натиҷа1); // Натиҷа: "1020" // Ҳангоми ҷамъ, агар ҳар ду рақам бошанд тағйирёбанда рақам2: рақам = 10; тағйирёбанда рақам3: рақам = 20; тағйирёбанда натиҷа2: рақам = рақам2 + рақам3; -чоп.сабт(натиҷа2); // 30 +чоп.сабт(натиҷа2); // Натиҷа: 30 ``` -## 2.8. Мисоли комплексӣ +```somonscript +// Мисоли 20: Табдили зоҳирӣ +тағйирёбанда сатр_рақам: сатр = "42"; +тағйирёбанда адад: рақам = Рақам(сатр_рақам); +чоп.сабт("Адад: " + адад); // Натиҷа: Адад: 42 +чоп.сабт("Дукарат: " + (адад * 2)); // Натиҷа: Дукарат: 84 +``` + +## 2.8. Мисолҳои комплексӣ ```somonscript -// Барномаи маълумоти шахсӣ +// Мисоли 21: Барномаи маълумоти шахсӣ собит НОМИ_БАРНОМА: сатр = "Системаи маълумоти шахсӣ"; +собит ВЕРСИЯ: сатр = "1.0"; -// Маълумоти шахс тағйирёбанда ном: сатр = "Аҳмад"; тағйирёбанда фамилия: сатр = "Раҳимов"; тағйирёбанда синну_сол: рақам = 25; тағйирёбанда мизони_маош: рақам = 5000; тағйирёбанда кормандӣ: мантиқӣ = дуруст; -// Намоиши маълумот -чоп.сабт("=== " + НОМИ_БАРНОМА + " ==="); +чоп.сабт("╔════════════════════════════════════╗"); +чоп.сабт(`║ ${НОМИ_БАРНОМА} v${ВЕРСИЯ} ║`); +чоп.сабт("╚════════════════════════════════════╝"); чоп.сабт(""); -чоп.сабт("Номи пурра: " + ном + " " + фамилия); -чоп.сабт("Синну сол: " + синну_сол); -чоп.сабт("Маош: " + мизони_маош + " сомонӣ"); -чоп.сабт("Кормандӣ: " + кормандӣ); +чоп.сабт("Маълумоти шахсӣ:"); +чоп.сабт(` Номи пурра: ${ном} ${фамилия}`); +чоп.сабт(` Синну сол: ${синну_сол}`); +чоп.сабт(` Маош: ${мизони_маош} сомонӣ/моҳ`); +чоп.сабт(` Ҳолати кормандӣ: ${кормандӣ ? "Фаъол" : "Ғайрифаъол"}`); -// Ҳисобҳо тағйирёбанда маоши_солона: рақам = мизони_маош * 12; -чоп.сабт("Маоши солона: " + маоши_солона + " сомонӣ"); +чоп.сабт(""); +чоп.сабт(`Маоши солона: ${маоши_солона} сомонӣ`); +``` + +```somonscript +// Мисоли 22: Барномаи ҳисоби майдони хона +собит НОМИ_БАРНОМА: сатр = "Калькулятори майдон"; + +тағйирёбанда дарозии_хона: рақам = 5; +тағйирёбанда паҳнои_хона: рақам = 4; +тағйирёбанда баландии_хона: рақам = 3; + +чоп.сабт("=== " + НОМИ_БАРНОМА + " ==="); +чоп.сабт(""); +чоп.сабт(`Андозаҳои хона:`); +чоп.сабт(` Дарозӣ: ${дарозии_хона} метр`); +чоп.сабт(` Паҳнӣ: ${паҳнои_хона} метр`); +чоп.сабт(` Баландӣ: ${баландии_хона} метр`); + +тағйирёбанда майдони_фарш: рақам = дарозии_хона * паҳнои_хона; +тағйирёбанда ҳаҷми_хона: рақам = дарозии_хона * паҳнои_хона * баландии_хона; + +чоп.сабт(""); +чоп.сабт("Натиҷаҳо:"); +чоп.сабт(` Майдони фарш: ${майдони_фарш} м²`); +чоп.сабт(` Ҳаҷми хона: ${ҳаҷми_хона} м³`); +// Натиҷа: +// === Калькулятори майдон === +// +// Андозаҳои хона: +// Дарозӣ: 5 метр +// Паҳнӣ: 4 метр +// Баландӣ: 3 метр +// +// Натиҷаҳо: +// Майдони фарш: 20 м² +// Ҳаҷми хона: 60 м³ ``` ## 2.9. Хулоса Дар ин боб шумо омӯхтед: -- Чӣ тавр тағйирёбанда ва собит эълон кардан -- Намудҳои асосии маълумот -- Чӣ тавр шарҳ навиштан -- Қоидаҳои номгузории тағйирёбандаҳо -- Чӣ тавр маълумотро чоп кардан + +✓ **Тағйирёбандаҳо ва собитҳо:** Чӣ тавр маълумотро нигоҳ доранд +✓ **Намудҳои асосӣ:** Сатр, рақам, мантиқӣ +✓ **Шарҳҳо:** Чӣ тавр кодро тавзеҳ диҳанд +✓ **Номгузорӣ:** Қоидаҳои дурусти номгузорӣ +✓ **Чопи маълумот:** Усулҳои намоиши натиҷаҳо +✓ **Template Literals:** Кор бо сатрҳои мураккаб +✓ **Табдили намуд:** Табдил байни намудҳои гуногун + +## Чаро ин муҳим аст? + +- **Тағйирёбандаҳо** имкон медиҳанд маълумотро нигоҳ доред ва бо онҳо кор кунед +- **Намудҳои дуруст** аз хатогиҳо ҷилавгирӣ мекунанд +- **Номҳои хуб** кодро аз фаҳмидан осон мекунанд +- **Шарҳҳо** ба дигарон (ва ба худатон баъдтар) кумак мекунанд кодро фаҳманд + +--- + +## Машқҳо + +### Машқи 1: Маълумоти шахсӣ +Барномае нависед, ки маълумоти шахсии шуморо нишон медиҳад: +- Ном ва фамилия +- Синну сол +- Шаҳри зиндагӣ +- Касби шумо + +**Маводҳо:** Истифодаи тағйирёбандаҳо ва template literals + +### Машқи 2: Калькулятори оддӣ +Ду тағйирёбанда бо арзишҳои рақамӣ эҷод кунед ва амалиётҳои зеринро ҳисоб кунед: +- Ҷамъ +- Тарҳ +- Зарб +- Тақсим + +**Маводҳо:** Нишон додани натиҷаҳо бо шарҳҳо + +### Машқи 3: Маълумоти донишгоҳ +Се собит эҷод кунед: +- Номи донишгоҳ +- Соли таъсис +- Шумораи донишҷӯён + +Ҳамаи маълумотро дар як формати зебо чоп кунед. + +**Маводҳо:** Истифодаи собитҳо ва чопи форматшуда + +### Машқи 4: Ҳисоби нарх +Барномае нависед, ки нархи маҳсулотро ҳисоб мекунад: +- Нархи асосӣ +- Миқдор +- Тахфиф (дар фоиз) +- Нархи ниҳоӣ (пас аз тахфиф) + +**Маводҳо:** Истифодаи формулаҳо ва template literals + +### Машқи 5: Барномаи маълумоти китоб +Маълумоти китобро нигоҳ доред: +- Номи китоб +- Муаллиф +- Соли нашр +- Шумораи саҳифаҳо +- Дар дастрас буданаш (дуруст/нодуруст) + +Ҳамаи маълумотро дар формати хонанишаванда чоп кунед. + +### Машқи 6: Ҳисоби миёна +Се адад гиред (бахоҳои донишҷӯ) ва миёнаи онҳоро ҳисоб кунед. Нишон диҳед: +- Бахоҳои алоҳида +- Ҷамъи бахоҳо +- Миёнаи бахо + +### Машқи 7: Конвертори асъор +Барномае нависед, ки сомониро ба доллар табдил медиҳад: +- Маблағ дар сомонӣ +- Курси доллар (масалан, 11.30 сомонӣ барои 1 доллар) +- Маблағи табдилшуда дар доллар + +**Маводҳо:** Истифодаи собитҳо барои курс ва ҳисобҳои математикӣ + +### Машқи 8: Барномаи маълумоти автомобил +Маълумоти автомобилро созед: +- Истеҳсолкунанда +- Модел +- Соли истеҳсол +- Масофаи гузашта (километр) +- Дар кор будан (дуруст/нодуруст) + +Ҳамаи маълумотро бо истифода аз template literals чоп кунед. --- -**Машқҳо:** +**Маслиҳатҳо барои муваффақият:** -1. Барномае нависед, ки маълумоти шахсии шуморо (ном, фамилия, синну сол) нишон медиҳад -2. Ду тағйирёбанда бо арзишҳои рақамӣ эҷод кунед ва ҷамъ, тарҳ, зарб ва тақсими онҳоро ҳисоб кунед -3. Се собит эҷод кунед: номи донишгоҳ, соли таъсис ва шумораи донишҷӯён -4. Бо истифода аз template literals маълумотро дар як сатр нишон диҳед +1. Ҳамеша номҳои маънодор интихоб кунед +2. Шарҳҳо илова кунед барои тавзеҳи коди худ +3. Кодро озмоед ва натиҷаҳоро санҷед +4. Аз template literals барои хонании беҳтар истифода баред +5. Қоидаҳои номгузориро риоя кунед