Программа денесі(операторлар тізбегі)



бет6/21
Дата16.03.2018
өлшемі5,46 Mb.
#39417
түріПрограмма
1   2   3   4   5   6   7   8   9   ...   21
Бұл программада денесінде GetModeRange процедурасы шақырылған цикл ұйымдастырылған, және де цикл параметрінің мәні процедураға оның Driver – параметрінің мәні ретінде беріледі. Осы процедура берген минималды жәнен максималды режимдер мәндері әрбір драйвер үшін экранға жол түрінде беріледі. Нәтижесінде мәндер кестесі жасалады. Бұл кестені анығырақ ету үшін программада тұрақтылар массиві жарияланды, оның элементтері драйверлердің әріптік белгіленуі болып табылатын string типті мәндер. Бұл белгілеулер кестенің бірінші бағанында көрсетілген.

GetModeRange процедурасының драйвер кодының мүмкін емес мәніне қалай жауап қататынын тексеру үшін цикл саны 11-ге дейін көбейтілді (1..10-драйверлердің мүмкін кодтары). Нәтижесінде мүмкін емес мән (11) үшін GetModeRange процедурасы MinMode және MaxMode параметрлері үшін -1 мәнін берді.
Графикалық режимнен шығу

Кез-келген графикалық режимге өту жүзеге асатын программада осы режимнен шығу қарастырылу керек. Графикалық режимнен шығуға CloseGraph процедурасы мүмкіндік береді.

CloseGraph процедурасы графикалық режимге өтуге дейінгі қолданылған видеорежимді (мәтіндік режим) қалпына келтіреді.

Тақырыбы:

Procedure CloseGraph;

Түстер мен толтырулар

Turbo Pascal программасында экранға бейнені шығару түрлі түстерді қолдану арқылы жүзеге асырылады. Сол сияқты қандай-да бір тұйық фигураны белгілі бір түсті толық фонмен немесе қандай-да бір өрнекпен толтыруға болады.



Ағымдағы түсті таңдау

Экранға бейнені шығаратын Graph модулінің барлық ішкі программалары SetColor процедурасы орнатқан ағымдағы түсті пайдаланады.

SetColor процедурасы ағымдағы түсті – қолданылған палитраның түстерінің бірін орнатады. Тақырыбы:

Procedure SetColor(Color:Word);

Мұндағы Color – жаңа ағымдағы түс.

Color параметрі қабылдай алатын мәндер Graph модулінде анықталған тұрақтылар жиынтығымен анықталады. Төмендегі 4-кестеден осы тұрақтыладың тізімін көруге болады.

4-кесте

Тұрақты атауы

Коды

Түсі

Black

0

Қара

Blue

1

Қою көк

Green

2

Қою жасыл

Cyan

3

Көгілдір

Red

4

Қызыл

Magenta

5

Күлгін

Brown

6

Қоңыр

LightGray

7

Ашық сұр (боз)

DarkGray

8

Сұр

LightBlue

9

Көк

LightGreen

10

Ашық жасыл

LightCyan

11

Ашық көк

LightRed

12

Қызғылт

LightMagenta

13

Қызғыш

Yellow

14

Сары

White

15

Ақ

Blink

128

Жыпылықтау

Мысалы, SetColor(3) жолы коды 3 болатын көгілдір түсті ағымдағы түс етеді. Жоғарыдағы кесте CRT модуліндегі түстер кестесімен сәйкес келеді.


Шаблондар мен толтыру түстерін таңдау

Графиканы бейнелеуде экрандағы түйық аймақты толтыру қажеттігі жиі туындайды. Толтыру өрнегін және түсін таңдауға SetFillStyle процедурасы мүмкіндік береді.

SetFillStyle процедурасы толтыру түсі мен шаблонын анықтайды. Тақырыбы:

Procedure SetFillStyle(Pattern:Word; Color:Word);

Мұндағы Pattern – толтыру шаблоны; Color – толтыру түсі.

Graph модулінде бірқатар дайын толтыру шаблондары бар. Төмендегі 5-кестеде осы шаблондардың тізімі келтірілген.



5-кесте

Тұрақты атауы

Коды

Толтыру

EmptyFill

0

Фон түсімен толтыру (өрнексіз)

SolidFill

1

