Файл қосу

Программалау тілдерінің деңгейлері



|ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ                    |
|СЕМЕЙ ҚАЛАСЫНЫҢ ШӘКӘРІМ АТЫНДАҒЫ МЕМЛЕКЕТТІК УНИВЕРСИТЕТІ                 |
|3 деңгейлі СМК құжаты         |ПОӘК           |ПОӘК                       |
|                              |               |042-18-12.1.97/03-2013     |
|«Программалау технологиясы»   |Баспа №1       |                           |
|пәнінің оқу материалдары      |18.09.2013ж    |                           |











                         «Программалау технологиясы»

                       Пәнінің оқу-әдістемелік кешені

     5В070300- «Ақпараттық жүйелер», 5В070400 – «Есептеу техникасы және
     программалық қамсыздандыру», 5В070200 «Автоматтандыру және басқару»
                     мамандығының студенттеріне арналған

                        ОҚУ - ӘДІСТЕМЕЛІК МАТЕРИАЛДАР




















                                Семей - 2013

      Мазмұны

|Глоссарий                                                           |
|Дәрістер                                                            |
|Тәжірибелік сабақтар                                                |
|Зертханалық сабақтар                                                |
|Студенттің өздік жұмысы                                             |




                                1. глоссарий

Программалау  тілі  деп  деректерді  жазуға  және  оларды  белгілі  ережелер
бойынша өңдеуге арналған адам  мен  компьютерді   байланыстыратын  формальды
тілді айтамыз.
Процедулалы  –  бағдарланған  тілдер  есепті  шешу   алгоритмін   сипаттауға
арналған, сондықтан да оларды кейде алгоритмдік тілдер деп те атайды.
Проблемалы – бағдарланған тілдер есептерді сипаттау үшін қызмет атқарады.
Тестілеу  (test  ағылшын  сөзі  сынау   деген   мағына   береді)   дегеніміз
программаның немесе оның жеке бөліктерінің дұрыс жұмыс істейтіндігін  сынау,
 тексеру.
Тест дегеніміз-алғашқы деректердің кейбір жиыны және осы  деректерге  сәйкес
келетін программа жұмысы кезінде алынуға тиісіті  барлық  нәтижелерінің  дәл
сипаттамасы.
Алгоритм – арнайы іс-әрекеттің белгілі бір кезекпен орналасқан  тәртібі.  Ол
алгоритмді  атқарушы  ЭЕМ-ге  жұмыс  тәртібін  түсіндіретін   ережелер   мен
нұсқаулар тізбегінен тұрады.  Сонымен,  алға  қойылған  мақсатқа  жету  үшін
немесе  берілген  есепті  шешу  барысында   орындаушыға   біртіндеп   қандай
әрекеттер жасау керектігін түсінікті әрі дәл көрсететін нұсқау алгоритм  деп
аталады
Цикл қайталап орындалатын есептеу процесінің белгілі бір бөліктерін атайды
Қызметші сөз деп –  Паскаль  тілінде  белгілі  бір  міндет  атқаратын  сөзді
айтамыз. Қызметші сөздер program, var, begin, end болады.
Атау – қандай да бір объектіні  белгілеу  үшін  қолданады.  Паскаль  тілінде
атаудың екі түрі бар,  олар:  стандартты  және  ЭЕМ-ді  қолданушы  енгізетін
атау.
Стандартты атау – ол стандартты  объектілерді  белгілеу  үшін  тілдің  өзіне
бекітілген атау болады.  Стандартты  атауларға  input,  output  атаулары  да
жатады.
Тілдің символы дегеніміз – кез келген мәтінді құруда қолданылатын  элементар
таңбалар. Осындай символдар жиынтығы тілдің алфавиті деп аталады.
Идентификатор – міндетті түрде  әріптен  басталатын  сандар  мен  әріптердің
тізбегі.
Массив  дегеніміз  –  бір  атаумен   белгіленіп   бір   өлшеммен   өлшенетін
айнымалылардың реттелген  тізбегі.  Массив  элементтерінің  барлығы  да  бір
типте болуы тиіс.
Тұрақты деп  программаның  орындалу  барысында  мәндері  өзгеріссіз  қалатын
шамаларды айтады.
Өрнек    деп    арифметикалық    амалдардың    таңбаларымен    біріктірілген
айнымалылардың, функциялардың, тұрақтылардың жиынын айтады.
Бүтін типтегі мәндер. Мәндердің барлық типтерін жай және күрделі  деп  екіге
бөлуге болады.
Жай  типтер  дегеніміз  –  мәндерінің  стандартты  және  айнымалы   типтері.
Стандартты  мәндер  типтеріне  жататындар:   бүтін  integer,   нақты   real,
логикалық boolean, символдық char.
Күрделі тип – бұл жай типтердің әр түрлі комбинацияларынан құралады.
Бүтін типтегі тұрақты дегеніміз – нүктесіз жазылған кез  келген  ондық  сан.
Бүтін тұрақты санды нақты түрле береді. Өзінің мәні  ретінде  бүтін  типтегі
тұрақтыны қабылдайтын айнымалы да бүтін типке жатады.


                                 2. Дәрістер

Дәріс №1. Кіріспе

 • Кiрiспе. Пәннің мақсаты және міндеті.
 • ДК Программалық қамсыздандыру (по)  туралы түсінік. по түрлері.
 • Программалау тілдері.  Программалау  тілдерінің  деңгейлері.  Трансляция.
   Трансляторлар.
 • Программалау жүйесі.
 • Программа құру кезеңдері.
                    Кiрiспе. Пәннің мақсаты және міндеті.
«Бағдарламалау технологиясы»  пәнінен  студенттер  Си  программалау  тілінде
программаларды құру тәсілдерін үйренеді.
Қазіргі  алгоритмдік  тілдер   ішінде   Си   программалық   тілі   өте   көп
ерекшеліктерге  ие кең  тараған тілдердің бірі есептеледі. Бұл  тіл  жүйелік
программалық жасақ мәселелерін (трансляторларды өңдеу,  операциялық  жүйе  ,
экрандық интерфейс,  аспаптық  құралдар  т.б.)  шешуде  қолданылатын  тиімді
универсал алгоритимдік тіл.
Си тілінің  ерекшеліктерінің бірі әр түрлі  операциялардан  жүйелер  аралық,
компьютерлер аралық программаларды жоғары деңгейде  орындай алады.
Си тілінде жазылған программаның архитиктуралары  әр  түрлі  компьютерлердің
бірінен бірін  ауыстыруға  бір  операциялық  системаның  екінші  операторлық
системаға ауыстыруға  жеңіл.  Сонымен  қатар  Си  тіліндегі  программалардың
орындалу  жылдамдығы  ассемблер  тіліндегі  программалардан  кем  емес.   Си
тілінің компиляторы қазіргі кездегі барлық операциялық  жүйеде  жұмыс  істей
береді. Unix, MSDOS, WINDOWS.
       ДК Программалық қамсыздандыру (ПҚ)  туралы түсінік. ПҚ түрлері.
  Программа  дегеніміз  машина  тіліне  аударылған  сіздің  есеп-бұйрығыңыз,
өйткені әзірше машина кәдімгі адам тілін түсіне алмайды.
Программа клавишті пульт перфокарта, магнитті  дискілер  арқылы  компьютерге
енгізеді.  Компьютер  программада  көрсетілген   іс-әрекеттерді   орындайды.
Программа қатесіз жасалу керек, белгілі ережелер  сақталмаса,  машина  ондай
програм маны орындамайды.
Программа-  арнайы  текст   арқылы   комспьютерге   тапсырманың   алгоритмін
хабарлайды. Алгоритм  –арнайы  іс-әрекеттердің  белгілі  кезекте  орналасқан
тәртібі, алогритм арқылы машина тапсырманы орындайды.
ПҚ- компьютерге арналған программалар жиыны
Ол 3 топқа бөлінеді:
1. жүйелік(базалық) ПҚ
2. қолданбалы ПҚ
3. аспаптық ПҚ
Жүйелік  программалар  аппаратттық  құралдармен  тығыз  байланысты   болғаны
соншалық, оны кейде компьютердің бір бөлігі деп те санайды.
Олар:

 • операциялық жүйелер;
 • сервисті программалар;
 • техникалық қызмет көрсету программалары.
Қолданбалы  ПҚ–  қолданушының  белгілі   бір   есептерін   шешуге   арналған
программалар.
Олар:

 • тексттік редакторлер мен процессорлер;
 • графикалық редаторлер
 • электронды кестелік процессорлер;
 • деректер базасын басқару жүйесі;
және т.б.
Аспаптық (Программалау жүйесі) –  бұл  компьютерге  арналған  программаларды
құруға арналған программалар. Оларға жатады:
 ✓ Basic;
 ✓ Pascal:
 ✓ C
 ✓ Fortran
 ✓ Және т.б.

                            Программалау тілдері

Программаларды жасауда қазіргі заманғы компьютерлерде  әр  түрлі  деңгейдегі
программалау тілдері пайдаланылады.
Жалпы жағдайда тіл деп информацияның жазылыуын және оның  түрленуін  белгілі
ережелер бойынша формальдыетіп беруші құралдарды түсінеміз.
Тілдің құрамында информацияның негізгі элементтерін құрудың  құралдары  және
осы элементтерден әр түрлі  мазмұнды  құрылымдар  құруға  арналған  ережелер
жүйесі бар.
Программалау  тілі  деп  деректерді  жазуға  және  оларды  белгілі  ережелер
бойынша өңдеуге арналған адам  мен  компьютерді   байланыстыратын  формальды
тілді айтамыз.
Програмалаудың әр түрлі тілдерін пайдалану.
Әр түрлі белгілер бойынша жіктеуге  болатын  бірнеше  жүздеген  программалау
тілдері бар. Ең жалпысы тілдің машинаға  жақындық  дәрежесі  бойынша  жіктеу
болып табылады. Осы белгісі бойынша программалау  тілдері  екі  үлкен  топқа
бөлінеді:
      ־ машинаға тәуелді тілдер;
      ־ машинаға тәуелсіз тілдер;
Машинаға тәуелді тілдер өз кезегінде былай бөлінеді:
      ־ машина тілі;
      ־ машинаға бағдарланған тілдер;
 Машинаға бағдарланған тілдер кейде  автокодтар  деп  те  аталады.  Машинаға
бағдарланған тілдердің екі деңгейі бар:
      ־ символдық кодтау тілдері, басқаша айтқанда мнемокодтар;
      ־ макротілдер.
      Макротілдер  машина  тілінің  командаларына  тікелей   ұқсастығы   жоқ
макрокомандаларды  пайдалануға  рұхсат  етеді.  Макрокомандаларды  пайдалану
программаны қысқартады әрі тілді жасау құралдарының  жиынын  кеңейте  отырып
программалаушының еңбегінің өнімділігін арттырады.
      Машинаға тәуелсіз тілдер  программаларды  бөлшектеу  дәрежесіне  қарай
екі топқа бөлінеді:
      ־ процедулалы- бағдарланған тілдер;
      ־ проблемалы – бағдарланған тілдер.
Процедулалы  –  бағдарланған  тілдер  есепті  шешу   алгоритмін   сипаттауға
арналған, сондықтан да  оларды  кейде  алгоритмдік  тілдер  деп  те  атайды.
Алгоритмдік тіл деген ұғым программалау тілі деген ұғыммен  сәйкес  елмейді.
Егер  алгоритмдік  тілде  жазылған  алгоритмдік  жазу  компьютерге  ендіруге
тікелей жарамды  және  дайын  жұмысшы  программаға  түрленетін  болса,  онда
мұндай  алгоритмдік тіл программалау тілі де бола алады. Кейбір  алгоритмдік
тілдер тек оларға кейбір құралдарды қосқаннан кейін ғана  программалау  тілі
болады.
Проблемалы – бағдарланған тілдер есептерді сипаттау үшін қызмет атқарады.
Бірақ алгоритмдік тілдер өздігінен барлық проблеманы, тіптен программаны  да
шеше  алмайды.  Мұндай  тілде   жазылған   программа   компьютерде   тікелей
орындалмайды, ол орындалу үшін алдын  ала  сол  компьютердің  машина  тіліне
аудару жеткілікті қиын мәселе болып табылады.
Алгоритмдік тілден программаны машина  тіліне  аудару  жұмысын  компьютердің
әмбебаптығын  пайдаланып,  оның  өзіне  жүктеуге  болады.  Бұл  үшін   әрбір
алгоритмдік тілден машина тіліне формальды аударуға яғни аударудың  ережесін
алгоритм түрінде тұжырымдауға мүмкіндік беретіндей болуы  керек.  Егер,  осы
алгоритмді бір рет машиналық программа  түріне  келтіріп  алсақ,  онда  одан
кейін осы  программаның  көмегімен  компьютердің  өзі  берілген  алгоритмдік
тілде жазылған кез келген программаны  нақтылы  компьютердің  машина  тіліне
аударып   бере   алады.   Мұндай   арнайы    аудармашы-программа    жоғарыда
айтқанымыздай транслятор деп аталады.

                             Программалау жүйесі

Программалау жүйесі  компьютердің  программалық  қамсыздандыруының  құрамына
жатады  және  ол  программаларды  жасау  және   оларды   жөндеу   жұмыстарын
автоматтандыруды  қамтамасыз  ететін  құралдардың  жиыны   болып   табылады.
Программалау жүйесінің құрамы 5-суретте бейнеленген.
Программалау процесі үш кезеңге бөлінеді:
      ־ есепті шешудің алгоритмін құру;
      ־ программа құру;
      ־ жасалған программаны тексеру.
Екінші кезеңдегі, яғни программа қрудағы қиындық адамның тек машина  тілінде
ғана программа жасауына байланысты болады. Компьютерді пайдаланудың  алғашқы
жылдарында әрқайсының әр түрлі компьютерлердің  пайда  болуы  бұл  қиындықты
тереңдетіп жібереді. Сондықтан нәтижесінде  бір  компьютерге  арнап  жасаған
программаны  басқа  компьютерге  пайдалануға  болмайтын   болды.   Бұл   бір
алгоритмнің өзін әр түрлі компьютерлерде орындау  үшін  әрқайсына  жеке-жеке
программа құруға мәжбүр етіп жұмысты қиындатып жіберді.
     Әрбір  компьютер  үшін  жасалған   программаның   дұрыс   және   ұтымды
жасалғандығын тексеру қажет. Қателік кеткендігі және басқа  да  кемістіктері
бар  екендігі  анықталса,  онда  ол  программаға  түзетулер  мен  өзгерістер
ендіріледі. Программалаудың осы аталған  кезеңдерінің  арнайы  ерекшеліктері
және қиыншылықтары бар.
Барлық осы аталған қиыншылықтар программалар жасаудағы атқарылатын
жұмыстарды мейлінше ықшамдап қысқарту мәселесін күн тәртібіне қояды. Бұл
мәселені шешу программалау процесін автоматттандыруды, яғни компьютердің
өзін программалар жасауға немесе программалауға байланысты таза техникалық
жұмыстар атқаруға пайдалануды талап етеді.































                    Сурет 1 Программалау жүйесінің құрамы
                          Программа құру кезеңдері
Есепті компьютерде  шығару-  біраз  бөлігі  компьютерсіз  жүзеге  асырылатын
мынадай негізгі кезеңдерден тұрады:
Есептің қойылуы:
 ־ есеп туралы ақпараттарды жинау;
 ־ есептің шартын тұжырымдау;
 ־ есепті шығарудың ақтық мақсатын анықтау;
 ־ деректерді сипаттау ( олардың түрін, шамалардың ауқымын, құрлымын  т.с.с.
   )
Есепті, моделдерді талдау және зерттеу:
 ־ есептің бар ұқсастарын талдау;
 ־ техникалық және программалық құралдарды талдау;
 ־ математикалық модельді жасақтау;
 ־ деректер құрлымын жасақтау.
Алгоритмді жасақтау:
 ־ алгоритмді жобалау тәсілдерін таңдау;
 ־ алгоритмді жазу пішінін ( блок-схема, алгоритмдік тіл т.б. ) таңдау;
 ־ тестерді және тестілеу тәсілдерін таңдау;
 ־ алгоритмді жобалау.
Программалау:
 ־ программалау тілін таңдау;
 ־ деректерді ұйымдастыру тәсілдерін айқындау;
 ־ алгоритмді таңдалынып алынған программалау тілінде жазу.
 Тестілеу және жөндеу:
 ־ синтаксистік жөндеу;
 ־ семантикалық және логикалық құрлымын жөндеу;
 ־ тестілік есептеулер және тестілеу нәтижелерін талдау;
 ־ программаны жетілдіру.
Есептің шешілу нәтижесін талдау:
Қажет болатын болса 2-5 кезеңдерді  қайтадан  орындай  отырып  математикалық
модельді айқындай түсу.
Программаны даярлау:
 ־ нақтылы есепті шығару үшін программаны жетілдіру;
 ־ есепті шешуге, математикалық модельге, алгоритмге, программаға,  тестілер
   жиынына, программаны пайдалану үшін құжаттар жасау.
                     Дәріс №1.Өзін-өзі тексеру сұрақтары

   1. Программалық қамсыздандыру неше топқа бөлінеді?
   2. Программа дегеніміз не?
   3. Программа құру кезеңдерін атаңыз.
   4. Қандай программалау тілдерін білесіз?
             Дәріс №2. Программаны жасақтаудың негізгі кезеңдері

   1. Программалауды автоматтау әдістері.
   2. Программаны жасақтау процесі
   3. Программаны жөндеу және тестілеу
   4. Тестілеу процесінің кезеңдері
   5. Программалауда кездесетін қателіктер
   6. Транслятор таба алмайтын қателіктер
&&&
$$$002-002-001$3.2.2.1 Программалауды автоматтау әдістері.

Автоматтандыру  программа  жасаушы  мамандардың  жұмысын  жеңілдетуді,   оны
жасауда кететін қателіктердің санын азайтуды, ең соңында есептің  қойылуынан
бастап нәтиже алғанға дейін кететін уақытты қысқартуды көздейді.
Программалауды  автоматттандырудың  ең  көп  тараған   негізгі   тәсілдеріне
мыналар жатады:
    • қолмен программалауды жеке жұмыстарын автоматтандыру тәсілдері;
    • бағыныңқы программалар кітапханасын құру;
    • программалаудың әр түрлі тілдерін пайдалану.
