М. Ӛ. МҰҚашева, Ұ. Т. Махажанова


IV Зертханалық және ӛзіндік жұмыстарға арналған әдістемелік нұсқаулар



Pdf көрінісі
бет4/13
Дата31.12.2016
өлшемі2,48 Mb.
#883
1   2   3   4   5   6   7   8   9   ...   13

IV Зертханалық және ӛзіндік жұмыстарға арналған әдістемелік нұсқаулар 
 
1 - зертханалық жұмыс.  
Программалауда  қазіргі  қолданылып  жүрген  технологиялар.  Объектіге  бағдарланған 
программалаудың  негізгі қағидалары 
   
Әдістемелік нұсқаулар 
 
Объектіге  бағдарланған  программалауды  жүзеге  асыратын  программалау  орталарына  
Visual  Basic,  C++  Builder  және  т.б.  жатады.    ОБП-дың  мағынасы  мынада:  программаның 
құрамындағы  кӛптеген  элементтер  (мысалы,  терезелер,  мәзірлер,  батырмалар  және  т.б.), 
программаға  тұтастай  қойылатын  және  программистің  басқаруына  ыңғайланған  белгілі  бір 
объектілер ретінде қарастырылады. Бұл объектілердің инкапсуляция, қабылдаушылық және 
полиморфизм  принциптеріне  негізделген  ерекше  қасиеттері,  әдістері  және  әрекеттері 
болады. Объектіге бағдарланған программалаудың негізін құрайтын да осы   инкапсуляция, 
қабылдаушылық және полиморфизм принциптері.   
Класс.  Инкапсуляция,  қабылдаушылық  және  полиморфизм  принциптеріне  сәйкес 
анықталатын  объектілерді  программада  сипаттау  және  қолдану  үшін      класс  деп  аталатын 
жаңа  құрылымдық  тип  қарастырылады.  Кез-келген  объект  белгілі  бір  кластың  ӛкілі,  бір 
данасы  немесе  айнымалысы    болып  есептеледі.  Кластың  құрамына  ӛрістер,  әдістер  және 
қасиеттер кіреді.  
Тума  кластар  ӛздерінде    түпкі  кластың  барлық  ӛрістерін  сақтап  калады  және  оны 
ӛзгерте  алмайды,  алып  тастауға  да  болмайды,  тек  жаңа  ӛрістермен  толықтыруға  болады. 
Түпкі класстың  программадағы сипатталуы немесе  кластың жаңа  данасын құру программа 
модулінде келесі түрде жазылады.:    
class кластың аты   
{          
private: 
< жабық элементтер немесе мәліметтер> 
жабық конструкторлар> 
< жабық функция-элементтер> 
рrotected: 
< қорғалған элементтер немесе мәліметтер> 

< қорғалған конструкторлар> 
< қорғалған функция-элементтер> 
рublic: 
< ашық элементтер немесе мәліметтер> 
< ашық конструкторлар> 
< ашық деструкторлар> 
< ашық функция-элементтер> 
}
Мысалы:  rectangle деп аталатын класты анықтау 
class rectangle // кластың аты 

private
double length; // ұзындығы жабық элемент 
double width; // ені жабық элемент 
public: 
rectangle() // конструктор үнсіздік бойынша 
{assign(0,0);}  
rectangle (double Len, double Wide) //конструктор 
{assign(Len,Wide);} 
double Length()  // функция -элемент 
{return length;} 
double Width()  // функция -элемент 
{return width;} 
double Area()   // // функция -элемент 
{return length*width;} 
void assign(double Len, double Wide); // // функция -элемент 
}; 
Мұндағы,  private,  protected,  public  бӛлімдері  класс  құрамындағы  элементтерді 
пайдаланудың 
ережелерін 
немесе 
приоритеттерін 
анықтайды. 
Ол 
бӛлімдердің  
әрқайсысының қызметі бар.  

Класстың    функция-элементтері    дегеніміз,  бұл  –  бірнеше  операторлардан  тұратын, 
класстан тыс анықталатын функциялар. Бұл функциялар сол класс анықталған файлда болуы 
да  мүмкін,  бұл  функция  мен  оның  прототипінің  берілуі  сияқты  болып  келеді.  Әдетте, 
функция-элементтер  ӛз алдына бӛлек *.h  немесе  *.сpp    файлдарда жинақталады және оны 
анықтағанда әуелі оның класының атын жазып, сонан соң  «::» /екі  рет  қос нүкте/  белгісін 
қойып,  сонан соң барып функцияның аты жазылады, мысалы:  
class rectangle // кластың аты 