Ағымдағы түспен толтыру (SetColor процедурасы арқылы орнатылған)

LineFill

2







LtSlashFill

3







SlashFill

4







BkSlashFill

5







LtBkSlashFill

6







HatchFill

7







XHatchFill

8







InterleaveFill

9







WideDotFill

10







CloseDotFill

11







UserFill

12

Пайдаланушы анықтаған толтыру шаблоны

Үнсіз келісім бойынша SolidFill (коды 1) тұрақтысы және ағымдағы палитраның максималды номерлі түсі қолданылады. SetFillStyle процедурасы анықтаған толтыру мен түс толтыру амалы қолданылатын барлық процедуралар мен функцияларда қолданылады. Егер Pattern параметрі UserFill (12 код) мәніне ие болса, онда пайдаланушы анықтаған қалып пайдаланылады.

Егер SetFillStyle процедурасына қате парамтрлер берілсе, онда GraphResult функциясы grError мәнін қайтарады да(қателіктер кестесін қара), ағымдағы толтыру қалыптары өзгертілмейді.
Пайдаланушы дайындаған толтыру қалыптары

Егер Turbo Pascal ұсынған дайын қалыптар ұнамаса, онда пайдаланушы өзінің қалпын жасауына болады. Бұл жағдайда SetFillPattern процедурасы қолданылады.

SetFillPattern процедурасы жеке толтыру қалпын анықтауға көмектеседі. Тақырыбы:

Procedure SetFillPattern(Pattern:FillPatternType; Color:Word);

Мұндағы Pattern – FillPatternType типіне жататын және пайдаланушының толтыру қалпын анықтайтын мән; Color – толтыру түсі.

FillPatternType типі GRAPH модулінде анықталған. Оның сипаттамасы келесі түрде:



Type

FillPatternType = array[1..8] of Byte;



Byte типінің 8 мәнінен тұратын массивті көрсететін FillPatternType типі 8х8 пиксельдер матрицасының жарықтануын басқаруға мүмкіндік береді. Егер осы 64 биттің қайсыбірі 1-ге тең мәнге ие болса, сол пиксель жарықтанады; 0-ге тең болса, жарықтанбайды. Толтыру амалы орындалған кезде экран әрбіреуі осындай матрица болатындай торкөздер жиынына бөлінгендей болады. Бұл кезде әрбір матрицаның жарықтанған және жарықтанбаған пиксельдері экранды қайталанған өрнекке толтырады. Осындай дайындалған қалыптардың екеуін 2-суреттен көруге болады.

Бұл жерде 8х8 матрицалары бар екі шаблон көрсетілген. Матрицалардың сәйкес байттарының ондық мәндері жанынан көрсетілген.

SetUserCharSize процедурасы тек векторлық мәтіндерге ғана әсер етеді.
Қозғалатын бейнені шығару

Қозғалатын бейнені бейнелеу кезінде видеожады парақтар деп аталатын аумақтарға бөлінеді. Бұл кезде уақыттың әр мезетінде бір ғана парақ бейнеленеді, ал шығаруды кез-келген параққа орындауға болады. Осылайша алдын-ала дайындалған парақтарды тізбекті түрде экранға шығару қолайлы. Бұл тәсіл көбінесе әртүрлі анимацияларды жасау кезінде қолданылады. Graph модулінде парақтармен жұмыс істеуге арналған екі процедура бар. SetActivPage процедурасы видеожадының бір бір парағын белсендіреді. Тақырыбы:

Procedure SetActivPage(Page:Word);

Мұндағы Page – парақ номері.

Барлық графикалық шығарулар Page номерлі белсенді параққа бағытталады. Көппарақты шығару тек EGA, VGA және т.б. сәйкес видеоадаптерлердің бар болуында ғана жүзеге асады.

SetVisualPage процедурасы номері процедура параметрі ретінде көрсетілген графикалық парақты көрсетеді. Тақырыбы:

Procedure SetVisualPage(Page:Word);

Мұндағы Page - парақ номері.

Көрінетін парақ – экранда бейнеленетін парақ. Ал белсенді парақ шығарылу жүзеге асатын парақ. Басқаша айтқанда, программа графикалық құрауларды көрінбейтін (бірақ, белсенді) параққа орындайды да, соңынан осы процедураның көмегімен осы парақты шығарады, осымен сол мезетте экранда бейнені бейнелейді.

