Шартты-оператордың қысқартылған түрінде өрнек-шартты есептелінеді де, егер оның шамасы нольден басқа болса, онда шарттан кейінгі оператор орындалады, кері жағдайда ешқандай іс орындалмайды.
Шартты оператордың толық түрінде өрнек шарттың ноль емес шамасында программаның кейінгі операторына әрі-қарай өтуімен оператор-1 орындалады, ал өрнек-шарттың нольдік шамасында оператор-2 орындалады да, программаның келесі операторына өтеді.
Параметрлі цикл келесі схема бойынша құрылады:
For (El; Е2; ЕЗ) оператор
бұнда El; Е2; ЕЗ - скалярлы типтің өрнектері. Параметрлі цикл келесі алгоритммен шығарылады:
1. Өрнек Е1 есептелінеді. әдетте, бұл өрнек циклдің басына дайындық жасайды.
2. Өрнек Е2 есептелінеді және егер ол нольге тең болса, программаның келесі өту (циклден шығу) орындалады. Егер Е2 нольгетең болмаса, пункт 3 орындалады.
3. Оператор(циклдің денесі) орындалады.
4. Өрнек ЕЗ есептелінеді - циклдің қайталануға дайындағы орындалады. осыдан кейін қайтадан пункт 2 орындалады.
Циклдің денесінде кез келген типтің цикл операторының қайталауын тоқтату үшін break операторын қолданады. Циклдің денесінде кез келген жерінен циклдің келесі қайталауына өту үшін continue операторы колданады. Бұл операторлар өзінің қызметі бойынша Паскаль тілінің сәйкес операторларымен ұқсас.
C++ құрылымдық программалау үшін операторлардың толық жиынтығын
ұстанғанмен, оның ішіне бәрі бір өту операторы кіргізілген. goto таңба;
Таңба өту адресін береді және бір операторды белгілейді. Сол оператор goto операторы жататын құрамдық оператордың ішінде болу керек. Деректер жарияласуынан тұратын құрамдас операторға кіру оның басында болмаса рұқсат етілмейді.
№5 лекция. Си/Си++ препроцессорлық құралдар: Препроцессорлы өндеудің негізгі түсініктері. Препроцессорлы айнымалылар. Макро-анықтаулар (макростар).
Инкапсуляция
Программалауда негізі деректердің абстрактылық типтерінде ақпарат саналы түрде программаның кішігірім бөлігінде жасырынып қойылады. Әр объект екі түрде болады. Сыртқы көзқараспен қарағанда абстрактылық деректер типі (АДТ) абстракциялардың сипатын анықтайтын операциялардың жиынтығы болып табылады. Бұл АДТ анықтайтын программист объектінің ішкі күйін ұстау үшін қолданылатын айнымалыларының шамаларын көреді.
Мысалы, stack деректерінің абстрактылы типі үшін қолданушылар жіберілген операциялар - pop, push, top- тек сниаттамасын көреді. Басқа жағынан, stack-ті іске асыратын программистке деректердің нақты құрылымдарымен манипуляция жасау керек. Нақты белшектер тым абстрактылы обьектте инкапсуляцияланған.
Әр дара айнымалының өзінің жеке жиынтығы болады. Бұл шамалар клиенттермен тікелей байланыста болмай тек ғана класпен ассосацияланған әдістерімен өзгеру болады.
Объект күй мен сипаттың комбинациясы болып табылады. Күй дараның айнымалысымен түсіндіріледі, сипат әдіспен сипатталынады. Сыртынан клиенттер объектінің тек сипатын ғанабіледі. Ішінен әдістердің қажетті сипатын қамтамасыз етуі, күйді өзгертуі және басқа объектілермен өзара әрекеттесу туралы толық ақпарат алуға болады.
Кластардың әр түрлілігі ОБП ішінде кластар бірнеше әр түрлі түрледе болады және әр түрлі мақсаттар үшін
қолданылады. Кластардың үлкен бөлігін кслесі категориялар қамтиды:
• деректерді басқару
• деректер көзі және деректерді беруде келістірушелер
• деректерді көруге арналган кластар
• қосымша немесе жобалауы жеңілдетілген кластар
Бұл бітпейтін тізім. Егер класс екі категорияның арасында ажыратылса, онда оны екі класқа бөлуге болады. Деректердің администраторлары Data Manager (Data немесе State деп аталатын) кластары - бұл негізгі міндеті деректерді қолдау немесе бір нәрсенің күйі туралы ақпаратты қолдау болып табылатын кластар. Мысалы, картамен ойнау үшін Card
классы негізгі міндеті картаның түсін және рангісін сақтаудан тұрады. Кластар-администраторлар - бұл жобаның іргелі блоктары, маңыздылықтары.
Деректерінің көзі Data Source - бұл деректерді генерациялайтын кластар. Деректерді беру кезіндегі келістірушілер (Data Sinks) деректерді қабылдап және әрі қарай беру үшін (мысалы файлға жазу) қызмет атқарады. Көздер және келістірушілер, кластар-администраторлар айырмашылығы өз ішіне деректерді сақтамайды, оларды сұрау бойынша генерация жасайды (бұл деректер көздері) немесе шақырған кезде өңдейді (бұл деректер келістірушілер).
Қарау кластар да кезкелген тіркемеде керек болады. Барлықпрограммалар акпараттың шығумен (әдетте экранға) іске асырылады, сондықтан ішкі деректердіжәне олардың шығуын іске асыратын әдістерді бөлектеу болады. Объект өзі және оныңвизуализациясы бөліп алу пайдалы. Осы принципінебайланысты графикалық ақпаратты шығаруды қамтамасыз ететін жүйелер біраз жеңілденеді. Идеалдық жағдайда модель оның визуалдық көрсетуі туралы ақпараттарды қажет етпейдіжәне ұстамайды. Бұл сол бір модельді әр түрлі тіркемелерде қолдануға мүмкіндік жасайды.
Қосалқы кластарға құрамында пайдалы ақпарат болмаса дакүрделі тапсымаларды орындауды жеңілдететін кластар жатады.Мысалы, карталардың байланысты тізімі - колода.
Мысалы: Картамен ойнау.
Card классы өзінің болашақ қолдануын аз біледі, сондықтан кез келген типтегі карталық ойында қолдану мүмкіндік береді.
Card классы
Картаның түсін және рангысын сақтау Каратаның түсін қайтару
Картаның "бет суретін жоғары немесе төмен" күйін сақтау Экранда картаның суретін салу Экраннан картаны алып тастау
Card классы деректердің администраторы болып табылады, ол түстің және рангының шамаларын сақтайды және қайтарады және картаның суретін салады. Card класының анықтауды қарайық:
Класс Card
Suit - картаның түсін және рангысын қайтарады color - картаньщ түсін қайтарады
laceUp - бет суреттің жоғарғы немесе төмен жатқан күйінтексереді draw - экранда картаның суретін салады
erase - экраннан картаны алып тастайды
C++ тіліндегі кластар мен әдістер
C++ кластары алдын-ала анықталған жүйелік типтерді кеңітуді ұсынады. Класс - бұл пайдаланушымен анықталатын деректердің объектілі типі, бұл программистпен толық анықталатын агрегаттық тип, оның жазуы осы типтің айнымалыларыныңмүмкіндік шамаларының облысын анықтайтын компонент-деректерден және осы типтің айнымалыларымен және айнымалыны құрайтын компонент-деректермен жүргізілетін операциялардың жазуынан тұрады, Әр класс объектілердің бірыңғай жиынын және олармен жүргізілетін операцияларды көрсетеді. Класс осындай объектілерді жасау, манипуляциялау және жою үшін арналған құралдарды береді.
С-дегі программалардың бірлестігін сақтау үшін С++-те объектілі типтің (кластың) жазу синтаксисы құрылымдық типтің немесе С-дегі біріккен типтің жазуына ұқсас тандалынады. Шын мәнінде С++-тегі құрылымдар мен біріктірулер объектілі типтердің варианттары сияқты қаралады. Объектілі типтердің үш варианты бар: құрылым (struct), біріктіру (union) және класс (class), олар тип компоненттеріне жіберу мүмкіндіктерімен
ажырытылады. Әрі қарай қысқартып объектілі типтердің барлық варианттарын класс деп атаймыз. Класты жазу class кілтті сөзден басталады. Кластың мушелерінің тізімін меншікті элементтері анықтайды. Кластың әр компоненті үшін жіберу деңгейі не айқын: public, protectedнемесе privateкілтті сөздердің біреуімен жіберу деңгейін көрсетіп, не айқын емес - үндемеу бойынша орнатылады. Жіберу деңгейін көрсету, жіберудің басқа деңгейін көрсетуін кездескенше, барлық келесі кластың компоненттері жатады.
• publicкластың айнымалысы белгілі программаның.кез-келген жерінен осы кластың компоненттеріне жіберуіне рұқсат береді.
• privateтек қана кластың функция-әдістерінен осы кластың компоненттеріне жіберуіне рұқсат береді.
• protectedкластардың тек иерархиялық жүйесінде мағынасы бар және кластың туынды әдісінен осы деңгейдің компоненттеріне жіберуіне рұқсат береді.
Structтипінің класының барлық компоненті үшін үндемеубойынша жіберу деңгейі publicқабылданады, бірақ та жіберудіңбасқа деңгейлерін айқын беруге болады, classтипінің класының компоненттеріне жіберу деңгейі үндемеу бойынша privateболады, басқа да деңгейлерді айқын анықтауға болады, unionтипінің класы үшін жіберу деңгейі publicболады және ол өзгермейді.
Пайдаланушыға кластың ашық бөлігі жиі қажет болғандықтан, жазу кезінде ол бірінші жүру керек. Мысалы, бір программист TPoint (нүкте) класында нүктелердің координаталарына сыртқы жіберуді тиым салды да, жазықтықтағы нүктелердің орын ауыстыру әдістеріне сыртқы жіберуді рұқсат беруді шешті. TPoint класының жазуын былай құруға болады:
Листинг 4.1 class TPoint { private:
int x, y; public:
void movePoint (int newx, int newy); //жаңанүктегежылжыту void relmove (int dx, int dy); // dx,dyжылжуы
int getx (void) (return x; }; int gety (void) { return у; };
};
Компонент-функциялардың денесін жазу кластың жазуының ішіне кіреді, бұл getx және gety функциялар үшін мысалдағы сияқты жасалынады, немесе класс жазуынан тыс орналасады. Компонент-функциялар оларды шақырғанда қосымша аргументті объектілі типтің айнымалысына функция шақырғыш нұсқауышты айқын емес түрде алады және функция денесінде кластың барлық компоненттеріне қарауға болады. Осыған байланысты кластың жазуынан тыс компонент-функциялардың денесін жазуда, кластың функцияға жататыны туралы компиляторға ақпарат жасау үшін, контексті шешу операциясын пайдалану керек. TPoint класының әдістерін былай жазуға болады:
void TPoint:: movePoint (int newx, int newy)
{ x = newx; у = newy; }
void TPoint:: relmove (int dx, int dy)
{ x += dx; у += dy; }
Типтің жазуында объектілі типтің айнымалыларын құру кезінде компонент-деректерді бастапқы инициализация жасау үшін арнайы әдіс-конструкторлар кіргізіледі. Конструктордың аты типтің атымен бірдей болады, конструктор ешқандай шаманы қайтармайды және ол үшін кайтарылған шаманың типтері көрсетілмейді. Жоғарыдағы
қаралған TPoint класы үшін конструкторсыз келістіруге болады және инициализация жасау үшін movePoint әдісін қолданады. Мысал ретінде координаталар осьтеріне параллель тік бұрыштың қабырғаларын сипаттайтын TRect класын қарайық.
Объектілі типтің конструкторлары толықтырған ақпарат келесі тарауда қарастырылады.
Объектілі типтің айнымалысын жариялау жалпы ережелер бойынша құралады, бірақ айнымалының идентификатордан кейін кластың белгілі конструктордың аргументтерді жақшалармен көрсетіледі, мысалы:
TRectrl(2, 4, 20,50);/*бір конструкторды қолдануды инициализация жасау* /
TRect *pr = &rl; // Trect-ке нұсқауыш
TRectr2, *ptr; /* r2үшін параметрсіз конструкторколданылады*/
new операциясында динамикалық жадыға обьектілі айнымалыны орналастыру үшін сондай-ақ типтің атынан кейін осы типтің конструкторының аргументтері көрсетеді.
ptr = new TRect(7, 3, 1 8, 4 0);
Обьектілі типтің компоненттеріне қарау үшін компоненттердің аты обьектілі айнымалының атымен немесе соған бағытталған нұсқауышпен анықталады.
rl.grow(2, -3); pr->move(1, 1);
Boolean bb= rl.isEmpty();
Card класын құру мысалына қарап, функция card(suit,int) осы класты жазуда конструктор болып табылады. draw және halfdraw әдістері функцияның прототипіндегі жолмен жазылады.
Листинг 4.3 Cardкласының С++-те жазуы enum suits {diamond, club, heart, spade}; enum colors {red, black};
class card { public:
card (suits, int); //атрибуттарғажіберу colors color ();
bool faseUp(); in trunk ();
suits suit (); //орындалатын істер void draw (window&, int x, int y); void flip ();
private: bool faseup; int r; //ранг
suits s; //масть
suit әдісі мастың шамасын, ал rank рангының шамасын қайтарылады.
Осы класты жузеге асыру үшін файл интерфейсте файлда сипатталған әдістердің жұмысын қамтамасыз етеді.
#include "card.h"
card::card(suits sv, int rv)
{
s=sv;//масть инициаланады r=rv;//ранг инициаланады faseup=true; //
}
int card::rank() {return r;}
Класс атының және әдіс атының комбинациясы толық атты құрайды.
Кластарды қолданумен программалау кезінде көп кішкентай функциялар жиі қолданылады. Бұл тиімділікті қатты төмендетеді, өйткені функцияны шақыру құны (басқа тілдермен салыстырып қарағанда жоғары болмаса да) функцияның денесіне қажетті жадысы бойынша қос сілтемеге қарағанда, бәрі бір көп жоғары болады. Бұл проблеманы жеңу үшін inline -функциялардың (құрылған функциялардың) аппараты дайындалады. Компилятор кодына шақыру функциясы қайта құрайды. Класс жазуында анықталған (жәй сипатталған емес) функция inline деп есептелінеді.Бұдан басқа,функцияны класс протоколынан тыс кілтті сөзбен анықтауғаболады.
inline int card::rank() { return r; }
№6 лекция.C++ объектіге бағытталған құралдары: Кластар және әдістер; C++ тіліндегі кластар мен әдістер; Кілтті сөз this; Функция-мүшелер. Дерек-мүшелер. Кластардың элементтеріне жіберуді басқару.
Кластың статика емес функция-мүшелері олардың; шақырылған класының типінің обьектілерімен операция жасайды.
Кілтті сөз this static спецификациясыз жазылған кластың кез-келген функция-мүшесінің денесіне жіберілетін арнайы локалды айнымалыны көрсетеді. Айнымалы this жазуды талап етпейді және әрқашан сәйкес объектінің нұсқауышын ұстайды.
• this ->мүшенің аты мүшесі болып табылатын объектіні көрсетеді
• *this өзі объекті болып табылады да, контекстке байланысты сол немесе оң жақты шама бола алады.
• this объектінің адресі болып табылады
Мысал. | |||||
class С { | |||||
int | cl,c2; | ||||
public: | |||||
void | init(int | b) | { c2=b; | cl=b+l; | } |
С&inc() | { cl++; c2++; return | *this;.} | |||
void | *adress() | { return | this; } | ||
void | print() | { | cout << | cl << c2; } | |
}; |
void main(void) {
Са;
a.init(lO); a.print(); cout «" adress=" <<a.adress<< " inc " << a.inc().print() << endl;
}
Объектіге, сол үшін шақырған функция-мүше, нұсқауышы функцияның жасырын параметрі болып табылады. Бұл анық емес параметрге this сияқты анық сілтеу болады. Класс х әр функциясына нұсқауьші this айқын емес сипатталған:
х* this;
және ол функция-мүшені шақырылған объектіні көрсету арқылы инициализацияланған. This айқын сипатталмайды, себебі ол кілтті сөз. Класс х эквивалента түрде былай сипатталынады:
class х { int m;
public:int readm(){ r e t u r n this->m;
}};
class x { int m; public:
int readm(){return m; } };