Қолмен программалаудың  жеке  жұмыстарын  автоматтандыру  тәсілдері.  Қолмен
программалаудағы жұмыстарды автоматтандыруда жұмыс  программаларын  түзетуді
негізгі назарда ұстау керек.
Қазіргі кезде программаның дұрыстығын тексеру үшін жоғарыда  айтқандай  тест
тәсілі  кеңінен  қолданылады.  Тест  тәсілі  бойынша  жауаптарды  алдын  ала
белгілі  есептердің  бірнеше  нұсқасы   компьютерде   құрылған   программаны
пайдаланып шығарылады.  Алынған  нәтижелер  алдын  ала  белгілі  жауаптармен
салыстырылады. Ол жауаптар біріне – бірі сәйкес  келмесе,  онда  программада
қателіка кеткен болып шығады.
Программаны жөндеу процесі бірнеше  әмбебеп  жөндеуші  программаларды  жасау
және   компьютердің   өзін   пайдалану   арқылы   автоматтандырылады.    Бұл
программалар командалардың қалай орындалып  жатқандығы  туралы  информацияны
баспаға бере  отырып  жөнделіп  жатқан  программаның  кез  келген  бөлігінің
жұмысын қадағалап бақылауға мүмкіндік береді.  Программаны  автоматты  түрде
жөндеуде программалаушыны қызықтыратын барлық информация  құжатқа  жазылады,
соның арқасында ол компьютерді  пайдаланбай-ақ  есептің  компьютерде  шншілу
процесінің дұрыстығын бақылай алады.

                        Программаны жасақтау процесі

мынадай формуламен өрнектеуге болады:
Программаны жасақтау→даярлау+тексеру және жөндеу
Жаңадан ғана жасалған программада қателіктің болуы-бұл  қалыпты  және  заңды
құбылыс.  Іс-жүзінде  нақты  және  жеткілікті  дәрежеде  күрделі  програманы
қателіксіз құру мүмкін емес.
Программаны компьютердің қабылдауына және оның нәтижесін беруіне  қарап  оны
дұрыс құрылған деген қорытынды жасауға болмайды. Өйткені  берілген  жағдайда
дұрыс болмаса да қандай да бір нәтиже алуға  қолымыз  жетті.  Осының  өзінде
программада  көптеген   логикалық   қателіктердің   болуы   мүмкін.   Кеткен
қателіктерді анықтау үшін программаны  компьютерге  ендіріп,  іске  қосқанға
дейін былай тексереміз.
Программа  мәтінін  «қолмен»  қарап  шығу,  тексеру  және  айналдыру  арқылы
тексеруге болады.
Программа мәтінін қарап шығу. Программа мәтінін жазуда  кеткен  қателіктерді
және программаның алгоритмнен алшақтығын анықтау  үшін  қарап  шығады.  Атап
айтқанда итерация санын беуші операторлардың дұрыстығына  көз  жеткізу  үшін
барлық  циклдердің  ұйымдастырылуын   қарап   шығу   өте   маңызды.   Шартты
операторлардағы  шарттарды,  бағыныңқы  программаларға   қатынас   жасаудағы
аргументтерді тексеріп шығу пайдалы.
Программаны тексеру.  Программалаушы  программаны  тексергенде  оның  мәтіні
бойынша  программа  анықтайтын  есептелу  процесін  ойша  қалпына  келтіруге
тырысады, осыдан кейін оны талап етілетін процеспен салыстырады.
Тексеру кезінде программаның не істейтіндігін ұмыту және ол  туралы  тексеру
барысында білу керек. Тек программаны тексеру аяқталғаннан кейін  ғана  оның
не істейтіндігін  еске  түсіруге  және  программаның  нақты  әрекетін  талап
етілетін әрекеттермен салыстыруға болады.
Программаны   айналдыру.   Айналдырудың   мәні   программаның    компьютерде
орындалуын программалаушының ойша орындауы болып табылады.
Айналдыруды орындау  үшін  кейбір  алғашқы  деректерді  беріп  және  олармен
қажетті есептеулерді жүргізу қажет.
Айналдыру- бұл еңбекті көп талап ететін  қиын  процесс,  сондықтан  оны  тек
программаның логикалық күрделі бөліктеріне қолданған жөн.
Алғашқы деректерді программаны айналдыру кезінде  программа-ның  зерттелетін
көптеген тармақтары қамтылатындай етіп таңдап алу керек.

                      Программаны жөндеу және тестілеу

Программаны жөндеу (debugging- жөндеу ағылшын  сөзі  сөзбе-  сөз  аударғанда
қоңыздарды аулау деген мағына береді.)  дегеніміз  программаны  компьютерден
өткізудің нәтижесі бойынша ондағы қателіктерді іздеу және жою процесі.
Тестілеу  (test  ағылшын  сөзі  сынау   деген   мағына   береді)   дегеніміз
программаның немесе оның жеке бөліктерінің дұрыс жұмыс істейтіндігін  сынау,
 тексеру.
Жөндеу және тестілеу бұлар бірінен бірі айқын ажыратылған және біріне-  бірі
ұқсамайтын екі кезең:
    •  жөндеу  кезінде  синтаксистік  қателіктердің  және  кодтаудың  айқын
      қателіктерін төңіректеу және жою орындалады.
    • тестілеу процесі кезінде айқын  қателіктері  жоқ  программаның  жұмыс
      істеу қабілеттілігі тексеріледі.
   Тестілеу қателіктің бар екендігін тағайындайды,  ал  жөндеу  программаның
дұрыс жұмыс істемеу себептерін анықтайды.
    Қазіргі заманғы программалауды  жөндеу  жұмысы   жөндеуші  деп  аталатын
арнайы  программалық  құралды  пайдалану  жолымен  жүзеге   асырылады.   Бұл
құралдар программаның ішкі жұмысын зерттеуге мүмкіндік береді.
    Жөндеу программасы әдетте мына төмендегідей мүмкіндіктер береді:
    • әрбір командадан соң, тоқтай отырып, программаны қадамдап орындау;
    •  кез-келген  айнымалының  ағымдағы  мәнін   қарау  немесе  кез-келген
      өрнектің, оның ішінде стандартты функцияларды пайдаланып  мәнін  табу
      қажеттілігіне қарай айнымалының жаңа мәнін пайдаланып орындау;
    • программада «тексеру  нұктелерін»  орнату,  яғни  аралық  нәтижелерді
      бағалау үшін  программа  уақытша  өз  жұмысын  тоқтататын  нүктелерді
      тағайындау т.б.
   Программаны жөндеуде мыналарды есте сақтау маңызды;
    • жөндеу процесінің басында қарапайым тестілік деректерді пайдалану;
    • пайда болатын қиындықтарды айқын ажыратып және қатаң  түрде  кезегімен
      жою;
    • қателіктің есебі компьютерде деп есептемеу керек.
 Тест дегеніміз-алғашқы деректердің кейбір жиыны және осы деректерге  сәйкес
келетін программа жұмысы кезінде алынуға тиісіті  барлық  нәтижелерінің  дәл
сипаттамасы.
Программа қаншалықты  өте  мұқият  жөнделсе  де  оның  жұмысқа  жарамдылығын
тағайындаудың  шешуші   кезеңі   программаның   тестер   жүйесінде   тікелей
орындалуын тексеру болып табылады.
    Егер программа таңдалынып алынған тестілік  деректер  жүйесінен  өткенде
барлық жағдайда дұрыс  нәтижелер  беретін  болса,  онда  программаны  шартты
түрде дұрыс деп есептеуге болады.
    Тестілеу тәсілін жүзеге асыру үшін тестердің эталондық нәтижелері алдын-
ала даярланған немесе белгілі болуы тиіс.
     Эталондық  нәтижелерді  программаның  компьютерде  орындалу   нәтижесін
алғаннан кейін емес, керісінше алғанға дейін есептеп шығарып қою керек.
     Тестілік деректер қателіктердің пайда болуының  барлық  мүмкін  болатын
шарттарын тексеруді қамтамасыз ететін болуы тиіс, атап айтқанда:
 ־ алгоритмнің әрбір тармағының сыннан өтуі;
 ־  кезектегі  тестіден  өткізу   алдыңғы   өткізудегі   тексерілмегендердің
   тексерілуі;
 ־ программаның  жалпы  жұмыс  істейтіндігін  тексеру  үшін  бірінші  тестің
   мүмкіндігінше қарапайым болуы;
 ־ есептеу көлемін  қысқарту  үшін  тестідегі  арифметикалық  операциялардың
   шегіне дейін ықшамдалуы;
 ־  тізбектер  элементі  санының,  итерациялық   есептеулер   үшін   алынған
   дәлдіктің, тестілік  мысалдар  цикліндегі  интерация  санының  есептеулер
   көлемін қысқарту тұрғысынан берілуі;
 ־ есептеулерді азайтудың тексеру сенімділігін төмендетпеуі;
 ־ тестілік деректер  жиынын  кездейсоқ  таңдау  күткен  нәтижелерді  қолмен
   орындау тәсілімен анықтауда қиындықтарға алып келетіндіктен және көптеген
   жағдайлар  тексерілмей   қалатындықтан   тестілеудің   белгілі   мақсатқа
   бағытталған және жүйеленген болуы;
 ־ тестілік деректерді күрделендіруде түсудің біртіндеп жүргізілуі.

                        Тестілеу процесінің кезеңдері

Тестілеу процесін үш кезеңге бөлуге болады.
1.Қалыпты жағдайда тексеру. Программалардың жұмыс істеуінің нақты  жағдайына
тән алғашқы деректер негізінде тестілеу болжанады.
2.Экстремальды жағдайда  тексеру.  Бұл  жерде  тестілік  деректер  дегеніміз
алғашқы деректер жиынының шекаралық мәндері. Бұл жиын программа дұрыс  жұмыс
 істеуге тиісті алғашқы  деректерден  тұрады.  Өте  кіші  немесе  өте  үлкен
сандар және деректердің болмауы мұндай деректердің  типтік  мысалдары  болып
табылады.
Барлық программалар қандайда бір шектеулі алғашқы  деректер  жиынын  өңдеуде
есептеліп жасақталатындығы  белгілі.  Сондықтан  мына  төмендегі  сұрақтарға
жауап алу маңызды:
        1.  Айнымалының  теріс  және  нолдік  мәндерін  өңдеуге  арналмаған
           программаға қандай да бір кеткен қателіктің себептерінен дәл сол
           мәндерді өңдеуге тура келсе не болар еді?
        2. Егер массив элементтері оны хабарлауда көрсетілген  саннан  асып
           кетсе, онда массивтермен жұмыс істеп жатқан программа өзін қалай
           ұстар еді?
        3. Егер өңделіп жатқан сан өте кіші немесе өте үлкен болса, онда не
           болар еді?
 Программа дұрыс емес  деректерді дұрыс  деректер  ретінде  қабылдап,  дұрыс
нәтижеге  ұқсас,  бірақ  дұрыс  емес  нәтиже  беретін  жағдайлар  ең   жаман
жағдайлар болып есептеледі.
    Программа  өзі  дұрыс  өңдей  алмайтын  кез  келген  деректерді  теріске
шығаратын болу тиіс.
                    Программалауда кездесетін қателіктер

Компьютерде есеп  шығарудың  барлық  кезеңдерінде,  атап  айтқанда,  есептің
қойылуына  бастап,  оның  құжаттарын  даярлағанға  дейін  қателіктің   кетуі
мүмкін.
Мысалы есептің дұрыс қойылмауы,  есепті  шығару  үшін  құрылған  алгоритмнің
дұрыс болмауы, логикалық қателіктер кететін жағдайларды дұрыс есепке  алмау,
семантикалық  және  синтаксистік  қателер,  операцияларды  орындау   кезінде
кететін қателіктер, деректерді беруде жіберілетін қателіктер,  ендіру-шығару
кезінде кететін қателіктер.
Әдетте синтаксистік қателіктер  трансляциялау  кезінде  байқалады.  Көптеген
басқа  да  қателіктерді  программалаушының  не  ойлағандығын  білмегендіктен
транслятор таба алмайды.
Сондықтан компьютердің синтакасистік қателіктер туралы хабарының  жоқ  болуы
программаның дұрыстығының жеткілікті щарты болып табылмайды.
Синтаксистік қателіктердің мысалдары:
 ־ тыныс белгілерінің қалып кетуі;
 ־ жақшалардың сәйкес келмеуі;
 ־ оператордың дұрыс жазылмауы;
 ־ қызметші сөздің дұрыс жазылмауы;
 ־ айнымалы атының дұрыс жазылмауы;
 ־ циклдің аяқталу шартының жоқ болуы;
 ־ массив сипаттамасының жоқ болуы т.с.с.

                     Транслятор таба алмайтын қателіктер

Программада пайдаланылатын операторлар дұрыс  жазылғанымен  транслятор  таба
алмайтын көптеген қателіктер болады.
Осындай қателіктердің мысалдарын келтірейік.
   Логикалық қателіктер:
 ־ кейбір шартты  тексергенмен  кейін  алгоритмнің  қай  тармағын  орындауға
   өтуді дұрыс көрсетпеу;
 ־ мүмкін болатын шарттарды толық есептемеу;
 ־ программада алгоритм блоктарын орындау  үшін  қажет  болатын  бір  немесе
   бірнеше шамаларды қалдырып кету.
 Циклдерде кездесетін қателіктер:
 ־ циклдің басын дұрыс көрсетпеу;
 ־ циклдің аяқталу шарттарын дұрыс көрсетпеу;
 ־ итерация санын дұрыс көрсетпеу;
 ־ шексіз цикл.
Ендіру-шығару қателіктері; деректермен жұмыс істеудегі қателіктер:
 ־ деректердің түрін дұрыс бермеу;
 ־ талап етілген аз немесе көп деректерді оқуды ұйымдастыру;
 ־ деректерді дұрыс түзетпеу;
 Айнымалыларды пайдалануда кететін қателіктер:
 ־ айнымалыларды олардың бастапқы мәндерін көрсетпей пайдалану;
 ־ бір айнымалыны басқа айнымалының орнына қате көрсету.
Массивтермен жұмыс істеуде кететін қателіктер:
 ־ алдын ала нолге келтірілмеген массивтер;
 ־ дұрыс сипатталмаған массивтер;
 ־ индекстерінің берілу реттілігі дұрыс емес массивтер.
 Арифметикалық операцияларды орындауда кететін қателіктер:
 ־ айнымалының түрін дұрыс   көрсетпеу  (мысалы,  нақты  айнымалының  орнына
   бүтін айнымалыны көрсету);
 ־ әрекеттер ретін дұрыс анықтамау;
 ־ нөлге бөлу;
 ־ теріс санның квадрат түбірін табу;
 ־ санның мәнді разрядын жоғалту.
Осы қателіктердің бәрін тестілеудің көмегімен табуға болады.

Дәріс №2.Өзін-өзі тексеру сұрақтары

                    1. Арифметикалық амалдарды орындауда кететін  қателіктер
                       қандай?
                    2. Тестілеу процесінің кезеңдерін ата
Дәріс №3. Программалау технологиялары

1. Программалау технологиялары

                         Программалау технологиялары

Программаларды   жобалаудың   негізгі   екі   тәсілі    «жоғарыдан    төмен»
және«төменнен  жоғары»  бар.  «Төменнен  жоғары»  технологиясының  мағынасы:
алдымен етене таныс және  түсінікті  (сұрыптау  алгоритмдері  жүзеге  асыру,
жолдарды өңдеу, мәліметтерді енгізу) мәселелер  орындалады  да  сосын  барып
үлкен, күрделі прорамманы дайын бөлшектерден құрастыру жасалады.
«Жоғарыдан  төмен»  тенологиясының  мағынасы:  алдымен   программа   скелеті
дайындалып (процедуралар мен олардың арасындағы байланысы) алынады да  содан
кейін жеке бөлшектерін  жазуға  кіріседі.  Көбінесе  программа  аталған  екі
технологияны   аралас қолдану арқылы құрылады.
Программалар жиі нашар  құрылымдарға  ие  болады  немесе  оларда  мәліметтер
көрінісі орындалатын жұмысқа  сәйкес  болмағандықтан,  олармен  жұмыс  істеу
қиын. Мәліметтердің жақсартылған құрылымын таңдау,  үйрене  алмайтын  өзінің
тегіндегі көркемөнері болып  табылады. Шешімдер процесі жеңілірек болу  үшін
және   мәліметтер  құрылымында  қандай   өзгерістер   басқаруды   қысқартуға
көмектесетінін анықтау үшін алдын-ала программаның  алғашқы  жазылған  түрін
жиі жазып  отыруға  тура  келеді.  Көптеген  программалар,  оларды  түгелдей
қабылдау үшін өте қолайсыз болып  келеді.  Жеке-жеке  меңгеру  үшін,  оларды
бөліктерге
бөлу қажет. Бұл программаның сеніділігін арттырудың жалғыз  жолы,  сондай-ақ
оқу мен түсінудің жалғыз тәсілі.
Функция  мен  процедуралар   үлкен   программалаудың   «модульдері»   немесе
құрылыстық  блоктары  болып  табылады.  Көптеген  тілдерде  ол  жеке   түрде
трансляциялануы  және  бір-бірінен   тәуелсіз   пайдалануы   мүмкін.   Үлкен
модульдер,  егер  олар  өте  көп  санды  немесе  тым  әртүрлі   функцияларды
орындайтын болса кең түрде қолдану үшін  өте  мамандандырылған  болады  және
пайдалану қиын.
Қайда  және  не  орындалу  керектігін  анықтайтын,  программаны  ұйымдастыру
жеткіліксіз мәліметтерді енгізу және шығару  форматтары  мен  есепті  талдау
салдары болып табылады.
Үлкен көлемдегі есептерді кіші көлемді есептерге  бөлу  процесі  «құрылымдық
жобалау» деп аталады. Осы пәннің шеңберінде:  Жазу мен үлкен  программаларды
сүйемелдеудің  жалғыз  тәсілі  –  оларды  модуль  түрінде  ұйымдасқан  біраз
функциялардың жиынтығы ретінде көрсету;
- Модульде ақпарат, ол өзінің есебін қалай шешетіндей жұмыс істемеуі керек;
-  Әр  модуль  өзінің  тікелей  көршілерінің  шағын   тобымен   ғана   өзара
әрекеттесуі қажет;
- Программаның құрамында өнделген мәліметтердің бейнесі табылуы керек.