Төмендегі мысалда көппарақты шығаруды қолданатын программаны көруге болады.

Program SetPage;

Uses graph, crt;

Var I, j, r, Dx, Dy, Err:integer; x,y:word;

Begin


I:=3; j:=0;

initGraph(I,j,’’);

if Err<>grOk then

Writeln(GraphErrorMsg(Err))

Else

Begin


GetAspectRatio(x,y);

R:=5;


For i:=0 to 15 do

Begin


SetActivePage(i);

Circle(320, 100, 100);

Dx:=320+Round(30*Cos(i*2*Pi/16)*y/x);

Dy:=100-Round(30*Sin(i*2*Pi/16));

FillEllipse(Dx, Dy, R*Round(y/x),r);

End;


While not KeyPressed=True do

for I:=0 to 15 do

begin

SetVisualPage(i);



Delay(200);

End;


CloseGraph;

End


End.

Бұл программаның жұмыс нәтижесін 28-суреттен көруге болады.

Бұл программада EGA драйвері үшін 0 режимі таңдалынған. Егер 2-кестеге қарайтын болсақ, бұл режим 4-парақты шығаруды қолдайды – қозғалыс эффектісін жасауға ең қолайлы режим. Осы программада екі цикл ұйымдастырылған. Бірінші циклда парақтар толтырылады, екіншісінде – демонстрацияланады. Парақтардың кезектесуі ірі нүктелердің шеңбер бойынша айналу эффектісін қамтамасыз етеді.

Программаны аяқтау үшін кез-келген пернені басу жеткілікті.
10-ДӘРІС Деректердің файлдық типтері.


  1. Файлдармен жұмыс істеу.

  2. Мәтіндік файлдар.

  3. Типтік файлдар.

  4. Типтік емес файлдар.

Осы уақытқа дейін біз танысқан мәліметтер типтері компьютердің оперативті жадысындағы ақпаратпен жұмыс істеуге арналған болатын. Дегенмен оперативті жадының мәліметтерді уақытша ғана сақтауға қабілетті екенін білеміз.

Ал тиімдірек жұмыс істеу үшін ақпарат ұзақ сақталатын тәсіл қажет.

Ақпаратты ұзақ уақыт сақтау үшін оперативті жадыдан файлдарға жіберу керек.

Файл сыртқы жадыда атауы бар орын. Сыртқы жады ретінде әртүрлі дисктерді алуға болады.

Сол сияқты MS DOS операциялық жүйесінің басқаруымен жұмыс істейтін компьютердің оперативті жадыларында виртуалды дисктер құруға болады. Файлдың «ұзақ уақыттылығынан» басқа тағы бір ерекшелігі бар: олардың анықталмаған көлемі. Егер басқа құрылымда қанша элементтен тұратындығы әрқашан нақты көрсетілетін болса, файлдық типтерді жариялау кезінде оның қанша элементтерден тұратындығы көрсетілмейді. Файлдың максимум ұзындығы тек қана дисктегі бос орынмен шектеледі және бұл массивтен басты айырмашылығы болып табылады.



Файдың типтер, файлдық айнымалылар

Turbo Pascal – да ақпаратты сақтау үшін файлдық типтер мен файлдық айнымалы анықтау мүмкіншілігін қарастырылған. Осыдан кейін соңынан қажет болатын ақпаратты дискідегі файлға орналастыруға болады. Файлдық типті анықтаудың үш тәсілі бар.

f=file of a;

f=text;


f=file;

Бұл 3 тәсіл Turbo Pascal амалдауға мүмкіндік беретін файлдың үш түріне сәйкес келеді: типтендірілген, текстік және типтендірілмеген файлдар. Жоғарыда көрсетілген файлдық типтерді жариялаудың мағынасы мынадай:

File және of – резервтелген сөздер, олардың мағынасы «файл және осыдан».

Text – бұл резервтелген сөз емес, мәліметтердің стандартты типінің идентификаторы болып табылады.

f - жарияланған файлдық типтің атауы.

а - файлда қамтылған элементтер типі (Файлдық типтен басқа кез-келген тип).

Файл элементтері файлдық немесе элементтері файлдар болып табылатын құрылымдық типтерден басқа кез-келген типті мәндер бола алады, яғни, «файлдар файлы» болмайды.

