5 апта
Тақырып 6. Өтудің шартты және шартсыз операторлары
Дәріс жоспары
-
Тармақталу алгоритмі.
-
Шартсыз өту операторы.
-
Шартты өту операторы.
-
Құрама операторы.
-
Таңдау операторы.
-
break операторы.
Дәрістің қысқаша конспектісі
1. goto шартсыз өту операторы
Жазылу форматы:
goto белгісі;
Белгі – бұл оператодың сол жағыда орналасатын және онымен қос нүкте арқылы бөлінетін идентификатор.
goto операторы көрсетілген белгі операторына жіберуді басқаруды орындайды.
2. if…else…шартты өту операторы
Шартты өту операторы екі түрде қолданылады:
1. Қысқаша түрі:
if (өрнек) оператор1;
Бұл түрде оператор жұмысы келесідей: егер өрнек ақиқат болса (яғни нөлдік емес мән болса), онда оператор1 орындалады, әйтпесе (яғни, логикалық өрнек жалған болса) – программадағы шартты өту операторынан кейінгі оператор орындалады.
өрнек ретінде қолданылуы мүмкін:
-
Арифметикалық өрнек.
-
Логикалық өрнек.
2. Толық түрі:
if (өрнек) оператор1;
else оператор2;
Толық түрде оператор жұмысы келесідей: егер өрнек ақиқат, онда оператор1 орындалады,әйтпесе (яғни, логикалық өрнек жалған болғанда) –оператор2 орындалады..
Оператор1, оператор2 – жай немесе құрама оператор.
Шартты өту операторы салынған болуы мүмкін.
Құрама оператор
Құрама оператор – { } фигуралық жақшамен шектелген ерікті операторлардың санынан тұратын топ.
3. switch операторы
switch операторы көптеген нұсқалар жиынынан таңдауды ұйымдастыруға арналған.Оператордың форматы келесідей:
switch (өрнек)
{
case тұрақты _1: операторлар_1]
case тұрақты_2: операторлар_2]
…
default: операторлар;
}
Дөңгелек жақшасының ішіндегі switch кілттік сөзінен кейінгі өрнек , Си тілінде рұқсат етілген мәні бүтін болатын кез келген өрнек бола алады. Бүтін типке келтіруге болатынын ескерейік, бірақ,шектеулер туралы да білу керек.
Бұл өрнектің мәні бірнеше нұсқалардың біреуін таңдау үшін кілттік болып табылады. switch операторының денесі тұрақтыдан кейінгі case кілттік сөзімен таңбаланған бірнеше оператордан тұрады. case кілттік сөзімен таңбаланған оператордан басқа default кілттік сөзімен таңбаланған бір фрагмент болуы мүмкін.
Операторлар тізімі бос болуы мүмкін немесе бір немесе бірнеше оператордан тұруы мүмкін. Сонымен қатар, switch операторында операторлар кезектілігін фигуралық жақшаға алу міндетті емес.
switch операторының орындалу сызбасы келесідей:
-
Өрнек жақша ішінде орындалады;
-
Есептелген мәндер case кілттік сөзінен кейінгі тұрақтылармен салыстырылады;
-
Егер тұрақтылардың біреуі өрнекпен сәйкес келсе, онда басқару case кілттік сөзімен таңбаланған операторға беріледі ;
-
Егер тұрақтылардың біреуі де өрнекпен сәйкес келмесе, онда басқару default кілттік сөзімен таңбаланған операторға беріледі, ал ол жоқ болған жағдайда басқару switch операторынан кейінгіге беріледі.
switch операторын қолданудың қызықры ерекшеліктерін атап өтейік: default сөзімен конструкция switch операторының денесінде ең соңғы болмауы мүмкін. switch операторының денесіндегі case және default кілттік сөздері switch операторының денесі орындалғанда бастапқы нүкте анықталатын бастапқы бақылау кезінде ғана маңызды . Егер қандай да бір оператор switch операторы денесінен басқаруды жібермесе, бастапқы оператор мен дене соңы арасындағы барлық операторлар кілттік сөздерге тәуелсіз орындалады.Сөйтіп, егер қажет болған жағдайда, case операторынан шығуды программист өзі ұйымдастыру керек. Көп жағдайда ол үшін break операторы қолданылады.
Өрнектің әр түрлі мәніне бір әрекетті қолдану үшін, бірнеше case кілттік сөзімен бір операторды бірнеше рет қолдануға болады.
Break операторы
break операторы оны біріктіретін switch, do, for, while ең ішкі операторлардың орындалуын тоқтатуға арналған. Break операторы орындалғаннан кейін басқару тоқтатылған оператордан кейінгі операторға беріледі.
Өзін – өзі тексеру сұрақтары
-
Тармақталған алгоритм деген?
-
Белгі деген не?
-
goto шартсыз өту алгоритмінің тағайындалуы мен жазылу форматы қандай?
-
if…шартты өту алгоритмінің тағайындалуы мен жазылу форматы қандай?
-
Қысқаша түрде жазылған шартты өту операторы қалай жұмыс істейді?
-
Толық түрде жазылған шартты өту операторы қалай жұмыс істейді?
-
Қарапайым оператор деген не?
-
Құрама оператор деген не?Ол не үшін қолданылады?
-
Таңдау операторының тағайындалуы мен жазылу форматы қандай?
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
6 апта
Тақырып 7. Циклдік операторлар
Дәріс жоспары
-
Циклдік алгоритм.
-
Шарты алдын ала берілген циклдік оператор.
-
Шарты соңынан берілген циклдік оператор.
-
Параметрлі цикл операторы.
-
continue операторы.
Дәрістің қысқаша конспектісі
Си тілінде циклді ұйымдастырудың үш түрі бар:
-
while… - шарты алдын ала берілген циклдік оператор
-
do… - шарты соңынан берілген циклдік оператор
-
for… - параметрлі цикл операторы
Әр операторды жеке қарастырайық.
1. Шарты алдын ала берілген оператор
Жазылу форматы:
while (өрнек_шарты)
цикл_денесі;
Өрнек_шарты ретінде көбінесе қатынас немесе логикалық өрнек қолданылады.
Цикл денесі циклде орындалатын операторлардан тұрады. Цикл денесі – не құрама, не жеке оператор, яғни, операторлық жақшаға алынған операторлардың кезектілігі. Цикл денесі бос оператор болуы да мүмкін, яғни, тек ";" түрінде ғана бейнеленеді.
Бұл оператор келесідей жұмыс атқарады:
Ең бірінші өрнек_шарты есептеледі. Егер ол ақиқат болса(яғни, 0-ге тең болмаса),онда цикл денесі орындалады, одан кейін өрнек_шарты жалған болғанға дейін қайта- қайта тексеріледі. Егер өрнек_шарты бірінші тексерілуден кейін жалған болып шықса, онда цикл денесі бір де бір рет орындалмайды. Егер өрнек_шарты тек ақиқат мәнді ғана қабылдаса, онда цикл денесі шексіз орындала береді.
Өрнек_шарты арифметикалық өрнек болуы да мүмкін.Бұндай жағдайда цикл денесі өрнек_шарты 0-ге тең болғанға дейін орындалады.
Ескерту: Циклде орындалатын операторлар циклдің денесі болып табылады.
2.Шарты соңынан берілген циклдік операторлар
Жазылу форматы:
do
цикл_денесі
while(өрнек_шарты);
Өрнек_шарты while цикліндегі сияқты логикалық немесе арифметикалық болып табылады.
Бұл оператор келесідей жұмыс істейді:
Ең бірінші цикл денесі орындалады, содан соң өрнек_шартының мәні есептеледі. Өрнек_шартының мәні ақиқат болғанша(яғни, 0-ге тең болмаса), процесс тексеріледі. Бұл мән жалған болысымен (яғни, 0-ге тең болса) циклдің орындалуы тоқтатылады. Егер өрнек_шартының мәні әрқашан ақиқат болса, онда цикл шексіз орындалады .
Ескерту: while операторында өрнек_шартының мәнін тексеру циклдің басында орындалатына мән беріңіздер, ал repeat операторында өрнек_шартының мәнін тексеру циклдің соңында орындалады және цикл денесі кез келген жағдайда бір рет болсын орындалады.
-
Параметрлі циклдік оператор
Жазылу форматы:
for (өрнек_1;өрнек_шарты;өрнек_3)
цикл_денесі;
for операторндағы бірінші және үшінші өрнектер үтірмен бөлінген бірнеше өрнектерден тұруы мүмкін.
Бұл оператор келесідей жұмыс істейді:
Өрнек_1 әрекетті циклдың басталуына дейін анықтайды, яғни, цикл үшін бастапқы шарттарды береді; көбінесе бұл меншіктеу операторы болып табылады.
Өрнек_шарты – әдетте логикалық немесе арифметикалық болады.Ол циклдің аяқталуын немесе жалғасуын анықтайды. Егер ол ақиқат болса(0-ге тең емес), онда цикл денесі орындалады, одан кейін өрнек_3 есептеледі.
Өрнек_3 әдетте циклдің келесі орындалуына қажеттілерді параметрлерді өзгерту немесе цикл денесінің кез келген айнымалыларын береді.
Сөйтіп, өрнек_1 бір рет ғана орындалады, ал өрнек_шарты және өрнек_3 цикл денесінің әр орындалуынан кейін есептеледі.Цикл өрнек_шарты жалған болғанға дейін жалғасады.
for операторында кез келген 3-еудің, кез келген 2-дің немесе барлық үш өрнек те жоқ болуы мүмкін, бірақ оларды бөлетін ";" символы міндетті түрде болуы керек. Егер өрнек_шарты жоқ болса, онда ол ақиқат және циклден шығу үшін арнайы құрал керек.
Continue операторы
continue операторы , break операторы сияқты, цикл операторының ішінде ғана қолданылады, бірақ, оның орындалуынан айырмашылығы программаның орындалуы тоқтатылған оператордан кейінгі оператордан жалғаспайды, тоқтатылған оператордың басынан басталады. Оператор форматы келесідей: continue;
Өзін – өзі тексеру сұрақтары:
-
Циклдік алгоритм деген не?
-
Шарты алдын ала берілген циклдік операторының тағайындалуы мен жазылу форматы қандай? Шарты алдын ала берілген циклдік операторы жұмысының блог –схемасын қалай көрсетуге болады?
-
Шарты соңынан берілген циклдік операторының тағайындалуы мен жазылу форматы қандай? Шарты соңынан берілген циклдік операторы жұмысының блог –схемасын қалай көрсетуге болады?
-
Параметрлік цикл операторының тағайындалуы мен жазылу форматы қандай? Параметрлік цикл операторының жұмысының блог –схемасын қалай көрсетуге болады?
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
7 апта
Тақырып 8. Функциялар
Дәріс жоспары
-
Ішкі программа ұғымы.
-
Функцияларды сипаттау.
-
Функциялар мен олардың типтерін сипаттау.
-
Функцияны шақыру.
Дәрістің қысқаша конспектісі
Көбінесе программаларда бірдей есептеулерді орындайтын бір типті, бірақ, әр түрлі берілгендермен аумақтар кездесіп жатады. Программаның бұндай бөліктерін ішкі программалар ретінде рәсімдейді.
Функциялар
Си тіліндегі әр программа– бұл функциялардың жиыны. main атты функция негізгі функция болып табылады. Бұл функциясыз программа орындалмайды. Бұл негізгі программаның аты барлық программалар үшін бірдей және өз еркімен таңдалына алмайды. main() функциясы орындалуға ОЖ –нің командасымен жіберіледі. main() функциясы қайтаратын мән ОЖ-ге беріледі.
Си тіліндегі функция ұғымы екі сипатта болады. Бір жағынан, функция – бұл еркін типтердің бірі. Екінші жағынан, функция – Си тіліндегі прграмманың минимальді орындалатын модулі . Бұл екінші ұғымның синонимі басқа тілдерде ішкі программа деп аталады.
Функцияны ішкі программа ретінде қарастырайық .
Ішкі программа – қосымша алгоритмді жүзеге асыратын программа.
Көбінесе программаларда бірдей есептеулерді орындайтын бір типті, бірақ, әр түрлі берілгендермен аумақтар кездесіп жатады. Программаның бұндай бөліктерін ішкі программалар ретінде рәсімдейді.
Функцияларды сипаттау Си тіліндегі түрі:
функция_атының (формальді_параметрлердің_спецификациясы)
типі {
обьект_сипаттамасы;
орындалатын _операторлар;
}
Бірінші жол– бұл функцияның тақырыпшасы.Ол келесі берілгендерден тұрады:
Тип – функция қайтаратын мәндердің типі. Егер функция мән қайтармаса, онда оның типі ретінде void қолданылған.
Функция аты – программаның қызметтік сөздерімен, басқа обьектілердің атымен сәйкес келмейтін, программист өз еркімен таңдайтын ат.
Формальді параметрлер спецификациясы – не формальді параметрлер тізімі, не бос, оның әр элеентінің түрі келесідей:
типтің_анықталуы параметр _аты
Функцияның денесі – бұл фигуралық жақшалармен шектелген және функцияның тақырыпшасынан кейін орналасатын функция сипаттамасының бөлігі. Функция денесі обьектінің сипаттамасынан (мысалы, айнымалыларды сипаттаудан) және орындалатын оператордан тұруы мүкін. Си тілінің ерекшелігі функция денесінің ішінде басқа функцияны сипатай алмауында.
Функция денесінің міндетті операторы функциядан шақыру нүктесіне қайту болып табылады, оның екі түрі бар:
return;
return өрнек;
Бірінші форма ешқандай мән қайтармай, функцияны аяқтайды, яғни, оның сипаттамасында функция атына void типін көрсеткен.
Екінші формада өрнек функция атының алдында, оны сипаттау бөлімінде функция қайтаратын мәнге автоматты түрде түрлендіретін типке сипатталуы керек.
Ескерту: Си тілінде функцияны сипаттаудың "ескі" формасы бар:
Функция атының типі (формальді _ параметрлер _типі)
параметрлер _ спецификациясы;
{
Обьектілер _сипаттамасы;
Орындалатын _операторлар;
}
Мысал:
1.Функцияның сипаттамасының стандартты формасы:
double f(int n, float x)
{
Функция денесі
}
2. Функцияның сипаттамасының "ескі" формасы:
double f(n, x)
int n;
float x;
{
Функция денесі
}
Бұл функциялардың сипаттамалары эквивалентті.
Функцияның сипаттамасы
Функция шақырылмас бұрын негізгі программада сипатталуы керек.
Стандартты түрде анықталған функцияның сипаттамасы негізгі программада орналасатын, оның прототипі болып табылады:
функция_ атының типі (формальді _ параметрлер _типі);
Функцияның тақырыпшасына қарағанда, оның прототипінде форальді параметрлердің атын көрсетпеуге болады.
Ескерту:
Егер функцияның сипатталуы негізгі программа мәтінін дейінгі программа мәтінінде орналасса, онда негізгі программада прототипті жазу міндетті емес.
Негізгі программада функцияны шақыру.
Функцияға рұқсат алу үшін:
функция_аты (фактілі_параметрлер_тізімі)
Аргуметтер деп аталатын фактілі параметрлер тізімі - бұл функцияның формальді параметрлерінің санына тең өрнектер тізімі. Формальді және фактілі параметрлердің арасындағы сәйкестік олардың тізімдегі өзара орналасуымен анықталады. Формальді және фактілі параметрлердің арасында типтері бойынша сәйкестік болуы керек. Егер фактілі параметрдің типі формальді параметрдің типімен сәйкес келмесе, онда компилятор автоматты түрде типтерді түрлендіретін командаларды іске қосады, бірақ ол тек типтерді келтіруге рұқсат етілген болса ғана орындалады.
Функцияның формальді параметрлері сонда жергіліктендірілген, яғни, функция сипаттамасы сыртында рұқсат етілмеген және функция денесінде формальді параметрлермен жүргізілген операциялардың ешқайсысы фактілі параметрлердің мәнін өзгертпейді.
Функцияны шақыру өрнек болып табылады, бірақ, бұндай өрнектерді программа мәтінінде орналастыру функцияның қайтаратын мәннің типіне байланысты.Егер функция қайтаратын мәннің типі void болса, онда функция қайтарылмайтын мәнді функция болып табылады – бұндай функция білімді қажет ететін ешқандай өрнекке кірмейді, тек жеке өрнек –оператор түрінде шақырыла алады:
функция_аты(фактілі_параметрлер _тізімі);
Ескерту:
main() негізгі фуннкциясы қарапайым функцияларға қарағанда, параметрлерімен де оларсыз да қолданыла алады. main()функциясын параметрлерсіз қолданғанда, жақшалар бос қалдырылады.
Өзін- өзі тексеру сұрақтары
-
Ішкі программа деген не?
-
Функция деген не?
-
Функцияны қалай сипаттауға болады?
-
Негізгі программада функцияны шақыру қалай орындалады?
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
8 апта
9 тақырып. Жады кластары
Дәріс жоспары
-
Жады кластары.
-
Объектілердің локализациясы.
-
Глобальды объектілер.
-
Динамикалық жады.
-
Ішкі объектілер.
-
Автоматты, статистикалық, ішкі айнымалылар.
Дәрістің қысқаша конспектісі
Жады кластары және программаларды ұйымдастыру
Объектілердің локализациялануы. Автоматы жадыны сипаттау үшін auto немесе register жадыларының классспецификаторлары қолданыла береді. Бірақта бұл жады класының спецификаторлардың-кілттік сөздерінсіз-ақ блок ішінде анықталған(мысалы,функция денесінің ішінде) кез-келген объект (мысалы,массивтер немесе айнымалылар), автоматты жады объектісі ретінде қабылданады. Автоматты жады объектісі өзі анықталған блоктың ішінде ғана бар болады. Аuto немесе register типіндегі объектілерімен белгіленген жады блоктан шыға бергенде босатылады, яғни объектілер жоғалады. Блокқа қайта кіргенде сол объектілер үшін жадыдан алдыңғылардан тәуелдсіз жаңа аймақтар бөлінеді. Автоматты жады объектілері өздері анықталған блоктың ішінде локалданған, олардың бар болу уақыты("өмір сүру" уақыты) сол блоктың ішіндегі басқарудың бар болуымен анықталады. Басқаша айтқанда, автоматты жады әрқашанда ішкі болады, оған тек сол блокта, яғни өзі анықталған блокта болғанда ғана байланыса аласыз.
Мысал:
# include
/* Автоматты жады айнымалылары */
void autofunc(void)
{
int K=l;
printf("\tK=%d",K);
K++;
return;
}
void main()
{
int x;
for (i=0;i<5;i++)
autofunc();
}
Программаның орындалуының нәтижелері: K=1 K=1 K=1 K=1 K=1
Бұл программаның орындалуының нәтижесі айқын көрініп тұр, және келтірмей-ақ қоюға болатын еді егер ішкі жадының тағы бір классы – статистикалық ішкі жады болмаса. Келтірілген программаға өте ұқсас программаны қарастырайық:
#include
/* Статистикалық жадының локальды айнымалылары */
void stat(void)
{
static int K=l;
printf("\tK=%d",K>
K++;
return;
}
void main()
{
int i;
for (i=0;x<5;i++)
stat() ;
}
Программаның орындалуының нәтижелері:K=1 K=2 K=3 K=4 K=5
Отличие функций autofunc() и stat() состоит в наличии спецификатора static при определении переменной int К, локализованной в теле функции stat(). К айнымалысы autofunc() функциясындағы - бұл автоматты жады айнымалысы, ол функцияға әр кірген сайын анықталады және инициализацияланады. static int К айнымалысы жадыдан орын алады және бір-ақ рет қана инициализирленеді. К статистикалық ішкі айнымалысының соңғы мәні stat() функциясынан шыға берісте, дәл осы функцияның кезеті шақырылуына дейіін сақталады.
Глобальды объектілер. Блоктар ішінде объектілерді қолдану мүмкіндігіне назар аудару қажет, Следует обратить внимание на возможность использовать внутри блоков объекты, которые по месторасположению своего определения оказываются глобальными по отношению к операторам и определениям блока. Есімізге түсірейік, блок – бұл тек функция денесі ғана емес, сонымен қоса ирек жақша ішіне алынған кез-келегн анықтама және операторлар кезектілігі.
Глобальды айнымалы программасынан мысал:
#include
int N=5;
/* Глобальная переменная */
void func(void)
{
printf("\tN=%d",N);
N--;
return;
}
void main()
{
int i;
for (i=0;i<5;x++)
{
func();
N+=2;
}
}
Программа орындалуының нәтижесі: N=5 N=6 N=7 N=8 N=9
int N айнымалысы main( ) және func() функциясының ішінде анықталмаған және олардың әрқайсысына байланысты глобальды объект болып табылады. Ғunc( ) –ты әр шақырған сайын N-нің мәні 1-ге азаяды, негізгі программада 2-ге ұлғаяды. Глобальді обьект блоктың ішінде глобальді обьектінің аты басқа мақсатпен иқолданғанда, анықтамамен "затенен" немесе "жасырылған" болуы мүмкін. Алдыңғы программаны модифицирлейміз:
#include
int N=5; /* глобальды айнымалы*/
void func(void)
{
printf("\tN=%d",N);
N--;
return;
}
void main()
{
int N; /* локальды айнымалы */
for (N=0;N<5;N++)
func() ;
}
Программа орындалуының нәтижесі: N=5 N=4 N=3 N=2 N=l
Автоматты жадының main( ) функциясынан шыққан int N айнымалысы int N глобальды айнымалысының мәніне еш әсер етпейді. Бұлар жадыдан әртүрлі аумақтары берілген әртүрлі объектілер. Ішкі айнымалы N main() функциясынан "көрінбейді" және бұл int N анықтамасының нәтижесі оның ішінде болады.
Динамикалық жады – бұл программаның орындалу барысында бөлінетін жады. Ал мына сұраққа: "Динамикалық жадыда глобальды ма әлде локальді объект орналасқан?" дұрыс жауап тауып көрейік.
Динамикалық жадыны бөлгеннен кейін, арнайы библиотекалық free() функциясының көмегімен ғана орындалуы мүмкін, оның толық босатылуына дейін сақталады.
Егер динамикалық жады программаның память не была освобождена до окончания выполнения программы, то она освобождается автоматически при завершении программы. Тем не менее, явное освобождение ставшей ненужной памяти является признаком хорошего стиля программирования.
Программаның орындалу барысында динамикалық жады аумағы осы аумақты адрестейтін нұсқаушы рұқсат етілген барлық жерде рұқсат етілген. Сондай қандай да бір блокта бөлінген (мысалы, негізгі емес функцияның денесінде) динамикалық жадымен жұмыстың келесі үш нұсқасы мүмкін:
-
нұсқаушы (динамикалық жады аумағында) автоматты жадының локальды объектісі ретінде анықталған. Бұл жағдайда бөлініп алынған жады нұсқаушының локальденуі блогының сыртына шыға бергенде рұқсат жоқ болады, және оны блоктан шығар алдында босату қажет;
-
нұсқаушы статистикалық жадының локальды объектісі ретінде анықталған. Блокта бөлініп алынған динамикалық жады әр блокқа кірген сайын нұсқаушы арқылы рұқсат етілген. Жадыны тек оны қолдануды аяқтағаннан кейін ғана босату керек;
-
нұсқаушы блокқа байланысты глобальді объект болып табылады. Динамикалық жады нұсқаушы "көрінген" барлық блокта мүмкін. Жадыны тек оны қолдануды аяқтағаннан кейін босату керек.
Динамикалық жадының объектісі ішкі статистикалық нұсқаушымен(локальденген) байланысты болғанда, екінші нұсқасын иллюстрациялаймыз:
#include
#include /* malloc(),free() функциялары үшін */
void dynam(void)
{
static char *uc=NULL; /* Ішкі нұсқаушы */
/* Жадының бірнеше рет бөлінуінен сақтау: */
if (uc ==NULL)
{
uc=(char*)malloc(1);
*uc='A';
}
printf("\t%c",*uc);
(*uc)++;
return;
}
void main()
{
int i;
for (i=0; i<5; i++)
dynam( );
}
Программа орындалуының нәтижесі: А B C D E
Алдыңғы программаның дұрыс еместігі - malloc()функциясымен бөлінген жады аумағы free( ) функциясымен босатылуы екіталай.
Келесі программада нұсқаушы жадының динамикалық аумағында - глобальды объект:
#include
#include /* malloc( ), free( ) функциялары үшін */
char * uk=NULL; /* глобальды нұсқаушы */
void dynam1 (void)
{
printf("\t%c", *uk) ;
(*uk)++;
}
void main (void)
{
int i ;
uk=(char*) malloc (1);
*uk='A' ;
for (i=0; i<5; i++)
{
dynam1();
(*uk)++;
}
free(uk);
}
Программа орындалуының нәтижесі: А С Е G I
Динамикалық объект негізгі функцияда құрылады және uk нұсқаушысымен байланысады. Сол жерде меншіктеуде бастапқы 'А' мәнін қабылдайды. Динамикалық объект глобальды нұсқаушы есебінен екі main() және dynam1() функцияларында да мүмкін. main() және dynam1() функциясының ішінде циклдың орындалу барысында динамикалық объект мәні өзгереді.
Жадының динамикалық бөлінген аумағын адрестейтін нұсқаушы, автоматты жады объектісі болып табылатындығына мысал келтірудің қажеттігі жоқ. Атап өтейік, динамикалық жады, анықталған немесе сыртқы объект ретінде сипатталған нұсқаушының осы жадымен байланысқан жерінде(кез-келген функцияда және кез-келген файлда) бөлінгеннен кейін барлық жерде рұқсат етілген. Ішкі объект анықтамасын нақты анықтау керек, ол тақырыпқа да көшеміз.
Ішкі объектілер. Си тіліндегі қарапайым немесе күрделі программа бірнеше мәтіндік файлдарда орналасқан, функциялар жиынынан тұрады. Программа мәтіні бар бөлек файлды кейде программалық модуль деп те атайды, бірақ модульдерге немесе файлдарға қатысты қатаң терминологиялық келісімдер жоқ. Программа функциялар жиынынан тұрады. Барлық ішкі функциялар, функцияның ішінде орналасқандықтан Си тілінің ережесі бойынша басқа функцияны анықтауға болмайды. Барлық функцияларда, тіпті әртүрлі файлдарда орналасқанның өзінде әртүрлі атаулар болуы керек. Функциялардың бірдей атауы бір және сол функцияға ғана қатысты болуы керек.
Функциядан басқа, программада ішкі обьектілер – айнымалылар, нұсқаушылар, массивтер және т.б қолданылады. Сыртқы объектілер функция мәтінінің сыртында анықталуы керек.
Сыртқы объектілер программаның көптеген функцияларынан алына алады, бірақта бұндай рұқсат алу үнемі автоматты түрде болмайды-жағдайлар қатарында программисттің қосымша араласуы қажет. Егер объект программамен бірге файлдың басында анықталған болса, онда ол файлда орналасқан барлық функциялар үшін глобальды болып табылады, және соның ішінде ешқандай қосымша жазылымдарсыз-ақ байланысу мүмкін болады. (Шектеу - егер функция ішінде глобальды объект атауы ішкі объект ретінде қолданылса, онда сыртқы объект мүмкін емес болып қалады, яғни "көрінбейтін" дәл осы функция денесінде.).
Суретте:
-
X объектісі: глобальді сияқты f11(), f12()-де болады; сыртқы сияқты файл 2-де extern X сипаттамасы енгізілген тек сол функцияларда ғана болады;
-
Y объектісі: f21( ) және f22( )-де глобальды сияқты; сыртқы сияқты 1 файлының extern Y сипаттамасы енгізілген сол функцияларында;
-
Z объектісі: f22( )-де және extern Z сипаттамасы енгізілген файл 1 және файл 2-нің барлық функцияларында глобальды сияқты болады.
Егер сыртқы объект басқа файлдың немесе функцияның функциясы үшін рұқсат етілген болуы қажет болса, онда ол сұхбаттасудан бұрын қосымша кілттік extern сөзін қолданумен бірге қосымша сипатталған болуы керек. (Наличие этого слова по умолчанию предполагается и для всех функций, т.е. не требуется в их прототипах.) Ондай сипаттама, extern сөзінің спецификаторымен бірге файлдың басында енгізіледі, және сонда объект файлдың барлық функцияларында доступен. Бірақта бұл сипаттама бір функцияның денесінде орналасуы мүмкін, онда объект сонда(ішнде) ғана доступен.
Сыртқы объект сипаттамасы оның анықтамасы емес. Естеріңізде сақтаңыздар: анықтамада объектіге ылғида жады бөлінеді, және ол инициализирленген болуы мүмкін. Анықтама мысалы:
double summa[5];
char D_Phil []="Doctor of Philosophy";
long M=1000;
Сипаттауда инициализация мүмкін емес, массивтер элементтерінің санын да көрсетуге болмайды:
extern double summa [ ];
extern char D_Phil [ ];
extern long M;
Өзін-өзі бақылау сұрақтары:
-
Қандай жады кластары бар?
-
Автоматты жады дегеніміз не?
-
Динамикалық жады дегеніміз не?
-
Статистикалық ішкі жады дегеніміз не?
-
Қандай жады кластарының спецификаторлары қолданылады?
-
Автоматты айнымалылар дегенімізе?
-
Статистикалық айнымалылар дегеніміз не?
-
Ікі айнымалылар ьдегеніміз не?
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
9 апта
Тақырып 10. Берілгендердің күрделі типі: массивтер
Дәріс жоспары
-
Массивтер.
-
Бір өлшемді және көп өлшемді массивтер.
-
Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.
-
Бір өлшемді массивтер мен нұсқауыштар.
Дәрістің қысқаша конспектісі
Массив – бұл бір типті ақырлы сандардың жиыны.
Массив атпен аталады.
Мысалы, 1.6, 14.9, -7, 0, -4 сандарының терілімін 5 элементтен тұратын массив деп санауға болады және белгілі бір атпен атауға мысылы, А болады.
Массивтің әр элементі массивтің аты мен квадратты жақша ішінде индексін көрсетумен аталады.
Массив элементтері индекстерінің ретімен реттелген.
Массивтерді сипаттауда:
-
Элементтерінің типін,
-
Массивтің атын,
-
Өлшемін , яғни, нақты элеметті көрсетуге қажет, индекстерінің санын
көрсету қажет.
Сонымен қатар, сипаттауда әр индекс қабылдайтын мәндердің саны көрсетіледі. Мысалы, int а[10]; 10 элементтен тұратын а[0], а[1], ..., а[9] массивті анықтайды. float Z[13][[6]; бірінші индексі 0 ден 12 ге дейінгі 13 мәннен, екінші индексі 0 ден 5 ке дейінгі 6 міннен тұратын екі өлшемді массивті анықтайды. Сөйтіп, Z екі өлшемді массив элементтерін келесідей көрсетуге болады: Z[0][0], Z[0][5], , Z[12][5]
Си тілінің синтаксисіне сәйкес, тек бір өлшемді массивтер ғана болады, дегенмен, бір өлшемді массивтің элементері массив бола алады. Сондықтан екі өлшемді массив массивтің массиві ретінде анықталады. Сөйтіп, мысалда әрқайсысы float типті 6 элементтен тұратын 13 элемент-массивтерден тұратын массив берілген. Кез келген массив элементін нөмірлеу 0- ден басталып, N-1 -ге дейін нөмірленетініне назар аударыңыз, мұндағы N –индекс мәндерінің саны .
Массивтердің шектелуі, яғни, Си тілінде оның элементінің индекстерінің санына жоқ. Си тілінің стандарты транслятор 31- ге дейінгі массивтердің сипаттамасын ғана өңдеуге рұқсат етеді . Әдетте, көбінесе, бір өлшемді және екі өлшемді массивтер кеңінен қолданылады.
Массивтердің инициализациясы. Массивтерді сипаттауда олардың иницализациясы мүмкін, яғни, бастапқы мәндерді олардың элементтеріне меншіктеу. Маңызы бойынша (анығығырақ, нәтижесі бойынша), инициализация – бұл обьектіні оған нқты бір мәнді меншіктеу арқылы сипаттау. Инициализацияны қолдану массивті сипатау форматын өзгертуге мүмкіндік береді. Мысалы, бір өлшемді массив элементінің анық санын сипаттамай қоюға болады, тек инициализация тізімінде олардың бастапқы мәнін көрсету:
double d[ ]={1.0, 2.0, 3.0, 4.0, 5.0};
Бергілген мысалда массивтің ұзындығын компилятор фигуралық жақшалардың ішіндегі бастапқы мәндер саны бойынша есептейді. Осындай сипаттаудан кейін элемент d[0] тең 1.0, d[l] тең 2.0 және т.с.с d[4] тең 5.0.
Егер массивтің сипатталуындаоның өлшемі көрсетілмеген болса,онда бастапқы мәндрдің саны массив элементінің санынан көп болмайды. Егер бастапқы мәндердің саны массив элементінің санынан аз болса, онда ол мәндер массивтің алғашқы элементтеріне ғана меншіктеледі:
int М[8]={8,4,2};
Берілген мысалда келесі айнымалылардың мәні ғана анықталған: М[0], М[1] және М[2], олар сәйкесінше 8, 4 және 2 –ге тең. М[3],..., М[7] элементтері инициализацияланбаған.
Көп өлшемді массивтерді инициялизациялау ережесі бір өлшемді массивті сипаттаған сияқты, көп өлшемді массивті сипаттаумен сәйкес келеді. Бір өлшемді массивтер фигуралық жақшаға алынған бастапқы мәндері тізімі арқылы инициализацияланады. Егер бастапқы мән өз кезегінде массивке қатысты болса және фигуралық жақшаға алынған бастапқы мәндерден тұрса. Мысалы, Екі жол және үш қатардан тұратын екі өлшемді А массивінің элементтеріне нақты бастапқы мән меншіктеу келесідей болады:
double A[3][2]={{10,20}, {30,40}, {50,60}};
Бұл жазу келесі меншіктеу операторының кезектілігіне эквивалентті: А[0][0]=10; А[0][1]=20; А[1][0]=30; А[1][1]=40; А[2][0]=50; А[2][1]=60; Осы тізімді келесі инициализациялау тізімі арқылы да алуға болады:
double A[3][2]={10,20,ЭО,40,50,60};
Инициализацияның көмегімен көп өлшемді массивтің барлық элементтеріне мән меншіктемеуге болады. Мысалы, матрицаның тек бірінші бағанына ғана мән меншіктеу келесідей болады:
double Z[4][6]={{1}, {2}, {3}, {4}};
Келесі жазылым 5 жол және 4 бағаннан тұратын бүтін санды массивте "үшбұрышты" матрицада түрлендіреді:
int х[5][4]={{1}, {2,3}, {4,5,6}, {7,8,9,10}};
Бұл мысалда ақырғы бесінші жол х[4] толтырылмаған, ал бастапқы үш жол толықтай толтырылмаған болып қалады.
Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.
Тапсырма. 5 элементтен тұратын бір өлшемді массивтің теріс элементтерінің арифметикалық ортасын есептеу керек.
#include
main()
{
int I,K,N;
float s;
int A[5]={-1,2,-3,4,5};
K=0;
N=0;
for (I=0; I<= 4; I++)
{
if (A[I]<0)
{
K=K+A[I];
N++;
}
}
s=K/N;
printf("\ns=%f",s);
}
Бір өлшемді массивтер және нұсқаушылар.
Си тілінде массивтер мен нұсқауыштар арасында байланыс бар. Мысалы, массив int array[25] түрінде сипатталса, онда массивтің жиырма бес элементі үшін жадыдан орын бөлу ғана орындалмайды, сонымен қатар мәні массивтің бірінші элементінің (яғни, саны бойынша нөлдік) адресіне тең, array атты нұсқауыш үшін де орын бөлу орындалады, яғни, массивтің өзі атсыз қалады, ал массивтің элементтеріне рұқсат алу array атты нұсқауыш арқылы жүзеге асырылады. Тіл синтаксисіне сәйкес array нұсқауышы тұрақты болып табылады, оның мәнін өрнектерде қолдануға болады, бірақ, бұл мәндерді өзгертуге болмайды.
Массив аты нұсқауыш болғандықтан, келесідей меншіктеуге рұқсат етілген :
int array[25];
int *ptr;
ptr=array;
Мұнда ptr нұсқауышы массивтің бірінші элементінің адресіне орнатылған, сонымен қатар ptr=array меншіктеуін келесі эквивалентті түрінде жазуға болады:
ptr=&array[0].
Массив элементтеріне рұқсат алудың екі әдісі бар. Біріншісі, қарапайым квадрат жақша ішінде индекс мәндерін қолданумен байланысты. Мысалы, array[16]=3 немесе array[i+2]=7. Мұндай рұқсат алу әдісінде екі өрнек жазылады, екінші өрнек квадрат жақшаға алынады. Бұл өрнектердің біреуі нұсқауыш, ал екіншісі бүтін типті мән. Бұл кезектіліктің жазылуы кез келген бола алады, бірақ, жақша ішіне екінші тұрғаны жазылады. Сондықтан array[16] және 16[array] жазылулары эквивалентті және массивтің он алтыншы элементін білдіреді. Индекті түрде қолданылған нұсқауыштың міндетті түрде қандай да бір массивке нұсқайтын, тұрақты болуы керек емес, ол айнымалы да бола алады. Дербес жағдайда, ptr=array меншіктелуі орындалғаннан кейін массивтің он алтыншы элементіне рұқсат алу ptr формасында келесідей болуы мүмкін: ptr[16] немесе 16[ptr].
Массив элементтеріне рұқсат алудың екінші әдісі *(array+16)=3 немесе *(array+i+2)=7 түріндегі адрестік мәндер мен адрестеу операциясымен байланысты. Мұндай рұқсат алу әдісінде массивтің он алтыншы элементінің адресіне тең адрестік өрнек келесі түрду жазылуы мүмкін :
*(array+16) или *(16+array).
Компьютерде жүзеге асыру барысында бірінші әдіс екінші әдіске келтіріледі, яғни, индекстік өрнек адрестік өрнекке түрленеді. Келтірілген array[16] және 16[array] мысалдары *(array+16) түріне тұрленеді.
Массивтің бастапқы элементіне рұқсат алу үшін (яғни нөлдік индексті элементке), тек array немесе ptr нұсқауыштарының мәнін қолдануға болады. Келесі меншіктеулердің кез келгені
*array = 2;
array[0] = 2;
*(array+0) = 2;
*ptr = 2;
ptr[0] = 2;
*(ptr+0) = 2;
Массивтің алғашқы элементіне 2 мәнін меншіктейді, бірақ, *array=2 және *ptr=2 меншіктеулері жылдам орындалады, себебі, оларда қосу операторларын орындау қажет емес.
Өзін – өзі тексеру сұрақтары
-
Массив деген не?
-
Массивтің өлшемі деген не?
-
Программада бір өлшемді, екі өлшемді массивтер қалай сиптталады?
-
Массив элементтеріне рұқсат алу қалай орындалады?
-
Массивті қалай толтыруға болады?
-
Массивті экранға қалай шығарады?
-
Бір өлшемді массивтер мен нұсқауыштар.
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
10 апта
Тақырып 10. Берілгендердің күрделі типі: массивтер
Дәріс жоспары
-
Екі өлшемді массивтің сипатталуы.
-
Екі өлшемді массивтің элементтерімен жұмыс.
-
Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.
-
Екі өлшемді массивтер үшін нұсқауыштарды қолдану.
Дәрістің қысқаша конспектісі
float Z[13][[6]; бірінші индексі 0 ден 12 ге дейінгі 13 мәннен, екінші индексі 0 ден 5 ке дейінгі 6 міннен тұратын екі өлшемді массивті анықтайды. Сөйтіп, Z екі өлшемді массив элементтерін келесідей көрсетуге болады: Z[0][0], Z[0][5], , Z[12][5]
Си тілінің синтаксисіне сәйкес, тек бір өлшемді массивтер ғана болады, дегенмен, бір өлшемді массивтің элементері массив бола алады. Сондықтан екі өлшемді массив массивтің массиві ретінде анықталады. Сөйтіп, мысалда әрқайсысы float типті 6 элементтен тұратын 13 элемент-массивтерден тұратын массив берілген. Кез келген массив элементін нөмірлеу 0- ден басталып, N-1 -ге дейін нөмірленетініне назар аударыңыз, мұндағы N –индекс мәндерінің саны .
Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.
Тапсырма. 3 жол және 3 бағаннан тұратын екі өлшемді массивті экранға шығару. Бас диоганалінен жоғары орналасқан оң элементтердің қосындысын есептеу керек.
# include
main()
{
int A[3][3]={3,-2,4,10,-7,1,-9,12,5};
int I,J,D;
D=0;
printf("\n");
for (I=0; I<=2; I++)
{
for (J=0; J<=2; J++)
{
if (I0) D+=A[I][J];
printf("%3d",A[I][J]);
}
printf("\n");
}
printf("\n%d",D);
}
Көп өлшемді массивтерге нұсқаушылар.
Си тілінде көп өлшемді массивтерге нұсқауыштар – ол массивтердің массивтері, яғни, элементтері массив болатын массивтер. Бұндай массивтерді жариялауда компьютердің жадысында әр түрлі обьектілер пайда болады. Мысалы, int arr2[4][3] екі өлшемін жариялағанда жадыда төрт нұсқаушыдан тұратын массивке нұсқаушы болып табылатын , arr айнымалысының мәнін сақтауға арналған орын бөлінеді. Төрт нұсқаушылы массиыке де орын бөлінеді. Бұл төрт нұсқаушының әрқайсысы int типті үш элементтен тұратын мссив адресінен тұрады Сөйтіп, arr2[4][3] жариялануы программада үш түрлі обьект тудырады: arr идентификаторымен нұсқауыш, төрт нұсқауыштан тұратын атсыз массив және int типті он екі саннан тұратын атсыз массив. Атсыз массивтерге рұқсат алу үшін arr нұсқаушысымен адрестік өрнек қолданылады. Нұсқаушылар массиві элементтеріне рұқсат алу arr2[2] немесе *(arr2+2) түрінде бір индекстік өрнекті көрсету арқылы жүзеге асады. Int типті сандық екі өлшемді массив элементтеріне рұқсат алу үшін екі индекстік өрнек int түрінде немесе оған эквивалентті *(*(arr2+1)+2) және (*(arr2+1))[2] түріндегі қолданылуы мүмкін.
Тіл синтаксисіне сәйкес arr нұсқауышы және arr[0], arr[1], arr[2], arr[3] нұсқауыштары тұрақты болып табылады, оның мәнін өрнектерде қолдануға болады, бірақ, бұл мәндерді программаның орындалу барысында өзгертуге болмайды.
Көп өлшемді массив элементтері жадыда жол бойынша ретпен орналасады, яғне, соңғы индексі жылдам өзгереді, ал біріншісі баяу өзгереді. Бұндай реттілік көп өлшемді массивтің кез келген элементіне оның бастапқы элементінің адресі мен тек бір индекстік өрнекті қолдану арқылы рұқсат алуға мүмкіндік береді.
Мысалы, arr2[1][2] элементіне рұқсат алу int *ptr2=arr2[0] түрінде жарияланған, ptr2 нұсқаушысының көмегімен жүзеге асады. Ішкі ұқсас arr2[6] рұқсат алуын орындау мүмкін емес, себебі 6 индексті нұсқаушы жоқ.
Өзін_- өзі тексеру сұрақтары
-
Екі өлшемді массивті қалай сипаттауға болады?
-
Екі қлшемді массив элементіне қалай рұқсат алуға болады?
-
Екі өлшемді массивті қалай толтыруға болады?
-
Екі өлшемді массивті экранға қалай шығаруға болады?
-
Екі өлшемді массив үшін нұсқауыштарды қолдануға болады.
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
11 апта
Тақырып 11. Жолдар
Дәріс жоспары
-
Символдық берілгендер.
-
Жолдық тұрақтылар мен айнымалылар.
-
Жолдармен жұмыс жасауға арналған функциялар.
-
Символды массивтерді өңдеудің типтік алгоритмін программалау.
Дәрістің қысқаша конспектісі
Символдық берілгендермен жұмыс
Символдық тұрақты– бұл апострофқа алынған бір символ.
Мүмкін мәндер ASCII символдар кодының кеңейтілген теріліміне жатады. ASCII – бұл American Standard Code for Information Interchange-тің (ақпаратты алмастыруға арналған американдық код) аббревиатурасы. ASCII стандартына сәйкес әр символға және кейбір басқарушы инструкциялардың 0 ден 127- ге дейінгі мәндерді қабылдайтын өз сандық коды бар. ASCII кеіейтілген кестесі екі бөлімнен тұрады. Біріншісіне, 0-127 кодымен символдар кіреді, ол универсалды болып табылады, ал екіншісі, (128-255) кодтары, арнайы символдар мен халықтардың әріптеріне (соның ішінде орыс әріптеріне) арналған. Сөйтіп, пернетақтаның әр перненің ішкі коды бар, ол код перненің пренетақтада орналасуы мен пернедегі символдың бейнесіне байланысты.
Мысалдар:
ASCII-ге сәйкес :
-
'F' символының коды 70
-
'f' символының коды 102
-
2 символының коды 50
-
ESC пернесінің коды 27
-
ENTER пернесінің коды 13
-
ПРОБЕЛ пернесінің коды 32
және т.б.
Си тілінде символды берілгендерді сипаттау үшін анайы берілгендер типі жоқ, символды берілгендерді сипаттау үшін CHAR типі қолданылады.
Символды мәндерді printf() және scanf() форматты жолдарында шығарып енгізу үшін %c спецификациясы қолданылады.
Латын алфабитінің әріптерінің ішкі кодтары реттелген, сондықтан оларды цикл операторында қолдануға болады.
Мысал:
'a' дан 'n ' –ға дейінгі латын алфавитінің символдарын экранға баған ретінде шығару.
#include
main()
{
char x;
for (x='a';x<='n';x++)
printf("\n%c",x);
}
Назар аударыңыз!
Егер символды айнымалыны шығару кезінде %d спецификациясын қолданса, онда символдың өзі емес оның коды шығады.
scanf() және printf()функцияларынан басқа символдарды енгізу және шығару үшін библеотекада арнайы функциялар қарастырылған:
getchar() – функциясы пернетақтадан енген символдарды бір бірден оқиды. Енгізілген смволдарды оқу Enter пернесін басқаннан кейін орындалады. getchar() функциясының параметрлері жоқ.
putchar(x) – x -тің символдық мәнінін экранға шығарады.
getch() – пернетақтадан енген символды экранда бейнелемей енгізуге арналған. getch()функциясының параметрлері жоқ.
Ескерту: putchar() функциясында форматты жолды көрсетуге болмайды.
Жолдармен жұмыс
Жолдық тұрақты – бұл тырнақшаға алынған символдардың кезектілігі.
Жолдық символдардың ішінде арнайы символдық тұрақтылар кодына сәйкес басқарушы кезектіліктер болуы мүмкін.
Жолды жадыға орналастырғанда, транслятор оның соңына автоматты түрде '\0' символын , яғни, нөлдік байтты орналастырады.
Программада жолдарды жеке символдардан түрлендіріп, жолды аяқтау белгісінің келісімін сақтау керек.
Жолдың ұзындығы – бұл +1 жолындағы символдадың саны (нөлдік байт қосу есебінен).
Жолды жазуда бір символ болуы да мүмкін, мысалы, "A", бірақ, "A" символдық тұрақтысына қарағанда, "A" жолының ұзындығы екі байтқа тең.
Си тілінде жолдар үшін жеке тип жоқ.Жол-бұл символдардың массиві деп қабылдауға болады. Бұндай массивтегі символдар саны сәйкес жолдық тұрақтыда бейнеленгеннен 1 – ге артық (нөлдік байт қосу есебінен).
Символдар массивіне (яғни, жолға) қарапайым меншіктеу көмегімен мән меншіктеуге болмайды.
Символдар массивіне инициализация (символды массивті сипаттауда) көмегімен немесе енгізу функциясының көмегімен жолды орналастыруға болады.
scanf() және printf() функцияларында символдық жолдар үшін %s спецификациясы қолданылады.
Жолды шығару үшін puts(s) функциясын қолдануға болады, мұндағы s – жол.
char типті массивті инициализациялаумен бірге сипаттауда жолдың ұзындығын көрсетпеуге болады.
Мысал:
Экранға жолды шығару.
#include
main()
{
char x[]="Привет";
printf("\n%s",x); /* бұл оператордың орнына puts(x) қолдануға болады * /
}
Өзін –өзі тексеру сұрақтары
-
Жол дегеніміз не?
-
Программада жолды қалай сипаттауға болады?
-
Жолдық берілгендерге қандай операциялар қолдануға болады?
-
Жолдың жеке символына қалай рұқсат алуға болады?
-
Жолдармен жұмыс жасаудың қандай функциялары бар?
-
Екі жолды қалай салыстыруға болады?
-
Жолдық айнымалыға мәнді қалай меншіктеуге болады?
-
Жолдың ұзындығын қалай анықтауға болады?
8.1. Негізгі әдебиеттер
1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995
2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999
3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005
8.2. Қосымша әдебиеттер
1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000
2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984
12 апта
Тақырып 12. Берілгендер құрылымы
Дәріс жоспары
-
Құрылымды қолдану.
-
Құрылымды сипаттау.
-
Құрылымдық айнымалыларды сипаттау.
-
Құрылым массивтері.
-
Берілгендердің құрылымы мен нұсқауыштар.
Дәрістің қысқаша конспектісі
Құрылымдық типтер мен құрылымдар
Үлкен көлемді мәнді жиынды өңдеу тапсырмасын шешуде массивтер қолданылады. Бірақ, масивтрмен жұмыста массивтің әр элементінің типтері бірдей болу керек.
Көптеген экономикалық және ақпаратық есептерде ведомость, құжаттарды, тізімдерді өңдеуде әр түрлі типтегі берілгендерді бір топқа біріктіру қажеттілігі туындайды. Мысалы, қоймадағы тауар келесі өлшемдермен сипатталады:
-
Тауар аты;
-
Көтерме(сататын) бағасы;
-
Сауда қымбаттатуы пайызбен;
-
Тауар партиясының көлемі;
-
Тауар партиясының түскен күні.
Бұл мысалда өлшемдердің типтері келесідей:
-
Тауар аты (char []);
-
Көтерме(сататын) бағасы (long);
-
Сауда қымбаттатуы пайызбен(float);
-
Тауар партиясының көлемі (int);
-
Тауар партиясының түскен күні (char [9]).
Бұндай обьектілерді Си тілінде сипаттау үшін құрылымдық берілгендер типі қолданылады.
Құрылым– бұл бір компонент деп аталынатын (өріс) немесе бірнеше типтердің фиксирленген элементтер санынан тұратын берілгендер типі.
Бір типті элементтерден тұратын массивтерге қарағанда, құрылымның компоненттері әр типті бола алады және олардың әрқайсысыныі аты әр түрлі болуы керек.
"Қоймадағы тауарлар" құрылымының аталған элементерінің типтерін программист өзі таңдаған. Мағынасына қарай компонентердің типтері тілде рұқсат етілгендердің кез келгені бола алады. Өоймадағы тауар көп болуы мүмкін болғандықтан, нақты тауар туралы мәліметтен тұратын жекеленген құрылымдарды сипаттау үшін , программист құрылымдық деп аталатын өз бетінше тип енгізеді. Біздің мысалымыз үшін оны былай енгізуге болады:
struct goods {
char name[]; /* Атауы */
long price; /* Көтерме бағасы */
float percent; /* Қымбаттауы % */
int vol; /* Партия көлемі */
char date [9]; /* Партияны әкелу күні */
};
Мұнда struct – құрылымдық тип спецификаторы (қызметтік сөзі ); goods – құрылымдық типтегі пограммист ұсынған атау (ат). ("tag" ағылшынн терминінің аудармасын қолданып,құрылымдық типтің орыс тіліндегі баламасы Си тілінде көбінесе тег деп аталады). goods типтік әр обьектісіне кіретін, элементті сипаттау фигуралық жақшаға алынады. Сөйтіп, құрылмдық типті анықтау форматы келесідей:
struct құрылымдық_тип_аты { элементті_сипаттау };
мұндағы struct – құрылымдық тип спецификаторы;
құрылымдық_тип_аты – программист өз еркімен таңдайтын идентификатор;
элементті_сипаттау – әр қайсысы енгізілетін құрылымдық типтің элементтері үшін прототип қызметін атқаратын, бір немесе одан да көп обьектілерді сипаттау жиыны .
Құрылымдық тип сипаттамасы үтір нүктемен аяқталатынын ескеру керек.
struct конструкциясы құрылымдық_тип_аты тип спеификатор сияқты рөл атқарады. Мысалы, double немесе int.
Құрылымдық сипаттау. Құрылымдық типтегі элементтерді (компонентерді) сипаттау сыртынан қарағанда сәйкес типті берілгендерді сипаттауға ұқсас. Бірақ, маңызды айырмашылықтары бар. Құрылымдық типті сипаттағанда оған жады бөлінбейді, оларды инициялизациялауға болмайды. Басқаша айтқанда, құрылымдық тип обьект болып табылмайды.
Біздің goods деп аталатын, құрылымдық типті анықтау мысалымыздан, тауардың атауы name атты char типті массивпен байланысты. Тауар бірлігінің көтерме бағасы percent аты long типті болады. Сауда қымбаттауы percent аты float типті болады. Бұның бәрі goods атты құрылымдық иптің сипатталуынан шығады. Бірақ, құрылымдық типті сипаттауға енген элементтерден бірінші мән ала алады, осындай типті бір құрымым болсын (яғни, құрылымдық обьект) сипатталған болу керек. Мысалы, келесі сипаттау екі құрылымды шығарады, яғни, goods типті екі обьектті шығарады:
struct goods coat, tea;
Сөйтіп, құрылымдық тип сипатталған және оның аты анықталған болса, онда нақты құрылымды сипаттау форматы (құрылымдық тип обьектісі) келесідей:
struct құрылымдық_тип_аты құрылым_тізімі,
мұндағы құрылым_тізімі – қолданушы таңдаған аттар тізімі (идентификаторлар).
Аталған құрылымдық сипаттау кезектіліктерден басқа (құрылымдық тип сипатталады, содан соң оның атын қолдану арқылы құрылымы сипаталады) Си тілінде тағы екі сызба және оның сипатталуы бар. Бірінші, құрылым құрылымдық типиен бірге сипаттала алады:
struct құрылымдық тип аты { элементерді сипаттау } құрылым тізімі;
Мысал
Кесте жолында берілген берілгендерді сипаттау:
№
|
Атауы
|
Саны
|
Бағасы
|
Шығарылған жылы
|
1
|
Стол
|
120
|
3000,5
|
2002
|
Достарыңызбен бөлісу: |