Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:
Object Pascal тіліндегі жазулар дегеніміз не және олар қалай сиппаталады.
Width_do операторының қызметі қандай?
Жазықтықта n нүкте берілген. Координаталар басына жақын орналасқан нүктені табыңыз.
Нүкте мен түзуді, екі түзудің және екі жазықтықтың арасындағы қашықтықты табыңыз.
дене бір қалыпты үдемелі қозғалады. Дененің Т уақыттан кейінгі жылдамдығы мен үдеуін табыңыз.
4A+7B-3A+8A-2K+1P-5R-2B көпмүшелігі берілген. А үшін ұқсас мүшелерді тауып, қосынды коэффицентті есептеңдер.
Группада 30 оқушы бар. Студенттердің берілген аты-жөні және 6 сабақтан тапсырған емтихан бағасы бойынша әрбір оқушының орта балын, аты-жөнін және ең жақсы оқушының орта балын есептеп экранға шығаратын программа құрыңдар.
Ағымдағы күннен Х күн өткеннен кейін болатын күнді есептейтін программа құрыңдар.
мекеменің автомобильдері жөніндегі мәліметтер (марка түсі, шыққан жылы, сапасы, құны) сақтап, жасалған сұрау бойынша әліметтерді беретін программа құрыңдар.
қалааралық автобекеттегі автобустар қозғалысының кестесін сақтайтын программа құрыңдар: рейс нөмірі, маршрут (бастапқы және соңғы пункттері), жүру мезгілі.
«Студент» деп аталатын жазу типті мәлімет берілген. Төмендегі ақпаратты өндейтін программа құрыңдар.
Қалада және жатаханада қанша студент тұрады;
Бірінші семестрдегі қанша студенттің балы 12-ден жоғары;
Екінші семестрдегі қанша студенттің балы 13-тен төмен;
Оқу жылы бойынша орташа оқу үлгерімін есептеу;
Үлгермейтін студенттердің тізімін шығару;
Тізімді балдың кемуі бойынша реттеу;
Тізімді алфавиттік ретпен реттеу.
Зертханалық жұмыс №9
Тақырыбы: Жиындар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:
Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:
Жиындар- бір-бірімен логикалық байланысқан бір типті объектілер жиыны. Объектілердің арасындағы байланыстардың сипатын программист көрсетеді, оны Object Pascal тілі ешқандай да бақыламайды. Жиынға кіретін элементтер саны 0 мен 256 аралығында өзгеруі мүмкін. Бірде бір элементі болмайтын жиын бос жиын деп аталады. Элементтер санының тұрақты болмайтындығы арқылы жиындарды массивтер ен жазулардан ажыратамыз.
Екі жиын эквивалентті деп есептеледі, сонда тек сонда ғана олардың элементтері тең болса, жиын элементтерінің орналасу ретіне ешқандай мән бермейді.
Енді жиындардың берілуі мен аяқталуына мысалдар келтірейік:
Type
digitChar= set of ‘0’..’9’;
digit=set of 0..9
var
begin
s1,s2,s3:DigitChar;
s4,s5,s6:digit;
begin
s1:=[‘1’,’2’,’3’];
s2:=[‘3’,’2’,’1’];
s3:=[‘2’,’3’];
s4:=[0..3,6];
s5:=[4,5];
s6:=[3..9];
…
End.
Бұл мысалдағы s1 мен s2 жиындары эквивалентті, ал s3 жиыны s2 жинының ішіне кіреді.
Жин типтерінің жазылу форматы төмендегідей:
<тип аты> = set of <базалық тип>;
Мұндағы <тип аты>- жиын типінің идентификаторы, set, of- қызметші сөздер, <базалық тип>- жиын элементтерінің базалық типі ретінде word, integer, LongInt, Intb типтерінен басқа кез келген реттелген тиа алынады.
Жиын элементтерін беруде жиын конструкторы пайдаланылады: бр-бірінен үтір арқылы ажыратынлған жиын элементтерінің тізімі, тізім квадарт жақшаның ішіне орналасады.
Жиындарға төмендегідей операцияларды қолдануға болады:
жиындардың қиылысуы- (*); екі жиынның қиылысу нәтижесінде алынған жиынға екі жиынның ортақ элементтері де кіреді. Мысалы, s4*s6- ның нәтижесі [3] болады; s4*s5 –тың нәтижес бос жиын болды.
Жиындардың бірігуі (+). Екі жиынның бірігуі бір мезгілде екі жиынға да кіретін ортақ элементтерден тұратын үшінші жиын болып табылады.
Жиындардың айыымы. Екі жиынның айырымы екінші жиын элементтері кірмейтін, бірінші жиын элементтерінен тұратын үшінші жиын болып табылады.
Жиындарға қолданылатын амалдар
Жиындық типтердің берілгендері үшін қалыптастыру, біркітіру, айырымдық және in амалдары анықталған. Сондай-ақ, “<”, “>”, “<=”, “>=”, “=” және “<>” қатынас белгілері пайдаланылады.
“=” қатынас белгісі. Егер А және В жиындары бірдей элементтерден тұратын болса, онда бұл жиындар тең болып есептеледі. Салыстырылатын жиындардағы элементтердің орналасу ретінің теңдік шартына әсері болмайды.
А жиынының мәні В жиынының мәні Өрнек Нәтиже
[1,2,3,4] [1,2,3,4] A=B True
[‘a’,’b’,’c’] [‘c’,’a’] A=B False
[‘a’..’z’] [‘z’..’a’] A=B True
Тең емес қатынас белгісі (<>). А және В жиындарының кем дегенде бір элементі өзгеше болатын болса, онда олар тең емес болып есептеледі.
А жиынының мәні В жиынының мәні Өрнек Нәтиже
[1,2,3] [3,1,2,4] A<>B True
[‘a’..’z’] [‘b’..’z’] A<>B True
[‘c’..’t’] [‘t’..’c’] A<>B False
Үлкен немесе тең қатынас белгісі (>=) Егер В жиынының барлық элементтері А жиынының құрамына кіретін болса, А>=И қатынасының нәтижесі ақиқат болады, ал кері жағдайда жалған болады.
А жиынының мәні В жиынының мәні Өрнек Нәтиже
[1,2,3,4] [3,2,4] A>=B True
[‘a’..’z’] [‘b’..’t’] A>=B True
[‘c’..’x’,’t’] [‘t’,’c’] A>=B True
Кіші немесе тең (<=) қатынас белгісі. Алдыңғы операцияда пайдаланылғандай, егер А жиынының барлық элементтері В жинының құрамына кіретін болса, онда А<=В өрнегінің нәтижесі ақиқат болады, кірі жағдайда жалған болады.
А жиынының мәні В жиынының мәні Өрнек Нәтиже
[1,2,3] [2,,3,4] A<=B True
[‘d’..’h’] [‘b’..’t’] A<=B True
[‘c’,’x’,’t’] [‘t’,’c’] A<=B True
In операциясы. Бұл операция қандай да бір мәннің көрсетілген жиында жататындығын тексеру үшін пайдаланылады. Әдетте шартты операторда пайдаланылады.
А жиынының мәні Өрнек Нәтиже
2 If A in [2,3,4,] then.. True
‘v’ if A in [‘a’..’n’] then False
x1 if A in [x0,x1,x2,x3] True
In операциясы бірқатар басқа да амалдары аламастыра отырып, күрделі шартты тексерулерді тиімді, көрнекі сипаттауға мүмкіндік береді. Мысалы,
If (a=1) or (a=3) or (a=4) or (a=5) then ... өрнегін өте қысқа, әрі көрнекі түрде сипаттауға болады:
If A in [1..6] then
Бұл операцияларға қосымша төмендегідей екі процедураны пайдалануға болады:
INCLUDE- жиынға жаңа элемент қосады. Процедураның шақырылуы төмендегідей:
INCLUDE (S,I)
Мұндағы S-TSETBASE базалық тип элементтерінен тұратын жиын; І- жиынға қосуға қажетті TSETBASE элементінің типі.
EXCLUDE-жиынан элементті шығарады. Процедураның шақырылуы төмендегідей:
EXCLUDE (S,I)
Шақыру параметерлері INCLUDE процедурасыдағыдай.
Тапсырма:
Тапсырманы орындауға әдістемелік нұсқаулар:
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:
Жиын дегеніміз не?
Жиынға кіретін элементтер санының өзгеру аралығы қандай?
Жиындарға қандай операциялар қолданылажы және қандай қатынас белгілері пайдаланылады?
Латын әріптерінен тұратын мәтін және тыныс белгілері берілген. Әрбір әріптің кіру мөлшері мен кіру процентін есептейтін программа құрыңыз?
1..60 аралығындағы сандардан құрылған Х[1..n] және Y[1..m] екі тізбегі берілген. Осы екі тізбектің барлық ортақ элементтерін табыңдар.
100..150 аралығындағы сандардан құрылған Х[1..n] және Y[1..m] тізбектері берілген. Х тізбегіне кіретін, ал У тізбегіне кірмейтін барлық элементтерін табыңдар.
1..30 аралағына 40 сан брілген. Осы сандардың ішіндегі Фиббоначчи санының қанша екеніні және бірінші мәнді цифры 1 немесе 2 болатын қанша цифр бар екенін анықтаңдар.
Символдардан құралған S жолындағы кездесетін “*”, “+”, “-” арифметикалық амал белгілерінің мөлшерін анықтаңдар.
100...250 аралығындағы сандардан құралған Х[1..n], Y[1..m] және Z[1..k] тізбектері берілген. Алғашқы екі тізбекте кездесетін ал, үшінші тізбекте кездеспейтін барлық элементтерді табыңдар.
100..180 аралығындағы сандардан құралған Х[1..n], Y[1..m] және Z[1..k] тізбектері берілген. Осы тізбектерде тек бір реттен ғана кездесетн барлық элементтерді табыңдар.
Нақты сандардан құырлған А [1..n, 1..n] матрицасының жолдары мен бағандарының нөмірлері сәйкес типі 1..n болатын S1 және S2 бос емес жиынында жататын элементтерінің қосындысын табыңдар.
Цифрлар мен латын әріптерінен құрылған мәтін берілген. Осы мәтіндегі дауысты немесе дауыссыз дыбыстардың қайсысы көп екенін анықтаңдар.
100..250 аралығынан алынған Х[1..n] тізбегі берілген. Тізбектегі қайталанбай тек бір реттен кездесетін әрбір санды басып шығыңдар.
1..250 аралығынан алынған n2+m2 түрінде берілген барлық бүтін сандарды өсу ретімен басып шығарыңдар.
[1..200] аралығындағы барлық жай сандарды өсу ретімен басып шығаратын программа құрыңдар.
Зертханалық жұмыс №10
Тақырыбы: Жолдар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:
Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:
Object Pascal тілінде мәтіндерді өңдеу үшін төмендегідей типтері пайдаланылады:
ShortString шағын жол немесе String [N], мұндағы N<=225
String ұзын жол;
WideString кең жол;
Pchar нөлдік терминалдық жол.
Бұл типтердің бәріне ортақ әрбір жол символдардан құралған бір өлшемді массив ретінде сипатталуында, ал жұмыс істейтін программада символдар мөлшері өзгеріп отырады: String[N] үшін жолдың ұзындығы 0- ден N-ге дейін, ал String және Pchar үшін 0-ден 2 Гбайтқа дейін өзгереді.
Ең үлкен ұзындықты шағын хабарлау ShortString стандартты типі арқылы жүзеге асадды. Windows-де нөлдік терминалдық жол жиі пайдаланылады, ол #0 символымен шектелген символдар тізбегін береді. Мұндай жолдардың ең үлкен ұзындығы жадының үлкендігіме шектеледі. OLE технологиясына негізделетін компоненттермен үйлесімділік үшін Delphi 32- де WideString стандарты типімен хабарланатын кең жолдар енгізілген. Олар өздерінің қасиеттері бойынша String жолымен бірдей, бірақ әрбір символды беру үшін 2 байт пайдаланылады.
STS ұзын жолын хабарлағандағы жадының жұмыс механизмі төмендегідей болады: компилятор жады ұяшығының нөмірін орналастыруға жеткілікті болатын айнымалы үшін 4 бай орын бөледі. Бөлінген орынға символдық жол орналасады. Мұны STS айнымылысы жолға сілтеме жасады дейді. Мұндай өңдеушінің бірінші операторы орындалғанда программа «символдар жолы» символдар тізбегінің ұзындығын анықтап, операциялық жүйеден 15+5=20 байт орын бөлуді талап етеді. STS айнымалысына бірінші бөлінген байттың нөмірін орналастырады.
Procedure TfmExample.bbRunClick (Sender:tObject);
Var
STS,STSS: String;
begin
STS:= ‘Символдар жолы’;
STS:=’Бұл’+STS;
STS[7]:+’’; //Жолдағы символдар 1-ден бастап нөмірленеді.
LBOutput.Caption:=STS;// «Бұл символдар жолы» деген жол шығады.
End;
Сондай-ақ, осы бөліктен бастап символдар тізбегін орналастырады да, терминалдық нольмен және 4 байттық есептегішке сілтемемен аяқтайды. Программаны жүргізу кезеңіндегі мұндай орналастыру динамикалық деп аталды, сонымен бірге компилиция кезеңіндегі орналастыру статикалық деп аталады. Жадымен жұмыс істеу кезінде сілтеме есептегіш маңызды роль атқарады:
STSS:=STS;
Оператор орындалғанда STSS айнымалысының мәнін орналастыруға жадыдан орын бөлінбейді, STSS айнымалысы STS айнымалысының мәні меншіктейді, оған байланысты жадының сілтеме есептегіші 1-ге артады. Сөйтіп, екі көрсеткіш те жадының бір бөлігіне сілтеме жасайды, оның сілтеме есептегішінің мәні 2-ге тең болады.
STS:=’бұл’+STS;
операторы орындалғанда сілтеме есептегіші 1-ге кемиді, жадыдан жаңа ұяшық бөлінеді, ұзындығы 20+6=26 байт. Жадының бұл ұяшығының көрсеткіші STS айнымаласына барып орналасады да, жадының өзіне «Бұл символдар жолы» деген символдар тізбегі, сілтеме есептегішінің бірілгінен тұратын терминалдық ноль орналасады. Сөйтіп, STSS және STS айнымалылары жадының әртүрлі бөліктеріне сілтеме жасайды. String жолын орналастыруға бөлінген жадының бөлігі-егер сілтеме есептегіші 0-ге тең болса босатылады.
Char типті айнымалыны хабарлағанда да жадымен орындалатын жұмыс осыған ұқсас жүзеге асырылады.
32 разядты Windows-дің нұсқалары символдардың үш түрін пайдаланады: бір байтты ANSI символы, екі байтты символ және Unicode символы. Unicode симвлы жадыдан 65536 мүмкін болатын мәндерден құралатын бір сөздік орын алады. Екі байттық символдар мен Unicode символдары WideString типті жолдардан құралған-WideChar стандартты типімен хабарланады. OLE технологиясын пайдалантын Windows –дің барлық программалары Unicode символдарына сәйкес кодталуы тиіс.
String және ShortString типтері
Ішкі орналасуындағы айырмашылыққа қарамастан қысқа ShortString және ұзын String жолдарының қасиеттері программист үшін бірдей. Жолдың ағымдағы ұзындығын Lengt функциясының көмегімен алуға болады. Мысалы, келесі оператор барлық соңғы бос орындарды алып тастайды:
While (Length (STS)<>0) and (STS [Length(STS)]=’’) do
SetLength (STS, Length (STS)-1);
Бұл мысалды стандартты SetLength процедурасы жолдың жаңа ұзындығын тағайындайды. Жолдарға жалғастыру операциясын қолдануға болады. Мысалы,
STS:=’a’+’b’; //STS “ab”
STS:=STS+’c’; //STS “abc”
Егер жалғанған жолдың ұзындығы жолдың көрсетілген N ұзындығынан артып кететін болса, онда артық символдар қалады. Мысалы, келесі программа “1” символын береді.
Procedure TfmExample.bbRunClick(Sender:Tobject);
Var
SSS:String [1];
Begin
SSS:=’123’;
LBOutput.Caption:=SSS;
End;
Қатынас операциялары: =,<>, >, <, >=, <=, символдардың ішкі кодталуын ескере отырып, символмен тексерілетін екі жол үшін орындалады. Мысалы, төмендегі қатынастар True мәнін береді:
‘A’>’1’
‘Object’ < ‘Object Pascal’
Жолдар мен символдара қолданылатын қалған операциялар арнайы стандартты процедуралар мен функциялар арқылы жүзеге асырылады.
5.3.2. Нөлдік терминалдық жолдар
Нөлдік терминадық жолдар Windows-дің API (Application program interface) функцияларыншақыруда жиі пайдаланылады. Өйткені Delphi ортасының компоненеттері Windows-дің API функцияларына байланысты барлық мәселелерді шешеді, программистің нөлдік терминалдық жолдарды пайдаланатын кездері сирек болады. Дегенмен мұндай жолдарды өңдеудің ерекшеліктеріне қысқаша тоқталып өтейік.
String базалық типі жадыда термианльдық нөлді сақтайды, сондықтан Object Pascal бір жолдық өрнекте екі типтің аралас пайдалануына мүмкіндік береді. Сондай-ақ String және Pchar түрлендіру автофункцияарының көмегімен типтерді өзара келтіруді жүзеге асырады. Мысалы,
Procedure TfmExample.FormActivate(Sender:TObject);
Var
PCS:Pchar;
SSS:=’123456’;
Begin
PCS:=’X=’;
SSS:=’X=’;
LBOutput.Caption:=SSS+PCS;
End;
Бұдан LBOutput жолына Х= 12346 жазылуы шығады.
Енді тағы бір мысал қарастырайық. АРІ функциясының құрамына экранда тақырыбы, мәтіндік хабарламасы мен батырмалар жиынтығы бар диалог терезесін құруға мүмкіндік беретін MessageBox функциясы кіреді.
Алдыңғы мысалдың соңына
MessageBox (0,SSS+PCS,’терезе тақырыбы’,mb_ok);
операторын қоссақ, компилятор қате деп көрсетеді, яғни функцияны шақыратын екінші параметр Pchar типті өрнек болуы тиіс. Сонымен бірге, SSS+PCS өрнегі тәрізді компилятор оны жалпы String типіне келтіреді. Оператордың дұрыс жазылуы төмендегідей:
MessageBox (0,Pchar (SSS+PCS),’терезе тақырыбы’,mb_ok);
Мәтіндік тұрақтылар кез келген жолдық типпен үйлеседі, сондықтан үшінші шақыру парметрін компилятор қатесіз өңдейді.
Delphi ортасында Pchar және String төемнгі шекарасы нөлден басталатын символдар массиві болып есептеледі. Pchar және String типтерінен айырмашылығы мұндай массив компиляция кезеңінде статикалық толтыру арнайы StrCopy процедурасының көмегімен жүзеге асырылады:
Procedure TfmExample.bbRunClick(Sender:Tobject);
Var
АСS:array [0..6] of char;
Begin
StrCopy (ACS, ‘123456’);
SSS:=’123’;
LBOutput.Caption:=ACS;
End;
Pchar типімен жұмыс істеу үшін String типіндегідей операциялар: «+» жалғастыру және салыстыру =,<>, >, <, >=, <=, операциялары пайдаланылады. Сондай-ақ, нөлдік терминалдық жолдаомен жұмыс істеуге арналған қосалқы программалар бар.
ТАПСЫРМА:
Жолдағы символдардың санын есептейтін қосымша құрайық. Жолды енгізіп болғаннан кейін ENTER клавишасын басу қажет. Ал, программа жұмысын аяқтау үшін Close батырмасын басу керек.
ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:
Алдымен формаға орналастыратын компоненттерге сипаттама берйік. Жолдармен жұмыс істегенде енгізу мен шығаруды ListBox және ComboBox компоненттерінің көмегімен ұйымдастырған ыңғайлы. ListBox компоненті элементтері клавиатураның немесе тышқанның көмегімен таңдалатын тізім болып табылады. Элементтер тізімі Items қасиетімен, Add, Delete және Insert әдістерімен жолдарды қосу, өшіру және қою орындалады. Еркшеленген элементтің нөмірін анықтау үшін ItemIndex қасиеті пайдаланылады.
Ал, ComboBox компоненті ListBox тізімі мен Edit редакторының комбинациясын береді, сондықтан осы компоненттердің барлық қасиеттері біріктірілген деуге болады. Жөндеу терезесімен жұмыс істеу үшін Edit компонентіндегідей Text қасиеті пайдаланылады, ал ListBox компонентінде тізімнен таңдау үшін Items қасиеті пайдаланылады. Style қасиетімен анықталатын компоненттің түрі бар. CsSimple түрінде тізім барлық уақытта ашық болады, ал қалған жағдайларда редактордың оң жағындағы ашу батырмасын басқаннан кейін ашылады. ListBox және ComboBox компоненттері Standard бетінде орналасқан.
Ал, BitBtn компоненті Additional бетінде орналасқан және стандартты Button батырмасының бірнеше түрін беретіні 4-тарауда айтыған болатын. Бұл жағдайда BkClose батырмасы негізгі терезені жауып, программа жұмысын аяқтайды.
Енді оқиғаны өңдеуші процедуралар құруды қарастырайық. Қосымшаны шақырғаннан кейін интерфейс панелі экранда пайда болған кезде ComboBox компонентінің өрісіне курсорды келтіретін форманы екпінді жасағанда пайда болатын OnActivate оқиғасын пайдалануға болады. Бұл оқиға- өңдеушіні құру үшін Объектілер Инспекторы терезесінен Form1 компонентін таңдап, Events бетінен OnActivate оқиғасын тауып, оның оң жақ бөлігін тышқанмен жылдам екі рет белгілейміз. Курсор оқиға өңдеуші
Procedure FormActivate (Sender:TObject);
процедурасының мәтінінде орналасады. Процедура денесіне ComboBox компонентіндегі таңдалатын тізімге енгізілу үшін орындалатын оқиға өңдеуші процедураны қарастырайық. Ол үшін Объектілер Инспекторы терезесінен ComboBox компонетін таңдап, Events бетінен OnKeyPress оқиғасын тауып, оның оң жақ бөлігін тышқанмен жылдам екі рет белгілейміз. Нәтижесінде курсор оқиға өңдеуші.
Procedure ComboBox1 KeyPress (Sender:TObject; var Key:Char);
процедурасының мәтінінде тұрады. Дәл осылайша, тышқанның батырмасын басқанда тізімен таңдаулы жүзеге асыратын ComboBox1компоненті үшін OnClick оқиға өңдеуші
Procedure ComboBox1 Click (Sender:TObject);
процедураны алу орындалады.
Таңдалған жолдағы символдар санын есептейтін негізгі алгоритмді жүзеге асыратын программа мәтіні төмендегідей:
unit HMUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
Type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
ComboBox1.SetFocus;
end;
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
ComboBox1.Items.Add(ComboBox1.Text);
ComboBox1.Text:='';
end;
end;
procedure TForm1.ComboBox1Click(Sender: TObject);
var st:string; nst,n,i,ind:integer;
begin
n:=0;
ind:=0;
nst:=ComboBox1.ItemIndex;
st:=ComboBox1.Items[nst];
for i:=1 to Length(st) do
case ind of
0:if st[i]<>''then
begin
{ind:=1;}
n:=n+1;
end else n:=n-1;
1:if st[i]=''then ind:=0;
end;
Label3.Caption:=IntToStr(n);
end;
end.
П
Достарыңызбен бөлісу: |