Файлдық айнымалыларды жариялау мысалдары:

Type

Arrays=array of integer;



Data=record

Day:1..31;

Month:1..12;

Year:1900..2000;

End;
Var

f 1:=file;

f 2:text;

f 3:file of integer;

f 4:file of arrays;

f 5:file of date;

Бұл жерде 5 файлдық айнымалы жарияланған. Бұлардың арасында f1 - типтендірілмеген файл, f2 – тестік, ал f3, f4 және f5 - типтендірілген файлдар. Және де егер типтендірілген файлдардың арасында f3 файлының элементтері стандартты integer типіне жататын болса, ал f4, f5 файлдарының элементтері пайдаланушы жариялаған типке жатады (Arrays типі – бүтін сандар массиві, Datе типі – жазба). Әр түрлі типтерге жататын файлдардың өзіндік ерекшеліктері бар, дегенмен барлығына ортақ ерекшелік те бар. Яғни файлда әрбір мезетте бір элементке ғана қатынас жасауға болады.

Мысалы, жоғарыда жарияланған файлдық айнымалыларды алатын болсақ, онда f3 файлында әр мезетте бір бүтін санға, f4 файлында - бір массивке, f5 файлында - бір жазбаға қатынас жасауға болады. Және де барлық файлдар файл соңы маркерімен аяқталады (EoF – End of File).

Әдетте файл элементтеріне қатынас оларды кезекпен таңдау арқылы тізбектей жүргізіледі. Басқаша айтқанда ең соңғы элементке «жету» үшін алдымен барлық алдыңғы элементтерін өңдеуге (оқуға немесе жазуға) тура келеді. Ал типтендірілген және типтендірілмеген файлдар үшін белгілі бір элементке өту мүмкіндігі бар.

Файл элементтерінің саны оның көлемін, ұзындығын анықтайды. Жоғарыда айтылғандай файл ұзындығы оны жариялаған кезде бекітілмейді. Мұнда және де бірде – бір элементі жоқ файлдар болуы мүмкін - мұндай файлдар бос файлдар деп аталады.




Бұл 1-суретте 5 элементтен тұратын файл бейнеленген. Файл f әріпімен белгіленген идентификатордан басталады. Содан кейін файлда қамтылған бірнеше ақпарат элементтері бар, және файл файл соңы маркерімен (EoF) аяқталады. Суреттегі бағдарша файлдың ағымдағы позициясын нұсқауыш болып табылады. Егер файлға жазуды немесе файлдан оқуды елестететін болсақ, файлға жазу алдында нұсқауыш тұрған элементтен басталады. Бұл файлдан оқуға да қатысты. Файл ұзындығының шектелмегендігін көрсету үшін бейнеленген сектор оң жағынан тұйықталмаған. Әрине файлды осылай визуалды түрде көрсету шартты түрде орындалған. Көбінесе файл жол бөлігін емес, бірнеше жолдарды алады. Бұл файлды визуалды түрде көрсету файл үстінен орындалатын әр түрлі амалдарды оқып – үйрену үшін қажет.


Фйлдармен орындалатын амалдар

Turbo Pascal – да басқа мәліметтер типіне қарағанда файлдармен жұмыс істеуге арналған кіріктірілген операторлар болмайды. Мысалы, меншіктеу операторының көмегімен файлдық айнымалыға қандай-да бір мән меншіктей алмаймыз. Осыған байланысты сәйкес амалдар процедура және функция түрінде орындалады.

ФАЙЛДАРҒА ҚАТЫНАСТЫ ҰЙЫМДАСТЫРУ

Басқа мәліметтер типінен айырмашылығы файлдар дисктерде жазылатындықтан оларға қатынас жасау үшін файлдық айнымалы жариялау жеткіліксіз. Нақты файлға қатынас жасау үшін оны алдын ала жариялайтын файлдық айнымалымен байланыстыру қажет. Мұндай байланыс Turbo Pascal –дың стандартты процедурасы болып табылатын Assign процедурасы арқылы орындалады.

Assign процедурасының тақырыбы:

Procedure Assign (var f; FileName: string);

Мұндағы f – FileName деп аталатын дискідегі файлмен байланысты кез-келген түрдегі файлдық айнымалының атауы (FileName параметрі STRING типіне жатады).

