11 Дәріс №11. Стандартты кітапхана құрылғыларымен С++
тіліндегі енгізу-шығару.
Дәрістің мақсаты:
С++ тілінің стандартты кітапханасындағы
енгізу-
шығару ағындары кластарын түсіндіру.
Дәрістің мазмұны:
контейнерлі кластар, алгоритмдер және итераторлар
кіретін стандартты кітапханасының бөлігі, үлгілердің стандартты кітапханасы.
42
Тілдің операторларынан басқа кез келген программа құрудың
интегрирленген ортасына қосылатын түрлі кітапханалардың құрылғылары
қолданылады. С++ тілінің стандартты кітапханасын екі бөлікке бөлуге
болады:
-
С++ тілінің кітапханасынан мұрагерлік константалар, типтер,
макростар, функциялар;
-
стандартты кластар және С++ тілінің басқа құрылғылары.
С++ тілінің стандартты кластарын келесі топтарға бөлуге болады:
-
сыртқы құрылғылар мен жедел жады арасындағы, сонымен қатар
жедел жады шектерінде деректер ағынын басқаруға арналған ағынды кластар
(дисктер, пернетақта, экран, монитор);
-
символдық жолдары бар жұмыстың қателерінен қорғалған және
қолайлы жолдық класс;
-
контейнерлі кластар, алгоритмдер және итераторлар. Контейнерлі
кластар деректерді сақтаудың кең таралған танымал құрылымдарымен:
тізімдер, векторларды, көпмүшеліктерді және тағы басқа сақтауларды жүзеге
асырады;
-
стандартты кітапхана құрамына компоненттерді түрлендіретін және
қолданатын алгоритмдер жатады. Итераторлар контейнерлі кластар
элементтеріне унифицирленген қатынауды қамтамасыз етеді;
-
жылжымалы нүктелі массивтер мен кешенді деректерді тиімді
өңдеуге арналған математикалық кластар;
-
типтер идентификациясы мен қателердің объекттіге бағытталған
өңдеуге арналған диагностикалық кластар;
-
жадыны динамикалық тарату, локальды ерекшеліктерге бейімделу
және тағы басқалар үшін қалған кластар.
Алгоритмдер және итераторлар кіретін стандартты кітапханасының
бөлігін үлгілердің стандартты кітапханасы деп аталатын (Standart Template
Library,STL) контейнерлі кластар.
С++ тілінің стандартты кітапханасының ағынды кластарын қолдануға
негізделген С++ тілінің енгізу-шығару құралдарын қарастырайық.
Ағын - қоректену көзінен қабылданушыға деректерді тасмалдауға
қатысты түсінік. С++ тілінің ағындары деректер типінің стандартты және
анықталған қолданушылармен сенімді жұмыспен қамтамасыз етеді, сонымен
қатар бірегей және синтаксисімен түсінікті.
Ағыннан деректерді оқу оларды ағыннан алу деп аталады, ағынға
шығару - ағынға деректерді қосу немесе орналастыру. Ағын байттар тізбегі
ретінде анықталады және алмасу орындалатын нақты қондырғыға тәуелсіз
болады.
Алмасу бағытына қарай ағындар кіріс (деректер енгізіледі), шығыс
(деректер шығарылады) және екі бағытты деп бөлінеді.
Ағын жұмыс істейтін қондырғы түрлі бойынша ағындарды стандарты,
файлдық, жолдық деп бөлуге болады.
43
Стандартты ағындар деректерді пернетақталардан дисплей экранына
беруге арналған файлдық ағындар - магнитті дискідегі ақпаратпен алмасу
үшін, ал жолдық ағындар - символдардың масивтерімен жұмыс істеу үшін
қолданылады.
Ағындарды қолдану үшін С++ тілінің кітапханасына ios және streambur
екі базалық класс негізінде құрылған кластар иерархиясы кіреді. Ios класынан
енгізу – шығаруға арналған өріс пен әдістер кіреді. Streambur класы
ағындардың буферизациясы мен оның физикалық қондырғылармен олардың
әсерлесуін қамтамасыз етеді. Бұл кластардан stream класы кіріс ағындар мен
оstream класы – шығыс үшін мұрагерленеді.
Бұл кластар екі бағытты ағындарды жүзеге асыратын iostream класы
үшін базалық болып табылады. Кейін кластар иерархиясында файлдық және
жолдық ағындар орналасқан.
Си тілінің енгізу-шығару стандартты функциясымен салыстырғанда
ағындардың негізгі артықшылығы типтерді бақылау болып табылады,
сонымен қатар кеңейтілуі, яғни қолданушымен анықталған типтермен жұмыс
істеу мүмкіндігі болып табылады. С++ тілі енгізу-шығаруды жүзеге асыруға
араналған құрылғылардың кең жиынын береді. С++ тіліндегі енгізу-шығару
бұл - iostream класының “<<” және “>>”
операцияларды қайта кең қолдану.
Енгізілген типтердің енгізу-шығаруды (стандартты) сәйкес кластар және
объектілермен, соның ішінде шарт алдын ала анықталған объектілерден
қолдау табады: cin, cout, cerr және clog.
Мысалы, cout«х; операторы шығару үшін iostream класының cout
объектісіне х айнымалысының мәнін жібереді. Қайта жүктелген operator<<
әдісі ол үшін шақырылған iostream объектісіне сілтемені қайтарады.
Сондықтан шығару операциясының негізінде тағы бір шығару операциясын
қолдануға болады, яғни шығарудың бірнеше операциясын бір тізбекке қосуға
болады.
include
int x; cout«″ =″ « x«″ \n″;
″ «″ операциясында солдан оңға қарай есептеу тәртібі бар екендігін
ескеріп, мұндай жазба келесі түрде интерпретирленеді:
((cout. operator «(″ x=″ )) operator « (x)). Operator « (“\n);
Берілген аргументтің типіне тәуелді operator<<
әдісінің белгілі бір
данасы шақырылады.
С++ тілінде шығуға ұқсас ену анықталады. Енгізілген стандартты тип
үшін ″«″ операциясы қайта жүктелген анықталған iostream класы байланысты.
Сонымен бірге operator<<
әдісі iostream класс объектісіне сілтемені
қайтарады, және енгізу кезінде енгізу операцияларын біріктіруге
болатындығын білдіреді, мысалы, үш аргументті:
44
// cin .operator» (х) ) . operator» (у ) . operator» (z ) ;
Енгізу және шығарудың нақты операциясын таңдау енгізілген немесе
шығарылған деректердің әрбір типімен анықталады.
Енгізілген типтермен қатар С++ тілі жаңа типтерді (қолданушымен
анықталған типтер) анықтауға мүмкіндік береді.
Ол үшін қайта жүктелетін функцияны қолданумен бірге әрбір
қолданушы типі үшін “<<” және “>>”
операциясын қайта жүктеу керек.
Қайта жүктейтін әдіс “<<” немесе “>>”
операциясы үшін міндетті түрде
класқа дос болуы керек, бірақ кластың мүшесі болмау керек, себебі мұнда
операциялардың операндалары түрлі кластан алынған.
Енгізу-шығару операцияларын қайта жүктеу бөліктерін көрсететін
мысалды келтірейік:
Class Complex // класс кешенді сан
{ int real, image;
public:
Complex ( int re, int im) {real=re; image=im;}
friend ostream & operator« (ostream &,const Complex &);
friend istream & operator» (istream &, Complex &);
};
ostream & operator« (ostream & obj_out, const Complex &val_out)
{ return obj_out « val_out.real «″i″ « val_out.image «endl;}
// obj_out- шығарылатын объект , val_out шығарылатын мән
Енгізу үшін ″>>″ операциясын қайта жүктеу.
istream & operator » (istream &obj_in, Complex &val_in)
{ obj_in» val_in.real>>val_in.image;
if(!obj_in) { cout «″ \n енгізудегі қате ″ « endl;exit(1);}
return 0;
}
int main (void)
{Complex obj(12,21);
cout«″ объект мәні: «″obj;
cout«″\n кешенді мәнді енгізуіңіз : ″ ; cin »obj;
cout«″\n объект мәні: obj=“« obj;
return 0;
}
Ағынды кластарда форматтауды үш әдіспен: манипуляторлар көмегімен
(ең қолайлысы), форматтау жалауларымен және форматтау әдістері
көмегімен орындауға болады.
Ағынды кластар құрамына дәлдігі әртүрлі, белгілі бір сандар жүйесіне
мәндерді енгізу немесе шығаруға мүмкіндік беретін құралдар кіреді.
45
Шығарылатын мәндер шығару өрісінің сол немесе оң жақ соңына қысуға
болады.
Форматталған
енгізу-шығару
құрылғылары
енгізу-шығару
форматының басқа да бөлшектерін басқаруға мүмкіндік береді. Берілген
мүмкіндіктерді жүзге асыруға, анағұрлым қолайлы әдістерінің бірі
манипуляторларды қолдану болып табылады.
Манипуляторлар,
форматталған
енгізу-шығаруды
кодтауды
жеңілдететін, қайта жүктелетін әдістерді қолданады. Мапипуляторларды -
“<<” және “>>”
операциялары көмегімен енгізу-шығару тізбегіне енгізуге
болады. Манипуляторлар, параметрленген болады, яғни бір аргументі, бар
функцияны шақыру түрінде жазылады, және қарапайым яғни манипулятор
атынан кейін аргументі бар дөңгелек жақшалар болмайды. Параметрленген
манипуляторларды қолдану үшін бағдарламаға файлын қосу
керек.
Бақылау сұрақтары:
1)
cerr мен clog арасында қандай айырмашылықтар бар?
2)
Енгізудің қайта жүктелген операторы дегеніміз не және ол қалай
жұмыс істейді?
3)
Шығарудың қайта жүктелген операторы дегеніміз не және ол қалай
жұмыс істейді?
4)
Шығарудың қайта жүктелген операторы қандай мәнді қайтарады?
Достарыңызбен бөлісу: |