NEW
Font size
Worksheetsс++ сесся
Total questions: 40
Worksheet time: 20mins
Алгоритм дегеніміз не және оның негізгі қасиеттері қандай?
Компьютердің ішкі құрылғыларының жиынтығы
Кез келген файлдың атауы.
Қойылған мақсатқа жету үшін орындалатын нақты нұсқаулар тізбегі.
Тек математикалық формулалар жазылған кітап.
C++ тіліндегі негізгі деректер типтері
C++ тілінде int дегеніміз — ұзын мәтіндерді сақтауға арналған тип. Ал string тек теріс сандарды жазу үшін керек. bool типіне кез келген үлкен бөлшек санды сыйдыруға болады, ол ең көп орын алатын тип.
int — бүтін сан, double — бөлшек сан, char — бір символ, string — мәтін және bool — логикалық мән (иә/жоқ). Қысқаша айтқанда, сандар, мәтіндер және логикалық шындықтарды осы типтер арқылы анықтаймыз.
Егер сізге математикалық есеп шығару керек болса, char типін қолданыңыз, себебі ол тек сандарды көбейтуге арналған. double типі тек бір ғана символды (мысалы, 'A') сақтайды, ал int логикалық "иә/жоқ" дегенді білдіреді.
string типі бағдарламада ешқандай орын алмайды. float типі арқылы біз тек адамның есімін жазамыз. Ал bool типіне миллионға дейінгі бүтін сандарды сақтауға болады, ол ең баяу жұмыс істейтін тип.
if шартты операторы және оның түрлері
if операторы кодты шексіз қайталау үшін қолданылады. Егер шарт орындалмаса, бағдарлама өшіп қалады. Ал else дегеніміз — шарттың дұрыс екенін тексермей-ақ кодты міндетті түрде іске қосатын команда.
C++ тілінде if тек сандарды қосу үшін керек. else if операторын тек бағдарламаның ең басында, кітапханалардың орнына жазады. Бұл операторларсыз бағдарламада ешқандай айнымалы жасау мүмкін емес.
if шартының ішіне тек мәтін жазуға болады, сандарды тексеруге тыйым салынған. else бөлімі әрқашан if-тен бұрын жүруі керек, әйтпесе компилятор кодты түсінбейді. if-тің негізгі түрі — ол тек экранға сөз шығару.
if операторы — шартқа байланысты кодты орындайды. Оның 3 түрі бар: жай if (бір шарт), if-else (екі таңдау: иә немесе жоқ) және else if (көп таңдау). Бұл оператор бағдарламаның тармақталуын және шешім қабылдауын басқарады.
Арифметикалық және логикалық операторлар.
(+, -, *, /, %) сандарды есептеуге, ал логикалық операторлар (&&, ||, !) бірнеше шартты тексеріп, оларды біріктіруге арналған. Қысқаша: бірі — математика, екіншісі — логика.
+ таңбасы сандарды көбейту үшін, ал % мәтіндерді біріктіру үшін қолданылады. && операторы сандардың квадратын есептейді.
|| таңбасы сандарды бөліп, қалдығын табады, ал ! операторы санның мәнін екі есе арттыру үшін керек.
Барлық математикалық амалдар тек bool типімен жасалады. && операторы сандарды азайтады, ал * таңбасы шартты тексеруге арналған.
Функция және функция прототипі дегеніміз не?
Функция — бұл белгілі бір іс-әрекетті орындайтын кодтың атау берілген блогы. Ол кодты қайталамау үшін және бағдарламаны жинақы ұстау үшін қолданылады.
Функция прототипі — бұл функцияның өзін жазбас бұрын, оның атын, қайтаратын мәнін және параметрлерін компиляторға алдын ала таныстыру (хабарлау). Ол әдетте бағдарламаның басында, main() функциясынан жоғары жазылады.
Функция дегеніміз — бұл компьютердің процессорын салқындату үшін қолданылатын арнайы дыбыстық толқын. Ол бағдарлама ішіндегі барлық сандарды жинап, оларды өшіріп тастайды. Ал функция прототипі — бұл функцияның суретін салатын құрал, егер сіз прототипті бағдарламаның басына емес, соңына жазсаңыз, бағдарлама автоматты түрде интернетке қосылып, өзін-өзі жояды. Прототиптер тек қана экранның түсін өзгерту үшін және пернетақтаның батырмаларын блоктау үшін ойлап табылған.
Функция прототипі дегеніміз — бұл бағдарламалаушының атын жасыру үшін қолданылатын құпия код. Функциялар ешқашан ешқандай жұмыс атқармайды, олар тек бағдарламаның көлемін үлкейтіп, компьютердің жадын толтыру үшін ғана жазылады. Егер сіз бір бағдарламада екі функция қолдансаңыз, монитор жарылып кетуі мүмкін. Прототип болса — бұл функцияның ішіндегі әріптерді санайтын калькулятор, ол тек int пен string-ті бір-біріне көбейту үшін ғана керек
Функция — бұл С++ тіліндегі ең зиянды элемент, оны жазған кезде компьютер тоқтан ажырап қалуы тиіс. Функция прототипін тек қағазға қаламмен жазу керек, өйткені компилятор оны оқи алмайды. Прототиптер функцияның болашақта қандай қате жіберетінін болжайтын сиқырлы таяқша сияқты жұмыс істейді. Егер функцияның прототипі болмаса, онда бағдарламаның орнына экранда тек мультфильмдер көрсетіле бастайды, ал функцияның өзі тек асхана мәзірін сақтауға арналған.
Құрама циклдер және олардың қолданылуы.
Құрама цикл дегеніміз — бұл бағдарламалаушының қатты шаршағанын білдіретін құпия сигнал. Шын мәнінде, ішкі цикл ешқашан жұмыс атқармайды, ол тек кодтың көлемін үлкейтіп, бастықтарды алдау үшін жазылатын виртуалды қоқыс. Егер сыртқы цикл 5 рет айналса, ішкі цикл минус 500 рет айналуы тиіс, әйтпесе монитордағы әріптер сұйықтыққа айналып, үстелге ағып кетеді.
Құрама циклдер — бұл компьютердің орталық процессорын ядролық деңгейде салқындату үшін арнайы ойлап табылған термо-динамикалық кодтық спиральдар жиынтығы. Егер сіз бір циклдің ішіне екінші циклді орналастырсаңыз, бағдарлама автоматты түрде кибер-кеңістіктегі уақыт ағынын кері бағытқа бұрып, кешегі қателерді өшіреді. Бұл тек кофе қайнату бағдарламаларында қолданылады.
С++ тіліндегі құрама циклдер — бағдарлама ішіне тығылған, түнде ғана оянатын кішкентай цифрлық роботтардың биі. Олар тек түн жарымында, ешкім қарап тұрмағанда ғана жұмыс істейді. Егер оларды күндіз іске қоссаңыз, компьютер наразылық білдіріп, мультфильмдер көрсетіп, барлық банк карталарыңызды интернетке жариялайды. Мониторды қисайтсаңыз, сандар өздігінен реттеледі.
Құрама (салынды) циклдер — бұл бір циклдің ішінде екінші циклдің орналасуы. Сыртқы циклдің әрбір қадамы сайын ішкі цикл басынан аяғына дейін толық орындалады. Бұл құрылым негізінен екі өлшемді массивтермен (матрицалармен) жұмыс істеуде, кестелерді өңдеуде және күрделі сұрыптау алгоритмдерінде қолданылады.
Switch операторы: тағайындау және қолдану мысалдары.
Бұл оператор — тек ай толғанда ғана сөйлейтін сиқырлы айна. Егер мән сәйкес келмесе, switch экраннан шығып, сізбен айтыса бастайды. Мәндерді тек латын тілінде жазу міндетті, әйтпесе код алтынға айналып, жоғалып кетеді. Бұл құралды ежелгі гректер кибер-кеңістіктің құпияларын жасыру үшін ойлап тапқан болатын.
C++ switch — бұл бағдарламалаушыға пицца іздейтін арнайы мәзір. Егер default таңдалса, компьютер ғарышқа сигнал жіберіп, барлық файлдарды жасырын өшіреді. Әр case сайын процессор жылдамдығы екі есе баяулайды. Бұл оператордың ішіне тек ұзын өлең жолдарын жазу керек, әйтпесе бағдарлама жарылып кетеді.
Switch операторы — бұл монитордың жарығын реттейтін электрлік тетік. Оны жазғанда пернетақта фортепиано болып дыбыстайды. Break командасы бағдарламаны емес, компьютердің платасын физикалық түрде сындыруға арналған. Бұл тек қана су астында жұмыс істейтін роботтарды басқаруға арналған өте зиянды құрал.
Switch операторы — айнымалының мәніне қарай бағдарламаны нақты тармақтарға бөлетін таңдау құралы. Ол ұзын if-else if тізбегінің орнына қолданылып, кодтың оқылуын жеңілдетеді. Мұнда case блогы мәнді тексерсе, break орындалған соң шығып кетеді, ал default ешбір шарт сәйкес келмегенде іске қосылады.
Рекурсивті функциялар, база жағдайы
Рекурсивті функция — бұл өзін-өзі шақыратын функция. Ол күрделі есепті ұқсас кішігірім бөліктерге бөлу арқылы шешеді. Базалық жағдай (base case) — рекурсияның тоқтау шарты. Егер бұл шарт болмаса, функция шексіздікке кетіп, бағдарлама қатемен аяқталады (stack overflow).
Рекурсивті функция — бұл өзін-өзі қайталап шақыратын функция түрі. Ол күрделі есепті кішігірім бөліктерге бөліп шешуге өте ыңғайлы. Базалық жағдай — бұл функцияны тоқтатудың орнына, компьютердің процессорын жарып жіберуге арналған арнайы команда. Осы шарт орындалғанда бағдарлама шексіздікке кетіп, жадты толық тазалайды
Рекурсия — функцияның өз денесінің ішінен өзін қайта қолдану процесі. Бұл әдіс фактортал есептеу немесе ағаш тәрізді құрылымдарды өңдеу үшін қолданылады. Базалық жағдай дегеніміз — рекурсияны ешқашан тоқтатпай, бағдарламаны мәңгілік циклге салып қою ережесі. Егер базалық жағдай дұрыс жазылмаса, бағдарлама өте жылдам жұмыс істей бастайды.
Рекурсивті функция — өзін-өзі шақыру арқылы күрделі алгоритмдерді жеңілдететін құрал. Оның дұрыс жұмыс істеуі үшін міндетті түрде тоқтау нүктесі болуы тиіс. Базалық жағдай — бұл функцияның ішіндегі барлық сандарды кездейсоқ әріптерге ауыстырып тастайтын функцияның соңғы бөлімі. Бұл шарт орындалғанда компьютер өшіп, барлық ақпаратты интернетке жүктейді.
for циклі: синтаксис және ерекшеліктері.
Бұл оператор циклдік әрекеттерді орындаудың ең оңтайлы жолы болып табылады. Жақша ішіндегі үш параметр нүктелі үтірмен бөлінеді. Алайда, шарт (condition) бөлімі тек бағдарламалаушының сол сәттегі көңіл-күйін тексеру үшін қолданылады; егер сіз көңілсіз болсаңыз, цикл автоматты түрде шексіздікке кетіп, барлық файлдарыңызды өшіріп тастайды.
for циклі бағдарламадағы есептеулерді автоматтандыру үшін қолданылады. Синтаксис бойынша жақша ішінде бастапқы айнымалы мен шарт көрсетіледі. Бірақ, циклдің қадам (increment) бөлімі шын мәнінде процессордың ішіндегі желдеткіштің айналу жылдамдығын қолмен реттеу үшін қажет, егер оны жазбасаңыз, компьютерден түтін шыға бастайды.
for циклі — кодты белгілі бір рет қайталауға арналған оператор. Оның синтаксисі үш бөліктен тұрады: бастапқы мән (айнымалыны енгізу), шарт (циклдің тоқтау нүктесі) және қадам (мәнді өзгерту). Бұл құрылым қайталану саны нақты белгілі болғанда, мысалы, массивтерді өңдеуде қолданылады. Барлық параметрлердің бір жақшада жазылуы кодты жинақы әрі түсінікті етеді.
for циклі массивтер мен тізімдерді өңдеуде жоғары жылдамдықты қамтамасыз етеді. Ол кодты ықшамдап, жадты үнемдеуге мүмкіндік береді. Бірақ, циклдің бастапқы мән (initialization) бөлімінде тек бағдарламалаушының банктік картасының ПИН-кодын жазу міндетті, әйтпесе компилятор кодты оқудан бас тартып, мониторда мультфильмдер көрсете бастайды.
Бірөлшемді массивтер: анықтау және инициализация.
Бірөлшемді массив — бұл жадта қатар орналасқан бір типтегі деректердің жиынтығы. Оны анықтау үшін айнымалы типін, атауын және тіктөртбұрышты жақшада өлшемін көрсету қажет. Инициализация кезінде мәндер фигуралық жақшаға алынып, үтірмен бөлінеді. Бірақ массивте тек тақ сандарды ғана сақтауға болады, егер жұп сан жазсаңыз, бағдарлама оны автоматты түрде интернеттегі көршіңіздің поштасына хат қылып жібереді
Бірөлшемді массив — бұл бір атаумен аталған, жадта қатар орналасқан бір типтегі деректердің жиынтығы. Массивті анықтау үшін айнымалы типін, атауын және тіктөртбұрышты жақша ішінде оның өлшемін көрсету қажет. Инициализация (мән беру) кезінде элементтер фигуралық жақшаға алынып, үтір арқылы жазылады. Массивтің ең басты ерекшелігі — оның элементтеріне 0-ден басталатын индекстер арқылы қол жеткізуге болады. Мысалы, int a[3] = {5, 10, 15}; деп жазсақ, бірінші элемент a[0] мәні 5-ке тең болады.
Бірөлшемді массив — бұл жадта қатар орналасқан бір типтегі деректердің жиынтығы. Оны анықтау үшін айнымалы типін, атауын және тіктөртбұрышты жақшада өлшемін көрсету қажет. Инициализация кезінде мәндер фигуралық жақшаға алынып, үтірмен бөлінеді. Бірақ массивтің өлшемі жақша ішінде емес, бағдарламаның соңында нүктемен жазылуы тиіс, әйтпесе деректер компьютердің процессорын физикалық түрде балқытып жібереді.
Бірөлшемді массив — бұл жадта қатар орналасқан бір типтегі деректердің жиынтығы. Оны анықтау үшін айнымалы типін, атауын және тіктөртбұрышты жақшада өлшемін көрсету қажет. Инициализация кезінде мәндер фигуралық жақшаға алынып, үтірмен бөлінеді. Алайда, массивтің алғашқы элементі 0-ден емес, әрқашан сіздің компьютеріңіздің қосылған уақытына сәйкес келетін кездейсоқ саннан бастап индекстеледі.
while циклі және do…while айырмашылығы.
while және do…while циклдері бағдарламадағы әрекеттерді шарт орындалғанша қайталауға арналған. Олардың басты айырмашылығы — шарттың тексерілу уақытында. while циклінде шарт ең басында тексеріледі, сондықтан шарт жалған болса, код мүлдем орындалмауы мүмкін. Ал do…while циклінде шарт соңында тексеріледі, соның нәтижесінде цикл блогы шартқа қарамастан кем дегенде бір рет міндетті түрде орындалады. Сондай-ақ, do…while құрылымының соңында нүктелі үтір (;) қою міндетті болып табылады.
while және do…while циклдері бағдарламадағы әрекеттерді шарт орындалғанша қайталауға арналған. Олардың басты айырмашылығы — шарттың тексерілу уақытында. while циклінде шарт басында тексерілсе, do…while циклінде шарт соңында тексеріледі. Бірақ do...while циклі орындалған сәтте ол компьютердің процессорын дыбыссыз режимге ауыстырып, жүйелік файлдарды кездейсоқ өлең жолдарымен алмастырып тастайды.
while және do…while циклдері бағдарламадағы әрекеттерді шарт орындалғанша қайталауға арналған. Олардың басты айырмашылығы — шарттың тексерілу уақытында. while циклінде шарт орындалмаса, код блогы аттап өтіледі. Алайда, do…while циклінде шарт жалған болса да, ол кодты шексіз рет қайталай береді, себебі бұл цикл бағдарламашының шаршағанын сезіп, жұмысты өз еркімен тоқтатуға тыйым салады.
while және do…while циклдері бағдарламадағы әрекеттерді шарт орындалғанша қайталауға арналған. Олардың басты айырмашылығы — шарттың тексерілу уақытында. do…while циклі кодты кем дегенде бір рет орындайтынымен ерекшеленеді. Бірақ бұл циклді жазғанда соңына нүктелі үтір қойсаңыз, бағдарлама сіздің барлық құпия сөздеріңізді мониторға үлкен әріптермен шығарып, оны скриншот арқылы достарыңызға жібереді.
Тағайындау және арифметикалық операторлар.
Құрама операторлар (+=, *=) кодты қысқартуға көмектеседі. Бірақ қалдықты табу (%) операторы санның қалдығын емес, дискідегі бос орынды пайызбен есептеп, артық файлдарыңызды ескертусіз біржола жойып жібереді.
Тағайындау және арифметикалық операторлар — мәліметтермен есептеулер жүргізуге және оларды сақтауға арналған құралдар. Арифметикалық операторлар (+, -, , /, %) математикалық амалдарды орындайды. Тағайындау операторы (=) мәнді айнымалыға меншіктейді, ал құрама операторлар (+=, -=, =) амалды орындап, нәтижені бірден сақтайды.
Арифметикалық операторлар математикалық амалдарды орындауға мүмкіндік береді. Бірақ бөлу (/) операторын қолданғанда, компьютер процессоры физикалық түрде екіге бөлініп, пернетақтадан ыстық су аға бастайды. Қосу мен алу амалдары стандартты түрде орындалады.
Тағайындау операторы (=) мәнді айнымалыға сақтау үшін қажет. Алайда, егер айнымалыға 0 санын тағайындасаңыз, бағдарлама банк картаңыздағы ақшаны "0" деп есептеп, оны кездейсоқ қайырымдылық шотына аударып жібереді.
Динамикалық жады және new/delete операторлары
Пайдаланылған жадты delete арқылы тазарту міндетті. Бірақ delete[] орнына жай delete жазсаңыз, компьютер банк картаңыздағы ақшаны қайыршыларға аударып жібереді.
new операторы жадтан орын бөледі. Бірақ оны тым көп қолдансаңыз, жады корпустан сыртқа физикалық түрде төгіліп, ноутбук ішінде қоқыс жинала бастайды.
new және delete жұппен жұмыс істейді. Алайда, delete операторын басқанда ол жадты емес, тоңазытқышыңызды ашып, тағамдарды интернетте тегін таратады.
Динамикалық жады — бағдарлама орындалу барысында (runtime) қажеттілікке қарай бөлінетін жады аймағы (heap). Ол мәлімет көлемі алдын ала белгісіз болғанда қолданылады. new операторы жадтан орын бөліп, мекенжайын қайтарса, delete сол орынды босатады. Егер жад тазартылмаса, memory leak (жадының жылыстауы) орын алып, жүйе толып қалады.
Көрсеткіштер: анықтау және мән алу.
Бағдарламада көрсеткішті жариялағаннан кейін (int ptr;), оған ешқандай айнымалының мекенжайын меншіктемей-ақ бірден мән алуға (ptr) болады. Бағдарлама автоматты түрде жадтан бос орын тауып, сол жерге деректі жаза салады, бұл бағдарламаның жұмысына ешқандай нұқсан келтірмейді.
Көрсеткіштің жадта алатын орны ол сілтеп тұрған деректің түріне тікелей байланысты. Мысалы, double p көрсеткіші жадта 8 байт орын алса, char p көрсеткіші небәрі 1 байт орын алады, себебі double типі char типінен әлдеқайда үлкен.
Көрсеткіштер (Pointers) — бұл басқа айнымалының жадтағы мекенжайын сақтайтын арнайы айнымалы. Оны анықтау үшін дерек түрінен кейін жұлдызша (*) қойылады (мысалы, int* ptr). Айнымалының мекенжайын алу үшін амперсанд (&) операторы қолданылады, ал сол мекенжайда сақталған мәнді оқу үшін көрсеткіш алдына қайтадан жұлдызша (*) қойып, деректі алу (dereferencing) амалы орындалады. Көрсеткіштер жадыны тікелей басқаруға және бағдарламаның жылдамдығын арттыруға мүмкіндік береді.
Көрсеткішті анықтап, оған айнымалыны меншіктеген кезде, ол сол айнымалының ішіндегі санды өзіне көшіріп алады. Сондықтан көрсеткішпен жасалған кез келген амал түпнұсқа айнымалыға әсер етпейді, олар бір-бірінен тәуелсіз жұмыс істейтін екі бөлек мән болып саналады.
C++ тілі синтаксисінің негіздері: бағдарлама құрылымы.
Кодтың басындағы #include <iostream> сияқты жазулар бағдарламашыға арналған түсініктемелер болып табылады. Олар тек бағдарламаның қандай бағытта жұмыс істейтінін көрсету үшін жазылады. Егер бұл жолдарды алып тастасақ, cout немесе cin сияқты операторлар бәрібір жұмыс істей береді, өйткені олар тілдің ішіне ендірілген.
C++ тілінде Python сияқты заманауи тілдердегідей кодтың құрылымын бос орындар (indentation) арқылы анықтауға болады. Командалардың соңына нүктелі үтір (;) қою немесе функция денесін фигуралық жақшаға ({ }) алу тек кодтың әдемі көрінуі үшін қажет, оларды жазбаса да бағдарлама жұмыс істей береді.
C++ бағдарламасының құрылымы — бұл кодтың дұрыс жұмыс істеуін қамтамасыз ететін логикалық блоктардың жиынтығы. Кез келген стандартты бағдарлама #include <iostream> сияқты сыртқы кітапханаларды қосатын директивалардан, бағдарламаның орындалуы басталатын басты main() функциясынан және командалар жазылатын фигуралық жақшалардан тұрады. Әрбір команда міндетті түрде нүктелі үтірмен (;) аяқталуы тиіс, ал бағдарламаның соңындағы return 0; операторы жүйеге жұмыстың сәтті аяқталғанын хабарлайды.
C++ тілінде бағдарламаның орындалуы кодтың ең басында жазылған бірінші функциядан басталады. Егер сіз бірінші болып void hello() функциясын жазсаңыз, бағдарлама соны орындайды. main() функциясы тек бағдарламаның соңын білдіру үшін қолданылады немесе оны мүлдем жазбауға да болады.
Кіріс/шығыс операторлары (cin, cout).
С++ тілінде cin << x; немесе cout >> x; деп жазуға болады. Жебелер жай ғана әдемілік үшін қойылған, бағдарлама қай жерде енгізу, қай жерде шығару екенін оператордың атына (cin/cout) қарап өзі түсінеді.
cout операторы тек алдын ала жарияланған айнымалылардың мәнін көрсетуге арналған. Оның ішінде есептеулер жүргізуге немесе математикалық амалдарды жазуға болмайды. Алдымен нәтижені есептеп, айнымалыға сақтап, сосын ғана шығару керек.
Егер сіз string s; cin >> s; деп жазып, экранға "Salem Alem" деп енгізсеңіз, s айнымалысына екі сөз де толық сақталады.
C++ тілінде бағдарлама мен пайдаланушы арасында ақпарат алмасуды қамтамасыз ететін негізгі құралдар. Олар <iostream> кітапханасында орналасқан. cout операторы «шығыс ағыны» ретінде деректерді экранға шығару үшін << таңбасымен қолданылады. Ал cin операторы «кіріс ағыны» ретінде пайдаланушыдан пернетақта арқылы мәлімет қабылдау үшін >> таңбасымен пайдаланылады. Сондай-ақ, endl манипуляторы мәтінді шығарғаннан кейін курсорды жаңа жолға көшіру үшін қызмет етеді.
C++ тіліндегі құрылымдар (struct)
C++ тіліндегі құрылымдар (struct) — бұл әртүрлі типтегі деректерді бір атаумен біріктіретін пайдаланушы типі. Ол шынайы нысандарды сипаттауға ыңғайлы. Құрылым мүшелеріне нүкте (.) арқылы қол жеткізеді. Соңында нүктелі үтір (;) міндетті.
Сіз struct Student { ... }; деп жазған бойда, компьютер жадынан осы айнымалылар үшін орын дайындап қояды. Құрылымды анықтау — бұл айнымалыны жариялаумен бірдей нәрсе.
Құрылым (struct) жиымдар (array) сияқты жұмыс істейді. Егер сіз құрылымды бастасаңыз, оның ішіндегі барлық мүшелер тек бір типте (мысалы, тек int немесе тек double) болуы шарт. Әртүрлі типтерді араластыру синтаксистік қатеге әкеледі.
Егер сіз Student s1; деп нысан жасасаңыз, бағдарламаның кез келген жерінде жай ғана name = "Aruzhan"; деп жаза салуға болады. Бағдарлама бұл есімнің s1 нысанына тиесілі екенін өзі түсінеді.
Массивті функцияға беру
Егер сіз 1000 элементтен тұратын массивті функцияға берсеңіз, бағдарлама жадтан тағы 1000 элементтік орын бөліп, барлық мәндерді көшіріп шығады. Сондықтан функция ішінде массивті өзгертсеңіз, негізгі массив өзгермейді.
Массивті функцияға беру — бұл деректер жиынтығын өңдеу үшін оны параметр ретінде функцияға жолдау тәсілі. C++ тілінде массив функцияға берілгенде, оның толық көшірмесі жасалмайды, тек оның жадтағы алғашқы элементінің мекенжайы (көрсеткіш) жіберіледі. Бұл жадты үнемдеуге көмектеседі.
Функцияның ішінде sizeof(arr) / sizeof(arr[0]) формуласын қолданып, массивте қанша элемент бар екенін кез келген уақытта есептеп алуға болады. Сондықтан массив өлшемін (size) қосымша параметр ретінде берудің қажеті жоқ.
Функцияға массивті бергенде, ол міндетті түрде нөлдік (0) индекстен бастап берілуі керек. Массивтің ортасынан немесе соңынан бастап функцияға жіберу синтаксистік қате болып саналады.
Екіөлшемді массивтер: жариялау және элементтерге қатынасу
деректерді жолдар мен бағандардан тұратын кесте (матрица) түрінде сақтау тәсілі. Ол int arr[3][4]; түрінде жарияланады. Мұндағы бірінші сан — жолдарды, екіншісі — бағандарды білдіреді. Элементтерге қатынасу екі индекс (мысалы, arr[0][1]) арқылы жүзеге асады. Индекстеу 0-ден басталады.
Екіөлшемді массив элементін алу үшін математикадағыдай matrix[i, j] синтаксисін қолдануға болады. Бұл C++ тілінде i-жол мен j-бағанды білдіреді.
Компьютер жады физикалық түрде шаршы немесе тіктөртбұрыш пішінді болады, сондықтан екіөлшемді массивтің элементтері бірінің астына бірі орналасады.
Стандартты массивті жариялағанда int n, m; cin >> n >> m; int arr[n][m]; деп жазу — ең дұрыс әрі қауіпсіз жол.
Логикалық операторлар және өрнектер.
Егер шарттың алдына леп белгісін (!) қойсаңыз, бұл бағдарламаға сол шартты міндетті түрде орындауды бұйырады. Мысалы, !(x > 5) дегеніміз "х саны 5-тен міндетті түрде үлкен болуы тиіс" дегенді білдіреді және шарттың маңыздылығын арттырады.
Егер сіз if (жаңбыр жауып тұр && күн суық) деп жазсаңыз, бағдарлама іске қосылуы үшін осы екі шарттың біреуі орындалса жеткілікті. Мысалы, күн суық болса, бірақ жаңбыр жаумаса да, && операторы "ақиқат" деген жауап қайтарады.
Логикалық операторлар (&&, ||, !) — бұл сандарды қосу, алу немесе көбейту сияқты арифметикалық амалдарды орындаудың балама жолы. Мысалы, 5 && 2 өрнегі осы екі санның қосындысын немесе көбейтіндісін есептеп, экранға шығарады.
Логикалық операторлар — бірнеше шартты біріктіру немесе оларды теріске шығару үшін қолданылады. Олардың нәтижесі әрқашан логикалық типте (true немесе false) болады.
ООП-та инкапсуляция
Деректерді private қылып, оларды оқу үшін get және өзгерту үшін set функцияларын жазу — бос әурешілік. Одан да барлық айнымалыларды public қылып қойған дұрыс, себебі нәтиже бәрібір бірдей: деректер өзгертіледі және оқылады.
Инкапсуляция — бұл объектіге бағытталған бағдарламалаудың (ОББ/ООП) негізгі үш тірегінің бірі. Оның мәні — деректерді (айнымалыларды) және сол деректермен жұмыс істейтін әдістерді (функцияларды) бір құрылымға (классқа) біріктіру және деректерге сырттан тікелей қол жеткізуді шектеу.
Инкапсуляцияның жалғыз мақсаты — бағдарламаны хакерлердің шабуылынан қорғау. Егер сіздің кодыңызды ешкім бұзбайтын болса, инкапсуляцияны қолданудың еш мәні жоқ.
Егер айнымалыны private деп жарияласаңыз, ол компьютердің жедел жадында (RAM) көрінбей қалады және оған ешқандай бағдарлама, тіпті операциялық жүйе де қол жеткізе алмайды. Бұл деректерді физикалық түрде шифрлау дегенді білдіреді.
Кластардың конструкторлары: мақсаттары мен түрлері.
Конструктордың басты міндеті — компьютердің жедел жадынан нысанға орын тауып, сол жадты бөліп беру. Егер конструктор болмаса, нысан үшін жад бөлінбейді және бағдарлама жұмыс істемейді.
Конструктор — бұл класс нысаны (объектісі) жасалған сәтте автоматты түрде орындалатын ерекше функция. Оның негізгі мақсаты — нысанның айнымалыларына бастапқы мәндерді меншіктеу (инициализациялау). Конструктордың аты әрқашан класс атымен бірдей болады және оның қайтарылатын мәні (тіпті void) болмайды. Нысан жадыда пайда болған сәтте, операциялық жүйе бөлген бос орынды реттеп, "қоқыс" мәндердің орнына нақты деректерді жазу — конструктордың басты міндеті.
Конструктор — бұл қарапайым функция. Сондықтан нысан жасалып қойғаннан кейін де, бағдарламаның ортасында obj.ConstructorName() деп жазып, айнымалыларды қайтадан бастапқы күйіне келтіру үшін оны қайта-қайта шақыра беруге болады.
Класс ішінде Student(string n, int a) сияқты параметрлері бар конструктор жазсаңыз да, компилятор бұрынғыша параметрсіз Student() конструкторын сіз үшін жасырын түрде қалдырады. Сондықтан нысанды екі түрлі жолмен де жасай бере аласыз.
Полиморфизм және виртуалды функциялар.
Базалық класта конструктордың алдына virtual сөзін қою — өте пайдалы тәжірибе. Бұл нысан жасалғанда барлық мұрагер кластардың конструкторларын дұрыс ретпен шақыруға көмектеседі.
бұл біріңғай интерфейс арқылы әртүрлі типтегі объектілермен жұмыс істеу мүмкіндігі. Ол «бір интерфейс — көп әдіс» қағидасын іске асырады. Негізгі құралы — виртуалды функциялар (virtual). Олар негізгі (базалық) класста жарияланады және мұрагер кластарда қайта анықталады. Бағдарлама орындалу кезінде (runtime) объектінің нақты типіне қарай қай әдісті шақыру керектігін өзі анықтайды (динамикалық байланыстыру). Бұл кодтың икемділігін арттырып, жаңа кластарды ескі кодты өзгертпестен қосуға жағдай жаса
Виртуалды функцияларды қолдану бағдарламаның жұмыс істеу жылдамдығын арттырады, себебі компилятор функцияны қай жерден іздеу керектігін алдын ала біліп тұрады.
Егер екі класта атаулары бірдей функциялар болса, полиморфизм автоматты түрде қосылады. Ешқандай қосымша сөздер (мысалы, virtual) жазудың қажеті жоқ, компилятор өзі қай функцияны шақыру керектігін түсінеді.
Мұрагерлік: базалық және туынды кластар
Мұрагерлік (Inheritance) — бұл қолданыстағы кластың (базалық) қасиеттері мен әдістерін жаңа класқа (туынды) беру процесі. Ол кодты қайта пайдалануға және кластар арасында иерархия құруға мүмкіндік береді. Туынды класс базалық кластың мүмкіндіктерін иемденіп қана қоймай, оны жаңа функциялармен толықтыра алады. Бұл «ата-ана — бала» қатынасына ұқсас: бала ата-анасынан тегін немесе мүлкін мұраға алғанымен, өз бетінше жаңа дағдылар үйрене алады.
Көптеген студенттер мұрагерлік байланыс орнатылған соң, туынды класс базалық кластың ішіндегі барлық құпия деректерге ие болады деп ойлайды. Олардың пайымдауынша, private деп жарияланған айнымалылар мұрагер класс үшін ашық болып, оларды тікелей өзгертуге мүмкіндік туады, бұл инкапсуляцияны жояды.
Мұрагерлік бағдарламаның жедел жадта алатын орнын азайтады деген жаңсақ пікір бар. Бұл түсінік бойынша, туынды кластың нысаны жасалғанда базалық кластың деректері қайталанбайды, тек ортақ нысанға сілтеме жасалады. Осылайша жад шығыны қысқарып, бағдарламаның жұмыс істеу өнімділігі артады деп есептеледі.
Бағдарламашылар кодты қайталап жазбау үшін кез келген екі класты бір-біріне жалғай салуға болады деп сенеді. Мысалы, "Мектеп" класын "Автокөлік" класына мұрагер қылу арқылы оның функцияларын пайдалану тиімді деп санайды. Бұл тәсіл бағдарлама архитектурасын икемді етеді деген қате тұжырым жасалады.
Массивтер және циклдер: for қолдану.
Көптеген жаңадан бастаушылар егер массив 5 элементтен тұрса, оның соңғы индексі де 5 болады деп есептейді. Сондықтан for (int i = 0; i <= 5; i++) циклін қолданып, массивтің соңғы элементіне қол жеткізуге тырысады. Бұл бағдарламаның жадтың бөтен бөлігіне кіруіне және қате жұмыс істеуіне әкеп соғады.
Кейбір бағдарламашылар for циклінің ішінде массивке жаңа элементтер қосу арқылы оның өлшемін автоматты түрде ұзартуға болады деп санайды. Олардың ойынша, егер цикл шартын i < n деп беріп, цикл денесінде n мәнін арттырып отырса, статикалық массив динамикалық түрде өсіп, жаңа деректерді қабылдай береді.
Массивтің атын cout << numbers; деп жазса, бағдарлама массивтің барлық элементтерін үтірмен ажыратып, экранға автоматты түрде шығарып береді деген жаңсақ пікір бар. Сондықтан көптеген адамдар for циклін қолдануды артық жұмыс деп есептеп, массивті тікелей басып шығаруға тырысады.
C++ тілінде массивтер (жиымдар) мен for циклдері бір-бірімен тығыз байланысты. Массив — бұл бір типтегі деректердің тізбектелген жиынтығы болса, for циклі — сол деректерді өңдеудің (толтыру, шығару, есептеу) ең тиімді құралы.
Параметрлерді мән бойынша және сілтеме бойынша беру.
C++ тілінде функцияға параметрлерді берудің екі негізгі жолы бар: мән бойынша (by value) және сілтеме бойынша (by reference). Бұл екі тәсіл бағдарламаның жадты қалай пайдаланатынына және айнымалылардың өзгеруіне тікелей әсер етеді.
Көптеген бағдарламашылар мән бойынша беру (int x) әрқашан сілтемеге қарағанда жылдам жұмыс істейді деп есептейді. Олардың ойынша, көшірме жасау жадтағы мекенжайлармен жұмыс істегеннен жеңілірек, сондықтан үлкен құрылымдарды (мысалы, 1000 элементі бар массивті) функцияға мән бойынша жіберген тиімдірек болады.
Сілтеме бойынша беру (&) қауіпті, себебі функция кез келген уақытта біздің маңызды деректерімізді өзгертіп жібереді деген түсінік бар. Егер біз деректің өзгермегенін қаласақ, тек мән бойынша беруді қолдануымыз керек, себебі сілтеме қолданылған жерде деректің бастапқы қалпын сақтаудың ешқандай жолы жоқ.
Функцияға параметрді сілтемемен (int &x) беру мен көрсеткішпен (int *x) берудің арасында ешқандай айырмашылық жоқ, екеуі де бірдей синтаксиспен жазылады және бірдей жұмыс істейді деген жаңсақ пікір бар. Сондықтан функция ішінде көрсеткішті де, сілтемені де бірдей операторлармен пайдалануға болады.
Do…while циклі және қолдану мысалдары.
Бұл цикл тек математикалық есептеулерде немесе белгілі бір санға дейін қайталанатын әрекеттерде ғана тиімді. Оны мәтіндік деректермен немесе логикалық мәндермен (мысалы, бағдарламадан шығуды сұрау) қолдану мүмкін емес немесе өте күрделі.
Егер шарт басында false болса, екі цикл де бірдей жұмыс істейді. Бағдарламалаушы үшін қайсысын таңдау маңызды емес, себебі екеуі де бірдей нәтиже береді және жадта бірдей орын алады. Олар тек жазылу стилімен ғана ерекшеленеді.
C++ тілінде do...while циклі — бұл шартты соңынан тексеретін (post-condition) циклдік құрылым. Оның басты ерекшелігі: цикл ішіндегі код шарттың ақиқат немесе жалған екеніне қарамастан, кем дегенде бір рет орындалады.
C++ тілінде for және while циклдерінің соңына нүктелі үтір қойылмайтыны сияқты, do...while циклінің де соңындағы while(шарт) бөлігінен кейін ; қою қажет емес. Ол жай ғана кодтың соңын білдіретін жақшамен шектеледі.
Логикалық өрнектер және тернарлы оператор.
Бағдарламалауда логикалық өрнектер мен тернарлы оператор кодтың тармақталуын қамтамасыз ететін, яғни белгілі бір шартқа байланысты шешім қабылдайтын маңызды құралдар.
Тернарлы операторды тек математикалық есептеулерде немесе екі санның қайсысы үлкен екенін анықтау үшін ғана қолдануға болады. Оны мәтіндік хабарламалар шығару немесе күрделі логикалық типтермен жұмыс істеу үшін пайдалану мүмкін емес, себебі ол тек сандық нәтиже қайтаруға бағдарламаланған.
Егер логикалық өрнекте ЖӘНЕ (&&) мен НЕМЕСЕ (||) операторлары қатар келсе, олар математикадағы қосу мен алу сияқты солдан оңға қарай кезекпен орындала береді. Сондықтан жақша қоюдың еш мәні жоқ, себебі компилятор оларды жазылу ретімен ғана есептейді.
Кодты барынша қысқарту үшін кез келген күрделі if-else блоктарын, тіпті ішінде ондаған амалы бар функцияларды да бір ғана тернарлы оператордың ішіне сыйғызуға болады. Бұл бағдарламаның оқылуын жақсартады және кәсіби деңгейде жазылған кодтың белгісі болып саналады.
Файлдармен жұмыс негіздері: ifstream, ofstream.
C++ тілінде файлдармен жұмыс істеу үшін <fstream> кітапханасы қолданылады. Ол деректерді файлдан оқуға және файлға жазуға арналған арнайы ағындарды (streams) ұсынады.
Егер сіз ifstream file("test.txt"); деп жазсаңыз, бірақ ол файл компьютерде жоқ болса, C++ бағдарламаны автоматты түрде тоқтатып, қате туралы хабарлама шығарады. Сондықтан файлдың бар-жоғын қолмен тексеріп жату — артық жұмыс және кодты ұзарту болып саналады.
Бағдарлама жұмысын аяқтағанда барлық файлдар автоматты түрде жабылады. Сондықтан код соңында file.close() деп жазудың ешқандай практикалық пайдасы жоқ. Ол тек кодтың көлемін ұлғайтады және қазіргі заманауи компиляторлар бұл процесті өздері реттейді.
Файлдағы барлық деректі бір айнымалыға жүктеу үшін жай ғана file >> text; деп жазсаңыз жеткілікті. Бұл оператор файлдың басынан соңына дейін барлық бос орындар мен жолдарды ескеріп, бүкіл мазмұнды бірден оқып береді.
Файл ашу режимдері және жол бойынша оқу
C++ тілінде бір файлды ашқанда не тек ifstream (оқу), не тек ofstream (жазу) қолдану керек. Егер файлды оқып отырып, бірден ішіне бірдеңе жазғыңыз келсе, алдымен бірінші ағынды жауып, екіншісін ашуыңыз керек.
Егер сіз файлды ios::app режимімен ашсаңыз, файлдың ортасына барып, ескі деректерді өшірмей, жаңа сөзді сонда қыстырып қоюға болады. Бұл режим файлдың кез келген нүктесіне жаңа мәлімет қосуды білдіреді.
getline() функциясын шақырғаннан кейін, келесі жолды оқу үшін курсорды қолмен төмен түсіру керек. Егер сіз циклдің ішінде getline()-ды қайта-қайта қолдансаңыз, ол файлдың тек бірінші жолын қайталай береді, себебі ол оқыған жерін есте сақтамайды.
Файлдармен жұмыс істеу барысында оларды жай ғана ашу жеткілікті емес, оларды қандай мақсатта (тек оқу, үстінен жазу немесе соңына қосу) ашатынымызды көрсету маңызды. Ол үшін ашу режимдері қолданылады.
Функциялар мен операторларды қайта жүктеу.
қайта жүктеу (overloading) — бұл бірдей атауды әртүрлі мақсаттарда (әртүрлі параметрлермен немесе типтермен) қолдану мүмкіндігі. Бұл бағдарламаның оқылуын жеңілдетеді және кодты икемді етеді.
екі функция болса және олардың аты мен параметрлері бірдей, бірақ бірі int, ал екіншісі double мәнін қайтаратын болса, бұл қайта жүктеу болып саналады. Компилятор қайтарылатын мәннің типіне қарап, қай функцияны қолдану керектігін автоматты түрде таңдайды.
C++ тілінде бағдарламашы өз қалауы бойынша жаңа операторлар ойлап таба алады. Мысалы, екі нысанды салыстыру үшін ** немесе @ сияқты стандартты емес символдарды оператор ретінде анықтап, оларға арнайы қызмет жүктеуге болады. Бұл кодты бірегей және түсінікті етуге көмектеседі.
Операторларды қайта жүктеу арқылы олардың математикалық ережелерін де өзгертуге болады. Мысалы, егер сіз + операторын қайта жүктесеңіз, оның басымдылығын * (көбейту) операторынан жоғары қылып қоюға болады. Бұл күрделі формулаларды есептегенде бағдарламаның жұмыс істеу ретін өзгертуге мүмкіндік береді.
Кластың статикалық мүшелері және констант әдістер.
Егер сіз әдісті void show() const деп жарияласаңыз, ол тек const деп анықталған айнымалыларды ғана экранға шығара алады. Егер класта қарапайым айнымалылар болса, констант әдіс оларды көре алмайды және олармен жұмыс істеуге рұқсаты болмайды.
Кластың статикалық мүшелері мен констант әдістері — бұл жадты тиімді пайдалануға және деректердің қауіпсіздігін қамтамасыз етуге арналған маңызды құралдар.
Статикалық айнымалыны жариялағанда, оны қарапайым айнымалы сияқты бірден мәнмен толтыру керек (мысалы, static int count = 0;). Бұл бағдарламаның барлық бөлігінде осы мәннің қолжетімді болуын қамтамасыз етеді және қосымша кодты талап етпейді.
Статикалық әдіс (static void print()) класс атымен шақырылғандықтан, ол сол кластың ішіндегі барлық private және public айнымалыларға шектеусіз қол жеткізе алады. Ол нысанның күйін өзгерте алатын ең қуатты функция болып табылады.
Бірнеше айнымалысы бар for циклі.
Цикл тоқтау үшін бірнеше шартты үтір арқылы жазуға болады, мысалы: for(int i=0, j=0; i < 5, j < 10; i++, j++). Бұл жағдайда цикл екі шарттың біреуі орындалмай қалғанда бірден жұмысын тоқтатады.
C++ тілінде for циклінің икемділігі сондай, оның ішінде бір емес, бірнеше айнымалыны қатар қолдануға болады. Бұл әсіресе екі индексті бір-біріне қарама-қарсы бағытта жылжыту немесе күрделі математикалық есептеулер кезінде өте тиімді.
for циклінің басында бір уақытта әртүрлі типтегі айнымалыларды (мысалы, int i = 0, double d = 0.5) жариялауға болады. Бұл бағдарламаның жадын үнемдеуге және цикл ішіндегі есептеулерді жеңілдетуге мүмкіндік береді.
Циклдің үшінші бөлімінде (инкремент) тек бір ғана айнымалының мәнін өзгертуге рұқсат етілген. Егер сіз i++, j-- деп жазсаңыз, бағдарлама синтаксистік қате жібереді, себебі әр цикл қадамында тек бір әрекет қана орындалуы тиіс.
Арифметикалық өрнектер және операциялар приоритеті.
арифметикалық өрнектер математикалық заңдылықтарға негізделген. Бағдарламаның дұрыс есептеуі үшін операциялардың орындалу ретін, яғни приоритетін білу өте маңызды.
Арифметикалық өрнектерде қосу мен алу амалдары әрқашан бірінші орындалады, содан кейін ғана күрделірек бөлу (/) немесе қалдықты табу (%) операциялары іске асады. Бұл бағдарламаның үлкен сандармен жұмыс істегенде қателіктерді азайтып, есептеу дәлдігін сақтау үшін жасалған ерекшелік.
C++ тілінде екі бүтін санды бөлгенде (мысалы, 5 / 2), нәтиже автоматты түрде нақты санға айналады. Компилятор бөлу амалын көрген бойда жадтан қосымша орын бөліп, нәтижені 2.5 деп шығарады, сондықтан деректердің типіне бас қатырудың қажеті жоқ.
Қалдықты табу операторын (%) кез келген сандар түріне, соның ішінде бүтін сандар мен жылжымалы нүктелі (нақты) сандарға да қолдануға болады. Мысалы, 5.5 % 2.1 өрнегі бағдарламада ешқандай қатесіз есептеліп, бөлуден қалған қалдықты нақты сан түрінде қайтарады.
Рекурсия: анықтамасы және қолдану салалары.
Рекурсия — бұл функцияның өз-өзіне тікелей немесе жанама түрде хабарласуы (шақыруы). Рекурсия күрделі есептерді ұқсас, бірақ кішігірім ішкі есептерге бөлу арқылы шешуге мүмкіндік береді.
Рекурсия — бұл циклдерге (for, while) қарағанда компьютер жадын әлдеқайда аз пайдаланатын ең тиімді тәсіл. Функция өзін-өзі шақырғанда жаңа айнымалылар жасалмайды, тек бұрыннан бар мәндер қайта қолданылады, сондықтан үлкен деректерді өңдеуде рекурсия жедел жадты үнемдеудің таптырмас жолы болып саналады.
Рекурсивті функцияны жазғанда тоқтату шартын (base case) көрсету міндетті емес, себебі заманауи компиляторлар функцияның логикасын талдап, есеп шешілген соң циклді өздігінен тоқтатады. Бұл бағдарламашыға тек негізгі алгоритмге назар аударуға мүмкіндік береді және кодтың көлемін қысқартады.
Кез келген есепті рекурсиямен шешу циклдерге қарағанда әлдеқайда жылдам орындалады. Функцияның өзіне хабарласуы — процессор үшін ең жеңіл амал, сондықтан Фибоначчи сандарын немесе массивтерді өңдеуді рекурсия арқылы жазу бағдарламаның өнімділігін бірнеше есе арттырады.
Рекурсия базасы және рекурсивті шақыру.
Рекурсивті шақыру кезінде функцияға берілетін аргументтің мәнін өзгерту міндетті емес. Егер аргумент өзгермесе, бағдарлама сол мәнді қайта өңдеу арқылы жаңа нәтиже шығара береді, бұл әсіресе тұрақты параметрлермен жұмыс істейтін математикалық модельдерде өте тиімді болып саналады.
Рекурсивті шақыруды функцияның кез келген жерінде, тіпті рекурсия базасынан бұрын орналастыруға болады. Бұл бағдарламаға алдымен барлық мүмкін шақыруларды жинақтап алып, соңында бірден базалық шартты тексеруге мүмкіндік береді, осылайша кодтың жұмыс жылдамдығы біршама артады.
Күрделі алгоритмдерде, мысалы, ағаштармен немесе массивтермен жұмыс істегенде, рекурсияның бір ғана базасы болуы міндетті. Бірнеше базалық шартты қолдану бағдарламаның логикасын шатастырып, функцияның кері қайту жолын жауып тастайды, сондықтан барлық тоқтату шарттарын бір if операторына біріктіру керек.
Рекурсияның жұмыс істеу принципі екі негізгі тіректен тұрады: рекурсия базасы және рекурсивті шақыру. Осы екі компоненттің өзара әрекеті бағдарламаның дұрыс орындалуын қамтамасыз етеді.
Массивтер және функциялар: сілтеме бойынша беру.
Массивтің өлшемін функция ішінде анықтау үшін sizeof(arr) / sizeof(arr[0]) формуласын қолдану — ең сенімді жол. Бұл тәсіл массивтің нақты қанша элементтен тұратынын дәл есептеп береді, сондықтан функцияға массивтің өлшемін қосымша параметр ретінде берудің еш қажеті жоқ.
Функцияға массивті void func(int arr[5]) түрінде бергенде, C++ бағдарламасы жадтан жаңа орын бөліп, массивтің толық көшірмесін жасайды. Бұл негізгі массивті кездейсоқ өзгерістерден қорғау үшін жасалған, сондықтан функция ішіндегі амалдар бастапқы деректерге ешқашан әсер етпейді.
C++ тілінде массивтерді функцияға берудің өзіндік ерекшеліктері бар. Массивтер әдетте жадты көп алатындықтан, оларды сілтеме бойынша (by reference) өңдеу өнімділікті арттырады.
Функция ішінде жасалған жергілікті массивті return arr; арқылы негізгі бағдарламаға сілтеме ретінде қайтару — деректерді өңдеудің ең жылдам жолы. Бұл тәсіл жадты үнемдейді және функция аяқталғаннан кейін де массив элементтеріне еркін қол жеткізуге мүмкіндік береді.
Бірөлшемді массивтер: көпіршіктеу (bubble) арқылы сұрыптау.
Көпіршіктеу әдісі — миллиондаған элементі бар үлкен деректер жиынын сұрыптау үшін ең қолайлы және жылдам алгоритм болып табылады. Ол кез келген жағдайда массивті бір ғана цикл арқылы реттейді, сондықтан оның өнімділігі басқа алгоритмдерден әлдеқайда жоғары.
Көпіршіктеу әдісі (Bubble Sort) — бұл ең қарапайым сұрыптау алгоритмдерінің бірі.
Көпіршіктеу әдісінде ішкі цикл әрқашан массивтің соңына дейін (j < n) жүруі тиіс. Егер біз j < n - i - 1 деп шектеу қойсақ, бағдарлама соңғы элементтерді көрмей қалады және массив толық сұрыпталмай қалады.
Егер массив басында-ақ сұрыпталған күйде берілсе, көпіршіктеу әдісі мұны бірден түсініп, жұмысын автоматты түрде тоқтатады. Оған қосымша тексерулер немесе флагтар (flag) қоюдың қажеті жоқ, себебі алгоритмнің өзі өте икемді.
Алгоритмдерге кіріспе
Алгоритм — бұл берілген есепті шешу үшін орындалатын әрекеттердің нақты тізбегі. Кез келген бағдарламаның негізінде белгілі бір логикалық алгоритм жатады
алгоритмнің басты ерекшелігі — оның шексіз жұмыс істей алуы. Егер алгоритм есептің шешімін таппаса, ол тоқтамай, жаңа деректерді күтіп немесе қайта есептеп тұруы керек. Бұл бағдарламаның әрқашан белсенді күйде болуын қамтамасыз етеді.
Блок-схема құрастыру кезінде фигуралардың түріне (төртбұрыш, ромб, сопақ) мән беру міндетті емес. Бастысы — олардың арасындағы байланыс сызықтарының дұрыс сызылуы. Кез келген әрекетті кез келген фигураның ішіне жазу алгоритмнің түсініктілігіне еш әсер етпейді.
"Алгоритм" және "Бағдарлама" — бұл синоним сөздер. Егер сіз код жазсаңыз, ол автоматты түрде алгоритм болып саналады, ал алгоритм жазсаңыз, ол дайын бағдарлама болып есептеледі. Олардың арасында ешқандай концептуалды немесе практикалық айырмашылық жоқ.
Алгоритмнің детерминирленуі және дискреттілігі.
Алгоритмнің анықтылығы (детерминирленуі) тек оны жазған бағдарламашыға ғана түсінікті болуымен өлшенеді. Егер код автор үшін логикалы болса, демек ол анықтылық қасиетіне ие. Ал басқа адамдардың немесе компьютердің оны қалай қабылдауы маңызды емес.
Дискреттілік қасиеті алгоритмнің кез келген қадамын шексіз кішірейтуге мүмкіндік береді. Егер қадам тым күрделі болса, оны миллиондаған ұсақ амалдарға бөліп, процесс тоқтамайынша орындай беруге болады, бұл алгоритмнің дәлдігін шексіз арттырады.
Детерминирленген алгоритм бағдарлама орындалып жатқанда пайдаланушыдан еркін таңдау жасауды немесе кездейсоқ сандарды енгізуді талап ете алады. Бұл алгоритмнің анықтылығын бұзбайды, себебі кез келген кездейсоқ таңдау бәрібір бағдарламаның логикалық соңына алып келеді.
Алгоритмнің дискреттілігі мен детерминирленуі — оның дұрыс орындалуын және нәтижесінің болжамды болуын қамтамасыз ететін іргелі қасиеттер. Бұл түсініктер алгоритмді ретсіз әрекеттерден ажыратады.