Атауға арналған ережелер

Файл атауының жалпыланған түрі MS DOS операциялық жүйесінің атау ережесі бойынша құрылып, төмендегідей болады.

диск: \жол\ файл_атауы

Мұндағы диск: - бұл компьютер дискілерінің біреуінің атауы.

Жол – бұл каталог.

Файл_атауы – осы каталог аясындағы белгілі файл идентификаторы.



Файл атаулары

Файл атауы сегіз символға дейін қамтып, кеңейтілумен толықтырылуы мүмкін (үш символға дейін). Файл атауы мен кеңейтілу нүкте арқылы ажыратылады. Файл атауында латынның үлкен кіші әріптері, цифрлар, сол сияқты !, @, #, $, %, ^, &, *, (, ),’,~, -, _ символдары болуы мүмкін. Және де файл атауларында ? . , ; : * / \ + « | символдары кездеспеу керек. Файл атауларына мүмкін символдарды каталог атауларына да қолдануға болады.

Turbo Pascal программасында дисктегі файлды жарияланған файлдық айнымалымен былай байланыстыруға болады.

Var


f1:file;

Begin


...

Assign (f1,’c:\sys\into.sys’);

...

end.


Assign процедурасының параметрі ретінде дисктегі файл атауының орнына белгілі құрылғыларға резервтелген құрылғының символдық атауын қолдануға болады.

6-кесте



Символдар

Құрылғылар

CON

Консоль

PRN, LPT1, LPT2, LPT3

Принтерлер

AUX, COM1, COM2

Коммуникативті каналдар

NUL

Жалған (фиктивті) құрылғылар

CON- консольдың символдық атауы. Консоль деп – бір мезетте пернетақта да және монитор да аталады. CON логикалық атауын assign процедурасында файл атауының орнына көрсетуге болады, яғни, ақпаратты пернетақтадан енгізу және экранға шығару қажет болған жағдайда қолданылады.

PRN – принтердің символдық атауы. Оны assign процедурасының параметрі ретінде ақпаратты принтерден басып шығру қажет болған жағдайда қолданамыз. Және де бірнеше принтерлер жалғанған болса, тағы да бірнеше символдық атаулар бар: PRN, LPT1, LPT2, LPT3 - өзара синоним атаулар.

AUX – коммуникациялық каналдың символдық атауы. Коммуникациялық канал басқа компьютермен, құрылғылармен ақпарат алмасуға арналған канал. AUX атауын assign процедурасының параметрі ретінде ақпаратты басқа компьютерге жіберу немесе сырттан қабылдау қажет болған жағдайда қолданамыз. MS DOS–та AUX-тан басқа тағы да бірнеше коммуникациялық каналдардың символдық атауы бар: СОМ1,СОМ2

NUL – жалған (фиктивті) құрылғының символдық атауы. Айталық, қандай да бір программаның қателіктерін түзеу процедурасы жүріп жатыр. Бұл программада басқаларымен қатар нәтижені шығару амалы бар. Ал дискідегі орын шектеулі. Бізге қажетсіз ақпаратты шығару қажет болсын. Мұндай жағдайда шығару құрылғысы ретінде жалған құрылғыны қолдану қолайлы.

Әртүрлі логикалық құрылғылармен файлдық айнымалыларды байланыстыру мысалы:

Var

f1, f2, f3, f4, f5:file;



begin

Assign (f1,’CON’);



Assign (f2, ‘LPT1’);

Assign (f3, ‘PRN’);

Assign (f4, ‘AUX’);

Assign (f5, ‘NUL’);

End.
Файлдардың үстінен қандай да бір әрекеттер орындау үшін Assign процедурасын шақыру керек. Assign процедурасын шақырғаннан кейін көрсетілген файл мен файлдық айнымалы арасында осы программа жұмысы аяқталғанға дейін байланыс болады.



ФАЙЛДАРДЫ АШУ, ЖАБУ, ЖОЮ

Қандай-да бір нақты файлды файлдық айнымалымен байланыстырғаннан кейін осы файлдың мазмұнына қатынас жасау үшін оны ашу қажет.