private
...   ...   ...  
public: 
 ...   ...   ... 
void assign(double Len, double Wide); //  функция -элемент 
}; // классты анықтау бітті 
void  rectangle :: assign(double Lendouble Wide) 
 // функция-элементтің ӛзінің анықталуы 
{ length=Len; 
width=Wide; 

Конструкторлар  классқа  жататын  объектілерді  дұрыс  құру  үшін  қолданылады. 
Конструктордың анықталуы келесі түрде болады: 
class rectangle // кластың аты 

private
...   ...    ...  
public: 
rectangle() // конструктор үнсіздік бойынша 
{assign(0,0);}  
rectangle (double Len, double Wide) //конструктор 
{assign(Len,Wide);} 
...    ...    ...  
}; 

Конструктор  үнсіздік  бойынша  болғанда  оның  параметрлері  берілмейді  немесе  оның 
мәні нақты кӛрсетіліп беріледі, мысалы:  
 class rectangle // кластың аты 

private
...   ...    ...  
public
rectangle() // конструктор үнсіздік бойынша 
{assign(0,0);}  
rectangle (double Len, double Wide) //конструктор 
{assign(Len,Wide);} 
rectangle (double Len=10, double Wide=12) //конструктор үнсіздік мәні бойынша 
...    ...    ...  
}; 
 
Деструкторлар  классқа  жататын  объектілерді  автоматты  түрде  жою  үшін 
қолданылады. Деструктордың анықталуы келесі түрде болады, мысалы: 
class rectangle // кластың аты 

private
...   ...    ...  
public: 
rectangle();  // конструктор 
...  ...   ... 
~rectangle ();  //деструктор 
...    ...    ...  
}; 
 
Жаттығу жұмыстары 
 

Тӛртбұрыштың берілген ұзындығы мен енін және ауданын баспаға шығара алатындай 
мүмкіндіктер  қарастырылған  rectangle  класын  анықтаңыз  және  сол  класқа  жататын  rect 
объектісіне сол класта қарастырылған мүмкіндіктерді қолданатын программа жазыңыз: 
 #include  
 #include  
class rectangle // классты анықтаудың басталуы  