Дәріс №3.Өзін-өзі тексеру сұрақтары
1.«Жоғарыдан төмен технологиясының» мағыгасын айт?

Дәріс №4.  СИ  тілінің  жалпы  характеристикасы.  Си  программалау  жүйесіне
кіріспе.

    • Жалпы мәліметтер
    • Си программалау тілі элементтері
    •   Негізгі   түсініктер:   алфавит,   идентификаторлар,    айнымалылар,
      константалар,  деректер  типтері.  Стандартты  типтегі   айнымалыларды
      сипаттау.
    • Препроцессор директивалары.
    • СИ тіліндегі программаның құрылымы.
                              Жалпы мәліметтер

Қазіргі  алгоритмдік  тілдер   ішінде   Си   программалық   тілі   өте   көп
ерекшеліктерге  ие кең  тараған тілдердің бірі есептеледі. Бұл  тіл  жүйелік
программалық жасақ мәселелерін (трансляторларды өңдеу,  операциялық  жүйе  ,
экрандық интерфейс,  аспаптық  құралдар  т.б.)  шешуде  қолданылатын  тиімді
универсал алгоритимдік тіл.
Си тілінің  ерекшеліктерінің бірі әр түрлі  операциялардан  жүйелер  аралық,
компьютерлер аралық программаларды жоғары деңгейде  орындай алады.
Си тілінде жазылған программаның архитиктуралары  әр  түрлі  компьютерлердің
бірінен бірін  ауыстыруға  бір  операциялық  системаның  екінші  операторлық
системаға ауыстыруға  жеңіл.  Сонымен  қатар  Си  тіліндегі  программалардың
орындалу  жылдамдығы  ассемблер  тіліндегі  программалардан  кем  емес.   Си
тілінің компиляторы қазіргі кездегі барлық операциялық  жүйеде  жұмыс  істей
береді. Unix, MSDOS, WINDOWS.
Бұл  тіл  жүйелік   программалардың   жасақшылары   үшін   ассемблер   тілін
ауыстырған тиімді.
Си тілінің кейбір ерекшеліктеріне тоқталайық.
    - Си тілі  кейбір төменгі деңгейлік операцияларды (сонымен қатар  биттер
      үстінде операцияларды) іске асырады. Бұл  операциялардың  кейбіреулері
      тікелей машина  командасының талабына сай келеді.
    - Си  тілі  айнымалы  және  функциялық  көрсеткіш  механизмдерін  сүеді.
      Көрсеткіштер   кейбір  айнымалы  немесе  функциялардың    (1)   машина
      жадысыдағы адрестеріне (сақталған) арналған айнымалы. Бұл  программист
      үшін машина жад  адрестерімен   тікелей   жұмыс  істеу  мүмкіндіктерін
      береді.
    - Си тілі енгізу–шығару операторлары, жадты динамикалық бөлу процессорды
       басқару операторларын, операциялық жүйелерге арналған  программаларды
      басқару мүмкіндіктерін береді.
Си  программалау тілі ең  алғаш   Б.Кернига  және  Д.Ритчи  авторлығында  70
жылдар  Bell  Laboratories фирмасы жәрдемінде  АқШ–та  жасақталды.  Бұл  тіл
сол кезде UNIX операциялық жүйенің пайдаланушылары үшін қолайлы тіл болды.

                      Си программалау тілі элементтері

Компьютер  пайдаланушы  жазған  программаның  құрылымдық   базасын  си  тілі
элементтері                         арқылы                         түсінеді.

Си тілі элементі төменгі бөліктерден тұрады.
-алфавит
-константалар
-идентификаторлар
-кілтті сөздер (ключевые слова )
-түсініктер (коментарий)
Си тілі компиляторы мәтіндік қатарлар  тізбегі   арқылы  си  тілінде  жазған
программаларды бастапқы файл ретінде  түсінеді.  әр  бір  қатар  жаңа  қатар
басталысыменен аяқталады және ENTER клавишінің басылуы -  қатар  аяқталғанын
білдіреді.
Си тілі компиляторы программаларды қатарлар тізбегі  арқылы  есептейді  және
лексема   деп  аталатын  символдық  топтар  арқылы   есептелген   қатарларды
дамытады. Лексема бұл  си  тілі  компиляторлары  үшін  өз  алдына  мәнге  ие
программа    мәтінінің    бірлігі.    ()операция    белгісі    константалар,
идентификаторлар және кілтті  сөздер  (бұл  бөлімде  айтылған  )лексемаларға
мысал  болады.  Бөлушілер,  мысалы,  квадраттық  жақша  ,фигуралық  жақша  ,
шеңберлі жақша ( ), бұрышты жақша және үтір де лексемаға мысал бола алады.
Әріптер мен цифрлар константа, идентификатор және кілтті сөздер  құрастыруда
қолданылады.
Си тілі компиляторы латын бас  және  кіші  әріптерін  әр  түрлі  символ  деп
есептейді.
Идентификаторлар. Тілдің ең негізгі түсіністерінің бірі-  идентификатор.  Ол
объектінің   атауы   ретінде    қолданылады.    (функцияның,    айнымалының,
константалардың)
Идентифатор төмендегі ережеге сай таңдалуы қажет:
       1. Олар латын әріптерінің х немесе астын сызу басталуы қажет .
       2. Оның ішінде  латын  әрпі  және  астын  сызу  белгілері  қолданылуы
          мүмкін. Бөтен таңбаларды қолдануға болмайды.
       3. Си тілінде кіші және үлкен латын әріптері өзгеше деп саналады.
       4. Идентификатордың ұзындығы әр программаның жүйесінде әр түрлі  ANSI
          стандарты бойынша 32 таңбадан аспауы керек . Си ++ те шектеуі жоқ.
       5. Объектілердің идентификаторы тілдің, түйінді сөздерінің стандартты
          функциядан және библиотека аттарынан өзгеше болуы қажет.
Си программалау  тілінде түсініктемеге көп көңіл  қойылады.  Ол  программаны
теруді жеңілдетеді. Каментарий мына /* және / таңбалармен шектеледі. /  *Бұл
түсініктеме */ Си++те мынадай тәсілі  бар  //  мына  таңбадан  кейін  тұрған
символдың бәрін сол қатер аяғына дейін түсініктеме деп түсінеді.

                        Си тілінің әліпбиі (алфавит)

      С тілінде мына белгілер (символдар) жинағы қолданылады:
1) Латын әліпбиінің бас (A,B,C,…….,Y,Z) және кіші (a,b,c,………,y,z)  әріптері;

2) 0-ден 9-ға дейінгі араб цифрлары;
3) Мынадай анайы белгілер:
+ (плюс),  -  (минус),  *  (жұлдызша ),  /  (бөлу сызығы  немесе  слэш),   =
(тең),  > (үлкен),  < ( кіші), ; (нүктелі үтір  ),  &  (амперсэнд  ),   [  ]
(тік жақшалар),  { }  (фигуралық жақшалар), (  )   (қарапайым  жақшалар),  _
(астыңғы сызық),    (пробел ),  .  (нүкте),  , (үтір),  :  (қос  нүкте),   #
(нөмір), % (пайыз), ~ (әрбір разряд бойынша терістеу),  ?  (сұрақ  белгісі),
!  ( леп белгісі),   \  (кері слэш).
      Берілгендер классификациясы
С тілінде екі категориялы берілгендер қолданылады: берілгендердің  қарапайым
 (скалярлық) және күрделі  (құрамды)  типтері.  Негізгі  (базалық)  типтерге
бүтін, нақты  және  символдық  типтер  жатады.  Өз  кезегінде,  бүтін  типті
берілгендер қысқа (short),  ұзын  (long)  және  таңбасыз  (unsigned)   болуы
мүмкін. Берілгендердің базалық  типтерінің  өлшемдері  мен  мүмкін  боларлық
диапазондарын келтірейік (1-ші кесте):

|Типтің аты         |Берілгендер  |Жады көлемі, байт| Мәндер диапазоны      |
|                   |типі         |                 |                       |
|Символдық          |char         |1                |-128…127               |
|Бүтін              |int          |2                |-32768…32767           |
|Қысқа              |Short        |2(1)             |-32768…32767(-128…127) |
|Ұзын               |Long         |4                |-2147483648…2147483647 |
|Таңбасыз бүтін     |Unsigned int |2                |0…65535                |
|Таңбасыз ұзын      |Unsigned long|4                |0…424967295            |
|Нақты              |Float        |4                |3,14*10-38…3,14*1038   |
|Екі еселі дәлдігі  |Double       |8                |1,7 *10-308   1,7      |
|бар нақты          |             |                 |*10308                 |

Берілгендердің күрделі типі массивтерге, құрылымдарға (struct),  бірігулерге
(немесе құрамаларға) (union), санауларға (enum) бөлінеді.

                         Препроцессор  директивалары

      Си тілінде программалау ортасында  немесе тіл  компиляторынна  қажетті
бір компонент ретінде препроцессор кіреді. Препроцессордың  негізгі  қызметі
ол-программада шығарылатын тексті  оның  компиляциясына  дейін  өңдеу  болып
табылады.
Препроцессорлық өңдеу қадамдары.
Негізінен  препроцессорлық  өңдеу  бірнеше  қадамдардан  тұрады.  Нақты  бір
реализация бірнеше қадамдарды біріктіре алады. Бірақ  оның  нәтижесі  келесі
реттеу секілді орындалуы қажет.
         • Барлық жүйелік-тәуелді стандарты  кодтарға  қайтадан  өзгертіліп
           кодталуы керек. (мысалы, жүйелік-тәуелді индикатор жол соғында)
         • "\" және "конец строки" символдарының біреуі араларына  қойылған
           пробелмен алынып тасталады., одан соң бастапоы мәтіндегі  келесі
           жол  "\"  және  "конец  строки  "  символдары  орналасқан  жолға
           біріктіріледі.
         •  Мәтінде  препроцессорлардың   директивалары   мен   лексемалары
           анықталады,  ал  әрбір  оларға  берілген  түсінікткме  бс   орын
           символымен ауыстырылады.
         • Препроцессор директивалары орындалады.
         •  Символдық  тұрақтылардағы  және  символдық  жолдардағы  эскейп-
           нәтижелері  өздерінің  эквиваленттілеріне  ауыстырылады.,   яғни
           өздерінің сәйкес сандық кодтарына өзгертіледі.
         • Жинақталған символдық жолдарға (жолдық  тұрақтылар)  түсініктеме
           беріледі, яғни олар бір жолға біріктіріледі.
         • әрбір препроцессорлық лексема Си тіліндегі мәтінге айналады.
Препроцессорлық   лексемаларға    символдық    тұрақылар,    файлдар    аты,
идентификаторлар,  операция   белгілері,   препроцессорлық   сандар,   тыныс
белгілері және жолдық тұрақтылар.
Препроцессор  директиваларын  өңдеу  қадамдарын   толық   қаастырайық.   Оны
орындауда келесі жағдайлар пайда болады:
    • идентификаторларды ауыстыру
    • көрсетілген файлдардан программаға текст қосу .
    • программадан  оның  мәтінінің  дара  бөліктерін  алып  тастау  (шартты
      компиляция).
Препроцессорды басқару үшін, яғни дұрыс  қадамдар  жасау  үшін  препроцессор
командаларын (директивалары) қолданылады,  олардың  әрбіреуі  жаңа  жолдарға
жазылады және #  символынан басталады.
Препроцессор директиваларының жалпыланған форматы:
# директива аты препроцессор лексемалары.
# символының алдында және  артында  директиваларда  пробел  болады.  сонымен
қатар  препроцессор  лексемаларының  алдына  да  және  артынада  да   пробел
қойылады. Препроцессор директиваларының аяқталу қызметін мәтін жолының  соңы
атқарады (егер "\" символы сол жолға қойылған болса, онда  аяқталу  қызметін
келесі мәтін жолының соңы орындайды).
      Клесі препроцессорлық директивалар анықталған.
# define-препроцессор идентификаторы немесе макросты анықтайды.
# include-файлдан мәтін қосу.
#undef-препроцессор идентификаторын немесе макросты анықтаудан бас тарту.
#if-шартты тексеру.
# ifdef-идентификаторды анықтауды тексеру.
#Ifndef-идентификатордың анықталмағанын тексеру.
#else -#if үшін альтернативті бұтақ басы.
#endif-#if шартты директивасының соңы.
#line-келесі төменгі жолдың номер ретінің ауысуы.
#error-қате туралы хат мітінін түзеу.
#pragma-реализациямен алдын-ала қарастырылған әрекет.
#  бос директива.
Препроцессорлық директивадан басқа үш препроцессорлық оерация  бар.  Олар  #
define командасыменбірге қарастырылады:
  defined –ақиқатты тексеру.
   ##-препроцессорлық лексема конкатенация.
#-операнданы жолдық символға айналдыру.
#define  директивасы  бірнеше   модификацияға   ие.   Олар   препроцессорлық
идентификатордың және макростың анықталуын қарастырады.
#include директивасы программа мәтініне көрсетілген файл мәтінін қосады.
#undef директивасы   # define директивасының әрекетін жоққа шығарады.
#if   директивасы   және   оның   модификациялары   #else,   #indif,   #elif
директиваларымен   бірге   программа   мәтінін    шартты    түрде    өңдеуді
ұйымдастырады. Бұларды қолданғанда барлық мәтін  өңделмейді,  тек  оның  осы
директивалармен бөлінген бөліктері ғанаөңделеді.
 #line директивасы жол номерін реттейді.
 #error директивасы қате болған жағдайда қысқаша мәтінді диагностикалық  хат
шығарады.
  #pragma директивасы автор өзі құрған компиляторды іске қосады.
  #-бос директива  болғандықтан  ештеңе  шақырмайды,  яғни  ешқандай  эффект
бермейді.
Негізінен Си тілінің операторлары локальді түрде  анықталады.  Және  олардың
мүмкіндіктерін кестемен көрсетуге болады. бұл кестенің мәні  өте  зор,  бұны
кез келген уақытта оқығанда немесе программа жазғанда қолдануға болады.

                     Си тіліндегі программаның құрылымы

Кез  келген  программа  бір  немесе  бірнеше  функциялардан   турады.   Олар
программа құруға  керекті  негізгі  модульдер  болып  табылады.  Кез  келген
программаның  жазылған  алғашқы  мәтіні   бастапқы   код   деп   аталады.Оны
біріктірілген  программалау  ортасында  теріп,сонан  соң  компилятор  арқылы
машиналық кодқа түрлендіріп орындаймыз.
Си  тілінде  жазылған  программа  препроцессор  директиваларынан,   глобалды
(ауқымды) айнымалыларды жариялаулардан,  бір  немесе  бірнеше  функциялардан
тұрады. Осы функциялардың ішінде түгелдей  программаның  жұмысын  басқаратын
бір негізгі (main) функция болады.
С тіліндегі программаның жалпы құрылымы мынадай:
<препроцессор директивалары>
<қолданушы типтерін анықтау – typedef>
<функциялар прототиптері>
<глобалды объектілерді анықтау>
<функциялар>
[pic]

















Сонымен Си программасы бірнеше функциялардан құралады  және  олардың  біреуі
міндетті түрде MAIN() болуы қажет.
Қарапайым программаның мысалын қарастырайық. Жалпы кез келген  функция  оның
тақырыбы мен тұлғасынан тұрады.
                                       [pic]

















Алдымен программа процессор арқылы өңделіп, оның  директиваларын  орындайды.
Мұнда программағатақырыптық файлдар прогаммаға  қосымша  элементтеренгізетін
мәтіндік файлдар жазылады.  Олар  мәліметтерді  енгізу\шығару  операцияларын
немесе экран сипаттамаларын өзгерту үшін қажет.
        Программадағы   кез   келген   функция   тақырыбы    препроцессордың
директивасынан және функция атынан тұрады. Функция атына  жалғасып  ,  жақша
ішіне параметрлер жазылуы мүмкін, кейде параметрлер  болмайды,ондайда  жақша
ішінде ешнәрсе жазылмайды.
       Функция  тұлғасы  операторлардан   тұрады,олар   жүйелі   жақшалармен
шектеледі. Әрбір оператордан кейін (;) таңбасы қойылады.
Мысалы:
 / Герон формуласы бойынша үшбұрыш ауданын табу/
#include  \*енгізу\шығару директивасы*\
#include  \*математикалық функциялар директивасы*\
Main()\*басты функцияны қолдану*\
{
Int a,b,c;
Float p,s;
Printf(“\n үшбұрыш қабырғаларын еңгіз,:\n”);
Scanf(“%f%f%f”,&f,&b,&c);
P=(a+b+c)\2;
S=sqr(p*(p-a)*(p-b)*(p-c));
Printf(“s=%f”,s);
}
Процессор директивалары #include сөзінен  кейін  жазылады,  stdio.h  тіркесі
енгізу\шығару  операциялары  орындалатынын   білдіреді.Ал   math.h   тіркесі
программада математикалық функциялар пайдаланылатынын көрсетеді.
      Басты функция main() аргументсіз  жазылған,сол  себепті  жақша  ішінде
ешнәрсе көрсетілмеген.Ал функция  тұлғасы  операторлардан  тұруы  тиіс.  Int
түйінді сөзі a,b,c  айнымалыларының  бүтін  мәнін  қабылдайды,float  түйінді
сөзі р,s айнымалыларының нақты мән қабылдайтынын сипаттап тұр.
      Келесі жол үшбұрыш қабырғаларыненгізуді талап ететін  сөз  тіркестерін