Тurbo Рascal-да файлды оқу үшін, жазу үшін, және де бір мезетте оқу үшін де, жазу үшін де ашуға болады. Файлды ашу кезінде алдымен дискіде бар файл ізделінеді немесе жаңадан жасалынады (егер файл жазу үшін ашылса) және ағымдағы нұсқауыш файл басына орнатылады. Файлдарды ашу үшін RESET және REWRITE процедуралары қолданылады.

RESET процедурасы – текстік файлдарға қолданыла отырып, оны тек оқу үшін ашады. Ал типтендірілген немесе типтендірілмеген файлдар үшін RESET процедурасын қолдансақ, оны оқу үшін де және оған жазу үшін де ашуға болады.

RESET процедурасының тақырыбы төмендегідей көрсетіледі.

Procedure RESET (var f [ : file; RecSize:word ] )

Мұндағы f - кез-келген типтегі файлдық айнымалы; RecSize – міндетті емес параметр, ол тек қана типтендірілмеген файлдар үшін анықталады және жазбаның өлшемін көрсетеді. Егер Assign процедурасын шақыру кезінде Recsize параметрі анықталмаған болса, онда үнсіз келісім бойынша жазба өлшемі 128 байтқа тең деп қабылданады.

RESET процедурасының көмегімен ашылатын файл міндетті түрде бар болуы керек. Егер көрсетілген каталогта мұндай атауы бар файл жоқ болса, онда қателік көрсетіледі. Сол сияқты құрылғылардың символдық атауы да қолданылатын кезде міндетті түрде мәліметтердің көзі бола алатын құрылғылар көрсетілуі қажет. Мысалы, егер ақпаратты принтерден оқу қажет десек, онда қателік көрсетіледі.



RESET процедурасының көмегімен ашылған файл 5-суретте көрсетілген.

REWRITE процедурасы – текстік файлға қолданылса, оны тек жазу үшін ашады. Осы процедураны типтендірілген немесе типтендірілмеген файлдарға қолданылса, оны оқу үшін де, жазу үшін де ашады.

REWRITE процедурасының тақырыбы:

Procedure REWRITE (var f [ :file , RecSize: word ] );

RESET процедурасындағы f және recsize параметрі туралы айтылғандардың барлығы REWRITE процедурасына да қатысты.

RESET және REWRITE процедураларының типтендірілген және типтендірілмеген файлдарға қолданылғандағы айырмашылығы неде? Егер RESET процдурасын жоқ файлға қолдансақ, онда қателікті көрсетеді. Ал мұндай жағдайда REWRITE процедурасы жаңа файл құрады. Егер RESET процедурасын дисктегі бар фалға қолдансақ, онда файл ашылады. Ал REWRITE процедурасы бұл жағдайда ескі файлдың мазмұнын өшіріп тастап, сол атаумен жаңа файл жасайды. Яғни REWRITE процедурасы бар файлға қолданылса, оның мазмұнының жойылуына әкеледі. Сондықтан, осы процедураны өте ұқыптылықпен қолдану керек.



REWRITE процедурасының көмегімен ашылған файл 6-суретте бейнеленген.

Файлды ашқаннан кейін (RESET немесе REWRITE) оның мазмұнын өңдеу жүргізіледі, өңдеу жұмысы аяқталғаннан кейін файл жабылып, кейде жойылады. Файлдарды жабу үшін Close процедурасы қолданылады, ал жою үшін Erase процедурасы қолданылады. Бұл процедуралар кез-келген түрдегі файлдарға қолданылады.

Close процедурасы RESET және REWRITE процедуралары ашқан файлдарды жабады.

Procedure Close (var f);

Erase процедурасы дискідегі файлды жояды.

Procedure Erase (var f);

Екі процедураның тақырыбында да бар f параметрі кез-келген типтегі файлдық айнымалыны көрсетеді.

Close процедурасын файлды жабу үшін қолдану міндетті емес, барлық ашылған файлдар программасы жұмысын аяқтаған кезде автоматты түрде жабылады. Дегенмен Close процедурасының көмегімен файлды жабу, сол файлды басқа процедурамен ашу үшін қажет болуы мүмкін (айталық, RESET процедурасының орнына REWRITE процедурасын қолдану қажет болса).

Қандайда бір файлды ашып, оны өңдеп, артынан жауып және жоюдың схемалық түрі төмендегідей болады.

Program file processing;

Var

f:file of char; {файлдық айнымалыны жариялау}




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




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

    Басты бет