private: 
double length; 
double width; 
public: 
rectangle() 
{assign(0,0);} 
rectangle (double Len, double Wide) 
{assign(Len,Wide);} 
double Length() 
{return length;} 
double Width() 
{return width;} 
double Area() 
{return length*width;} 
void assign(double Len, double Wide); 
}; // классты анықтаудың соңы 
void rectangle :: assign(double Len, double Wide) 
{ length=Len; 
width=Wide; 

int main() 

rectangle rect; // rectangle класына жататын rect объектісін анықтау 
double uzin, eni; 

cout<<"uzindigi men enin beriniz-"; 
cin>>uzin>>eni; 
rect.assign(uzin,eni); 
cout<<"\n"<<"Tortbyrishtin uzindigi - "<cout<<"\n"<<"Tortbyrishtin eni - "<cout<<"\n"<<"Tortbyrishtin audani - "<getch(); 
//return 0; 

Программаның нәтижесі:  
uzindigi men enin beriniz-10   12 
Tortbyrishtin uzindigi - 10 
Tortbyrishtin eni - 12 
Tortbyrishtin audani - 120 
Әдістер.  Кластың  немесе  объектінің  әдістерін  осы  класқа  енетін,    процедуралар  мен 
функциялар  құрайды.  Олар  кәдімгі  процедуралар  мен  функциялар  сияқты  жазылады. 
Кластың  әдістерінің  немесе  процедура  мен  функциялардың  тақырыбы  /мысалы,  procedure 
Button1Click  (Sender:  TObject);/  программа  модулінің  interfase  -  секциясындағы  класты 
сипаттау бӛлімінде жазылады да, ал денесі әдістің қайсы класқа тиесілі екендігін кӛрсететін 
құрама  атпен  /мысалы,  TForm1.Button1Click(Sender:  TObject);/  implementation  –  секцияда 
жазылады.     
С++  -те  кез-келген  класс  үшін  анықталған,  кластың  жаңа  данасын  құратын 
конструктор  және  құрылған  дананы  жоятын  деструктор  деп  аталатын  екі  әдіс 
қарастырылған. TОbject класы және одан тарайтын тума кластардың басым бӛлігі үшін бұл 
әдістер сәйкесінше Create және Destroy деп аталады. 
Қасиеттер. Кластың қасиеттері немесе сол класқа жататын объектінің қасиеттері - бұл 
ӛрістерді пайдалануға арналған арнайы механизм. Класты сипаттауда қасиеттерді жазу үшін 
property,  read,  write  қызметші  сӛздері  қолданылады.  Программа  модулінде  қасиеттердің 
мәнін кӛрсету келесі түрде жазылады: 
кластың_аты->қасиеті:= мәні;        
Оқиғалар.  Процедура  болғандықтан  бұл  программалық  кодтарды  «әдіс»  деп 
қарастырады да, «оқиға»- қабылдайтын мәндері осы процедуралық типтер болатын «қасиет» 
болады. Оқиға болған кезде, шақырылатын процедураны немесе әдісті оқиға ӛңдеуші / Event 
Handler-  обработчик  событий/  деп  атайды,  С++Builder-  де  әрбір  кластың  ӛзіне  тән 
оқиғаларына сәйкес, программа модуліне, визуальдық компоненттің белгісіне екі рет шерту 
арқылы, автоматты түрде қойылатын стандарт оқиға ӛңдеушілері болады,  

Стандарт  оқиғалардан  басқа,  кез-келген  оқиғаларды  ӛңдеушілердің  шаблон 
процедураларын  Object  Inspector  терезесінің  Events  жапсырмасындағы  оқиғаның  атына 
сәйкес жолға екі рет шерту арқылы қояды. 
 
Ӛзіндік жұмыс тапсымалары 
 
Есепті  әуелі  құрылымды  /struct/    пайдаланып,  сонан  соң  class  –  ты  пайдаланып 
орындаңыз:  
1.
 
―Ӛте  жақсы―,  ―ӛте  жақсы  және  жақсы―,  ―жақсы  және  қанағаттанарлық―,  ‖тек 
қанағаттанарлық― бағалармен оқитын студенттердің тізімін құру программасын жазу. 
2.
 
Фамилиялары бірдей студенттер оқитын топты анықтау программасын жазу. 
3.
 
Фамилиясы  ―A‖-дан  басталатын  қызметкерлер  тізімін  және  олардың  орташа 
еңбекақысын кӛрсететін программа жазу. 
4.
 
Аяқ  киім  дүкенінің  ассортименті  жазба  түрінде  берілген,  ен  қымбат  әйел  адамынын 
аяқ  киімін  және  ер  адамдар  аяқ  киімін,  олардың  құнымен  кӛрсететін  программаны 
жазу. 
5.
 
―Телефондық  анықтаманы  моделдейтін―  программаны  құру,  әйел  адамдардың 
телефон нӛмерін және мекен жайын шығару. 
6.
 
Автомашинаны жӛндеу шеберханасында машина жӛніндегі мәліметтер жазба түрінде 
берілген,  қызыл  түсті  машиналардың  маркасын  және  нӛмерін  аңықтайын 
программаны жазу. 
7.
 
Мекеменің  қызметтері  туралы  мәліметтер  жазба  түрінде  берілген.  Ер  адамдардың 
мамандығы мен жасып кӛрсетіп, экранға тізім шығарыңыз. 
8.
 
Кітаптардың  аты,  авторы,  шыққан  жылы,  бағасы  және  тиражы  анықталған  каталог 
құрыңыз.  Экранға  алфавитімен  тиражы  бойынша  сұрыпталған  кітаптар  тізімін 
шығарыңыз. 
9.
 
Теміржол  кассісіндегі  тӛмендегідей  мәліметтер  белгілі.  Поездың  нӛмері,баратын 
жері,билеттің  бар  жоғы  анықтау.  Бос  билеттердегі  саны  125-ке  тең  поездардың 
нӛмерін, баратын жерін экранға шығарыңыз. 
10.
 
Ӛзініз оқитын топтың тізімін алфавитімен студенттердің туған жылы бойынша реттеу 
программасын жазыңыз, нәтижесін экранға шығарыныз. 
 
 
2 - зертханалық жұмыс. 
С++ Buildеr 6 ортасының құрылымы. С++  Buildеr 6 ортасында қосымша құру. Жоба, 
форма, модуль, ресурс файлдары 
 
Әдістемелік нұсқаулар 
 
С++Builder программмалау ортасы іске қосылғаннан кейінгі терезелердің орналасуы 
келесі түрде болады /4.1-сурет/: 

 
Негізгі терезе (С++Builder Project1); 

 
Объектілер инспекторының терезесі ( Object Inspector); 

 
Форма редакторының терезесі (Form1); 

 
Код жазы; 

 
Латын редактордың терезесі (Unit1). 

Ескерту. Кеңеймелері : *.cpp, *.h, *.dfm, *.bpr, *.res. болатын файлдар маңызды болып 
есептеледі, себебі олар барлық жобаға қатысады.  
 
Жаттығу жұмыстары 
 
Жобамен жұмыс жасау: 

 
Жоба құру үшін негізгі терезеде File New  Application командалары орындалады.  

 
Жаңа  құрылған  жобаны  толығымен  сақтау  үшін  Filе  Save  All  командасы 
орындалады.  Жоба  құрамына  кіретін  файлдардың  жиынтығы  бір  бумада  сақталуы 
қажет. 
 
 
4.1- сурет.  С++Builder программмалау ортасының негізгі терезесі 
 

 
Жобаны орындау бірнеше тәсілдермен жүргізіледі. 

 
Жобаны жабу үшін  Filе Close All  командалары орындалады.  

 
Бұрыннан бар жобаны ашу үшін Filе
 Open командасы орындалады да, пайда болған 
диалогтық терезеде жоба файлының (* .bpr) аты кӛрсетіледі. 

 
Жоба файлының (*.bpr- файл) мәтінін қарау үшін бас мәзірден  Project View Source 
(Проект->Просмотр) командасы орындалады; 

 
Жоба  файлының  терезесін  жабу  үшін  терезе  контекстік  мәзірінен    Close  Page 
командасы орындалады;  

 
Жоба файлын  С++Builder  ортасы автоматты түрде ӛзі құрады;   

 
Жоба  файлы    С++Builder  ортасының  жобалар  тобына  (группа  проектов, 
ProjectGroup1)  кіреді.  Жоба  тобы  -  бұл  ӛзі  қамтитын  бір  немесе  бірнеше  жобалар 
туралы ақпараттар, сипаттаулар сақталатын *.bpg кеңеймелі файл. 

 
Project Manager программасы жоба тобымен жұмыс жасауда қолданылады. 

 
Жоба параметрлерін беру үшін ProjectOptions командасы орындалады.  
 
Ӛзіндік жұмыс тапсымалары 

 
1.
 
Жай жоба құрыңыз, оны ӛз бумаңызда сақтаңыз. 
2.
 
Ӛз  жобаңыздың  құрамына  кіретін  файлдарды,  олардың  атын,  қызметін  кӛрсететін 
кесте жасаңыз.  
3.
 
С++Builder  ортасының  негізгі  терезесіндегі  (С++Builder  Project1)  бас  мәзірдің 
опцияларындағы  жиі  қолданылатын  командаларын  және  олардың  қызметін  жазып 
алыңыз. 
 
3 - зертханалық жұмыс.  
Негізгі  визуалдық  компоненттер.  VCL  кітапханасының  компоненттері.  Қасиеттері, 
әдістері және оқиғалары 
 
Әдістемелік нұсқаулар 
 
VCL  (Visual  Component  Library)-  визуальды  компоненттер  кітапханасында  қосымша 
құруда қажет болатын компоненттер жинақталған.  
  Компоненттердің  қасиетін  ӛзгерту  екі  түрлі  жолмен  жасалады:  объектілер 
инспекторының  (Object  Inspector)  терезесінде  немесе  программалау  жолымен.  Мысалы, 
Label1 компонентінің Caption қасиетін Object Inspector терезесінде ӛзгерту. 
Ал  программалық  жолмен  ӛзгерту  үшін  программа  мәтінінде  келесі  түрде  жазылуы 
керек:  
Label1->Caption= "Багдарлама"; 
Объектінің немесе компоненттердің әдістерін шақыру келесі түрде жазылады:                                 
Объектінің аты ->әдістің аты;   
Memo1->Clear();  
Компоненттерге  тән  оқиғалар  функциялар  /void  __fastcall/  түрінде  анықталған,  бұл 
функциялардың    шаблондары  программа  мәтініне  автоматты  түрде  бірден  қойылады,  бұл 
шаблондарды сол компоненттің белгісіне екі рет шерту немесе Object Inspector  терезесіндегі 
Events  жапсырмасындағы  оқиғалар  арқылы  шақырып  алуға  болады.  Мысалы,  Button1 
компонентінің OnClick  оқиғасы:  
void __fastcall TForm1::Button1Click(TObject *Sender) 

Label1->Caption= "Багдарлама"; 

 

 
4.2- сурет. Button1 компонентінің 
OnClick  оқиғасын шақыру. 
 
Форма.  C++  Builder    ортасында  құрылатын  қосымшаның  орындалуы  кезінде  экранға 
шығатын  визуальдық  бӛлімінің  негізін  TForm    класының  ӛкілі  болып  табылатын  Form 
компоненті құрайды. C++ Builder  ортасы жүктелгенде, құрылатын жобаға (Project1) сәйкес 
форма терезесі (Form1) ӛзі автоматты түрде пайда болады /4.3-сурет/.  Форма терезесі, бұл - 
Windows  қосымшаларына  тән  тақырыптық  зонасы,  жүйелік  мәзір  батырмасы,  басқару 
батырмалары және таза жұмыстық обылысы бар, ӛлшемі ӛзгеріп отыратын терезе. 
 
Жобаға  тағы  да  форма  терезелерін  қосу  үшін  File    New    Form    командасы 
орындалады.    Программа  құруда  Form  компонентінің  келесі  қасиеттері  мен  әдістері  жиі 
пайдаланылады:  
4.3 –сурет. Форма терезесі 
 

TCaption    типтер  класына  жататын      Caption  қасиеті  форманың  тақырыбын,  яғни 
тақырыптық зонадағы мәтінді жазу үшін қолданылады;  
TComponentName  типіне  жататын    Name  қасиеті    Form  компонентінің  атын  немесе 
идентификаторын  беру  үшін  қолданылады,  әдетте  ол  Form1,  Form2  ...  болып  кете  береді, 
егер қолданушы қажет болған жағдайда бұл атауларды ӛзгерте алады және программада оны 
сол  ӛзі  берген  атпен  шақырып  пайдаланады,  мысалы,  Name  қасиетінің  мәні  Form1  –ден  
MainForm- ға ӛзгертілсе онда оны программада пайдаланғанда  
Form1  Caption:=  “Форма  терезесі”;      деп  жазудың  орнына  MainForm  Caption:= 
“Форма  терезесі”;    түрінде  жазады.  Бұл    Name  қасиеті  C++  Builder      ортасындағы 
қолданылатын барлық программалық компоненттерге тән қасиет. 
Программада  Form  компонентінің  жаңа  экземпляр-данасын  құру  үшін  constructor 
Create (AOwner: TComponent);  конструкторы қолданылады, егер жаңа дананы құру команда 
түрінде талап етілетін болса оны программа мәтінінде келесі түрде жазады: 
ApplicationCreateForm(TForm1, Form1); 
бұл  программаның  негізгі  терезесін  құру  болып  табылады,  ал  қалған    терезелерін  құруды, 
мысалы 
Form2=TForm2.Create(Application); түрінде беруге болады. 
Close функциясы форма  терезесін жабуды қамтамасыз етеді, программадағы жазылуы: 
Form1 Close(); 
Hide функциясының қызметі - форманы экранда кӛрсетпей жасырып тұрады, жазылуы:  
Form1 Hide(); 
Show  функциясы  орындалғанда  кӛрінбей  тұрған  форма,  алдыға  шығып    экранда 
кӛрсетіліп тұрады, жазылуы:  
Form1 Show(); 
Форма  компонентінің    TNotifyEvent  класына  жататын  OnCreate  оқиғасы  форма 
құрылған  кезде  бір-ақ  рет  орындалады,  сондықтан  бұл  функцияға  форманың  құрылуымен 
бірге  орындалатын  (мысалы  пароль  енгізу  сияқты)  операциялар  жазылады.    OnCreate 
оқиғасына  сәйкес  функция  Object  Inspector  терезесінің  Events  жапсырмасындағы  OnCreate 
жолының терезесіне екі рет шерту арқылы шақырылады: 
  
void __fastcall TForm2::FormCreate(TObject *Sender) 

 

 

Мәтінмен жұмыс жасауға арналған Standart панелінің Label, Memo, Еdit компоненттері. 
Қарапайым қосымшалар құру үшін Standart панелінің  компоненттері қолданылады.  
Қосымшаларда    мәтін  түріндегі  мәліметтерді    терезелер  арқылы  енгізуде    Standart 
панелінің  Label, Еdit,  Memo компоненттері қолданылады.   
Еdit  компоненті  (немесе  енгізу  жолағы,  немесе  бір  жолды  редактор  деп  те  атайды) 
мәтінді  кішкентай  терезе  түріндегі  бір  жолға  енгізуді  немесе  мәтін  түріндегі  нәтижені 
терезеге  шығарып  қоюды  қамтамасыз  етеді.  Қосымшада    Еdit  компонентінің  терезесінде 
берілген  мәтінді,  курсорды  оңға  және  солға  жылжытатын  бағыттауыштар  кӛмегімен, 
символдарды  ӛшіретін  <Backspace>  және      пернелерін  пайдаланып  және 
фрагменттерді бӛліп алып жӛндеуге болады.  Еdit компонентінің терезесіне енгізілген мәтін, 
оның  типі  AnsiString болатын   Text қасиетінің мәні болып табылады, яғни  Еdit  терезесінде 
берілген  мәліметтер  программада  тек  жолдық  тип  ретінде  ғана  қабылданады,  ал  оны  әрі 
қарай  программада  сандар  ретінде  пайдалану  үшін  түрлендіру  функциялары  қолданылады. 
Терезеге енгізілген мәтінді  бүтін /int/  немесе нақты /float/  типтердің біріне айналдыру үшін 
келесі түрлендіру функциялары қолданылады: 
 
StrToInt (AnsiString s)- жолдық типті бүтін типке,         StrToFloat(AnsiString s) -  нақты 
типке түрлендіреді.  
Еdit  терезесіндегі  мәтіннің  үлкен  немесе  кіші  әріптермен  жазылуын  немесе 
регистрлердің ауысып отыруын оның CharCase  (типі TEditCharCase) қасиеті арқылы береді, 
сәйкесінше ол үш түрлі мән қабылдайды: 
 

 
ecNormal – ррегистр ӛзермейді, сол күйінде тұрады; 

 
ecLowerCase - тӛменгі регистрдің әріптеріне кӛшеді; 

 
ecUpperCase -  жоғарғы регистрдің бас әріптеріне ауысады. 
 
Еdit компонентінің типі Char болатын PasswordChar қасиеті осы терезеге пароль енгізу 
үшін  қолданылады,  әдетте  оның  мәні  #0  болып  тұрады  да  терезеге  енгізілген  мәтіннің  ӛзі 
шығады, ал оны жасырып кӛрсетпеу үшін PasswordChar қасиетінің қабылдайтын мәнін басқа 
бір символға, мысалы «*» немесе «?» секілді мәндерге ӛзгерту керек, сонда енгізілген құпия 
мәтіннің орнына «********» немесе «?????????» түріндегі жолдар  шығады. 
Программа  терезесінде  Еdit1,  Еdit2,  Еdit3    компоненттері  арқылы  берілген  бірнеше 
терезелердің  бірінен  екіншісіне  ENTER    пернесі  арқылы  кӛшіп  отыру  үшін  оларға  басқару 
фокусын беруді (курсорды беретін) қамтамасыз ететін  SetFocus әдісін қолдануға болады, ол 
әдіс осы компоненттің терезесінде тұрып басылған пернеге жауап беретін OnKeyPress оқиға 
ӛңдеушісінің  денесінде  шақырылады.    Мысалы,  Еdit2  компонентінің  терезесінен  ENTER  
пернесі  арқылы  Еdit3  терезесіне  кӛшу  үшін  сол  Еdit2–нің  OnKeyPress  оқиға  ӛңдеушісіне 
келесі кодты жазуға болады:  
 

Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   ...   13




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет