Windows Formada dizaynda ishlash murakkab. Drag&Drop - dasturga o`zgacha ko`rinish beradi va bu ajoyib imkoniyat ham. Uning tayyor kodini olib ishlatish esa undanda ko`proq zavq-shavq beradi :-) Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi. Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace Library.Controls
{
public class DragDropContainer : Control
{
private readonly Panel _content = new Panel
{
Dock = DockStyle.Fill,
Padding = new Padding(0)
};
private readonly Panel _header = new Panel
{
Padding = new Padding(0),
Height = 20,
Dock = DockStyle.Top
};
private Action _action;
private bool _mouseDown;
private string _oldPosition;
private Point _point = new Point(0, 0);
public DragDropContainer()
{
Controls.Add(_header);
Controls.Add(_content);
_content.BringToFront();
}
public int ColumnCount { get; set; }
public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
public IEnumerable> Child => _content.Controls.OfType().Select(x => x.Child);
public IEnumerable
public IEnumerable Panels => _content.Controls.OfType();
for (var i = 0; i < ColumnCount; i++)
{
var panel = new DragDropPanel
{
Name = "" + i,
Width = Width/ColumnCount,
Dock = DockStyle.Right,
Padding = new Padding(5)
};
var label = new Label
{
AutoSize = false,
Width = panel.Width,
Padding = new Padding(0),
Dock = DockStyle.Right,
Name = "" + i,
TextAlign = ContentAlignment.MiddleCenter
};
_content.Controls.Add(panel);
_header.Controls.Add(label);
dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
{
Name ="test1",
Text = "Ism Familiya"
};
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
{
MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
var position = dragDropContainer1.Child;
});
Bu versiyada panellar tartiblandi. Tartib chapdan o`ngga davom etadi. DragDropContainer ga kiritilgan controllar qaysi o`rinda turgani ham ko`rish mumkin.
Keyingi versiyada har bir harakatni, biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolamiz va unga Action bajartiramiz. So`ng bu DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ladi.
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace ControlsLibrary.Controls
{
public class DragDropContainer : Control
{
private bool _mouseDown;
private Point _point = new Point(0, 0);
public int ColumnCount { get; set; }
public IEnumerable> Child => Controls.OfType().Select(x => x.Child);
public static T Get(string body){ body.XmlToObject(); }
dasturning kodi
internal static class XmlJsonExt { public static T Deserialize(this string data) { return JsonConvert.DeserializeObject(data); } public static T XmlToObject(this string data) { return CreateDocument(data).XmlToJson().Deserialize(); } #region Utils private static XmlDocument CreateDocument(string body) { var document = new XmlDocument(); document.InnerXml = body; return document; } private static string XmlToJson(this XmlDocument xmlDoc) { var sbJson = new StringBuilder(); sbJson.Append("{ "); XmlToJsoNnode(sbJson, xmlDoc.DocumentElement, true); sbJson.Append("}"); return sbJson.ToString(); } // XmlToJSONnode: Output an XmlElement, possibly as part of a higher array private static void XmlToJsoNnode(StringBuilder sbJson, XmlElement node, bool showNodeName) { if (showNodeName) sbJson.Append("\"" + SafeJson(node.Name) + "\": "); sbJson.Append("{"); // Build a sorted list of key-value pairs // where key is case-sensitive nodeName // value is an ArrayList of string or XmlElement // so that we know whether the nodeName is an array or not. var childNodeNames = new SortedList(); // Add in all node attributes if (node.Attributes != null) foreach (XmlAttribute attr in node.Attributes) StoreChildNode(childNodeNames, attr.Name, attr.InnerText); // Add in all nodes foreach (XmlNode cnode in node.ChildNodes) { if (cnode is XmlText) StoreChildNode(childNodeNames, "value", cnode.InnerText); else if (cnode is XmlElement) StoreChildNode(childNodeNames, cnode.Name, cnode); } // Now output all stored info foreach (string childname in childNodeNames.Keys) { var alChild = (ArrayList) childNodeNames[childname]; if (alChild.Count == 1) OutputNode(childname, alChild[0], sbJson, true); else { sbJson.Append(" \"" + SafeJson(childname) + "\": [ "); foreach (var child in alChild) OutputNode(childname, child, sbJson, false); sbJson.Remove(sbJson.Length - 2, 2); sbJson.Append(" ], "); } } sbJson.Remove(sbJson.Length - 2, 2); sbJson.Append(" }"); } // StoreChildNode: Store data associated with each nodeName // so that we know whether the nodeName is an array or not. private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue) { // Pre-process contraction of XmlElement-s if (nodeValue is XmlElement) { // Convert into "aa":null // xx into "aa":"xx" var cnode = (XmlNode) nodeValue; if (cnode.Attributes.Count == 0) { var children = cnode.ChildNodes; if (children.Count == 0) nodeValue = null; else if (children.Count == 1 && (children[0] is XmlText)) nodeValue = ((XmlText) (children[0])).InnerText; } } // Add nodeValue to ArrayList associated with each nodeName // If nodeName doesn't exist then add it var oValuesAl = childNodeNames[nodeName]; ArrayList valuesAl; if (oValuesAl == null) { valuesAl = new ArrayList(); childNodeNames[nodeName] = valuesAl; } else valuesAl = (ArrayList) oValuesAl; valuesAl.Add(nodeValue); } private static void OutputNode(string childname, object alChild, StringBuilder sbJson, bool showNodeName) { if (alChild == null) { if (showNodeName) sbJson.Append("\"" + SafeJson(childname) + "\": "); sbJson.Append("null"); } else if (alChild is string) { if (showNodeName) sbJson.Append("\"" + SafeJson(childname) + "\": "); var sChild = (string) alChild; sChild = sChild.Trim(); sbJson.Append("\"" + SafeJson(sChild) + "\""); } else XmlToJsoNnode(sbJson, (XmlElement) alChild, showNodeName); sbJson.Append(", "); } // Make a string safe for JSON private static string SafeJson(string sIn) { var sbOut = new StringBuilder(sIn.Length); foreach (var ch in sIn) { if (Char.IsControl(ch) || ch == '\'') { int ich = ch; sbOut.Append(@"\u" + ich.ToString("x4")); continue; } if (ch == '\"' || ch == '\\' || ch == '/') { sbOut.Append('\\'); } sbOut.Append(ch); } return sbOut.ToString(); } #endregion }
Odatsa asynchrone usulda controllarni formada joylashtirganda xatolik yuz beradi, ammo bunday qilmasa dastur sekin ishlashi tabiiy(agar katta dastur bo`lsa)
Buning yo`li oson:
Extention yozib olamiz ,
public static class ControlExt {
public static void Asynch(this TControl control, Action action) where TControl : Control { if (control.InvokeRequired) control.Invoke(action, control); else action(control); } }
Extentionimiz tayyor, endi istagan yerda asynchrone usulda qo`shaveramiz,
content.Asynch(delegate (Panel panel) { panel.Add(new Malumotnoma { Name = "malumotnoma", Dock = DockStyle.Fill, EmployeeCode = Code }, "Malumotnoma"); });
Sqlite da atigi bir nechta funksiya bor, oddiy dasturlar uchun bu yetarli. Lekin murakkabroq so`rovlarni tuzish uchun bu albatta kamlik qiladi. Shu sababli Sqlite o`ziga qo`shimcha funksiya yozib undan keng foydalanishimiz uchun darvozalarini ochib qo`ygan.
Biz istan tipdagi funksiyani qo`shib, unga maxsus logikani ishlatishimiz mumkin. Bu funksiyalar yacheykalar bo`yicha har bir ustun uchun alohida tepadan pastga qarab ishlaydi. Aggregate funksiyalar 1 dona natija qaytaradi(masalan: sum, min, max,avg, count,..), Scalar funksiyalar satrlarning soniga teng natija qaytaradi.(length, lower, upper, day, year,...)
Foydalanish tartibi: 1. Yangi funksiyamizni Connection dan ro`yxatdan o`tkazamiz
_connection.BindFunction(new Lower());
2. Yangi funksiya tanasi
using System; using System.Data.SQLite; namespace SQLite.CustomFunction { [SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)] public sealed class Lower : SQLiteFunction { public override object Invoke(object[] args) { return args.Length > 0 ? (args[0].ToString() ?? "").ToLower() : null; } } }
Sqliteda lower funksiyasi bor, ammo u krill harfi uchun ishlamaydi, bizni yangi funksiyamiz Sqlite ning funksiyasini qayta yuklaydi(override, overload). Esda tuting: Bu so`rov sqlite browserida ishlamaydi, chunki uning kodida bu funksiya yo`q, faqat bizning ulanish usluniimizdagi ro`yxatga olingan dasturimizda ishlaydi
Main funksiyasi(asosiy
funksiya) - Barcha dasturlarda
mazkur funksiya bor. Bu funksiya dasturning kirish eshigi, dastur ishga
tushirilganda avtomatik shu funksiyaga murojaat bo`lib, shu funksiyada qaysi
funksiya ko`rsatilsa shu yerga yo`naltiriladi. agar hech bir funksiyaga
murojaat qilinmagan bo`lsa boshqa class yoki funksiyalarga murojaat qilmasdan dastur
ish faoliyatini tugatadi.
Funksiyalar
biz uchun nega kerak? - Class biz uchun tip, funksiyalarni e`lon qilish
maydoni, biror obyektni qayta ishlash uchun kerakligini bildik. Endi funksiya
haqida, nima uchun foydalanishimiz kerakligi haqida bilib olamiz. Sizchi nima
deb o`ylaysiz?
Demak,
class ning vazifalari ichida mantiqiy yoki arifmetik amallar yo`q. Biz biror
missiyani bajarishni xohlasak uning algoritmini qanday kiritamiz? Albatta
funksiyaga. Funksiyalar ko`p bo`lishi mumkin ular bir classda yoki bir nechta
class da bo`lishi ham mumkin. Eslab
o`tamiz tashqaridan ko`rishimiz uchun bu funksiya albatta public bo`lishi
lozim. Demak funksiyada dasturning mantig`i yoziladi, bu mantiq
funksiyalarga, classlarga ma`nosi bo`yicha ajratib, tartiblab yoziladi. Kerak
bo`lgan yerda shu qismni e`lon qilinadi, kerak bo`lgan yerda murojaat
qilinaveradi. Bir nechta kichik dastur
tuzmoqchi bo`lsangiz yoki bir nechta masalani ishlamoqchi bo`lsangiz har biriga
alohida proyekt yaratib o`tirishni keragi yo`q, har bir masalani bittadan
funksiyada bajarib, shu funksiyalarni asosiy funksiyadan chaqirib qo`yish
kifoya. Son-sanoqsiz funksiyalar, classlar bo`lishi mumkin, ammo ular siz
qachon murojaat qilsangizgina faoliyatni boshlaydilar. Bundan anglashiladiki,
yozayotgan kodimi kattalashib ketmasligi uchun classlarga, funksiyalarga bo`lib
tashlasak xotirani tejaymiz, murojaat qilsakgina ishlar ekanlar. Funksiyaga
murojaat ham faqat funksiya ichidan bo`ladi, e`lon qilish esa faqat class
ichida. Demak class da e`lon qilyapmiz, funksiyadan boshqa funksiyani
chaqirayapmiz. Funksiyaga murojaat qilganda funksiya nomidan so`ng
"(" belgisini qo`yamiz(qavsni
yopmay turamiz) va bizga kiritishimiz shart bo`lgan kerakli parametrlar
ko`rinadi. Demak ko`rindiki funksiyalardan foydalanish, e`lon qilish uchun
maxsus bilim shart emas, tiplarni bilsak bo`ldi ekan. Tiplarni esa OOP ni
o`rganishdan oldin misol yechish jarayonida yodlab, tushunib olamiz. Xulosa shuki biz uchun o`ylagan
algoritmimizni funksiyani e`lon qilib uning ichida(tanasida) yozamiz.
Classlarga
murojaat qilganda ma`lumot dinamik xotiraga tushadi. Chunki classni chaqirish
C# va Java da deyarli bir xil.
Bu
yerda Tom -class, tom - obyekt. demak Tom tipidagi tom.(Mushuklar turiga
kiruvchi bir hayvon yoki obyekt, ya`ni bir mushuk. E`tibor bering: Tom(Mushuk)
bilan tom(mushuk) farq qilmoqda).
Class, funksiya, obyekt
yoki propertyni static(static) element sifatida e`lon qilish mumkin. Bundan
ko`zlangan maqsad statik elementni xotiraning yuqori pog`onasiga chiqarib
qo`yish va uni xotirada doim saqlash, kerak bo`lganda unga murojaat qilish.
Statik bo`lmagan elementlar esa classga murojaat vaqtida ular ham yangidan
xotiraga olinadi, classni ishlatishni to`xtatib block yopilganda esa u
elementlar xotiradan tozalab tashlanadi. Undan tashqari class ni bir necha
marta qayta-qayta murojaat etib chaqirib foydalanilganda shu class tipida bir
nechta obyekt hosil bo`ladi, statik bo`lmagan elementlari har bir klassda
alohida element qabul qiladi, statik bo`lsa shu obyektlarda hammasida ayni shu
statik elementi bir xil qiymatga moslashib qoladi(bittasidagi statik element
o`zgartirilsa hamma obyektlarda xuddi shu statik element bir xil yangi qiymatga
o`zgarib qoladi).
Funksiyalar
ham statik bo`lishlari mumkin. Bu qachon bo`ladi? Qachonki bir funksiyaning
vazifasi o`zi joylashgan classdagi boshqa funksiyaga bog`liq bo`lmasa va uni
asosan boshqa classlardan chaqirilsa shunda ishlatiladi.
Static
elementlar class nomidan so`ng nuqta(.) qo`yib chaqiriladi
Masalan:
Console.WriteLine("..."); System.out.println("...");
bu yerda Console va System -class, WriteLine
va println esa statik funksiyalar.
Funksiyaga
murojaat - Funksiyani
chaqirish, funksiyani ishlatish, funksiya ijro etish...
Funksiyaga
murojaat etishda quyidagilarga e`tibor qaratish lozim:
1.
Funksiya qiymat qaytaradimi? - agar qaytarsa demak undan biror natija olib
boshqa o`zgaruvchiga berish mumkin.
2.
Funksiyaning tipi qanaqa, ya`ni bizga qaytadigan qiymat qaysi tipda bo`ladi? -
Agar yangi o`zgaruvchi e`lon qilib unga funksiyaning qiymatini berishni
istasak, demak yangi o`zgaruvchining tipi funksiyaning tipini o`z ichiga olishi
yoki u bilan bir xil bo`lishi shart.
3.
Funksiya parametr oladimi? - agar parametr olsa, unga parametr kiritish kerak
bo`ladi.
4.
Parametrlari nechta va tiplari qanaqa? - parametrlarning o`rniga biror qiymat
yoki boshqa bir o`zgaruvchi kiritish mumkin. Ketma-ketlik esa parametrlarning
ketma-ketligi bilan bir xil va har bir kiritilayotgan parametrning tipi e`lon
qilingan parametr o`zgaruvchisining tipi bilan bir xil bo`lishi kerak.
bular
4 ta bo`lgani bilan qiyin emas.
Ushbu
shartlar qanoatlantirilsa funksiya ishlaydi va biror natija olish yoki
shunchaki ishlatib yuborish mumkin.
Ko`rib
turganimizdek funksiyalarning ichki qismida yana biz bilgan tizimli
dasturlashning arifmetik amallaridan foydalaniladi. Shu sababli yosh
dasturchilarga masala ishlatib, ularni ko`niktirib boriladi va Class
tushunchasini qabul qilish ularga og`irlik qilmaydi. Sababi funksiyani e`lon
qilish va chaqirishdan boshqa deyarli barcha narsalar arifmetik ifodalar
bo`lmoqda...
Class
lar o`zida qiymat saqlovchi obyektlardan, funksiya va property(xususiyat)
lardan tashkil topgan. Vazifa bir turga yaqin funksiyalarni bir joyga saqlash
uchun biror bir klassning ichida e`lon qilinadi(joylashtiriladi) va biror nom
bilan nomlanadi.
Funksiyalarni
e`lon qilish - funksiyani biror class ning ichiga
joylashtirib uning ichiga logikasini(bajaradigan missiyasini)
yozish.
Funksiyani
chaqirish(ishlatish) - E`lon qilingan funksiyani chaqirish
mumkin, e`lon qilinmagan funksiya mavjud bo`lmaydi. Funksiyalar - kichik
dasturchalar, ular parametr berib ishlatiladi va biror natijani qabul qilib
olinadi.
funksiyalarni
e`lon qilishda ham ma`lum bir type(Reference yoki Value) bilan e`lon
qilinadi(yaratiladi deb ham yoziladi - bu e`lon qilish ma`nosida). Kirish
parametrlari bir nechta bo`lsa ham natijaning qiymati bir dona bo`ladi(ya`ni
bitta qiymat qaytadi).. Parametrlar ham natija ham biror type ga tegishli
bo`ladi. Natija esa funksiyaning qiymati deb aytiladi. Qiymat qaytarmaydigan funksiyalar ham bor,
bular Prosedura(Procedure) deyiladi. E`lon qilinishi xuddi funksiyalar
bilan bir xil, faqat funksiyaning tipi void deb belgilanadi. void- - bu maxsus
tip, faqat funksiyalarda qo`yiladi, qachonki uni proseduraga aylantirish kerak
bo`lgan vaqtlarda.
Return
- ingliz tilida qaytarmoq, qaytarib bermoq, jo`natmoq yoki javob bermoq
ma`nolarini beradi. Biz bu operatorni funksiyalarda qo`llaymiz. Shu
funksiyaning natijasini qaytaruvchi operator. Dasturning biror qismidan kerakli
funksiyani chaqirganimizda odatda undan biror natija kutamiz va kelgan natijani
boshqa bir o`zgaruvchiga beramiz. Shu funksiyadan natija qaytishi uchun
returndan foydalaniladi. Returndan
keyingi operatsiyalar bajarilmaydi. Funksiyada qanday amallar bajarilganiga
qaramay returnda nima berilgan bo`lsa shu qaytad(funksiyaning qiymati shunga
teng bo`ladi).
Obyektlar
orqali ma`lumotlarni qayta ishlash va amallar bajarishni ta`minlashda
foydalaniladigan dasturlash tillari Obyektga
yo`naltirilgan dasturlash tillaridir. OOP ham rivojlanish evaziga ehtiyoj
sababli yuzaga kelgan. OOP ning
imkoniyatlari ba`zida bizning tasavvurimizdan ham kattaroq. Unda istalgan
tipdagi obyektlarni qayta ishlashning imkoni bor. OOP dasturlarini tasavvur
qilish tizimli dasturlarni tuza oladigan dasturchilar uchun qiyin emas, OOP -
tizimli dasturlarning majmui. Istalgan dasturni tahlil qilsak - hech bir dastur
yo`qki unda tizimli dasturlash tillaridagi amallar bajarilmasa, OOP da ham
turli xil tiplar bo`lgani bilan ular ham oddiy tiplardan tuzilgan
to`plamlardir, ular o`rtasida amal bajarganda ham shundoq o`zini emas ichidagi
a`zolari o`rtasida amallar bajariladi. A`zolari esa o`sha biz bilgan oddiy
tiplar hisoblanadi.
OOP ning 3 prinspi:
1.
Inkaptsulyatsiya (incapsulation)(Class a`zolarining xavfsizligini ta`minlash)
Savol:
Object nima? Object(obyekt) - xotirada saqlangan
ma`lumotning e`lon qilingan nomi(o`zgaruvchisi). O`zgaruvchi
- ma`lumotni biror bir nom bilan e`lon qilish.
Savol:
Struct nima? Struct(struktura) -obyekt tegishli
bo`lgan to`plamning nomi. Bu to`plamni tip(type) deb ataladi. Struct tipidagi
obyektda ichidagi barcha o`zgaruvchilar tashqaridan ko`rinib turadi.
Savol:
Class nima? Class ham xuddi Struct kabi type, lekin
undagi obyektning ba`zi xususiyatlari bor, ular bu obyektning tanasini yashirib
turadi va boshqalar.. Shu sababli ham struct dan odatda juda kam foydalaniladi.
Chunki Struct - bu public(ommaviy, ochiq, oshkora obyekt). Bundan tashqari
Class lar kod yozishda ham muhim ahamiyatga ega. Dasturchi dastur tuzganda
odatda har bir missiya uchun bir funksiya ochadi va funksiya nomini shu missiyaga
mos qilib nomlaydi. Kodning matnini shu funksiyalarda yozadi. Funksiyani o`zini
esa Class da yoziladi. Demak Classda kod matnini emas funksiya(method-metod),
property(xususiyat) hamda o`zgaruvchilar yoziladi, funksiyaning ichida esa
kodning matni yoziladi.(adashtirmaslik
kerak). Ma`lum bir guruhga kiradigan missiyalar, mantiqlar to`plami bitta
Class da tashkil etiladi va shu class nomini ham mantiqdan kelib chiqib nom
beriladi. Agar bu class mantiqiy amallarni bajarish uchun emas, faqat
to`plamning tipi(type) uchun yaratib vaqtincha shu tipdagi ma`lumotni saqlab
turish uchun yaratilgan bo`lsa (ya`ni undan maqsad faqat ma`lumot saqlash va
biror manzilga yo`naltirish) demak unda funksiyaning keragi yo`q.
Masalan:
Bu
class Tom obyektining qiymatini saqlash uchun e`lon qilingan. Tom-mushuk bir
obyekt bo`lsa uning ismi va yoshini saqlab turadigan class. Demak bu to`plam
yoki bir tip ki, unda mushuk haqida ma`lumotlar saqlanadi. Bu klass tipidagi
obyektlar ko`pligi bizga bir nechta mushukning ma`lumotlari saqlanayotganligini
bildiradi. Oydinlashadiki. biz OOP dasturlash tillarida o`zimiz xohlagancha tip
e`lon qilib foydalana olishimiz mumkin ekan. Biz OOP orqali juda katta
imkoniyatlarga erishamiz. Class lar birgalikda kutubxona(library-biblioteka)
fayllarini tashkil etadi, bu kutubxonalar ham biror katta dasturlar tizimini
tashkil etadi. Masalan: Windows OS ham kutubxonalardan tashkil topgan.
Public va Private nima? Class
a`zolarining xavfsizligini ta`minlash(inkapsulyatsiya)-incapsulation) prinspining
maxsus so`zlari. Public, Protected, Private turlari mavjud.
Public(umumiy) - ushbu elementni class tashqarisidan ko`rish, o`zgartirish
mumkin yoki yo`qligini bildiradi
Protected(himoyalangan)
- ushbu element shu class avlodlari(nasl olinganda) ichida va shu class ning
ichida ko`rinishi, murojaat qilish mumkinligi va qiymatini o`zgartira olish
huquqini beradi
Private(maxfiy)
- mazkur element o`zi joylashgan class ichidagina ko`rinishi va qiymatlarini
o`zgartira olinishi hamda murojaat huquqini beradi.
Bu
bizga nima uchun zarur? Tasavvur qilishga oson bo`lishi uchun kompyuter
klaviaturasidan foydalanamiz. Klavishlar public elementlar, uning ichki
qismidagi sxemalar esa private. Bizga faqat foydalanishimiz kerak bo`lgan
elementlar ko`rsatib qo`yilgan, qolgani esa biz uchun muhim emas va mavhum.
Protectedni esa xotirada qolishi uchun foydalangan vaqtimizda tushuntirib
o`tamiz.
Takrorlanish operatori ( for -parametrli sikl operatori)
Takrorlanish
operatori ham muhim ahamiyatga ega. Qo`yilgan masalaning yechimi bir yoki
bir-nechta arifmetik ifodaning N marta qayta-qayta hisoblanishi natijasida
chiqadigan bo`lsa bundan foydalaniladi.
Shartli o`tish operatori ( if )
Shartli o`tish operatori - biror shart bajarilganda belgilangan vazifani bajarishga yo`naltiruvchi operator. E`tibor bering: shart bajarilganda. bu operatorning sintaksisi quyidagicha. Belgilangan vazifa bajarilishi uchun biror shart qo`yish kerak bo`lganda foydalaniladi.
Biror shart bajarilganda 1-vazifa aks holda 2-vazifa bajarilishi uchun ham foydalanish mumkin.