экранға шығарады, мұндағы \n таңбалары сөз тіркесі алдында және  одан  кейін
курсор бір жол төмен түсетінін  көрсетеді.  Scanf   сөзінен  басталатын  жол
a,b,c  мәндерін  пернелерден  қабылдайды,   сонан   кейін   жарты   периметр
есептеліп, аудан мәні анықталады да, соңғы нәтиже экранға шығарылады.
Scanf-  форматты енгізу.
%d%d -енгізу форматы
&a,&b -енгізетін сандарды жазатын ұяшық адресі.
Формат-қандай сандар енгізілетінін\шығарылатынын көрсететін символдық тип.
%d-бүтін ондық сан шығарылуы тиіс.
%i- бүтін ондық сан шығарылуы тиіс.
%f-жылжымалы нүктелінақты ондық сан.
%e-жылжымалы нүктелі экспоненциалды сан.
%E-е орынына Е шығарады.
%c-бір символ шығарылуы тиіс.
%s-символдар тіркесі шығарылуы тиіс.
%g-нақты сан, сан ұзындығына сәйкес %e немесе %f қолданылады.
%u-таңбасыз ондық бүтін сан жазылып шығады.
%o-таңбасыз бүтін сегіздік сан жазылып шығады.
%x-таңбасыз бүтін он алтылық сан жазылып шығады.
\n-келесі жаңа жолға көшу атқаратын басқару символ.

Дәріс №4.Өзін-өзі тексеру сұрақтары
1.Си тіліндегі программаның құрылымын атаңыз.

Дәріс №5. Меншіктеу операторы. Енгізу – шығаруды ұйымдастыру

    • Меншіктеу операциясы
    • С тіліндегі енгізу-шығару құралдары
    • С++ тіліндегі енгізу-шығару құралдары
    • С тілінде форматтап енгізу және шығару
    • С++-тегі форматтау функциялары мен флагтар

                            Меншіктеу операциясы.

Меншіктеу операциясынан сол жақ операндасына  сәйкес  тек  модификацияланған
мәндер қолданылады (l-мән), сонымен қатар мәндерін өзгертуге болатын  кейбір
аталған жады облыстарына ссылкалар қолданылуы мүмкін.
       Меншіктеу  операцияларын  жіктей  отырып   меншіктеу   операцияларынң
қарапайым және күрделі операциялары бар екенін айта кетейік.
       =  -  қарапайым  меншіктеу:  операнда  өрнегінің   мәнінін   белгісін
операнданың оң жақ бөлінен сол жақ бөлігіне меншіктейді. Мысалы:  P=10.3-2*x

      *= -  көбейтуден  кейінгі  меншіктеу:  сол  жақ  бөліктін  операндасын
меншіктейді. Мысалы: P*=2 өрнегі P=P*2 өрнегіне эквивалентті.
       /=  -бөлуден  кейінгі  меншіктеу:  сол   жақ   бөліктегі   операнданы
меншіктеу. Мысалы:P/=2.2-d өрнегі P=P/(2.2-d) өрнегіне эквивалентті.
      %= -модуль  бойынша  бөлуден  кейінгі  меншіктеу:  сол  жақ  бөліктегі
операнданы  меншіктеу.  Оның  қалдық  бөлігін  бүтін  санды  бөлудегі  мәнін
операнда   мәніне   меншіктеу.   Мысалы:   N%=3   өрнегі    N=N%3   өрнегіне
эквивалентті.
       +=  -  қосындыдан  кейінгі  меншіктеу:  екі  операндалар   қосындысың
мәндерін операнданың сол жақ бөлігіне меншіктеу. Мысал: A+=B  өрнегі   A=A+B
өрнегіне эквивалентті.
      -= - алу амалынан кейінгі меншіктеу: со жақ  және  оң  жақ  мәндерінің
алымдарын операнданың сол жақ бөлігіне  меншіктеу.  Мысал:  Х=4.3-z   өрнегі
X=X-(4.3-z) өрнегіне эквивалентті.
      <<=  -   разрядтардың  солға  жылжуынан  кейінгі  меншіктеу:  сол  жақ
бөліктегі поерандалардың бүтін санды мәніне разряд санына байланысты  биттік
бейнелеудің соға қарай жылжуынан алынған мәнді  меншіктеу.  Ол  бүтін  санды
операнданың оң жақ бөлігіндегі  мәнге  тең  болады.  Мысалы:   a<<=4  өрнегі
a=a<<4 өрнегіне эквивалентті.
       >>=  -  разрядтардың  оңға  жылжуынан  кейінгі  меншіктеу:  сол   жақ
бөліктегі поерандалардың бүтін санды мәніне разряд санына байланысты  биттік
бейнелеудің оңға қарай жылжуынан алынған мәнді  меншіктеу.  Ол  бүтін  санды
операнданың оң жақ  бөлігіндегі  мәнге  тең  болады.  Мысалы:  a>>=4  өрнегі
a=a>>4 өрнегіне эквивалентті.
      &= - поразрядты конъюкциядан  кейінгі  меншіктеу:  сол  жақ  бөліктегі
бүтін  санды   операнда   мәніне   поразрядты   конъюкциядан   және   биттік
бейнелеуіндегі бүтін санды операнданың оң  жақ  бөлігін  меншіктеу.  Мысалы:
e&=44 өрнегі e=e&44 өрнегіне эквивалентті.
      |= - поразрядты дизъюнкциядан  (НЕМЕСЕ)  кейінгі  меншіктеу:  сол  жақ
бөліктегі бүтін санды операнда мәніне поразрядты дизъюнкциядан  және  биттік
бейнелеуіндегі  бүтін  санды   операнданың   оң   жақ   бөлігін   меншіктеу.
Мысалы:a|=b өрнегі a=a|b өрнегіне эквивалентті.
      ^= -  ерекше  поразрядты  дизъюнкциядан  кейінгі  меншіктеу:  сол  жақ
бөліктегі бүтін санды операндаға ерекше поразрядты операциясын екі  операнда
мәнінің биттік бейнелеуінен алынған мәнді меншіктеу. Мысалы:  z^=x+y  өрнегі
z=z^(x+y) өрнегіне эквивалентті.
Меншіктеу операциясының екі түрлі жазылуы бар:
1. Толық формасы:
айнымалы_аты =өрнек;
Алдымен  өрнек  есептеледі,  содан  кейін  оның  нәтижесі  айнымалы_аты  –на
меншіктеледі. Мысалы:  y=(x+2)/(3*x)-5;
Бір оператордың көмегімен бір мәнді бірнеше айнымалыға  меншіктеуге  болады,
мысалы:          x=y=z=0;         /* x, y, z=0 */
немесе      z=(x=y)*5;      - алдымен x айнымалысына  y  айнымалысының  мәні
меншіктеледі,  одан  кейін  x*5  өрнегі  есептеледі,  одан  кейін  нәтиже  z
айнымалысына меншіктеледі.
2. Қысқа форма:
айнымалы_аты операция =өрнек;
мұнда операция – (+ , -, *, /, %) арфметикалық операцияларының біреуі;
Мысалы:     x*=5;                 /* x=x*5;  */
s+=7;                  /* s=s+7;  */
y/=x+3;                /* y=y/(x+3);  */
Қысқа форма  айнымалы  осы  оператордың  толық  формасының  екі  жағында  да
кездескен жағдайда қолданылады..
С тілінде айнымалының мәнін 1-ге азайту (--) және арттыру (++)  операциялары
бар. Операциялар префикстік (++i және --i)  және  постфикстік  (i++  и  i--)
болуы мүмкін. Бұл  операцияны  өрнектерде  қолданған  кезде,  егер  операция
префикстік   болса,   онда   операция   бірінші   орындалады   (i-дің   мәні
өзгертіледі),  содан  кейін  барып  қана   өрнек   есептеледі.   постфикстік
операцияны  қолданған  кезде  операция  өрнек   есептелгеннен   кейін   ғана
қолданылады.
Мысалы:     b=7;
n=1;
1.    c=b*++n;          /* n=n+1; c=b*n;    яғни c=14 */
2.    c=b*n++;          /* c=b*n; n=n+1;    яғни c=7 */


                     С тіліндегі енгізу-шығару құралдары

С/С++ тілдерінде 20-дан астам мәліметтерді енгізу-шығару тәсілі бар. Енгізу-
шығару  стандартты   кітапханалық   функциялар   файлдармен   және   әртүрлі
құрылғылармен  байланысқан  мәліметтерді  оқуға  немесе   жазуға   мүмкіндік
береді.
С тілінде файлдың қандай да бір алдын-ала анықталған структурасы  жоқ.  Кез-
келген мәлімет байттар тізбегі түрінде  қарастырылады.  Жалпы  енгізу-шығару
функцияларын негізгі үш категорияға бөлуге болады:
    • Лектік(потоктық);
    • консолдық (консольные);
    • төмен деңгейлі (низкоуровневые)

Лектік   функциялар:   буферлік,   форматталған,   форматсыз   енгізу-шығару
мүмкіншілігін жүзеге асырады.
Буферлік лектердің мәліметтерді уақытша жазу-оқу  барысында  буферде  сақтау
мүмкіндігі бар.  Дискке  тікелей  жазу  уақыт  алады,  ал  буферлік  аймақты
пайдалану процесті тездетеді.
Лектік функциялар мәліметтерді символдар  легі  түрінде  қабылдайды.  Лектік
файлдар арқылы белгілі бір мөлшердегі  және  форматтағы  символдар  блогымен
алмасуға болады.
Файлды ашқанда лектік функцияны пайдаланып  файлмен  FILE     типтіструктура
арасында  байланыс  орнатылады  да  программа  сәйкесінше  осы   структураға
сілтемені алады, ол лек көрсеткіші немесе лек деп аталады.
    • Сонымен қатар консоль  немесе  порт  арқылы  енгізу-шығару  орындалады
      (мысалы,  принтер  порты  арқылы).  Бұл  жағдайда  сәйкес  функциялары
      мәліметтерді  байттап  оқып-жазады.Консольмен  жұмыс   жасау   қосымша
      мүмкіндіктер береді. Бұлар мынадайқосымша мүмкіндіктерді орындайды:
         - символдық клавиатурадан енгізілген кезеңін анықтау;
         - енгізілген символдар ЭХО режимін қосу-ажырату. Мысалы, символдың
           клавиатурадан енгізілген кезеңін анықтау, т.б.
    • Төмен деңгейлі категория  функциялары  тікелей  жүйелік  енгізу-шығару
      құралдарын пайдаланады, яғни төмен деңгейде файлға немесе периферийлік
      құрылғыларға  жол  ашады.  Төменгі  деңгейлі  функциялар  арқылы  файл
      ашқанда оның дескрипторы – бүтін сан қайтарылады  да,  ол  кейін  файл
      идентификаторы ретінде қолданылады.
Ескерту: Лектік функция мен  төмен  деңгейлі  функцияларды  бір  программада
араластыру арқылы конфликт пайда болады.
Лектік функциялар.
 стандарты кітапханасында лектік функциялар  орналасқан  Қосымшаны
жүктегенде автоматты түрде 5 стандартты лек ашылады. Лектер:
    - енгізу (stdin);
    - қателер (stderr);
    - шығару (stdout);
    - баспаға шығару (stdprn);
    - сыртқы құрылғылар (stdoux).
Автоматты  түрде   қате   енгізу,   шығару   стандартты   легі   консольмен,
байланысады.  Лекті  көрсететін  көрсеткіш  аргументі  болатын  функцияларда
жоғарыдағы  көрсеткіштердің  бірін  таңдап  көрсету  керек.  Stdin,  stderr,
stdout, stdprn, stdoux- тұрақтылар.
getс ( ), putc ( ) - функциялары
getc ( ) функциясы файлдық лектен 1 символды оқиды. Жалпы форматы: int  getc
( );
Бұл функция буферден оқылған символдың кодын қайтарады. getc (  )  функциясы
лектен жаңа жол символы кездескенге дейін оқиды.
Мысалы,  клавиатурадан  Enter   басу   арқылы   ғана   жекелеген   символдар
енгізілсін. putc ( ) - символды лекке жазады.
Мысалы, int ix;
Ix=getc (stdin);
putc (ix, stddut);
putc() функциясы қате жіберілгенде EOF  қайтарады.  putc,  getc  функциялары
функция және макрос түрінде де анықталған.  Макрос  приоритеті  жоғары.  Оны
өзгерту үшін, яғни макросты  болдырмау  үшін:   #  undef  getc  препроцессор
директивасысы берілу керек.
Бүтін сандарды енгізу
Бүтін сандардың легін (буферлік) енгізіп-шығару үшін: getw (  ),  putw  (  )
функциялары getc ( ), putc ( ) функция секілді,  тек  бүтін  сандарды  оқиды
және тек файлдардан (екілік режимде ашылған) оқиды.

                   С++ тіліне тәні енгізу-шығару құралдары

С++ тілінде С тіліндегі  стандарт  функциялар  енгізу-шығаруға  қолданылады.
Сонымен қатар С++ тілінде    т  тақырыптық  файлында  анықталған
енгізу-шығару құралдары бар. Лектік енгізу-шығару  осы  тақырыптық  файлдағы
кластар арқылы орындалады.
Мына операторлар: >> - енгізу және <<- шығару операторы -  кез-келген  типті
мәліметтермен  жұмыс  жасауда  қолданылады.  С++-те  де  үш   лектік   класс
қарастырылған:
istream - енгізу құралдары;
ostueam - шығару құралдары;
iostream - енгізу-шығару құралдары.
Осы үш класта  да  <<,  >>  операторлары  қолдынылады.  С  тіліндегі  stdin,
stdout, stderr стандартты лектеріне сәйкес С++тілінде cin, cout, cerr,  clog
– объект лектері қарастырылған.
Cin istream класының объектісі istream енгізу легімен,  ал  osream  класының
объектісі cout шығару легімен байланысты.
Cerr - ostream класының объектісі - қателер легі, ал clog  ostream  класының
объектісі - буферленген қателер легіне сәйкес.
Мысалы:
Шығару: С-де: printf (“ бүтін сан = %d, нақты = %f, ia, fb);
     Си++-те: cout << “бүтін сан” <>ia >> fb
Бұл жолдарда  С  тілінде  айнымалылар  арнайы  форматтар  мен  типтері  анық
көрсетілу арқылы орындалса, С++ тілінде << - операторы  мәлімет  типін  және
форматын таңдайды, ал >> - операторы қабылданатын мәннің  адресін,  форматын
анықтайды.
    • << операторында endl манипуляторы тіркелуі  мүмкін.  Мысалы,  cout  <<
      “бүтін сан = ” <<іа<>-операторы
жолды оқығанда пробель, ТАВ  белгісі,  ‘\n’   литері  кездескен  бойдан  оқу
әрекетін аяқтайды, ал осы таңбалар арқылы сипатталып кездескен  жолды  толық
оқу үшін cin объектісінің get( ) функциясын қолданған дұрыс.
Мысал: #include 
#define n 25
void main (void)
{
char span [n];
cout << “пән аты - ?”;
cin >>span;
cout << “\n сабақ, “ <   типті   файлдағы    лектік-объектілер    жұмысы     форматтау
флагтарымен басқарылады:
Флагтар self( ) функциясы  көмегімен  орнатылады,  unself(  )      функциясы
арқылы ажыратылады.
Мысалы: cout <тақырыптық
файлы қосылу керек.
Енгізу-шығару бағытын адрестеу
Қазіргі операциялық жүйе клавиатура  мен  экранды  файлдық  құрылғы  ретінде
қарастырады.
Клавиатура мәліметтерді оқып немесе экранға  шығару  программасының  бағытын
адрестеу үшін жүйеге клавиатураның орнына нақты файлды, мысалы DAN.
DAT қолдануға нұсқау беріледі.
Мысалы, орындалатын файл аты – PRIMER.
Нұсқау: 1) primer < dan.dat - файлдан оқу
2) primer > res.dat - файлға шығару.
Бірге: 3) primer < dan.dat > res.dat.
Стандартты потоктар мен нақты файл арасында немесе  периферийлік  құрылғылар
арасында байланыс ұйымдастырудың 2 тәсілі бар:
   1. бағытын адрестеу;
   2. каналдар құру.
Канал  дегеніміз  -  бір  программадағы   стандартты   енгізу   мен   екінші
программадағы  стандартты  шығару  арасындағы   тікелей   байланыс.   Мысал,
procces1 | process2
Мұндағы process 1,2 екі программа.
Тік сызық ( | ) - каналмен байланыстыру таңбасы. Байланастыру  жұмысы,  яғни
екі  программаның  енгізу-шығару   жүйесінің   әрекетін   операциялық   жүйе
басқарады.

Дәріс №5.Өзін-өзі тексеру сұрақтары

   1. Енгізу-шығару мүмкіндіктерінің өзге тілдерден ерекшелігі қандай?
   2. Енгізу-шығару барысындағы басқару таңбаларының қойылу реттері қандай?

            Дәріс №6. Басқару инструкциялары мен конструкциялары

   1. if инструкциясы
   2. if/else   инструкциясы
   3. Switch/case  /case  конструкциясы
   4. ?  шартты  операторы+
                               if инструкциясы

С/С++ тілінде 4 базалық таңдау инструкциялары бар:  if, if/else,  swith/case
 және   “?”    операторы.  Оларды  жеке  –жеке  қарастырудан  алдын,  шартты
өрнектерді құрудың  жалпы  принциптерін  айтып  өтелік.  Таңдау  иструкциясы
программаның белгілі бір блоктарын таңдап орындауға қолданылады.
Бұл блоктар бір не бірнеше қатардан тұруы  м‰мкін.  Бірінші  жағдайда  қатар
фигуралық жақшаға алынбайды, ал екіншіде блок  т‰гел алынады.
If инструкциясы команданы не командалар  блогын  шарттың  ақиқат  не  жалған
болуына байланысты орындалады.
Қарапайым көрінісі (синтаксисі).
 If  (шарт) өрнек;
Егер шарт тексерудің нәтижесі ақиқат   (true) болса, онда өрнек  орындалады,
одан соң келесі қатарлар орындалып кете береді.
Ал, егер шарт  нәтижесі  false  мәнін   (жалған)  берсе,  өрнек  орындалмай,
тастап кетіледі.
Мысал:
Мына бір программаның бөлігінде а  айнымалының  мәні  72-ден  ‰лкен  не  тең
болған сайын  экранға  “Добрый день” сөзі шығады.
If (a>=72)
printf  (“Добрый день!”)
If  инструкциясы бір емес бірнеше командаларды  қамтитын  болса,  синтаксисі
мынадай болады:
If(шарт)  {
өрнек 1;
өрнек2;
...........
өрнек n;
}
Мысал:
# include 
int main ()
{
int otl, hor, udov;
float cred;
printf  (“/n өте жақсы деген баға алған пәндердің санын ендіреміз:”);
scanf  (“%d”,&otl)
printf (“/n жақсы деген баға алған пәндердің санын ендіреміз:”);
scanf (“%d”,&hor);
printf(“/n қанағаттанарлы деген баға алған пәндердің санын ендіреміз:”);
scanf (“%d”, &udov);
cred=(otl*5+hov*4+udov*3)/ (float)(otl+hov+udov);
printf (“/n сіздің орташа балыңыз : %5,2 f/n”, cred);
if (cred>=4.5)
{
printf (“/n құтықттаймыз!/n”);
print(“/n Cіз конкурстан өттіңіз”);
}
return (0);
}

Бұл жерде if құтықттау сөздерін шығару не шығармауды  басқарып  тұр  ,  яғни
cred айнымалысының мәні 4,5- ке тең, не ‰лкен келесі қатарлар орындалады.

                          if/else   инструкциясы 2


If/else инструкциясы шарттқа байланысты 2 өрнектің  бірін  таңдап  орындауға
м‰мкіндік береді.

Синтаксисі:
If (шарт)
  өрнек1:
else
    өрнек2:
Егер шарт тексеру мәні true болса, онда өрнек1 орындалады  ,  кері  жағдайда
өрнек2
Мысалы:
If (ckeupressed==up)
iu_pixel_coovd++
else iu_pixel_coovd—
Келтірілген  программа  бөлігінде  ckeypressed  айнымалысының  мәніне  қарай
тышқан  көрсеткішінің  горизонтал  координатасы  жоғарылайды   (артады)   не
кемиді(  төмендейді.  (ckeyressed  айнымалысы   басылған   клавиштің   кодын
меншіктейді)
Егер if және  else-нің  операторлық  бөлімі  бір  емес  бірнеше  өрнектерден
тұрса, онда оларды фигуралық жақшаға алу керек.
Мысал:
# include
int main()
{
char  c;
int many, i, more;
more=1;
while  (move==1)
{
printf(“ Tatop атауын ендіріңіз)
if  (scanf (“% c”, & c)!= EOF)
{
while (c!=’/n’)
scant(“% c”, &c)
printf ( қанша заказ берілді?)
scanf (“% d”, &many);
scanf (“% c” , &c);
for (i=1; i<=many; i++)
printf (“*”);
printf (“/n”);
{
else
 more=0;
{
return(0);
}

Бұл программа пайдаланушыға товар атауын ендіруді ұсынады.  Егер  файл  соңы
деген белгі берілмесе (ctrl+c  клавиштері  басылмаса),  онда  товар   атауын
әріптеп оқып, қатар соңын  білдіретін  символды(Enter   клавиші  басылғанша)
кездестіргенше жалғастыра береді.
Келесі қатарға “қанша заказ берілді” сөзі шығады. Бұдан соң  заказ  берілген
товарлар бірлігін ендіру қажет. Мұнан кейін  ендірілген  санға  сәйкес,  for
циклі экранға жұлдызшалар қатарын шығарады.
Егер файл соңы деген белгі (ctrl+c клавишін басу) берілген болса ,  онда  if
–тің шартынан кейінгі қатарлар орындалмастан  else денесі  орындалады,  яғни
more-нің мәні  0-ге ауыстырылады. Демек  цикл  енді  қайталанбай,  программа
аяқталады.

                      Switch/case  /case  конструкциясы


Бір  айнымалыны  бірнеше мәндермен тең  не тең   еместігін  тексеруге   тура
келетін  жағдайлар  жиі   кездеседі.   Б±ны   if/else/if    конструкциясының
көмегімен  не  осыған  ±қсас  конструкция   switch/case  көмегімен   орындай
аламыз. Оның синтаксисі мынадай.

switch (б‰тін санды өрнек)
case константа 1
              өрнек 1
break;
case константа2
               өрнек2
break;
  .
  .
  .
case константаn
               өрнекn
break;
detault

Үнсіз  келісім  бойынша  әрекет  break  инструкцияның   барлық   тармақтарда
(default тан бөлек) қайталанатынын байқаймыз. Егер өрнек1 ден кейінгі break-
ты  алып  тастасақ,  онда  өрнек1  орындалғанан  соң,  switch  конструкциясы
ж±мысын  аяқтаудың  орнына,  жалғасып  өрнек2  де  орындалады.  Демек  break
тармақтардың  бірі  орындалған  соң  басқаларын  орындамай,  тастап   кетуді
атқарады.
Мысалы: Төмендегі фрагментті  switch/cаse  конструкциясын  пайдаланып  қайта
жазамыз.

if (more= =smu)
f=5;
else if (more= = smd )
f=-5;
else if (more= = lmu)
f=10;
else f=-10;
switch (more )
{
case smu: f=5; break;
case smd: f=-5; break;
case lmu: f=10; break;
default: f=-10;
}
Бұл жерде more айнымалысының мәні біртіндеп case  бұтақтарындағы  smu,  smd,
lmu константаларымен (тұрақтыларының) салыстырылып тура келсе,  f-ке  сәйкес
мәні  меншіктеледі.  Бадан  соң  break  инструкциясы  басқаруды  }  жабылған
жақшадан кейінгі қатарға береді. Егер  ешқайсысынада  сәйкес  келмесе,  онда
default инструкциясы  орындалады.  Default  б±тағының  болуы  міндетті  емес
екендігін ескерте кетелік. Default блоктың соңғы қатары  болғандықтан,  одан
кейін break инструкциясын жазудың қажеті жоқ.

 Мысал:
іnt main()
{
char c= ‘a’;
int ivowel=0, iconst=0;
switch(c)
{
case ‘a’:
case ’A’:
case ‘e’:
case ’E’:
case ’i’;
case ‘I’:
case ’o’;
case ’O’:
case ’u’:
case ’U’:  ivowel ++;break;
default:  iconst++;
}
refurn(0);
}

 Егер с айнымалысы  aғылшын  тілінің  кез  келген  дауысты  дыбысының  ASCII
кодына тең болса, (‘a’-әрпінің ASCII коды) онда  ivowel  айнымалысының  мәні
бірге артады, кері жағдайда iconst бірге артады.

                            ?  шартты  операторы

? операторы қарапайым бір қатарлы шартты өрнектер қ±руға  м‰мкіндік  береді.
Синтаксисі:
шарт ? өрнек бір : өрнек екі;
? операторы тернарлы деп аталады, өйткені ол тек  3  операнданы  ғана  керек
етеді.
Мысал:
if (fr>=0.0)
fr=fr;

Мұны ? шартты операторының көмегімен бір қатарға жазуға болады:
fr=(fr>=0.0) ? fr : -fr;

Дәріс №6.Өзін-өзі тексеру сұрақтары немесе тестер
{Өзін-өзі тексеру сұрақтар тізімі немесе тесттер}

        1. Инчтрукция дегеніміз не?
        2. Конструкция дегеніміз не?

Дәріс №7. Цикл операторы.

   1. Цикл инструкциялары

Программалау    негіздеріндегі   қайталау     алгоритмдерін    ұйымдастыруда
қолданылатын негізгі үш  циклдық  конструкция  қарастырылған.  Олардың  бір-
бірінен басты ерекшелігі циклдың  қайталану  шартына  қарай  цикл  денесінің
орындалу ретінің анықталуына байланысты.
While циклы
Жалпы форматы:
While <өрнек> инструкция
Мұндағы,  <Өрнек>  есептелінеді,  егер  мәні  0-ге  тең  емес  болса,   онда
инструкция орындалады да өрнек қайта есептеледі  және  ол  өрнек  мәні  0-ге
дейін қайталанады.
for циклы
For (өрнек1;өрнек2; өрнек3) инструкция
Мұндағы: өрнек1 және өрнек3 көбінесе меншіктеу немесе функцияны  шақыру,  ал
өрнек2  қатынас  өрнегі  болып  табылады.  Өрнек1  цикл  орындалғанға  дейін
қабылданғаннан  кейін  қатынас  өрнегі  тексеріледі.  Егер  қатынас  өһрнегі
ақиқат мән қабылдаса, онда  циклдың  денесі  ретінде  анықталған  инструкция
орындалады. Цикл денесі орындалған соң,  яғни  итерация  аяқталғаннан  кейін
өрнек3 орындалады да қатынас өрнегі  қайта  тексеріледі.  Осы  процесс  оның
мәні жалған мән қабылдағанға дейін жалғасады.
Бұл өрнектердің кез-келгені болмаса да ; қойылуы міндетті.
Мысалы,
for(;;) {
…
}
Мұнда өрнек2 мәні барлық уақытта ақиқат деп есептелінеді, бұл шексіз  циклды
көрсетеді. Мұның жұмысы  breаk  немесе  return  инструкцияларының  көмегімен
тоқтатылуы мүмкін.
Цикл мысалы:
For(i=0,i; Өрнекті жақшаға да жазуға болады, бірақ ол міндетті емес.Си-
дегі функция Раscal-ғы процедура мен функция секілді.
Айырмашылығы:-Си-де функцияның барлық аргументі параметрлер ретінде
беріледі, яғни шақырылатын функцияға аргументтің өзі емес оның
аргументтерінің мәні беріледі.
Си-гі кез келген функцияның прототипі болуы тиіс, яғни функция аты,
аргументтерінің типі және қайтарылатын нәтиже типі көрсетілген тақырыбы
хабарланады. Прототипі программа денесінде немесе бөлек тақырыптар файлында
айқындалады. Функция прототипі  компиляторға функция туралы информация
береді де, сәйкесінше компилятор типтер сай келуін тексереді. Функция
әртүрлі типті мән қайтара алады, М, int,void,float т.б.



                Функцияның формальды және нақты аргументтері.


Айнымалылар жергілікті және сыртқы болуы мүмкін. Жергілікті айнымалылар
функция ішінде сипатталады да сонда ғана “көрінеді”. Сыртқы айнымалылар кез
келген функция сыртында сипатталады да, сол функцияның кез келген жерінде
қолданылады. Кез келген функцияны анықтау үшін форматы:
<тип нәтиже> <функция аты> (параметр тізімі)
{
<функция денесі>
}
Mысалы:
#include 
Int max (int m, int n, int k);
Main ( )
{ int a,b,c;
Printf (‘a,d,c=’);
Scanf (“%i,%i”,&a,&b,&c);
Priktf (“max (a,b,c)=%i”, max (a,b,c));
Return (0);
}
Int max (int m, int n, int k);
{
Int d;
D=(m>n)? m:n;
D=(d
int prim (int *pa, int *pb);
int main ( )
{
int ia, ib, ic;
scanf (“%i,%i”,&ia,&ib);
ic=prim (&ia,&ib);
printf (“kob=%d\n”,ic);
return (0);
}
int prim (int *pa, int*pb);
{
int q;
q=*pa * *pb;
return (q);
}
С++-те аргументтерді беру барысында көрсеткіш орнына тікелей сілтеме беруге
болады. Сілтеме де аргументке сілтейді, бірақ көрсеткішті айқындау
операторын қолдануды қажет етпейді. Мысалы, төмендегі С++ тіліндегі
программада функцияны шақырғанда адрес алу операторы, ал функция денесінде
көрсеткіш опраторлары қатыспайды.
#include 
Int prim (int &pa, int &pb);
Int main ( )
Int ia, ib, ic;
cin >>ia; cin >>ib;
Ic=prim (ia,ib);
cout >< “kob=”<
Void primer(void);
Int main ( )
{
printf (“cанның кубын анықтау”);
Primer ( );
Return (0);
}
Void primer (void)
{
int t=8;
Printf (“t-ның кубы=%d\n”,t*t*);
}
Функция аргументі ретінде массивті беруге болады, мұнда функция массивтің
бірінші элементінің адресін көрсеткіш түрінде қабылдап алады.
Мысалы:
#include 
void summ_pr(int *prmas);
int main()
{
int inmas[5]={10,4,16,0,45};
summ_mas(inmas);
return(0);
}
void summ_pr(int *prmas)
{
int t,s;
for (t=s=0; t<5; t++) s+=prmas[t];
printf(“массивтің элементтерінің қосындысы=%i \n”,s);
}
Функцияның аргументі ретінде массивті беру барысында массивті өлшемі
белгісіз түрде де көрсетуге болады. Мына түрде void pr_mas(float mas[])
сипатталады.

                      Рекурсия. Рекурсивті алгоритмдер.

Өзін өзі шақыратын функция рекурсия деп аталады.Рекурсия тереңдігі
дегеніміз – функция мәнін есептеуде өзін-өзі шақыру саны. Рекурсивті
программалау стек принципіне сүйенеді.
Рекурсия түрлері мынадай:
    • сызықтық рекурсия;
    • параллель рекурсия;
    • қосалқы рекурсия;
    • жоғары ретті рекурсия.
Рекурсивті алгоритмдер мысалдары:
6!- алты факториялды есептеу алгоритмі:
#include 
double fact(int n);
int n=6;
double f;
f=fact(n);
printf(‘6!=%10.0f\n”,f);
return (0);
}
double fact(int n)
{
if (n<1) return(1.0)
else
return(n*fact(n-1);
}
Евклид алгоритмі бойынша екі санның ең үлкен ортақ бөлгіші табу алгоритмі:
#include 
#include 
double euob(double n, double m);
int main ()
{
double f;
double n=1470;
double m=693;
f=euob(n,m);
printf(“f=%10.0f \n”, f);return(0);
}
double euob(double n, double m)
{
w=floor(fmod(n,m);
if (w==0) return(m);
else return(euob(m,w));
}

Дәріс №8.Өзін-өзі тексеру сұрақтары немесе тестер

1. Ішкі программа дегеніміз не?
2. Функция қандай типті мәндер қайтара алады?
3. Рекурсияның қандай түрлері бар?

                    Дәріс №9 Қатарлық тип. Атаулар. Жады.
    • Қатарлық тип.
    • Атаулар.
    • Жады.

                                Қатарлық тип


Қатарлық  типтер  символдар  тізбегіне  айтылады.   қатарлық  типтер   char*
(символ  кµрсеткіші)  типінде  анықталады.   Кµрсеткіш  жадтағы   орналасқан
адресін білдіреді.  қатарлық  типті  айнымалылар  қатарлық  типтегі  бірінші
тұрған символ адресіне байланысты болады. Мысалы:

char *str = "HELLO";

қатарлы тип пен қатарлы тип айнымалылардың жадта орналасуы кµрсетілген.
                                    [pic]

    Сурет 9.1 Қатарлы тип пен қатарлы тип айнымалылардың жадта орналасуы

Литерал қатарлы типтер қос жоғары  үтірлер  аралығына  жазылады.  Компилятор
әрқашан литерал қатарлы типтердің соңын білдіретін символ  белгілеуі  керек.
қатарлы типтің кез-келген символын ажратып жазу мүмкін.

"Name\tAddress\tTelephone"       // табулациямен ажратылған сµз

"ASCII character 65: \101"                       // 'A' арналады '101'

Бір қатарға симайтын ұзын қатарлы типтер (\)  символы  жәрдемінде  ажратылып
жазылуы мүмкін. мысалы:

“ biz inf 12 top \
studentteri Universitettin \
en bilgir studentteri”
Бұл “ biz inf 12  top  studentteri  Universitettin  en  bilgir  studentteri”
мағынасын береді.

Көп  жағдайда  программа  “А”  қатарлы  тип  пен  ‘А’   символын   шатастыру
нәтижесінде қәте нәтиже береді. Бұл екеуі бір біріне тең емес,  біріншісі  А
2 байт және ‘\0’ символымен аяқталады, екіншісі бір байт кµлем иелейді.

                                   Атаулар


Программалау тілінде программаны құру үшін әр түрлі мақсатты сөздерден  және
аттардан  пайдаланамыз.  Біз  айнымалы  аттарын  енгізуге  мысалдар  кµрдік.
Бұлардан басқа функция аттары, тип аттары және  макро аттары бар.
Аттар (сөздер)  программалар  құруда  программа  құрушыға  түсінікті  сµздер
жиындығын құрайтын мағынаға ие сµздер мен мәндерді ұйымдастыруға  ыңғайлылық
тудырады. Нәтижеде, компилятор оларды орындағанда сол аттардан  пайдаланады.
Мысалы, temperatura айнымалысы сол атты  жадта  бірнеше  байттардан  тұратын
айнымалыға орын ажратады.  Кейінірек,  компилятор  сол  адресте  сол  есімді
(атты) шақырады.
C++ программалау тілі тµмендегі жарамды аттарды (идентификатор) жарату
құралдарынан пайдаланады. Есім (ат) ең кемінде бір символ немесе одан кµп
символдардан олар әріптер (‘A’..’Z’ немесе ‘a’.. ‘z’ ), цифралар (0..9)
немесе тµменгі сызықша ( _ ) символдарынан тұрады. Тек бас символ цифра
болмауы тиіс. Бас әріппен басталған есім кіші әріпінен басталатын есімінен
айырмашылыққа ие.
Мысалы:
salary                // жарамды
salary2             // жарамды
2salary             // жарамсыз (цифрамен басталады)
_salary             // жарамды
Salary               // жарамды бырақ  salary дан басқа

                                    Жады

Компьютер программаны орындауда орындалатын программа кодтарын сақтау үшін
Random Access Memory (RAM) жадынан пайдаланылады. Бұны біз сақталатын кейін
бе келетін биттер (bit 0 және 1) тізбегін түсінеміз. Жад кейін 8 биттен
тұратын байт бµліктерінен құралады. Байттар тізбегі жадта адрестеледі.
Демек, әрі байт жадта µз адресіне ие.

Жадыдағы бит пен байттар
[pic]
С++ программа компиляторы жадтағы орналасуына  қарап,  мәндерді  орындалатын
кодқа айналдырады. Мысалы:

                                   int ayliq =12000;

қатарын  компилятор  жадта   ayliq  деп  аталатын  айнымалы  үшін  компьютер
жадынан орын ажыратады. Жадтан қанша орын ажырату алдын –  ала  кµрсетіледі.
Мысалы, integer бүтін сандар үшін компилятор жадтан  2  байт   орын  бµледі.
Ayliq атты айнымалы мәні  адрестелгенде бірінші байт орнын  айнымалы  адресі
түсінеді және компилятор программаны орындағанда айнымалы мәні бірінші  байт
адресінен іздейді. Мысалы:   12000  мәні  1214  нµмерлі  екі  байт  адресіне
сақталады.

       Figure 1.2        Representation of an integer in memory.
[pic]
Salary

(a two-byte integer whose address is 1214 )

Программистер айнымалы мәнінің анық адресіне µте аз жағдайда  қызығады.  Бұл
жадты жалпы ұйымдастырғанда және жадтағы адрестерді бµлгенде ғана  қажетті.

Дәріс №9.Өзін-өзі тексеру сұрақтары
        1. Қатарлық типтер қандай типте анықталады?
        2. Идентификатор дегеніміз не?

              Дәріс №10. Деректердің күрделі типтері: массивтер

1. Массив дегеніміз не? Массив қызметтері және сипатталуы.
2. Массивтің инициялизациялануы.
3. Массив элементтерімен жұмыс жасау.
4. Символдық массивтер.
5. Көп өлшемді массивтер.

           Массив дегеніміз не? Массив қызметтері және сипатталуы.

Массив дегеніміз - бір атпен аталған, әртүрлі   индекстелген бір типті
элементтер жиынтығы.
Қасиеттері:
Массивтің қасиеттерін анықтайтын 4 негізгі принципі бар:
-массивте элементтер деп аталатын мәндер сақталады;
-массивтің барлық элементтері бір типті болуы керек;
-жадыда массивтің барлық элементі тізбектеліп орналасады және бірінші
элемент адрестің нөлдік индексін білдіреді;
-массив атауы тұрақты болып табылады және массивтің бірінші элементінің
адресінен тұрады.
Mассивтің сипатталуы:
<элементтің типі> <массив аты> [<элементтер саны>];
Мысалы, int a[12]; {12 элементтен тұратын массив}
char s[20]; {20 элементтен тұратын массив}
#define KOL 10 {}
int [KOL];

                        Массивтің инициялизациялануы.

Массивті инициялизациялау 3 тәсілмен анықталады:
- массивті құру барысында;
- массивті құру барысында бастапқы тұрақтыларды көрсету;
- программаның орындалу барысында;
- құру барысында массивтің бастапқы мәндері берілмесе, онда автоматты түрде
массив 0-мен толтырылады (NULL).
Мысалдар:
int a[3]={-1,0,1};
char buk [ ]={‘A’,’.’,’*’,’-‘,’!’,’i’,’u’};
float x[4]={0,1.5,7.55,-3.3E1,0,1.1457890,-1.1};
Массив элементінің саны мәндер санына сәйкес келмесе (3-ші мысал) көпшілік
компиляторда қате хабарланады, ал кейбірі автоматты түрде өлшемін үлкейтеді
немесе жетпесе (мән) 0-мен толықтырылады. 2-ші мысалда массивтің элементтер
саны мәндері санына қарай анықталады.

                     Массив элементтерімен жұмыс жасау.

Массив элементтерін қолдану үшін квадрат жақшада бүтін мәнді индекс
көрсетіледі. Мұндағы индекс массивтің базалық адресіне қарағанда элементтің
орнынының ығысу адресін анықтайды. С/С++ машиналық-бағытталған тіл
болғандықтан массивтің бірінші элементті 0-ші индекстен басталып
нөмірленеді, себебі массивтің бірінші элементті оның базалық адресінің
басынада орналасады да бірінші элементтің адресін алу үшін ешқандай ығысу
жасалудың қажеті жоқ. Мысалы, 5-ші элементтің адресін алу үшін базалық
адрестен бастап, 4 элементке ығысу орындалуы тиіс. Массивпен жұмыс жасауда
алдымен массив сипатталады. Мұнда квадрат жақшада оның элементтерінің саны
көрсетіледі, ол өз кезегінде жадыдан бөлінетін ұяшықтар санын анықтайды.
Мысалы:
Int imas[6];
Сипатталуына сәйкес анықталған массивтің элементтерінің саны -6 және
элементтері 0-ден 5-ке дейін индекстелгендіктен мынадай қолданылу жолы
дұрыс болмайды:
Imas[6]=3667;
Массив элементін қолданғанда индекс ретінде үш түрлі мән беруге болады:
    • Сандық тұрақты.
    • Айнымалы.
    • Өрнек.
Мұндағы мәндердің нәтижесі массивтің сипаттамасындағы мәліметтерге сәйкес
логикалық корректі сан болуы тиіс.
Қолданылу мысалдары:
#define K 8
int imas[k]; /*8 элементтерен тұратын массив сипаты */
int w=6; /* w бүтін типті айнымалысының сипаты*/
imas[3]; /*массивтің 4-ші элементті */
imas[w]; /* массивтің 7-ші элементі */
imas[k-6]; /*массивтің 3-ші элементі */  Индекс массивтің жадыдан қанша
байт орын алатынынан тәуелсіз тікелей реттік нөмініне сілтейді.


                             Символдық массивтер

Егер программада жолдық мәліметтерді өңдеу қажет болса, онда оны символдар
массив ретінде қарастыру қажет. Мұндай массивте жолдың әр элементі үшін
жеке ұяшықтар бөлінеді және ең соңғы элементі ретінде жолдың соңы таңбасы
(\о) қойылуы тиіс.
Символдық массивті енгізу және инициализациялау мысалдарына программа
келтірейік:
#include 
main ()
{
char pan[12], razm[5];
static char opr[11]=”информация”;
razm[0]=’б’;
razm[1]=’а’;
razm[2]=’й’;
razm[3]=’т’;
razm[4]=\o’;
printf(“\n информатика сөзін енгізіңіз:“);
scanf(“%s”, pan);
printf(“\n %s \n”, pan);
printf(“\n %s \n”, razm);
printf(“\n %s \n”, opr);

}
Көріп отырғанымыздай символық массивке енгізілетін жолдық мәннің
ұзындықтары бірге арттырылып алынып отыр. Ол орын жолдың соңы таңбасына
арналады. Инициализациялау барысында ол таңб арнайы қойылады.

                            Көп өлшемді массивтер

Бір типті элементтер жиынтығын өңдеуде  олардың  жадыда  санына  қарай  және
элементтерін қолдану моделіне қарай анықтап сипаттау мүмкіндігі  бар.  Соған
байланысты массивтің өлшемі анықталады деп есептеледі. Демек,  индекстерінің
көрсетілуіне қарай бір өлшемді, екі  өлшемді  т.с.с.  массивтерді  анықтауға
болады. Екі немесе одан да көп өлшемді массивтеркөп  өлшемді  массивтер  деп
аталады. Сәйкес өлшемде сипттау үшін квадрат  жақшаларда  олардың  өлшемдері
көрсетіледі. Мысалы, екі  өлшемді  массив  екі  квадрат  жақшамен  анықталып
төмендегідей сипатталады:
float massiv[3][4];
Мұндағы massiv массив атауы, ал массивтің 12 элементі бар, массив  0-ден  2-
ге дейін индекстелетін 3  жолдан  және  0-ден  3-ке  дейін  индекстелетін  4
бағаннан тұрады.
Практикада массив  өлшемі  көбінесе  үш  өлшемдіден  аспайды.  Массивті  екі
өлшемді түрде сипаттағанмен  ол  ЭЕМ  жадысында  тізбектелген  бірдей  типті
мәндер тізбегі ретінде  орналатырылады  да,  массивтің  алғашқы  элементінің
орынының адресі-базалық адресі массив атуына беріледі. Жалпы массив атауы  -
өз бетінше көрсеткіш болып табылады.
С/С++  тілдерінде   практикада  математикалық  матрица  түрінде  анықталатын
есептерді қарастырғанда көп өлшемді  массив  құру  міндетті  емес.  Оны  бір
өлшемді массив түрінде  ұйымдастыруға  болады.   Ал,   элементтерін  ретімен
қолдану үшін оның реттік нөмірін  сәйкес  анықтау  формуласын  дәл  анықтаса
жеткілікті.    Себебі    компьютерде    көп    өлшемді    массив     түрінде
сипатталғаныменбірдей элементтер тізбегі басқарылады.
Мысалы, a[3,4] массивінің a[і,j] –ші элементін қолдану  ретін  қарастырайық.
Ол үшін 12 элементтен тұратын бір өлшемді массивті төмендегідей  сипаттайық:

Float a[12];
Ал, a[і,j] –ші элементін мына түрде өрнектеледі - a[i*4+j].
Мысалы, 2 жолы мен 3 бағанының қиылысуындағы элементті қолдану үшін оның
a[1][2] индекстерімен анықталатыны белгілі. Ал  жоғарыдағы a[i*3+j]
өрнегіне қоятын болсақ a[1*4+2]=a[6] болады. Бұдан екінші жолдың 3-ші
элементті тізбекте 7-ші екендігін, ал оны қолдану үшін массивтің базалық
адресіне қарағанда 6 элементке жылжу қажеттігін аңғару қиын емес.

Дәріс №10.Өзін-өзі тексеру сұрақтары немесе тестер

   1. Массив атауы айнымалы ма?
   2. Массивтің нөлден бастап нөмірленуі неден тәуелді?
   3. Көп өлшемді массивтің бір өлшемді массив ретінде басқарылуына мән
      беріңіз.

              Дәріс №11. Деректердің күрделі типтері: массивтер

6. Массив дегеніміз не? Массив қызметтері және сипатталуы.
7. Массивтің инициялизациялануы.
8. Массив элементтерімен жұмыс жасау.
9. Символдық массивтер.
10. Көп өлшемді массивтер.

           Массив дегеніміз не? Массив қызметтері және сипатталуы.

Массив дегеніміз - бір атпен аталған, әртүрлі   индекстелген бір типті
элементтер жиынтығы.
Қасиеттері:
Массивтің қасиеттерін анықтайтын 4 негізгі принципі бар:
-массивте элементтер деп аталатын мәндер сақталады;
-массивтің барлық элементтері бір типті болуы керек;
-жадыда массивтің барлық элементі тізбектеліп орналасады және бірінші
элемент адрестің нөлдік индексін білдіреді;
-массив атауы тұрақты болып табылады және массивтің бірінші элементінің
адресінен тұрады.
Mассивтің сипатталуы:
<элементтің типі> <массив аты> [<элементтер саны>];
Мысалы, int a[12]; {12 элементтен тұратын массив}
char s[20]; {20 элементтен тұратын массив}
#define KOL 10 {}
int [KOL];

                        Массивтің инициялизациялануы.

Массивті инициялизациялау 3 тәсілмен анықталады:
- массивті құру барысында;
- массивті құру барысында бастапқы тұрақтыларды көрсету;
- програманың орындалу барысында;
- құру барысында массивтің бастапқы мәндері берілмесе, онда автоматты  түрде
массив 0-мен толтырылады (NULL).
Мысалдар:
int a[3]={-1,0,1};
char buk [ ]={‘A’,’.’,’*’,’-‘,’!’,’i’,’u’};
float x[4]={0,1.5,7.55,-3.3E1,0,1.1457890,-1.1};
Массив элементінің саны мәндер санына сәйкес келмесе (3-ші  мысал)  көпшілік
компиляторда қате хабарланады, ал кейбірі автоматты түрде өлшемін  үлкейтеді
немесе жетпесе (мән) 0-мен толықтырылады. 2-ші мысалда массивтің  элементтер
саны мәндері санына қарай анықталады.

                     Массив элементтерімен жұмыс жасау.

Массив  элементтерін  қолдану  үшін  квадрат  жақшада  бүтін  мәнді   индекс
көрсетіледі. Мұндағы индекс массивтің базалық адресіне қарағанда  элементтің
орнынының  ығысу  адресін   анықтайды.   С/С++   машиналық-бағытталған   тіл
болғандықтан   массивтің   бірінші   элементті   0-ші   индекстен   басталып
нөмірленеді, себебі  массивтің  бірінші  элементті  оның  базалық  адресінің
басынада орналасады да бірінші элементтің адресін алу  үшін  ешқандай  ығысу
жасалудың қажеті жоқ. Мысалы,  5-ші  элементтің  адресін  алу  үшін  базалық
адрестен бастап, 4 элементке ығысу орындалуы тиіс. Массивпен  жұмыс  жасауда
алдымен массив сипатталады. Мұнда квадрат жақшада оның  элементтерінің  саны
көрсетіледі, ол өз кезегінде жадыдан бөлінетін ұяшықтар санын анықтайды.
Мысалы:
Int imas[6];
Сипатталуына  сәйкес  анықталған  массивтің  элементтерінің  саны  -6   және
элементтері 0-ден  5-ке  дейін  индекстелгендіктен  мынадай  қолданылу  жолы
дұрыс болмайды:
Imas[6]=3667;
Массив элементін қолданғанда индекс ретінде үш түрлі мән беруге болады:
    • Сандық тұрақты.
    • Айнымалы.
    • Өрнек.
Мұндағы мәндердің нәтижесі массивтің  сипаттамасындағы  мәліметтерге  сәйкес
логикалық корректі сан болуы тиіс.
Қолданылу мысалдары:
#define K 8
int imas[k]; /*8 элементтерен тұратын массив сипаты */
int w=6; /* w бүтін типті айнымалысының сипаты*/
imas[3]; /*массивтің 4-ші элементті */
imas[w]; /* массивтің 7-ші элементі */
imas[k-6]; /*массивтің 3-ші элементі */  Индекс массивтің жадыдан қанша
байт орын алатынынан тәуелсіз тікелей реттік нөмініне сілтейді.


                             Символдық массивтер

Егер программада жолдық мәліметтерді өңдеу қажет болса, онда оны символдар
массив ретінде қарастыру қажет. Мұндай массивте жолдың әр элементі үшін
жеке ұяшықтар бөлінеді және ең соңғы элементі ретінде жолдың соңы таңбасы
(\о) қойылуы тиіс.
Символдық массивті енгізу және инициализациялау мысалдарына программа
келтірейік:
#include 
main ()
{
char pan[12], razm[5];
static char opr[11]=”информация”;
razm[0]=’б’;
razm[1]=’а’;
razm[2]=’й’;
razm[3]=’т’;
razm[4]=\o’;
printf(“\n информатика сөзін енгізіңіз:“);
scanf(“%s”, pan);
printf(“\n %s \n”, pan);
printf(“\n %s \n”, razm);
printf(“\n %s \n”, opr);

}
Көріп отырғанымыздай символық массивке енгізілетін жолдық мәннің
ұзындықтары бірге арттырылып алынып отыр. Ол орын жолдың соңы таңбасына
арналады. Инициализациялау барысында ол таңб арнайы қойылады.

                            Көп өлшемді массивтер

Бір типті элементтер жиынтығын өңдеуде олардың жадыда санына қарай және
элементтерін қолдану моделіне қарай анықтап сипаттау мүмкіндігі бар. Соған
байланысты массивтің өлшемі анықталады деп есептеледі. Демек, индекстерінің
көрсетілуіне қарай бір өлшемді, екі өлшемді т.с.с. массивтерді анықтауға
болады. Екі немесе одан да көп өлшемді массивтеркөп өлшемді массивтер деп
аталады. Сәйкес өлшемде сипттау үшін квадрат жақшаларда олардың өлшемдері
көрсетіледі. Мысалы, екі өлшемді массив екі квадрат жақшамен анықталып
төмендегідей сипатталады:
float massiv[3][4];
Мұндағы massiv массив атауы, ал массивтің 12 элементі бар, массив 0-ден 2-
ге дейін индекстелетін 3 жолдан және 0-ден 3-ке дейін индекстелетін 4
бағаннан тұрады.
Практикада массив өлшемі көбінесе үш өлшемдіден аспайды. Массивті екі
өлшемді түрде сипаттағанмен ол ЭЕМ жадысында тізбектелген бірдей типті
мәндер тізбегі ретінде орналатырылады да, массивтің алғашқы элементінің
орынының адресі-базалық адресі массив атуына беріледі. Жалпы массив атауы -
өз бетінше көрсеткіш болып табылады.
С/С++  тілдерінде  практикада математикалық матрица түрінде анықталатын
есептерді қарастырғанда көп өлшемді массив құру міндетті емес. Оны бір
өлшемді массив түрінде ұйымдастыруға болады.  Ал,  элементтерін ретімен
қолдану үшін оның реттік нөмірін сәйкес анықтау формуласын дәл анықтаса
жеткілікті. Себебі компьютерде көп өлшемді массив түрінде
сипатталғаныменбірдей элементтер тізбегі басқарылады.
Мысалы, a[3,4] массивінің a[і,j] –ші элементін қолдану ретін қарастырайық.
Ол үшін 12 элементтен тұратын бір өлшемді массивті төмендегідей сипаттайық:

Float a[12];
Ал, a[і,j] –ші элементін мына түрде өрнектеледі - a[i*4+j].
Мысалы, 2 жолы мен 3 бағанының қиылысуындағы элементті қолдану үшін оның
a[1][2] индекстерімен анықталатыны белгілі. Ал  жоғарыдағы a[i*3+j]
өрнегіне қоятын болсақ a[1*4+2]=a[6] болады. Бұдан екінші жолдың 3-ші
элементті тізбекте 7-ші екендігін, ал оны қолдану үшін массивтің базалық
адресіне қарағанда 6 элементке жылжу қажеттігін аңғару қиын емес.

Дәріс №11.Өзін-өзі тексеру сұрақтары немесе тестер

   1. Массив атауы айнымалы ма?
   2. Массивтің нөлден бастап нөмірленуі неден тәуелді?
   3. Көп өлшемді массивтің бір өлшемді массив ретінде басқарылуына мән
      беріңіз.

                Дәріс №12. Деректердің құрылымы (структурасы)

1. Структуралар түсінігі
2. Структуралар мен функциялар
3. Структуралар массиві
4. Структураларға көрсеткіш

                           1 Структуралар түсінігі


Структура – бір атпен біріктірілген бір немесе бірнеше әр түрлі типті
айнымалылар тобы. Структура struct қызметші сөзімен құрылады. Структураның
жалпы құрылымы төмендегідей:
struct тег {
тип1 иден1;
тип2 иден2;
…  …
типN иденN;
};
мұндағы тег мәліметтердің жаңа типі болып саналады және оны айнымалыны
сипаттауда қолдануға болады.
Сипатталған структура негізінде айнымалы құру үшін
struct <тег> <айнымалы>
С++ тілінде struct қызметші сөзін көрсетпесе де болады:
<тег> <айнымалы>
Айнымалыны структураны құру кезінде де анықтауға болады:
struct тег {
тип1 иден1;
тип2 иден2;
…  …
типN иденN;
} <айнымалы>;
Егер структура типті басқа айнымалылар құрылмайтын болса, структура
тегінкөрсетпеуге болады. Мұндай структура атаусыз (безымянный) деп аталады:
struct {
тип1 иден1;
тип2 иден2;
…  …
типN иденN;
} <айнымалылар тізімі>;
Сипаттау мысалы:
Struct strtype {
Char fam[25];
Char gor[20];
Int god;
Float zarp;
};
Мұнда strtype атты структура құрылды. Осы структура арқылы айнымалы
төмендегідей сипатталады:
Struct rab strtype;
Немесе былайша да сипаттауға болады:
Struct strtype {
Char fam[25];
Char gor[20];
Int god;
Float zarp;
} rab;
Структуралар іштестірілген де болуы мүмкін:
struct тег1 {
тип1 иден1;
тип2 иден2;
тип3 иден3;
};
struct тег2 {
тип1 иден1;
тип2 иден2;
struct тег1 иден3;
};
Қолданылу мысалы:
struct adr {
char ul[20];
int dom;
int kb;
}
struct adam {
char fam[25];
struct adr;
}

Сәйкесінше айнымалыны сипаттау мысалы:
struct adam sotr;
ал, қолданылу мысалы:
sotr.adr.dom=5;
Коріп отырғанымыздай структура элементтерін нүкте операторының көмегімен
алуға болады, форматы мынадай:
<айнымалы>.<элемент>
Структура элементтері циклда енгізілгенде _flusshall() –функциясы кіріс
легіндегі жаңа жол символын өшіруге, яғни буферді тазалауға қолданылады.
Жаңа жол символы scanf( ) функциясын қолданғанда қойылады. Ал, gets( )
функциясы бұл таңбаға дейінгі символдарды ғана оқиды.

&&&
$$$002-012-002$3.2.12.2  Стуктуралар мен функциялар

Кейбір жағдайларда структураны функция денесінде қолдану қажеттігі
туындайды. Ондай жағдайда функция прототипінде структураны функция
параметрі ретінде беру керек (С++ тілінде struct қызметші сөзін көрсету
міндетті емес):
// С және С++ тілдерінде
<функция типі> <функция аты> (struct <тег> <айнымалы>)
// Тек қана С++ тілінде
<функция типі> <функция аты> (<тег> <айнымалы>)
Структура элементтерінің тұрақты тізімін беруге немесе инициализациялауға
болады.
Struct adam sotr={“Романов”, “Айболова”,34,50}
Функцияға структура типті объектіні беру тәсілдері үш түрлі:
    • Компоненттерін жеке-жеке беру.
    • Структураны толығымен беру.
    • Структураға көрсеткішті беру.
Компоненттерін жеке беру мысалы:
Struct adr funrpr(char r[20], int k, int d)
{
Struct adr f;
f.ul=r;
f.dom=d;
f.kb=k;
return f;
}

                            Структуралар массиві

Структуралар массивін сипаттау структура типті айнымалыны сипаттауға ұқсас.
Мысалы, struct <тег> <айнымалы-массив>.
Сипаттау ретін төмендегі мысалдан нақты аңғаруға тырысыңыз:
#define N 10
struct mas {
char group[8];
int count;
int otest;
} stud[N];
Немесе бірге тағайындау арқылы төмендегідей де сипатталады:
#define N 3
struct mas {
char group[8];
int count;
int otest;
} stud[N] = {“MKO4”,23,2,
“IKO3”,19,3,
“IKO2”, 23,2
}
Мұндай массивтер өлшемі компиляциялау барысында анықталады. Оның структура
элементтерінің өлшемі мен массив элементтерінің санының көбейтіндісіне тең.

                          Структураларға көрсеткіш

Көрсеткіш келесі түрде сипатталуы мүмкін:
struct <тег> *<айнымалы>
Бұндай жағдайда структуралық айнымалының кез-келген элементін мына
әдістердің бірімен алуға болады:
(*<айнымалы>).<элемент> немесе <айнымалы> –> <элемент>
Функцияға күрделі құрылымды структура берілетін болса, онда оның толығымен
көшірмесін берудің орынына, оған көрсеткішті қолданған тиімді. Структураға
көрсеткіштер қарапайым  айнымалыларға  көрсеткіштер  секілді.
Сипаттау мысалдары:
Struct strtype *p;
Мұндағы р айнымалысы strtype типті структураға көрсеткіш деп аталады. Ал,
*р – структураның өзі, оның элементтері (*p).dom, (*p).god түрінде
қолданылады.
Көрсеткішті пайдалану жолдары:
Struct strtype sotrudn, *p;
P=&sotrudn;
Printf(“sotrudn info: %s \t %i \t %6.2f \n”, (*p).fam, (*p).god,
(*p).zarp);
Мұнда (*р).fam бейнесінде жақша міндетті түрде болуы тиіс, себебі нүкте (.)
операторының приоритеті * операторының приоритетінен жоғары. Структураларға
көрсеткіштер жиі қолданылады. Сондықтан оның элементтерін қолдану барысында
ыңғайлы болатын қысқаша жазу формасы қарастырылған. Оның түрі мынадай:
P - ><структура элементі>
Жоғарыдағы мысалдағы шығару жолы осы жазу формасын қолданып төмендегідей
жазылады:
Printf(“sotrudn info: %s \t %i \t %6.2f \n”, p->fam, p->.god, p->zarp);
Нүкте және -> операторларының орындалу реті солдан оңға қарай және
приоритеттері басқа операторлардан жоғары. Қолдану барысында осы қасиетін
мұқият ескеру қажет.
Әртүрлі уақытта әрүрлі типті және әртүрлі өлшемді обьектілерді сақтай
алатын айнымалы –біріктіру деп аталады. Өлшемдеріне және реттеуге қатысты
талаптарды компилияция  орындайды. Жадының бір аймағында әртүрлі мәндерді
сақтауға мүмкіндіктері бар.
Біріктіру синтаксисі структура синтаксисі секілді:
Union unprim {
Int iman;
Float fman;
Char *sman;
} mainun;
Си тілінде мәндер типіне жаңа атау беруге болатын құрал - typedef құралы
бар.

Дәріс №12.Өзін-өзі тексеру сұрақтары
   1. Структуралар не үшін құрылады?
   2. Структуралар элементтері қандай типті бола алады?
   3.  Структуралар  элементтерін  енгізу-шығаруда  басқару   элементтерінің
      қойылу реттері қандай?
   4. typedef құралы не үшін қолданылады?

Дәріс №13. Файлдар

    • Файлдық типті айнымалыларды сипаттау. Файлды  қолдану режимдері
    • Файлдық енгізу-шығару.

       Файлдық типті айнымалыларды сипаттау. Файлды  қолдану режимдері

Файлдан оқу және файлға енгізу үшін ең алдымен файл fopen функциясының
көмегімен ашылуы тиіс. Бұл функция операциялық жүйе арқылы орындалатын
әрекеттерді ұйымдастыру жұмысын орындайды және файлмен мәлімет алмасуға
арналған көрсеткішті қайтарады.
Ал, файлға көрсеткіш файл туралы информациялардан тұратын құрылымға
(жазбаға) сілтейді. Мұндағы информация мынадай сұрақтарының жауабынан
тұрады:
− буфер адресі,
− буфердегі ағымды литердің күйі,
− файлдан оқуға немесе жазуға ашық па?,
− файлдың соңғы таңбасы кездесті ме?
Мұндай құрылым сипаттамасы  кітапханасындағы FILE типіндеберіледі.
Қолдану үшін мынадай декларация берілсе жеткілікті:
FILE * fp;
FILE * fopen (char * name, char * m);
Мұндағы: fp – FILE типіндегі көрсеткіш, ал fopen FILE – ге көрсеткішті
қайтарады. Fopen функциясы мына түрде қолданылады:
fp = fopen (name, m);
Мұндағы: name – файлдың атын меншіктейтін жол; ал, m – файлды қолдану
режимі; яғни бұл да жол, қолданушы файлды қалай қолданатынын білдіреді,
төмендегідей мәндердің бірін иелене алады:
" r " – (read) оқу режимі;
" w "- ( write) жазу;
" a "- ( apprnd) толықтыру;
Кейбір жүйеде тексттік және бинарлық файлдар болып жіктеледі, бұл жағдайда
режим жолына "в" (binary – бинарлық) немесе “t”(тексттік) таңбасы
тіркеледі. Файлмен жұмыс жасау барысында қате кездессе, онда fopen
функциясы NULL мәнін қайтарады.
Мысалы,  FILE*fin, * fout;
fin=fopen (“PRIMER.dat”,”’r”);
fout=fopen (“RESULT.dat”, “w”);
1-ші жолда 2:fin,fout – файл көрсеткіші құрылады, ал төменгі жолдарда
сәйкесінше оқуға және жазуға арналған файлдар ашылады.
Fopen() функциясы файлдың аталған көрсеткішін қабылдайды, программаның
орындалу барысында олардың мәндері жасанды өзгертілмеуі тиіс. Мұндай
файлдағы 2-ші параметр файлдарымен мәлімет алмасу режимін анықтайды. Файл
мынадай режимдерде ашылуы мүмкін:
- текстік;
- екілік;
Текстік режимде ашу үшін режимді көрсеткенде қасына «t» символын тіркеу
арқылы жүзеге асады;
Режимдер кестесі:
|Режим   |Сипаты                                                   |
|а       |Файл мәндерімен толықтырылуы үшін ашылады. Егер файл     |
|а+      |жоқ болса, ол құрылады. Жаңа мән соңына тіркеледі;       |
|r       |Жоғарыдағы секілді, тек оқұға да болады;                 |
|r+      |Файлды тек оқу үшін ашады, файл жоқ болса, ашылмайды;    |
|w       |Файлды оқуға да, жазуға да болады;                       |
|w+      |Жаңа файл ашады, бұрын бар болса, мәнін өшіреді.         |
|        |Жаңа файлды мән жазуға да, одан оқуға да мүмкіндік       |
|        |береді. Файл болса, мәні тазартылады.                    |


R+,w+,a+ режимдерін қолдануда, яғни оған оқуды және жазуды бір уақытта
орындалу барысында файл көрсеткішінің Fsetpos(), fseek(), немесе
rewind()файлдары көмегімен ағымды позицияларын модификациялау керек.
Программа жұмысы аяқталғанда Си-де автоматты түрде барлық ашық файлдар
жабылады, ал файлды жабу үшін fclose(fin) қолданылады.
С++ тілінде:
Файлмен мәлімет алмасу мақсатында ifstream және ofstream кластарын
қолданған тиімді. Ол үшін < fstream. h > тақырыптық файлы ашылуы тиіс.
Мұнда, сәйкесінше, ifstream класының объектісі myof және ostream класының
mygf лектері құрылып көрсетілген файлмен  байланысады.
Мысалы,
Ifstream myof(“prim.in”,ios::in);
Ofstream mygf(“prim.out”,ios::out);
• Бір объектімен тізбектеп бірнеше лекті байланыстыру қажет болса, онда ол
төмендегідей ретпен орындалады:
Ifstream myof;
. .  .
myof(“prim.in”);
. . .
myof.close();
myof.open (“prim2.in”);
. . .
myof.close();
• Файлмен мәлімет алмасу мүмкіндігінің режимін өзгерту – файлдық объектінің
сипатындағы екінші аргументін өзгерту арқылы жүзеге асады.
Мысалы, Ofsetream myof ( “prim.in”,ios::app | ios::nocreate); - мұндағы
файл бар болса ғана myof объектісі құрылып, байланыс орнатылады, себебі
ios::nocreate аргументі берілген, яғни файл болмаса, объект құрылмайтынын
білдіреді. Ал, ios::app аргументі файлға шығарылатын мәндер файлдың соңына
қосылатынын анықтайды.
Флаг-аргументтер  биттік  |  -  «немесе»  амалының  көмегімен   біріктіріліп
анықтала алады.
Файлдық  лекті  анықтау  барысында  қолданылатын  аргументтерді   анықтайтын
флагтар төмендегідей:
|флаг           |Мағынасы                                              |
|ios::in        |Файл оқуға ашылады                                    |
|ios::out       |Файл жазуға ашылады                                   |
|ios::ate       |Объект құрылған соң, ағымды көрсеткіш файлдың         |
|               |соңына орнатылады                                     |
|ios::app       |Мәндер файлдың соңына жазылады                        |
|ios::trunc     |Егер файл бар болса, ол тазартылады                   |
|ios::nocreate  |Файл болмаса, онда объект құрылмайды                  |
|ios::noreplace |Файл бар болса, онда объект құрылмайды                |
|ios::binary    |Файл екілік режимде ашылады (қалыпты жағдайда         |
|               |тексттік режим)                                       |


feоf (FILE * fp) – функциясы файлдың соңын анықтайды.
Файлды жабу үшін:
Int fclose(FILE *fp) функциясы қолданылады, яғни файлдық көрсеткішпен
орнатылған байланысты үзеді.
• Файлмен мәлімет алмасу үшін fstream класының объектісі де қолданылады:
Fstream io(“update.dat”, ios::in|ios::app); - бұл жағдайда көрсетілген файл
мәліметті оқуға және жазуға ашылады.
• Seekg() файлдан оқу ал, seekp() файлға жазу барысында функциялары файлдың
ағымды позициясының маркерін басқаруға қолданылады.
Мысалы, io.seekg(5, ios::cur) – оқу барысында маркерді ағымды орынынан 5
байтқа жылжыту;
io.seekg(-7, ios::end)- маркерді соңынан бастап 7 байтқа жылжыту керектігін
білдіреді.
Аргументтер:
Io::cur – ағымды орынынан; Io::beg – файл басынан;
Io::end - файл соңынан жылжытылатынын білдіреді.
Файлдың лектік күйін анықтау функциялары:
|Функция    |Түсініктеме                                                  |
|eof()      |Файл соңын кездестірсе, 0-дік емес мән қайтарады             |
|fail()     |Лекте қате кездессе 0- ден өзге мән қайтарады                |
|bad()      |Енгізу-шығару барысында мағыналы қате кетсе, нөлден өзге     |
|           |мән қайтарады, онда лекпен жұмыс тоқтатылғаны дұрыс. Лек     |
|           |күйінің биттік мәндері анықталмаса, 0-ге тең емес мән береді.|
|rdstate()  |Мына тұрақтылардың бірін, яғнм лектің ағымды күйін           |
|           |анықтайтын мәнді қайтарады:                                  |
|           |Ios::goodbit - қате жоқ                                      |
|           |Ios::eofbit – файл соңына жетті                              |
|           |Ios::failbit – форматтау немесе түрлендіру қатесі            |
|           |Ios::badbit - маңызды қате                                   |
|clear()    |0-ге тең болса тазарту                                       |

                           Файлдық енгізу-шығару.

Файлдан оқығанда Pascal-дағы секілді,
fprinf(fin,’формат’, <айнымалы>);
fscanf(fin,'формат', <айнымалы>);
fseek() функциясы:
Жалпы форматы:
Int fseek (FILE *str, long offset, int orig)
М, fseek (f, K, r)
Fseek функциясы f Көрсеткіші арқылы берілген файлдағы ағымды көрсеткішті К
байтқа жылжытады. Жылжыту:
- файлдың басынан (r=0)
- ағымды көрсеткіш тұрған (r=1)
- файлдың аяғынан (r=1) басталуы мүмкін.
Си- де r-дің мәні ретінде көрсету үшін қолданылатын 3 const қарастырылған:
SEEK_SET (файл басынан жылжу)
SEEK_CUR(ағымдағы позициядан бастау)
SEEK_END(файл соңынан)
Fseek() функциясы қызметі сәтті аяқталса 0-ді, әйтпесе EOF мәнін қайтарады.
• Ftell()-функциясы файл басынан бастап ығысқан шамамен анықталады, яғни
long типті мән қайтарады, ағымды көрсеткіштің рынын анықтайды.
long ftell(FILE*str)
 Ftell(f)
• Rewind функциясы ағымды көрсеткішті файлдың басынан орындайды.
rewind(FILE*str);
rewind(f) мынаған сәйкес мәнді қайтарады;
fseek(f, ol, seek_set);
Мысалы:
# include 
void main()
FILE *pf;        “tect.dat”-да=”ABCD”
Char c;
Long l; {С тілінде 64 кб-өлшенді файлдармен жұмыс жасауға
болады, сондықтан L-long типті. }
pf=fopen (“test.dat”, “r+t”);
c=f getc (pf); {“A”-ны алады}
putchar (c);{“A”-ны экранға шығару}
с=f getc(pf);{“B”-ны оқу}
putchar (c);{“B”-ны экранға шығару}
l=ftell(pf);{ағымы көрсеткіш мәнін меншіктейді,в-оқылғандықтан,L=2}
C= f getc(pf); {c-ны оқып экранға шығару}
putchar(c);
fseek  (pf,l,o);{ағымды көрсеткіш”Д”-да  тұрған  жерінен  “С”-ны  көрсетуге
көшеді,себебі функция басынан 2 бт жылжиды }
с=f getc(pf);
putchar(c);       {экранға ''C''-ны экранға шығарады }
fseek (pf,l,o);{ағымды көрсеткіш қайтадан “С''-ға сілтейді,енді оның орнына
“Е” файлға жазылады}
fputc (‘E’,pf);
fseek (pf,l,o); {ағымды көрсеткіш файл басына l=2 байтқа байланысты
жылжиды,
яғни “E”-ні көрсетеді}
с=f getc(pf); {экранға “Е''-ні шығарады}
putchar (c);
rewind (pf); {ағымды көрсеткіш файл басына көшіріледі.}
c=f getc (pf);
putchar (C);{С-ға файлдан «А» оқылады, экранға шығарады}
нәтижесінде:ABCCEA
get c () –берілген потоктан бір символды оқиды.

&&&
$$$002-013-100$Дәріс №13.Өзін-өзі тексеру сұрақтары

1.Файл дегеніміз не?
2.Файлдық лекті сәйкестендіруді қалай түсінесіз?
3.Файл бойымен жылжу, ағымдық көрсеткішті басқару функциялары қандай?

Дәріс №014. Графика

      • Графикалық режимде жұмыс жасау туралы.
      • Графикалық жүйені инициализациялау.
      • Қателерді өңдеу. Режимдердің ауысуы.

                    Графикалық режимде жұмыс жасау туралы

Дербес компьютер экраны текстік және графиктік режимдердің бірінде жұмыс
істейді. Графикалық режимде жұмыстың қалай жүргізілетінін қарастырайық.
Қазіргі  ДК-де,  негізінен,  растрлық   дисплейлер   қолданылады.   Олардағы
бейненің ең кіші элементі болып нүкте  –  pixel  (ағылш.,  picture  element)
табылады.  Дисплейдің  мүмкіндігі  –  бұл  көлденең  және   тік   орналасқан
пикселдер  саны  (стандартты  разрешение   –   640*480   нүкте).   Дисплейде
бейнеленетін сурет орталық процессор жадысының бейнежады  (видеопамять)  деп
аталатын арнайы облысында кодталып сақталады. Мәліметтер периодты түрде  осы
облыстан оқылып, бейнесигналдарға  түрлендіріледі  де  экранда  бейнеленеді.
Сурет  кодтарын  бейнесигналдарға  түрлендіруді  арнайы  электрондық  схема-
бейнеадаптер (видеоадаптер) жүзеге асырады. Ең кең  тараған  адаптерлер  VGA
және SVGA. C++  тілінде  бейнежадының  дербес  бөліктеріне  енуге,  түстерді
басқаруға,  әр  түрлі  формада  графикалық   бейнелер   тұрғызуға,   текстік
хабарламалар  шығаруға,  курсорды  басқаруға  мүмкіндік   беретін   көптеген
функциялардын тұратын графикалық  кітапхана  бар.  Бұл  функциялардың  нақты
бейнеадаптерлермен жұмысқа баптау қажетті графикалық драйверді  қосу  арқылы
қол жеткізіледі.  Драйвер  –  бұл  ДК-дің  құрылғыларын  басқаруға  арналған
арнайы программа. Адаптерлердің барлық түрлері  үшін  графикалық  драйверлер
Borland International фирмасымен құрастырылған. Олар BGI  (Borland  Graphics
Interface) кеңеймесімен  жеке  файлдарда  орналасқан.  Графикалық  драйверді
қосу үшін арнайы initgraph() функциясы қолданылады.
Көптеген графикалық функциялар  ағымдағы  позиция  көрсеткіші  деген  ұғымды
қолданады. Ол  таңдалған  пикселді  білдіреді  және  екі  бүтін  сан  арқылы
сипатталады: экранның горизонталь және  вертикаль  координаттары.  Нумерация
солдан оңға және жоғарыдан төмен қарай  жүргізіледі (нольден бастап).
Мысалы, EGA үшін 640*480 режимінде экран бұрышы мен оның центрінің
координаттары мынадай болады






                     Графикалық жүйені инициализациялау.

1. Драйверді және графикалық режимді таңдау detectgraph (&gd,  &gm)  функция
арқылы орындалады.
2. Драйверді жүктеу, графикалық жүйені  инициализациялауды  initgraph  (&gd,
&gm,  "BGI-файлдың  жолы")  функциясы   атқарады,   мұндағы   gd   және   gm
айнымалылары қажет драйвер мен
графикалық режимнің номерлері.  Егер   ВGI-файлдар   ағымдағы   директорияда
орналасса,  онда initgraph()функциясының үшінші параметрі ретінде бос  жолды
беруге болады initgraph (&gd, &gm, " ");
Графикамен жұмыс жаса барысында  мына  әрекеттер  тізбегі  арқылы  графиктік
режимді орнату жолдары жазылады:
#include 
#include 
#include 
void main ( )
{ int gd, gm, error;
detectgraph (&gd, &gm);
initgraph (&gd, &gm,” ”);
error=graphresult ( );
if (error !=grOk )
{ puts ("ошибка графики");
puts (grapherrormsg (error));
exit (1);
}
……………………………. // Программа денесі
closegraph ( );
exit (0) ;
}
                    Қателерді өңдеу. Режимдердің ауысуы.


1.Графикамен жұмыс жасағанда қате жағдайларды өңдеу үшін  graphresult  (  );
функциясы қолданылады. Ол соңғы  қолданылып  отырған  графикалық  функцияның
аяқталу кодын қайтарады. Қате болмаса, «0»  қайтарылады.  Әр  түрлі  қателер
типі үшін өздерінің аяқталу коды қарастырылған:

|Тұрақтылар      |Қате коды |Хабарлама                                |
|GrOK            |0         |Қате жоқ                                 |
|GrNoInitGraph   |-1        |Графика инициализацияланбаған            |
|GrNoLoadMcm     |-5        |Драйверді       жүктеуге       жадының   |
|                |          |жеткіліксіздігі                          |
|GrFontNotFound  |-8        |Шрифт файлы табылмаған                   |

Қате  кодының  сәйкес  мәнін  экранға  шығару  мүмкіндігі  бар.   Бұл   үшін
grapherrormsg  (қате  коды)  функциясы  қолданылады.  Ол  аргумент   ретінде
берілген аяқталу кодының сипаттамасынан тұратын жолға көрсеткіш қайтарады.
2.  Режимдерді ауыстыру.  Дисплейлік  адаптердің  текстік  режиміне  уақытша
ауысу үшін мына функция қолданылады:
restorecrtmode ();
Қайтадан графикалық режимге  ауысу  setgraphmode  (gm)  функциясымен  жүзеге
асырылады.
Ағымдағы  драйвер  үшін  графикалық  режимнің   максимал   мәнінің   номерін
getmaxmode ()
функциясы арқылы анықтауға болады.
Графикалық  жүйемен  жұмыс  жасап  болған  соң,  графикаға  бөлінген  жадыны
босату,  бейнеадаптер  буферін  тазарту,  алдыңғы  текстік  режимді  қалпына
келтіру  керек.  Барлық   әрекеттерді   closegraph   ()   функциясы   жүзеге
ауыстырады.
3. Түстерді, шрифттерді сызықтардың  стилін  және  бояу  стилін  тағайындау.
Түстерді көрсету үшін констандаларды пайдалануға болады.  Стандартты  түстер
палитрасы:

|BLACK      |0  |Қара              |DARKGRAY          |8     |Қара сұр        |
|BLUE       |1  |Көк               |LIGHTBLUE         |9     |Ашық көк        |
|GREEN      |2  |Жасыл             |LIGHTGREEN        |10    |Ашық жасыл      |
|GRAY       |3  |Сұр               |LIGHTCYAN         |11    |Ашық бирюза     |
|RED        |4  |Қызыл             |LIGHTRED          |12    |Ашық қызыл      |
|MAGENTA    |5  |Қызғылт (таңқурай)|LIGHTMAGENT       |13    |Ашық қызғылт    |
|           |   |                  |A                 |      |(ашық таңқурай) |
|BROWN      |6  |Қоңыр             |YELLOW            |14    |сары            |
|LIGHTGRA   |7  |Ашық сұр          |WHITE             |15    |ақ              |
|Y          |   |                  |                  |      |                |


Графиктік мәліметтер нақты  бір  бейнелер  арқылы  берілетіні  мәлім.  Тілде
бейнелерді тұрғызуға арналған арнайы функциялар қолданылады.

Дәріс №015.Өзін-өзі тексеру сұрақтары

1. Растрлық графика дегеніміз не?
2. Растрлық және векторлық графика айырмашылығы неде?

Дәріс №15. ОБЪЕКТІЛІ-БАҒЫТТАЛҒАН ПРОГРАММАЛАУ (ОБП)

    • Объектілі-бағытталған программалау негізі.
    • Кластар иерархиясы.
    • Объект қасиеттері: инкапсуляция, тұқым қуалау, полиформизм.
    • Конструкторлар мен деструкторлар.
Объектілі-бағытталған программалау негізі.
{Дәріс конспекті)
ОБП  элементтері  70-ші  жылдарда  Симула  тілінде  модельдеуде  қолданылды.
Қазірде кең құлаш  жайған  программалау  технологиясына  айналып  отыр.  ОБП
негізгі мақсаты – программа  құруда  деңгейін  көтеру.  С++  тіліндегіі  ОБП
негізін қалаушы – Бьярне  Страуструн,  80-жылдары  Bell  Labs  компаниясында
өңдеген.
С++ тілі объектілермен жұмыс жасауға бағытталған, ал С тілі  –  структуралық
программалауға  бағытталған.  С++тілінде   объект   класы   тұрақтылар   мен
айнымалылардан  және  оларға  қолданылатын  амалдардан   тұрады.   ОБП   -ды
қолданудың негізгі үш ерекшелігі бар:
1. Программа коды ықшамдалады және құрылымы жақсарады.
2. Программаға программалық бағыттарды қосу және алып тастау жеңіл
орындалады (программаны модернизациялау жеңіл, яғни онда бар кластың ұрпақ
класын құру арқылы жүзеге асырылады).
3. Тиімді құрылған класты кітапханалық файлдар сақтап, оны қажетінше
қолдану мүмкіндігі бар. ОБП-да объектілердің байланысы мен өзара
әрекеттестігінің схемасын сипаттау арқылы есеп пен оның шешімі
қарастырылады.

Кластар иерархиясы.

С++-тегі класс структураның кеңейтілген түрі және  объект  құруға  арналған.
С++-тегі класс шаблон секілді,  оның  негізінде  объектілер  құрылады.  Кез-
келген кластың  бірнеше  ішкі  кластары  болуы  мүмкін.  Кластар  иерархиясы
құрылады, баба класы жалпы  сипаттаға  әдістерден  тұрады.  Кластың  құрамын
арнайы кілттік сөздердің көмегімен реттеуге болады. Олар: public  -  «ашық»,
«көрінетін» бөлігі private  -  «тасаланған»  бөлігі  («жабық»)  protected  -
«қорғалған»  бөлігі.  «Көрінетін»  бөлігіндегі  сипатталған  әдістер  класты
қолданатын кез-келген  программадан  шақырылады,  яғни  кластың  интерфейсін
құрайды.  «Тасаланған»  бөлігіндегі  элементтер   тек   өзінің   әдістерінде
қолданылады, ал«қорғалған»  бөлігіндегі  элементтер өз  әдістері  мен  ұрпақ
кластарда қолданылады

Объект қасиеттері: инкапсуляция, тұқым қуалау, полиформизм.

Объект – класс  экземпляры.  Объектінің  қасиеттері  бар.  Оның  күйі,  оның
белгілерінің  мәндері  арқылы  беріледі.  Объектінің   негізгі   қасиеті   –
инкапсуляция.
• Инкапсуляция  дегеніміз  –  бір  структурада  мәліметтермен  қатар  оларды
өңдеуге арналған функциялардың берілуі (әдістердің).
●  Тұқым  қуалау  қасиеті  деп  баба  класынан  ұрпақтарына  мәліметтер  мен
әдістердің берілуін атайды.
Егер  кластың  атрибуттары  бір  баба  кластан   берілсе,   онда   жалғыздық
(одиночный) тұқым қуалау деп атайды.
• Полиморфизм
Полиморфизм класс  иерархиясымен  байланысты,  иерархиядағы  бірнеше  класқа
бірдей хабарлама беру  мүмкіндігінің  болуы,  яғни  қандай  кластың  қайсысы
келген хабарды өңдеу құқығын алатынын анықтау  –  полиморфизм  деп  аталады.
Бір иерархиядағы әртүрлі класта болатын және бір атпен аталған және  virtual
қызметші сөзімен сипатталған әдіс виртуальді әдіс деп табылады.
С++ тіліндегі программаның орындалуы  барысында  объектінің  типі  алдын-ала
анықталмаса да оны сұрауға болады,  және  бұл  функция  адресін  динамикалық
түрде  анықтауға  болады,  яғни  кеш   байланыстыру   ішкі   жүйесі   арқылы
орындалады. Виртуальді әдісті (функцияларды) шақырғанда виртуальді  кесте  –
функциялар  адрестерінің  кестесі  қолданылады.  Бұл  кесте   объект   класс
конструкторлары арқылы құрылуы барысында анықталады.
Конструктор  ролі виртуальді әдісті  дұрыс  адрестер  кестесімен
байланыстыру.
Программаны компиляциялау барысында виртуальді функциялар адресі белгісіз,
ал виртуальді кесте ұяшықтары белгілі болады да программа орындалу
барысында сол ұяшықтарға адрестер жазылады.
Кластың сипатталуы:
class < Аты > {
< тип 1 > < айн 1 >
< тип 2> < айн 2 >

public:
әдіс 1
әдіс 2

әдіс n;
};
<сипаттаушы> <кл. аты> [:базалық тізім] {элементтер тізімі}
Мұндағы - <сипаттаушы> –  class,  struct,  union  қызметші  сөздернің  бірі.
Класс аты – идентификатор;
< базалық тізім > -қасиеттері тұқым қуалауға  тиісті  базалық  класс  немесе
кластар тізімі болады;
{элементтер тізімі} – осы кластың өзіне тән элементтер тізімі беріледі.  С++
тілінде класты құрғанда элементтерді бермей-ақ сипаттауға болады,
u class Sorun.
Бұларды  класс  аттарына  сілтеме  жасау  үшін  қолданады,   ал   объектімен
нақтыжұмыс жасауда толық анықталуы  тиіс.  Автоматты  түрде  кластың  барлық
элементтері «жабық» деп есептеледі және олар тек  осы  класс  функцияларында
қолданылады.  Ал,  оларды  «ашық»  түрдесипаттау  үшін  public,   protected,
private қызметші сөздерінің бірін қолдану керек.
Қарапайым класс мысалы:
# include <
# include 
class obj_type
{
double data;
public:
void set_v(double ang);
double get_sin(void);
}
obj;
void obj_type :: set_v(double ang) {
data = ang;
}
double obj_type :: get_sin(vold) {
return (sin(0.01*data);
«Комплекс сандар» класын құрайық: Комплекс сандар мен матрицаларын
анықтайық:
#include 
#include  {exit( ); }
class Complex
{ float Re;
float Im;
public:
void sum (complex, complex);
void Minus (complex, complex);
void Mult (complex, complex);
void Div (complex, complex);
void Get ( );
void Put ( );
};
void complex :: Minus(complex X, complex Y)
{
Re = x.Re – y.Re;
Im = x.Im – Y.Im;
}
Void Complex :: Mult (complex X, complex Y)
{
Re = x.Re*Y.Re – x.Im*Y.Im;
Im = x.Re – Y.Im+x.Im*Y.Re;
}
void Complex :: Div (complex X, complex Y)
{
if (Y.Re\\y.Im)) {
Cout << “0-ге бөлінгендік”;
exit(12); }
Re = x.Re*Y.Re – x.Im*Y.Im;
Im = x.Re* Y.Im + x.Im* Y.Re;
}
void Complex :: Get ( ) {
cont << «Комплекс санның нақты бөлігін енгіз:»;
cin >>Re
cout << «Комплекс санның жорамал бөлігін енгіз»;
cin>>Im
}
void main ( ) {
complex a, b, c;
a. Get ( );
b. Get ( );
c. Sum (a, b);
c. Put ( );
}
                      Конструкторлар мен деструкторлар.

Конструкторлар класс айнымалыларын инициализациялауға және жадыдан орын
бөлуге арналған айрықша функция болып табылады. Конструктор аты өзі тиісті
класс атымен бірдей болады. Класс объектісін құру барысында қажетті
конструктор автоматты түрде  шақырылады. Егер класс сипатында конструктор
сипатталмаған болса, онда компилятор стандартты класс құрады.
Деструктор – бұл да айрықша функция, жойылатын объект алып тұрған
динамикалық жадыны босату қызметін атқарады. Деструктордың да аты класс
атымен бірдей, тек алдында ~ (тильда) жазылады. Деструктор – класс
объектісіне сілтейтін көрсеткіш арқылы анықталған delete операторы
кездескенде    шақырылады.    Деструктордың конструктордан айырмашылығы
ешқандай аргументтен тәуелді емес. Егер деструктор айқын түрде анықталмаса,
компилятор класс үшін стандартты деструктор бөледі. Класс деструкторы мен
конструкторы С++ тілінде динамикалық жадыны үлестіру және босату үшін
сәйкесінше Nen, delete қолданылады.
# include 
# include 
class string
char * Q string;
int strieng;
public
string (char*);(конструктор)
~ string ( ); }(деструктор)
string ::string (char*init str) {
Q string = new (Q string, init str);
if (!Q string) cont << «Жады жетіспейді»;
strieng:=streen (Q string);
}
string :: ~ string ( );
{
cout << «Жол» 
main ()

Стандартты функцияны шақыру операторы

Меншіктеу
операторы

Сипаттау операторы

Функция тұлғасы

Int n; m=I;

Prinf (“%d бастапқы мән”,n);

F2

операторлар

операторлар

F1

операторлар

Main()

Си -программа

# тақырып

                                 Құрастырушы

                     Бағыныңқы программалар кітапханасы

                                Интерпретатор

                                 Компилятор

                                  Ассемблер

                   Программалық тңілдерінің трансляторлары

                            Программалау тілдері

                     Программалау жүйесі


Пәндер