Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Көлік техникасының қолданбалы программалар негі...doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

4.2. Инкрементті және декрементті операторлар

С/ С++ тілдерінде айнымалылардың мәндерін өсіруге немесе кемітуге арналған екі оператор бар:

инкрементті оператор ++ - өз операндасына 1-ді қосу операторы, ал

декрементті оператор - - өз операндасынан 1-ді шегереді.

Бұл операторлар тек айнымалыларға ғана қолданылады. Мысалы, Мына өрнекке қолдану (х+у)++ - дұрыс емес .

++ және – операторларын айнымалының алдына (префиксті оператор)

немесе артына(постпрефиксті) қойып қолдануға болады.

Мысалы, ++n және n++ .

Егер өрнекте ++ немесе – операторлары жалғыз ғана оператор болса, оның алдында немесе артында қойылуы бәрібір. Ал күрделі өрнекте кездессе, онда і++ болса, айнымалының мәнін алдымен қайтарып, сосын ғана оның мәнін арттырады. Ал, ++і болса, онда і-дің мәнін арттырып, соны қайтарады.

Мысалы.

int a=10, b, c=1; {Айнымалылар осы түрде сипатталған делік}

c=++a; {Орындалу нәтижесінде: a=11, c=11}

a=b=c--; c=a++; { Орындалу нәтижесінде: a=11, c=10}

c = a --; { Орындалу нәтижесінде: a=9, с=10}.

4.3. Қатынас және логикалық операторлары

Қатынас операторлары:

«<» - кіші, «<=» - кіші немесе тең, «>» - үлкен, «>=»- үлкен немесе тең. Бұл операторлардың приоритеттері бірдей. Бұдан бір деңгейге төмен: == (тең) және != (тең емес).

Логикалық операторлар &&(және) немесе ||(немесе). Арасында && немесе ||

операторлары тұрған өрнектер солдан оңға қарай есептеледі және нәтиженің мәні

ақиқат немесе жалған болғанда бірден аяқталады.

 ! – унарлық оператор (не), нөлдік емес операндты 0-ге, ал 0-ді 1-ге айналдырады, көбінесе мынадай констукцияда қолданылады:

if (!V) немесе if(V= =0). Бұл екі конструкция эквивалентті.

f (!V) – конструкциясы “егер V нөл емес болса” деп оқылады.

3.1. Биттік операторлар

Биттік операторлар жеке биттер, графикалық бейнелерді экранға шығару барысында қолданылады. Биттермен жұмыс жасауға арналған 6 оператор бар. Бұларды тек бүтін мәнді операндтарға қолданады, яғни char, short, int, long типті операндтарға қолданады.

Мысалы, а және в мәндері үшін амалдардың қолданылу нәтижесі:

& - биттік «және» операторы:

a b a&b

0 0 0

0 1 0

1 0 0

1 1 1

| - биттік «немесе» операторы:

a b a|b

0 0 0

0 1 1

1 0 1

1 1 1

^ - биттік «шығарушы немесе» (исключающее ИЛИ) операторы:

a b a^b

0 0 1

0 1 1

1 0 1

1 1 0

<< - солға жылжу операторы.

>> - оңға жылжу операторы.

~ - унарлық жоққа шығару операторы.

<<-оператордың сол жағындағы бүтін мәнді айнымалының биттік бейнесін оператордың сол жағында көрсетілген санға сәйкес битке жылжытады. Және босатылған төменгі биттер саны азаяды.

Мысалы, int c=65; /*0100 0001*/

C<<=1; /*1000 0010*/

Printf(“%d”,c); /* 130-шығады*/.

Ал, >>оңға жылжыту сол секілді, тек санның биттік бейнесінде көрсетілген битке оңға жылжыту жүзеге асырылады,және босатылған үлкен биттер 0-ге толтырылады,ал кіші биттер мағынасын жоғалтады.

Int c=10; /* 0000 1010*/

c>>=1; /* 0000 0101*/

printf(“%d”,c); /*5-шығады*/

Үтір(,) операторы - бір жолда жазылған 2өрнекті тізбектеп орындауға мүмкіндік береді.Нәтижесінде үтірдің оң жағында орналасқан өрнектің мәні қабылданады.

4.5. Меншіктеу операторлары және шартты өрнек

Біріктірілген меншіктеу операторы және өрнек.

Біріктірілген бинарлық операторға <ор>= меншіктеу операторы сәйкес келеді, мұндағы <ор> – мына операторлардың бірі: +, -, *, /, %, <<, >>, &, ^, | бола алады. Мына жазба < өрнек1> ор = < өрнек2> төмендегі өрнекпен эквивалентті:

<өрнек1> = <өрнек1> ор <өрнек2> .

Мысалы,

x+=5; {x=x+5 өрнегімен эквивалентті }

y*=2; {y=y*2 өрнегімен эквивалентті }

Шартты өрнек. «?=» тернарлық операторының көмегімен шартты өрнек құруға

болады. Жалпы жазылу форматы мынадай:

«өрнек1» ? «өрнек2» : «өрнек3»

Алдымен «өрнек1» есептелінеді, егер оның мәні нөлге тең емес болса, яғни ақиқат мән қабылдаса, онда «өрнек2» есептелінеді де оның мәні шартты өрнек мәні болып табылады, әйтпесе «өрнек3» орындалады да, соның мәні қабылданады. Мысалы, z=(a>b)?a:b өрнегі z=max(a,b) математикалық өрнегін программалауда қолданылады.

4.6. Амалдар приоритеттерінің кестесі

Аталған операторлардың приоритеттері мен орындалу реттерін білу маңызды.

Олар төмендегі Кесте №1-де көрсетілді. 52

Кесте№1.-Есептеулер реті мен приоритеттері кестесі

Операторлар Реті

( ) [ ]

! ~ ++ -- + - * & size of

* / %

+ -

<< >>

< <= > >=

= = !=

&

^

!

&&

::

?:

=+= -= *= /= %= &=^= := <<= >>=

,

солдан оңға

оңнан солға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

солдан оңға

оңнан солға

оңнан солға

солдан оңға

Кестеде операторлардың реті мен приоритетті берілген, бір жолдағы операторлар приоритеті бірдей. Приоритеті төмені бірінші орындалуы үшін жақша қолдану қажет.

Мысалы, if((x & mask)= =0)…

Компилятор түрлері әртүрлі, соған сәйкес операторлар орындалу реттері д құбылуы мүмкін.

4.7. Типтерді түрлендіру

Егер оператор операндтары әр түрлі типке жатса, онда олар қайсібір жалпы түрге келтіріледі. Келтірулер ержелерге сәйкес орындалады. Әдетте ешқандай ақпаратты жоғалтпай мәндері аз диапазонды операндтарды мәндері үлкен диапазоды операндтарға айналдыру автоматты түрде жузеге асырылады. Мысалы, бүтінді жылжымалы нүктелі санға айналдыру. Char типті мәндер - бүтіндер және оларды арифметикалық өрнектерде қолдануға болады.

Бақылау сұрақтары:

1. Операторларының универсалды тілдегі операторлардан өзгешелігі бар ма?

2. Типтерді айқын түрлендіру не үшін қажет?

3. Инкрементті және декрементті операторларының қолданылу, жазылу

реттеріне қарай қызметі?

4. Биттік операторлар қолданылуына мысал келтіріңіз.

Әдебиеттер:[1-10], [16-17].

53

Дәріс №5. БАСҚАРУ ИНСТРУКЦИЯЛАРЫ МЕН КОНСТРУКЦИЯЛАРЫ

Дәріс мақсаты: Тілдің басқару инструкциялары мен негізгі конструкцияларын

түсіндіру.

Кілттік сөздер: Инструкция, блок, тармақталу, таңдау, цикл, іштестірілген цикл, цикл денесі, итерация, конструкция.

Жоспары:

5.1. Инструкция және блоктар түсінігі.

5.2. IF-ELSE6 ELSE-IF конструкциясы

5.3. switch инструкциясы.

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

5.1. Инструкция және блоктар түсінігі.

С/С++ тілдерінде кезкелген өрнек соңына нүктелі үтір (;) қойылса, онда ол инструкция болып табылады.

Мысалы, x=0;

I++;

Printf(…); -инструкциялар.

Демек, нүктелі үтір Паскаль тіліндегідей ажыратқыш емес, инструкцияның соңын білдіретін литер болып табылады. Фигуралық жақша ({…}) инструкциялар мен сипаттамаларды біріктіріп блок құруға мүмкіндік береді. Блок соңына нүктелі үтір қойылмайды.

5.2. IF-ELSE және ELSE-IF конструкциясы

if-else конструкциясы.

Төмендегі конструкция программадағы бірнеше жолдың біреуін таңдауға қолданылады: Ол келесі түрде жазылады:

If (өрнек)

инструкция1

else

инструкция2

Мұнда else тармағы болуы да болмауы да мүмкін. Алдымен «өрнек» есептеледі, егер ол ақиқат болса, онда инструкция1 орындалады. Егер өрнек жалған және else тармағы бар болса, онда инструкция2 орындалады. If өрнектің сандық мәнін ғана тексеретіндіктен, шартты кейде қысқартылған түрде жазуға болады.

Мысалы:

If (өрнек)

жазуы

if (өрнек!=0).

54

Кейде бұндай қысқартулар анық болады, ал кейбір жағдайларда керісінше программаны түсінуді қиындатады. Бір-біріне іштестірілген If конструкцияларының бірінің else тармағы болмауы конструкция жұмысын түсінуде қиындықтар туғызады. Мұндай жағдайда блокты орынды қолданған жөн.

If (n>0)

If (a>b) z=a;

Else z=b;

else ішкі if-ке тиісті. Егер бізге басқа интерпретация қажет болса, фигуралық жақшаларды дұрыс қоюымыз қажет:

if (n>0){

if(a>b) z=a;

}

else

z=b;

Мұндағы z=a-дан кейін тұрған нүктелі үтірге көңіл бөліңіз:

If (a>b)

z=a;

else

z=b;

Мұндағы нүктелі үтір міндетті түрде керек, себебі грамматика ережесі бойынша If-тен кейін инструкция тұру қажет, ал z=a; түріндегі инструкция әрқашан нүктелі үтірмен аяқталады. else-if конструкциясы.

Конструкция

If (өрнек)

инструкция

еlse if(өрнек)

инструкция

еlse if(өрнек)

инструкция

еlse if(өрнек)

инструкция

еlse

инструкция

Келтірілген if инструкциялар тізбегі -көпсатылы шешім қабылдайтын сипаттаудың жалпы әдісі. Алдымен өрнек рет бойынша есептеледі, ''ақиқат'' мәнді өрнек кездескеннен кейін, оған сәйкес инструкция орындалады; осымен тексеру тізбегі аяқталады. Мұнда инструкция деп не бір инструкция не фигуралық жақшаға алынған инструкциялар тобы айтылып отыр. Егер алдыңғы шарттар орындалмаса,Сонда соңғы еlse тармағы орындалады. Көпжолдық тармақталуды көрсету үшін v-массивінен x мәнін іздейтін функцияны қарастырайық. v-массивінің элементтері өсу реті бойынша орналасқан делік. Функция v-массивінен x мәнінің орнын көрсетеді (0-ден n-1-ге дейінгі сандар). Егер ол онда кездессе оның орынын, ал, егер ол жоқ болса -1-ді қайтарады. 55 Бинарлық іздеуде алдымен х-тің мәні v-массивінің ортасында орналасқан элементпен салыстырылады. Егер х ол мәннен кіші болса, онда v-массивінің ''жоғары'' бөлігі іздеу облысы болады, кері жағдайда -''төменгі''. Қай жағдайда да келесі қадам - ол ортанғы элементтің кері бөлікпен салыстыру. Диапазонды бөліктеу процесі мән табылғанша немесе диапазон бос болғанға дейін қайталанады. Бинарлық іздеу функциясы денесі мынадай:

/*binsearch:v[0]<=v[1]<=...<=v[n-1]-ден x-ті табу*/

int binsearch(int x,int v[ ],int n)

{

int low,high,mid;

low=0;

high=n-1;

while(low<=high){

mid=(low+high)/2;

if (x<v[mid])

high=mid-1;

else if (x>v[mid])

low=mid+1;

else /*x табылды*/

return mid;

}

return -1; /*x табылған жоқ*/

}

5.3. switch инструкциясы

Программалауда екі немесе оданда көп тармақтық жағдайларды ұйымдастыруда тармақталу алгоритмдері құрылады. Ол үшін арнайы инструкция қарастырылған:

Switch (өрнек) {

Case <тұрақты-өрнек> : <инструкциялар>

Case <const-өрнек> : <инструкциялар>

Default : <инструкциялар>

}

Switch инструкциясы өрнектің мәні берілген тұрақтылар жиынынан алынған мәндердің біріне тең болса, онда оған сәйкес тармақты, ал ешқайсысына тең болмаса, онда default сөзінен кейінгі тармақ орындалады, егер ол жоқ болса, ештеңе орындалмайды. case және default тармақтарын әртүрлі ретпен қоюға болады. Әрбір тармақтың соңына break инструкциясын қойған дұрыс. Тұрақты мәндер қайталанбау керек.

Мысалы,

While ((c=getchar())!=EOF){

Switch{

Case ”0”: k0++;

Case ”5”: k5++; break;

Case ’ ‘: kp++; break;

Default n++; break;

}

}

Түсіндіру:

“,” операторы - бір жолда жазылған екі өрнекті орындауға мүмкіндік береді. Нәтижесі “,”-ң оң жағындағы өрнек мәні болады, <өрнек1>, <өрнек2>

Мысалы,

for (min=1, max=5; min<max; min++, max--){

Printf(“%d,%d”, min, max)}

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

Программалау негіздеріндегі қайталау алгоритмдерін ұйымдастыруда қолданылатын негізгі үш циклдық конструкция қарастырылған. Олардың бір-бірінен басты ерекшелігі циклдың қайталану шартына қарай цикл денесінің орындалу ретінің анықталуына байланысты.

While циклы

Жалпы форматы:

While <өрнек> инструкция

Мұндағы, <Өрнек> есептелінеді, егер мәні 0-ге тең емес болса, онда инструкция орындалады да өрнек қайта есептеледі және ол өрнек мәні 0-ге дейін қайталанады.

for циклы

For (өрнек1;өрнек2; өрнек3) инструкция

Мұндағы: өрнек1 және өрнек3 көбінесе меншіктеу немесе функцияны шақыру, ал өрнек2 қатынас өрнегі болып табылады. Өрнек1 цикл орындалғанға дейін қабылданғаннан кейін қатынас өрнегі тексеріледі. Егер қатынас өһрнегі ақиқат мән қабылдаса, онда циклдың денесі ретінде анықталған инструкция орындалады. Цикл денесі орындалған соң, яғни итерация аяқталғаннан кейін өрнек3 орындалады да қатынас өрнегі қайта тексеріледі. Осы процесс оның мәні жалған мән қабылдағанға дейін жалғасады. Бұл өрнектердің кез-келгені болмаса да ; қойылуы міндетті.

Мысалы,

for(;;) {

…

}

57

Мұнда өрнек2 мәні барлық уақытта ақиқат деп есептелінеді, бұл шексіз циклды көрсетеді. Мұның жұмысы breаk немесе return инструкцияларының көмегімен тоқтатылуы мүмкін.

Цикл мысалы:

For(i=0,i<n;i++) ...

Do-while циклы

Жалпы форматы:

Do

инструкция

while (өрнек);

Инструкция орындалған соң өрнек есептеледі, ақиқат болса онда инструкция қайта орындалады. Break және Continue Break-циклдан немесе ажыратқыштан уақытынан бұрын шығару. Continue-циклды келесі итерациясына көшіру Return инструкциясы-программаның орындалу барысында жұмысын тоқтату үшін қолданылады,аяқталу кодын меншіктейді. Goto инструкциясы және белгі Іштестірілген күрделі құрылымдарды үзу үшін кейде goto қолданылады. Ол көрсетілген белгіге көшеді. Белгі - айнымалы атауы секілді, белгілі бір атпен аталады да соңына : қойылады.

Мысалы, for(…)

For(…) {…

If() goto error;

Бақылау сұрақтары:

1. Басқару конструкцияларындағы жазылу формасына мән беріңіз.

2. Блок қай жағдайда қолданылады?

3. Дейін-циклы мен Әзір-циклын ұйымдастырыуында қандай

конструкцияларды пайдаланған дұрыс?

4. Циклды уақытына бұрын тоқтату инструкциясы қандай?

Әдебиеттер:[1-5, [10], [16-17].

Дәріс №6. МАССИВТЕР

Дәріс мақсаты: Массив, оның қасиеттері мен сипатталуы, қолданылу реттері

мен алдын-ала инициялизациялануы туралы түсініктерді беру. С/С++ тілдерінде бір немесе бірнеше өлшемді массивтердің құрылымы мен қолданылуын үйрету. 58

Кілттік сөздер: Массив, массив элементтері, индекс, элементтер типі, массив элементтерінің саны, атауы, инициялизациялау, бір өлшемді массив, көп өлшемді массивтер.

Жоспары:

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

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

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

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

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

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

Массив дегеніміз - бір атпен аталған, әртүрлі индекстелген бір типті элементтер жиынтығы. Қасиеттері:

Массивтің қасиеттерін анықтайтын 4 негізгі принципі бар:

-массивте элементтер деп аталатын мәндер сақталады;

-массивтің барлық элементтері бір типті болуы керек;

-жадыда массивтің барлық элементі тізбектеліп орналасады және бірінші элемент адрестің нөлдік индексін білдіреді;

-массив атауы тұрақты болып табылады және массивтің бірінші элементінің адресінен тұрады.

Mассивтің сипатталуы:

<элементтің типі> <массив аты> [<элементтер саны>];

Мысалы, int a[12]; {12 элементтен тұратын массив} char s[20]; {20 элементтен тұратын массив}

#define KOL 10 {}

int [KOL];

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

Массивті инициялизациялау 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-ші мысалда массивтің элементтер саны мәндері санына қарай анықталады.

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

Массив элементтерін қолдану үшін квадрат жақшада бүтін мәнді индекс көрсетіледі. Мұндағы индекс массивтің базалық адресіне қарағанда элементтің орнынының ығысу адресін анықтайды. С/С++ машиналық-бағытталған тіл болғандықтан массивтің бірінші элементті 0-ші индекстен басталып нөмірленеді, себебі массивтің бірінші элементті оның базалық адресінің басынада орналасады да бірінші элементтің адресін алу үшін ешқандай ығысу жасалудың қажеті жоқ. Мысалы, 5-ші элементтің адресін алу үшін базалық адрестен бастап, 4 элементке ығысу орындалуы тиіс. Массивпен жұмыс жасауда алдымен массив сипатталады. Мұнда квадрат жақшада оның элементтерінің саны көрсетіледі, ол өз кезегінде жадыдан бөлінетін ұяшықтар санын анықтайды.

Мысалы:

Int imas[6];

Сипатталуына сәйкес анықталған массивтің элементтерінің саны -6 және элементтері 0-ден 5-ке дейін индекстелгендіктен мынадай қолданылу жолы дұрыс болмайды:

Imas[6]=3667;

Массив элементін қолданғанда индекс ретінде үш түрлі мән беруге болады:

1. Сандық тұрақты.

2. Айнымалы.

3. Өрнек.

Мұндағы мәндердің нәтижесі массивтің сипаттамасындағы мәліметтерге сәйкес логикалық корректі сан болуы тиіс.

Қолданылу мысалдары:

#define K 8

int imas[k]; /*8 элементтерен тұратын массив сипаты */

int w=6; /* w бүтін типті айнымалысының сипаты*/

imas[3]; /*массивтің 4-ші элементті */

imas[w]; /* массивтің 7-ші элементі */

imas[k-6]; /*массивтің 3-ші элементі */

Индекс массивтің жадыдан қанша байт орын алатынынан тәуелсіз тікелей реттік нөмініне сілтейді.

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

Егер программада жолдық мәліметтерді өңдеу қажет болса, онда оны символдар массив ретінде қарастыру қажет. Мұндай массивте жолдың әр элементі үшін жеке ұяшықтар бөлінеді және ең соңғы элементі ретінде жолдың соңы таңбасы (\о) қойылуы тиіс. Символдық массивті енгізу және инициализациялау мысалдарына программа келтірейік:

#include <stdio.h>

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);

}

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

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

Бір типті элементтер жиынтығын өңдеуде олардың жадыда санына қарай және элементтерін қолдану моделіне қарай анықтап сипаттау мүмкіндігі бар. Соған байланысты массивтің өлшемі анықталады деп есептеледі. Демек, индекстерінің 61 көрсетілуіне қарай бір өлшемді, екі өлшемді т.с.с. массивтерді анықтауға болады. Екі немесе одан да көп өлшемді массивтеркөп өлшемді массивтер деп аталады. Сәйкес өдшемде сипаттау үшін квадрат жақшаларда олардың өлшемдері көрсетіледі. Мысалы, екі өлшемді массив екі квадрат жақшамен анықталып төмендегідей сипатталады:

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 элементке жылжу қажеттігін аңғару қиын емес.

Бақылау сұрақтары:

1. Массив атауы айнымалы ма?

2. Массивтің нөлден бастап нөмірленуі неден тәуелді?

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

беріңіз.

Әдебиеттер:[1-5],[7 -10], [11].

Дәріс №7. ФУНКЦИЯЛАР. РЕКУРСИЯ

Дәріс мақсаты: Ішкі программалар: функциялар түсінігін қалыптастыру.

Функцияларды сипаттау және қолдану реттерін үйрету. Рекурсивті алгоритмдерді программалау жолдарын көрсету.

Кілттік сөздер: Функция, функция прототипі, функция аргументтері, функция қайтаратын мән, формалды және нақты аргументтер, аргументтердің берілу тәсілдері, рекурсия, рекурсивті алгоритмдер.

Жоспары:

.

7.1. Функциялар. Функцияны сипаттау.

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

7.3. Аргументтерді берілу тәсілдері.

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

7.1. Функция. Функцияны сипаттау.

Си-дегі кез-келген программа - бұл айнымалылар сипаттамасы мен функциялар жиынтығы. Функциялар арсындағы байланыс мән қайтаратын аргументтер мен сыртқы айнымалылар арқылы орнатылады. Return инструкциясы нәтижені шақыратын функциядан шақырған функцияға қайтару механизмін орындайды және return сөзінен кейін кез келген өрнек тұруы мүмкін.

Return <өрнек>;

Өрнекті жақшаға да жазуға болады, бірақ ол міндетті емес.Си-дегі функция Раscal- ғы процедура мен функция секілді.

Айырмашылығы:-Си-де функцианың барлық аргументі параметрлер ретінде беріледі, яғни шақырылатын функцияға аргументтің өзі емес оның аргументтерінің мәні беріледі. Си-гі кез келген функцияның прототипі болуы тиіс, яғни функция аты, аргументтерінің типі және қайтарылатын нәтиже типі көрсетілген тақырыбы хабарланады. Прототипі программа денесінде немесе бөлек тақырыптар файлында айқындалады. Функция прототипі компиляторға функция туралы информация береді де, сәйкесінше компилятор типтер сай келуін тексереді. Функция әртүрлі типті мән қайтара алады, М, int,void,float т.б. 63

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

Айнымалылар жергілікті және сыртқы болуы мүмкін. Жергілікті айнымалылар функция ішінде сипатталады да сонда ғана “көрінеді”. Сыртқы айнымалылар кез келген функция сыртында сипатталады да, сол функцияның кез келген жерінде қолданылады. Кез келген функцияны анықтау үшін форматы:

<тип нәтиже> <функция аты> (параметр тізімі)

{

<функция денесі>

}

Mысалы:

#include <stdio.h>

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<k)? k:d;

Return d;

}

Формальды және нақты параметрлер

Кез келген функцияның формалды аргументтер тізімі болады (болмауы да мумкін). Программадан функция шақырғанда аргумент тізімі беріледі. Аргументтер адрес алу мысалын қарастырайық:

#include <stdio.h>

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);

}

64

int prim (int *pa, int*pb);

{

int q;

q=*pa * *pb;

return (q);

}

С++-те аргументтерді беру барысында көрсеткіш орнына тікелей сілтеме беруге болады. Сілтеме де аргументке сілтейді, бірақ көрсеткішті айқындау операторын қолдануды қажет етпейді. Мысалы, төмендегі С++ тіліндегі программада функцияны шақырғанда адрес алу операторы, ал функция денесінде көрсеткіш опраторлары қатыспайды.

#include <iostream.h>

Int prim (int &pa, int &pb);

Int main ( )

Int ia, ib, ic;

cin >>ia; cin >>ib;

Ic=prim (ia,ib);

cout >< “kob=”<<ic;

Return (0);

}

Int prim (int &pa, int &pb)

{int q;

q=pa +pb;

return (q);

}

7.3. Функция аргументтерінің берілу тәсілдері

Аргументтерінің айнымалы-мән ретінде берілу тәсілі:

Аргументтер мән ретінде берілгенде функцияның ішінде аргумент аттас жергілікті айнымалы құрылады да оның мәні функцияда өзгеруі мүмкін, бірақ аргументтің мәні өзгермейді. Айнымалы-сілтеме арқылы берілу тәсілі: Аргументтегі айнымалы сілтеме арқылы берілгенде функция аргументтің мәнін емес, оның адресін алады. Ал мұнда құрылған жергілікті айнымалы көрсеткіш болады. Бұл, жадыны үнемдеуге мүмкіндік береді және функцияның орындалу барысында айнымалы аргумент мәні өзгереді. Бұл жағдайда функция аргумент айнымалы сілтеме арқылы бірнеше мән қайтара алады. Әртүрлі типті аргументті функцияларды қарастырайық: Функция аргументтері Char, int, float, double, массив типті бола алады. Функция аргументтері болмауы да мүмкін. Онда Void қызметші сөзі қолданылады және ол функцияның аргументтерінің жоқ екенін білдіреді. 65

Mысалы,

#include <stdio.h>

Void primer(void);

Int main ( )

{

printf (“cанның кубын анықтау”);

Primer ( );

Return (0);

}

Void primer (void)

{

int t=8;

Printf (“t-ның кубы=%d\n”,t*t*);

}

Функция аргументі ретінде массивті беруге болады, мұнда функция массивтің бірінші элементінің адресін көрсеткіш түрінде қабылдап алады.

Мысалы:

#include <stdio.h>

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[]) сипатталады. Ескерту: С++ тілінде сілтемеге сілтеме, биттік өріске сілтеме, сілтемелер массивіне сілтеме және сілтемелерге көрсеткіштер қолданылмайды.

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

Өзін өзі шақыратын функция рекурсия деп аталады. Рекурсия тереңдігі дегеніміз – функция мәнін есептеуде өзін-өзі шақыру саны. Рекурсивті программалау стек принципіне сүйенеді. 66

Рекурсия түрлері мынадай:

 сызықтық рекурсия;

 параллель рекурсия;

 қосалқы рекурсия;

 жоғары ретті рекурсия.

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

 6!- алты факториялды есептеу алгоритмі:

#include <stdio.h>

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 <stdio.h>

#include <math.h>

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));

}

Бақылау сұрақтары:

1. Ішкі программа дегеніміз не?

2. Функция қандай типті мәндер қайтара алады?

3. Рекурсияның қандай түрлері бар?

Әдебиеттер:[1-5],[7-10], [12-17].

Дәріс №8. КӨРСЕТКІШТЕР

Дәріс мақсаты: Оперативі жадыдағы ұяшықтар адресін көрсету арқылы программалау барысында қолданылатын көрсеткіштер ұғымын қалыптастыру. Көрсеткіштердің сипатталуы, қолданылуы және адрестік арифметиканы орындау жолдарын көрсету.

Кілттік сөздер: Адрес, логикалық адрес, нақты адрес, көрсеткіш, көрсеткіштер қолданылуы, көрсеткіштер мен массивтер, көрсеткіштерге көрсеткіштер, адрестік арифметика.

Жоспары:

8.1. Көрсеткіштер және адрестер.

8.2. Көрсеткіштер және функциялар аргументтері.

8.3. Жолдарға көрсеткіштер.

8.4. Көрсеткіштер мен массивтер.

8.5. Көрсеткіштерге көрсеткіштер.

8.6. Адрестік арифметика.

8.1. Көрсеткіштер және адрестер

Есептеуіш техникасының жадысын жеке-жеке немесе тұтас күйінде басақару мүмкіндігі болатын ұяшықтар тізбегінен тұратын массив түрінде қарастыруға болады. Әрбір ұяшық нөмірленеді және адрестеледі. Ол адрестерді меншіктететін айнымалыларды тағайындауға болады. Ол айнымалылар көрсеткіш деп аталады. Көрсеткіштер дегеніміз - басқа айнымалыларының адресінен тұратын айнымалы. Көрсеткіш - адрес сақтаған ұяшықтар тобы (2 н/се 4 ұяшық). Ұяшықтардың нақты адрестерін қолдану үшін арнайы операторлар қарастырылған:

& унарлық операторы объектінің адресін береді. Р=&C - инструкциясы С ұяшығының адресін Р айнымалысынаа меншіктейді немесе Р айнымалысы С-ға сілтейді деп аталады. 68 * унарлық операторы көрсеткішті сипаттауда қолданылады. Көрсеткіш бұл операторды қолданылғанда осы көрсеткіш сілтейтін объектіні береді.

Мысалы:

х,у- бүтін. Р-бүтін мәнге көрсеткіш болсын.

Int х=10, У=5, А[1]; {айнымалылар сипаттамасы}

Int *р; {бүтін мәнге көрсеткіш }

Р=&Х; {Р енді х-ке сілтейді.}

У=*Р; {У=10}

*Р=0 ; {х= бос жиын};

Р= &а [0]; {р енді а [бос жиын] көрсеткіш}

Мұндағы, Int *р сипаттамасы- «*р өрнегі бүтін типті мән» дегенді білдіреді. * және & операторларының приоритеті арифметикалық операторларға қарағанда жоғары.Мысалы:

У=*Р+1 {Р сілтейтін мәнге 1-ді қосу және оны У-ке меншіктеу}

*Р+=1 {Р сілтейтін мән 1-ге арттырылады}

++*Р { Р сілтейтін мән 1-ге арттырылады }

(*Р)++ жақша болғандықтан Р сілтейтін мән 1-ге арттырылады. Ал жақша болмаса * және ++ унарлық операторларының приоритеттері бірдей, ал орындалу реттері оңнан солға қарай орындалатындықтан бұл көрсеткіштің өзінің мәні арттылады. Көрсеткіштік айнымалылардың өзін де қолдана аламыз.

Мысалы:

q=p { бүтін мәнге тағы бір көрсеткіш болады}.

8.2. Көрсеткіштер және функция аргументтері

Си тілінде функция өз аргументі ретінде параметр-мәнді қабылдайды, сондықтан шақырған функцияның айнымалысын шақырылған функция денесінде отырып өзгерту мүмкін емес. Мұны орындау үшін мәнге көрсеткіштерді қолдану керек.

Мысалы:

void swap ( int *px, int * py)

{

int t;

t=*px;

*px= *py;

*py=t;

}.

Сонымен функцияның көрсеткіш - аргументтері негізгі программалардағы объектілерді өзгертуге мүмкіндік береді.

8.3. Жолдардағы көрсеткіштер

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

Char *pstr = ”жолдық тұрақты” немесе char *pstr;

Pstr=”жалдық тұрақты”;

Мұнда көрсеткіш құрылады және оған 1-ші символдың адресі меншіктеледі, ал жол арнайы кестеге енгізіледі.

8.4. Көрсеткіштер мен массивтер

Массивте а[i] - массивтің і-інші элементі болсын.

Егер р көрсеткіші былайша анықталса:

Int *p;

онда P= &a[0] немесе а массивінің нөлінші элементіне сілтейді немесе р- а[0]-дің

адресін алады.

Ал, мынадай амалдар:

х=*p; - x-қа а[0]- дің мәнінің көшірмесін береді.

Сол секілді:

р+1 - а[1]-ге,

р+і - а[і]-ге сілтейді, ал

*(р+1) мәні a[1] -дің;

*(p+i ) мәні a[i] дің мәнін алады.

Көрсеткіштерге қолданылатын арифметика мен индекстеу арасында тығыз байланыс бар. Анықтама бойынша массив типті айнымалының немесе өрнектің мәні массивтің нөлінші элементінің адресі болып табылады.

Р=&а[0] меншіктеуінен кейін р мен а бірдей мәнге сілтейді.

Сонымен, массивтің аты бастапқы элементінің адресі болғандықтан

жоғарыдағы меншіктеуді былай р=a; жазуға да болады және а[i]-ді *(а+і) түрінде жазуға болады. Себебі а[i]-ді кездестіргенде компилятор оны бірден осы түрге түрлендіреді. Сондықтан, &a[i] баламасы a+i – ге эквивалентті, яғни екі жағдайда да бұл і- ші элементтің адресін береді. Р- көрсеткішін өрнектеуде индекстер қолдануға болады, яғни p[i]~ *(p+i). Сонымен массив элементін ығысумен берілген Көрсеткіш немесе индекстелген массив атымен көрсетуге болады. Массив аты мен көрсеткіш арасында (массив ретінде қарастырылатын) бір айырмашылық бар. 70

Көрсеткіш – бұл айнымалы, сондықтан оны р=a немесе р++ деп жазуға болады. Ал, массив аты тұрақты ретінде қатысады, яғни айнымалы емес, сондықтан оны а=p немесе а++ деп жазуға болмайды. Көрсеткіштерді инициализациялау Көрсеткіштерді сипаттау барысында инициализациялауға болады.

Мысалы:

int ix;

Int *pix = &ix;

Char *pstr = ”информатика”;

Мұндағы іx - бүтін мәнді айнымалы, ал pix - бүтін мәнді айнымалыға көрсеткіш және оған бірден ix айнымалысының адресі меншіктеледі.

8.5. Көрсеткіштерге көрсеткіштер

Көрсеткіштерге көрсеткіштер құру үшін программада сипаттау барысында қосарланған жұлдызшалар( ** ) қолданылады, мысалыға: int **ppix; сипаттамасы басқа көрсеткіштің адресі сақталатын көрсеткіш болады. Әрбір жұлдызша (*) қосалқы адрестеу деңгейін анықтайды.

Мысалы:

int ix=12;

Int *pix;

Int **ppix;

Int ***ppix;

сипаттамаларына сәйкес меншіктелу реттері мынадай:

pix = &ix;

ppix=&pix;

pppix=&ppix;

Сонымен кез-келген деңгейлі крсеткіш құруға болады.

8.6. Көрсеткіштерге қолданылатын арифметикалық амалдар немесе адрестік арифметика

 Си-де көрсеткіштерге екі метеметикалық әрекетті қолдануға болады: қосу және азайту.

Мысалы:

int *pix;

float *pfy;

int ia;

float rb;

pix = &ia;

pty = &rb;

71

pix++;

pfy++;

Жоғарыдағы мысалда бүтін мәнге (берілген жүйеде)2 байт, ал нақты санға 4 байт орын бөлінген десек және ia айнымалысының адресі 500 болатын ұяшықтаx орналасқан, ал rb айнымалысы 1000 адресті ұяшықта десек, онда жоғарыдағы жолдар орындалған соң pix Көрсеткішіндегі мән 502-ге, ал prb Көрсеткішіндегі мән 1004-ке тең болады. Яғни инкрементті (++) және дикрементті (--) операторлар операнд-көрсеткіштер мәнін олардың жадыдан алатын ұяшықтарының өлшеміне тең санға өсірді немесе кемітеді.  Көрсеткіштегі адресті кез-келген бүтін санды қосу және алу арқылы өзгертуге де болады. Мысалы, адресті 14 ұяшыққа жылжыту үшін prb=prb+14;

 Көрсеткіштен бүтін мәнді шегеруге де болады, бұл жағдайда ағымды ұяшықта тұрған көрсеткіш солға қарай көрсетілген шамаға ығысып, сондағы элементке сілтейді.

 Бір көрсеткішті екінші көрсеткіштен шегеруге болады (2кКөрсеткіш те 1 массивке сілтеуі тиіс) мұның нәтижесі олар сілтеп тұрған ұяшықтар арасындағы элементтер санына тең болады. Егер бұл өрнекте екі әртүрлі типті көрсеткіш қарастырылса және олар әртүрлі массивке сілтесе амал орындалғанда нәтижесі мағынасыз (түсініксіз) мән қайтарады.

 Көрсеткіштерді салыстыру амалы қолданылады. Бұл <=, =, >= операторлары көмегімен салыстырылады нәтижесінде false немесе true мәндерін қабылдайды. Бұл мәнді шартты өрнектерде қолдануға болады және бүтін типті айнымалыға меншіктетуге болады.

 Көрсеткішті нөлмен салыстыруға болады. Егер нөлге тең болса, онда оның ешқандай объектімен байланыспағанын білдіреді. Нөлді кезкелген типті көрсеткішке меншіктетуге болады.

 Көрсеткішті нәтижесі нөлге тең тұрақты өрнекпен салыстыруға болады.

 Сол секілді void типті басқа көрсеткішпен де салыстыруға болады.

 Көрсеткіштерді бір-біріне қосуға, бөлуге және көбейтуге болмайды.

Бақылау сұрақтары:

1. Динамикалық жады дегеніміз не?

2. С/С++-тегі көрсеткіштерді қолдану несімен ерекшеленеді?

3. Көрсеткіштерге амалдар қолдануға бола ма?

4. Амалдар приоритетін білу қаншалықты маңызды?

Әдебиеттер:[1-2].

Дәріс №9. СТРУКТУРАЛАР

Дәріс мақсаты: Әртүрлі типті мәліметтерді біріктіріп басқару барысында құрылатын структура түсінігін беру. Структура құрылымы мен қолданылу ретттерін

таныстыру.

Кілттік сөздер: Структура, структура элементтері, структура тегі,

структуралар массиві, структураларға көрсеткіш.

Жоспары:

9.1. Структура түсінігі

9.2. Структуралар мен функциялар

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

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

9.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;

} <айнымалылар тізімі>;

73

Сипаттау мысалы:

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;

74

Ал, қолданылу мысалы:

sotr.adr.dom=5;

Коріп отырғанымыздай структура элементтерін нүкте операторының көмегімен

алуға болады, форматы мынадай:

<айнымалы>.<элемент>

Структура элементтері циклда енгізілгенде _flusshall() –функциясы кіріс легіндегі жаңа жол символын өшіруге, яғни буферді тазалауға қолданылады. Жаңа жол символы scanf( ) функциясын қолданғанда қойылады. Ал, gets( ) функциясы бұл таңбаға дейінгі символдарды ғана оқиды.

9.2. Стуктуралар мен функциялар

Кейбір жағдайларда структураны функция денесінде қолдану қажеттігі туындайды. Ондай жағдайда функция прототипінде структураны функция параметрі ретінде беру керек (С++ тілінде struct қызметші сөзін көрсету міндетті емес):

// С және С++ тілдерінде

<функция типі> <функция аты> (struct <тег> <айнымалы>)

// Тек қана С++ тілінде

<функция типі> <функция аты> (<тег> <айнымалы>)

Структура элементтерінің тұрақты тізімін беруге немесе инициализациялауға болады.

Struct adam sotr={“Омаров”, “МОлдағұлова”,34,50}

Функцияға структура типті объектіні беру тәсілдері үш түрлі:

1. Компоненттерін жеке-жеке беру.

2. Структураны толығымен беру.

3. Структураға көрсеткішті беру.

Компоненттерін жеке беру мысалы:

Struct adr funrpr(char r[20], int k, int d)

{

Struct adr f;

f.ul=r;

f.dom=d;

f.kb=k;

return f;

}

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

Структуралар массивін сипаттау структура типті айнымалыны сипаттауға ұқсас. Мысалы, 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

}

Мұндай массивтер өлшемі компиляциялау барысында анықталады. Оның стурктура элементтерінің өлшемі мен массив элементтерінің санының

көбейтіндісіне тең.

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

Көрсеткіш келесі түрде сипатталуы мүмкін:

struct <тег> *<айнымалы>

Бұндай жағдайда структуралық айнымалының кез-келген элементін мына әдістердің бірімен алуға болады:

(*<айнымалы>).<элемент> немесе <айнымалы> –> <элемент> Функцияға күрделі құрылымды структура берілетін болса, онда оның толығымен көшірмесін берудің орынына, оған көрсеткішті қолданған тиімді. Структураға көрсеткіштер қарапйым айнымалыларға көрсеткіштер секілді.

Сипаттау мысалдары:

Struct strtype *p;

Мұндағы р айнымалысы strtype типті структураға көрсеткіш деп аталады. 76 Ал, *р – структураның өзі, оның элементтері (*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 құралы бар.

Бақылау сұрақтары:

1. Структуралар не үшін құрылады?

2. Структуралар элементтері қандай типті бола алады?

3. Структуралар элементтерін енгізу-шығаруда басқару элементтерінің

қойылу реттері андай?

4. typedef құралы не үшін қолданылады?

Әдебиеттер:[1-2], [5-10], [16-17].

Дәріс №10. БІРІКТІРУ

Дәріс мақсаты: Әртүрлі өлшемді объектілерді жадының белгілі бір аймағында сақату жұмысын ұйымдастыруда қолданылатын біріктірулер туралы түсініктерін қалыптастыру және біріктірулерді құру тәсілдерін көрсету.

Кілттік сөздер: Бірігу, бірігуге қолданылатын амалдар, Typedef құралы ,

биттік өріс.

Жоспары:

______________10.1. Біріктіру (Объединения)

10.2. Typedef құралы

10.3. Биттік өрістер (Битовые поля)

10.1. Біріктіру

Әртүрлі уақытта әрүрлі типті және әртүрлі өлшемді обьектілерді сақтай алатын айнымалы –біріктіру деп аталады. Өлшемдеріне және реттеуге қатысты талаптарды компилияция орындайды. Жадының бір аймағында әртүрлі мәндерді сақтауға мүмкіндіктері бар. Біріктіру синтаксисі структура синтаксисі секілді:

Union unprim {

Int iman;

Float fman;

Char *sman;

} mainun;

Мұндағы mainun айнымалысының өлшемі көрсетілген типтердің кез-келген айнымалысының мәні сиятындай болады, оның нақты өлшемі жүзеге асыру барысынан тәуелді болады. Осы үш типтің бірінің мәні mainun-ға меншіктеліп әрі қарай өрнектерде қолданылады. Өрнекте қолданғанда програмист оған меншіктелген соңғы мәннің типінің қандай болғанына байланысты қарастыруы тиіс.Әйтпесе бір типтегі мәнді сақтап, екінші бір типті мән ретінде шығарылса, нәтижесі әрқалай болады. Бірігу элементтерін қолдану синтаксисі төмендегідей:

<Бірігу аты>.<элемент> немесесе <бірігуге сілтеуіш>-><Элемент>

Mainun айнымалысының ағымды мәнінің типіy untype айнымалысына сақтасақ, онда мынадай жолдармен жазуға болады:

іf (untype= =INT) printf (“% d\n”, mainun.iman);

еlse if (untype= =FLOAT) рrintf(“% f\n”,mainun.fman);

еlse if (untype= =STRING) рrintf(“% s\b”, mainun.sman);

еlse printf(“типі дұрыс емес”);

Бірігуді массивтер мен структураларға немесе керісінше енгізуге болады.

Структураларға енгізілген бірігу элементтерін іштестірілген структуралардағы секілді қолдануға болады:

Struct {

Char *FAM;

Int k;

Int t;

Union {

Int iman;

Char *slobo;

Float fman;

} unp;

} tab[N];

Мұндағы іman-ді алу үшін tab[i].unp.iman , сол секілді slobo жолының бірінші символын былайша алуға болады:

*tab[i].unp.slobo;

Tab[i].unp.slobo[0].

Бірігу структура секілді, тек оның барлық элементтері оның барлық адресіне қарғанда басынан бастап ығысуымен сипатталады да өлшемі ең үлкен өлшемді эленті сиятындай анықталады және барлық типін қанағаттандыратындай түрде болады. Бірігуге де меншіктеу, көшіру және оның адресін алу, жеке элементтерімен мәлімет алмасу амалдарын қолдануға болады. Бірігуді инициялизациялағанда бірінші элементінің типіне сәйкес мәнді ғана тағайындауға болады. Мысалы, жоғарыда мысалда int типті мәнді тағайындайды.

10.2. Typedef құралы

Си тілінде мәндер типіне жаңа атау беруге болатын құрал - typedef құралы бар.

Мысалы:

typedef int butun;

Мұндағы butun int типінің синонимі. Мұны сипаттау барысында төмендегідей қолдануға болады:

Butun i,k;

Butun Massiv[];

Сол секілді:

Typedef char * String;

79

Мұнда String сhar * синонимі, яғни char типті элементке сілтеуіш секілді анықталады, қолданылуы:

String p, pt[M];

Мұндағы типтер атауы ерекшелеу мақсатында үлкен әріптен басталады. Бұл құрал жаңа тип құрмайды, тек бұған дейін бар типке жаңа ат береді. Бұл құралды қолданудағы басты мақсаттар мынадай:

1) Программаны басқа машинаға көшіруге байланысты мәселелерді шешуге қажетті параметрлерді анықтау; яғни typedef арқылы машинадан тәуелді болатын типтерді сипаттасақ,басқа машинаға программаны көшіру барысында тек typedef-ті ғана қайта анықтай қоямыз.

2) Программа текстін түсінітірек болсын деген мақсатқа байланысты, яғни мысалы Treeptz(tree-дерево, pointeг-сілтеуіш) атауы-ағылшын атауы күрделі структураға көрсеткіш түрінде анықталған типке қарағанда түсініктірек;

10.3. Биттік өрістер

Жады жетіспеген жағдайда бірнеше обьектіні машинаның бір сөзіне сиғызу қажет болуы мүмкін. Осы жағдайда Си-де сөз-дегі өрістерді анықтау және тікелей мәлімет алмасу мүмкіндігін қолдануға болады. Сонымен, биттік өріс дегеніміз - жадының “сөз” деп аталатын бірлігінің ішіне енетін биттер жиынтығы.Өрістерді анықтау және онымен мәлімет алмасу мүмкіндігі структура арқылы анықталады.

Мысалы:

struct {

unsigned int is_keyword:1;

unsigned int is_txtern:1;

unsigned int is_static:1;

} flags;

Бұл жазбада flags үш бірбитті өрістерден тұрады, мұндағы (:)-ден кейінгісін өрістер енін анықтайды. Ал, өрістер unsigned int түрінде сипатталуы – таңбасыз шама ретінде анықталу қажет екенін көрсетеді.

Жеке өрістерін: flags.is_keyword

Flags.is_static

Түрінде қолданамыз.

Өрістерді арифметикалық өрнектерде “бүтіндер” секілді қолдануға болады.

Мысалы:

Flags.is_Extern=flags.is_static=1 /*сәйкес биттерге 1-ді орнатады.*/

Flags.is.extern=flags.is_static=0 /*оларды 0-ге айналдырады.*/

If (flags.is_extern= =0) /* тексеру*/

Өрістерге қатысты мәселелер жүзеге асыру барысында туындайды, мысалы, өрістің сөз шекарасынан шығып кетуі..., өрісті атаусыз қолдануға болады (:ені 80 көрсетілген), мұнда қажетті мөлшерде разрядтар тастап кетуге болады. Кейбір машиналарда өрістер солдан оңға қарай, кейбірінде-оңнан солға қарай орналастырады. Өрістерді іnt типімен сипаттауға болады, олар массив бола алмайды және адрестері болмайды, сондықтан & операторы өрістерге қолданылмайды. Мысалы, компиляторға арналған символдар кестесін өңдеу есебінде кездесетін ситуацияның бірі - бірбиттік флажактар біріктіруді қарастырайық. Символдар таблицасын басқаратын фрагмент, яғни компилятор фрагментін қарастырсақ:

Программаның әрбір идентификаторы нақты бір информацияны білдіреді; мысалы бұл қызметші сөз бе?

Айнымалы қандай класқа жатады, статикалық н/емесе сыртқы т.б.

Осындай информацияларды кодтау тәсілінің ең тиімдісі - char немесе int типті сөзде бірбиттік флажактар қою болып табылады.

Бақылау сұрақтары:

1. Typedef құралы қолдаылуына мысал келтіріңіз.

2. Біріктіру айнымалысына жадыдан бөлінетін орын неден тәуелді?

3. Биттік өрістер не үшін қарастырылады?

Әдебиеттер: [1-10],[16].

Дәріс №11. ГРАФИКА

Дәріс мақсаты: С/С++ тілінің графикалық мүмкіндіктеріне қысқаша шолу жасау. Графикалық мәліметтерді өңдеу программаларын құруға бағыт бағдар жасау. Кілттік сөздер: Графика, графикалық режим, графикалық режимді орнату, графикалық функциялар тақырыптық файлы, графикалық функциялар, графикалық драйвер, экранның координаталық жүйесі, пиксел.

Жоспары:

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

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

11.3. Қателерді өңдеу. Режимдердің ауысуы.

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

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

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

1. Драйверді және графикалық режимді таңдау detectgraph (&gd, &gm) функция арқылы орындалады.

2. Драйверді жүктеу, графикалық жүйені инициализациялауды initgraph (&gd, &gm, "BGI-файлдың жолы") функциясы атқарады, мұндағы gd және gm айнымалылары қажет драйвер мен графикалық режимнің номерлері. Егер ВGI-файлдар ағымдағы директорияда орналасса, онда initgraph() функциясының үшінші параметрі ретінде бос жолды беруге болады

initgraph (&gd, &gm, " ");

Графикамен жұмыс жаса барысында мына әрекеттер тізбегі арқылы графиктік режимді орнату жолдары жазылады:

#include <stdio.h>

#include <stdlib.h>

#include <graphics.h>

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) ;

}

11.3. Қателерді өңдеу. Режимдердің ауысуы

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

Кесте 3.1. Тұрақтылар кесетесі.

Тұрақтылар Қате коды Хабарлама

GrOK 0 Қате жоқ

GrNoInitGraph

-1

Графика инициализацияланбаған GrNoLoadMcm -5 Драйверді жүктеуге жадының жеткіліксіздігі GrFontNotFound -8 Шрифт файлы табылмаған Қате кодының сәйкес мәнін экранға шығару мүмкіндігі бар. Бұл үшін grapherrormsg (қате коды); функциясы қолданылады. Ол аргумент ретінде берілген аяқталу кодының сипаттамасынан тұратын жолға көрсеткіш қайтарады.

4. Режимдерді ауыстыру. Дисплейлік адаптердің текстік режиміне уақытша

ауысу үшін мына функция қолданылады:

83

restorecrtmode ();

Қайтадан графикалық режимге ауысу

setgraphmode (gm);

функциясымен жүзеге асырылады.

Ағымдағы драйвер үшін графикалық режимнің максимал мәнінің номерін

getmaxmode ();

функциясы арқылы анықтауға болады.

Графикалық жүйемен жұмыс жасап болған соң, графикаға бөлінген жадыны босату, бейнеадаптер буферін тазарту, алдыңғы текстік режимді қалпына келтіру керек. Барлық әрекеттерді closegraph (); функциясы жүзеге ауыстырады.

5. Түстерді, шрифттерді сызықтардың стилін және бояу стилін тағайындау.

Түстерді көрсету үшін констандаларды пайдалануға болады. Стандартты түстер

палитрасы:

BLACK 0 Черный DARKGRAY 8 темно-серый

BLUE 1 Синий LIGHTBLUE 9 светло-синий

GREEN 2 Зеленый LIGHTGREEN 10 светло-зеленый

GRAY 3 Серый LIGHTCYAN 11 светло-

бирюзовый

RED 4 Красный LIGHTRED 12 светло-красный

MAGENTA 5 Малиновый LIGHTMAGENT

A 13 светло-

малиновый

BROWN 6 Коричневый YELLOW 14 Желтый

LIGHTGRA

Y 7 светло-

серый WHITE 15 Белый

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

№11- дегі әдістемелік нұсқауларды қараңыз.

Бақылау сұрақтары:

1. Растрлық графика дегеніміз не?

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

Әдебиеттер: [5-10], [16-17].

Дәріс №12. ФАЙЛДАРМЕН МӘЛІМЕТ АЛМАСУ МҮМКІНДІКТЕРІ

Дәрістің мақсаты: С/С++ тіліндегі программаларда файлдармен мәлімет алмасу тәсілдері мен мүмкіндіктерін түсіндіру. Файлдармен байланыс орнату, оларға енгізу-шығару, басқару жолдарын үйрету.

Кілттік сөздер: Файл, FILE структурасы, файлдық көрсеткіш, файлдан оқу, файлға жазу, файлдармен мәлімет алмасу режимдері, тексттік режим, екілік режим, ағымды көрсеткіш, файл соңы, файлды басқару функциялары.

Жоспары:

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

режимдері.

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

12.1. Файлды сипаттау.

С тілінде:

Файлдан оқу және файлға енгізу үшін ең алдымен файл fopen функциясының көмегімен ашылуы тиіс. Бұл функция операциялық жүйе арқылы орындалатын әрекеттерді ұйымдастыру жұмысын орындайды және файлмен мәлімет алмасуға арналған көрсеткішті қайтарады. Ал, файлға көрсеткіш файл туралы информациялардан тұратын құрылымға (жазбаға) сілтейді. Мұндағы информация мынадай сұрақтарының жауабынан тұрады:

 буфер адресі,

 буфердегі ағымды литердің күйі,

 файлдан оқуға немесе жазуға ашық па?,

 файлдың соңғы таңбасы кездесті ме?

Мұндай құрылым сипаттамасы <stdio.h> кітапханасындағы 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);

86

 Бір объектімен тізбектеп бірнеше лекті байланыстыру қажет болса, онда ол төмендегідей ретпен орындалады:

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-ге тең болса тазарту

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

Файлдан оқығанда 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 <stdio.h>

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 () –берілген потоктан бір символды оқиды.

Бақылау сұрақтары:

1. Файл дегеніміз не?

2. Файлдық лекті сәйкестендіруді қалай түсінесіз?

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

қандай?

Әдебиеттер: [1-10],[16].

90

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

Дәрістің мақсаты: Объектілі-бағытталған программалау негіздеріне және негізгі түсініктеріне анықтамалық мәліметтер беру. Машиналық бағытталған тілдегі объектілерді басқару жолдарын үйрету.

Кілттік сөздер: Объект, қасиеттері, тұқым қуалау, инкапсуляция, полиморфизм, ОБП, кластар, кластар иерархиясы, класс экземпляры, конструктор, деструктор.

Жоспары:

13.1. Объектілі-бағытталған программалау негізі.

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

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

13.4. Конструкторлар мен деструкторлар.

13.1. Объектілі-бағытталған программалау негізі

ОБП элементтері 70-ші жылдарда Симула тілінде модельдеуде қолданылды. Қазірде кең құлаш жайған программалау технологиясына айналып отыр. ОБП негізгі мақсаты – программа құруда деңгейін көтеру. С++ тіліндегіі ОБП негізін қалаушы – Бьярне Страуструн, 80-жылдары Bell Labs компаниясында өңдеген. С++ тілі объектілермен жұмыс жасауға бағытталған, ал С тілі – структуралық программалауға бағытталған. С++тілінде объект класы тұрақтылар мен айнымалылардан және оларға қолданылатын амалдардан тұрады.

ОБП -ды қолданудың негізгі үш ерекшелігі бар:

1. Программа коды ықшамдалады және құрылымы жақсарады.

2. Программаға программалық бағыттарды қосу және алып тастау жеңіл орындалады (программаны модернизациялау жеңіл, яғни онда бар кластың ұрпақ класын құру арқылы жүзеге асырылады).

3. Тиімді құрылған класты кітапханалық файлдар сақтап, оны қажетінше қолдану мүмкіндігі бар. ОБП-да объектілердің байланысы мен өзара әрекеттестігінің схемасын сипаттау арқылы есеп пен оның шешімі қарастырылады.

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

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

private - «тасаланған» бөлігі («жабық»)

protected - «қорғалған» бөлігі.

«Көрінетін» бөлігіндегі сипатталған әдістер класты қолданатын кез-келген программадан шақырылады, яғни кластың интерфейсін құрайды. «Тасаланған» бөлігіндегі элементтер тек өзінің әдістерінде қолданылады, ал «қорғалған» бөлігіндегі элементтер өз әдістері мен ұрпақ кластарда қолданылады.

13.3. Объект қасиеттері: инкапсуляция, тұқым қуалау, полиморфизм Объект – класс экземпляры. Объектінің қасиеттері бар. Оның күйі, оның белгілерінің мәндері арқылы беріледі. Объектінің негізгі қасиеті – инкапсуляция.

 Инкапсуляция дегеніміз – бір структурада мәліметтермен қатар оларды өңдеуге

арналған функциялардың берілуі (әдістердің).

● Тұқым қуалау қасиеті деп баба класынан ұрпақтарына мәліметтер мен әдістердің берілуін атайды. Егер кластың атрибуттары бір баба кластан берілсе, онда жалғыздық (одиночный) тұқым қуалау деп атайды.

 Полиморфизм

Полиморфизм класс иерархиясымен байланысты, иерархиядағы бірнеше класқа бірдей хабарлама беру мүмкіндігінің болуы, яғни қандай кластың қайсысы келген хабарды өңдеу құқығын алатынын анықтау – полиморфизм деп аталады. Бір иерархиядағы әртүрлі класта болатын және бір атпен аталған және virtual қызметші сөзімен сипатталған әдіс виртуальді әдіс деп табылады. С++ тіліндегі программаның орындалуы барысында объектінің типі алдын-ала анықталмаса да оны сұрауға болады, және бұл функция адресін динамикалық түрде анықтауға болады, яғни кеш байланыстыру ішкі жүйесі арқылы орындалады. Виртуальді әдісті (функцияларды) шақырғанда виртуальді кесте – функциялар адрестерінің кестесі қолданылады. Бұл кесте объект класс конструкторлары арқылы құрылуы барысында анықталады. Конструктор ролі – виртуальді әдісті дұрыс адрестер кестесімен байланыстыру. Программаны компиляциялау барысында виртуальді функциялар адресі белгісіз, ал виртуальді кесте ұяшықтары белгілі болады да программа орындалу барысында сол ұяшықтарға адрестер жазылады.

Кластың сипатталуы:

class < Аты > {

< тип 1 > < айн 1 >

< тип 2> < айн 2 >

public:

әдіс 1

әдіс 2

әдіс n;

};

<сипаттаушы> <кл. аты> [:базалық тізім] {элементтер тізімі}

Мұндағы - <сипаттаушы> – class, struct, union қызметші сөздернің бірі.

Класс аты – идентификатор;

< базалық тізім > -қасиеттері тұқым қуалауға тиісті базалық класс немесе кластар

тізімі болады;

{элементтер тізімі} – осы кластың өзіне тән элементтер тізімі беріледі. С++ тілінде класты құрғанда элементтерді бермей-ақ сипаттауға болады, u class Sorun. Бұларды класс аттарына сілтеме жасау үшін қолданады, ал объектімен нақты жұмыс жасауда толық анықталуы тиіс. Автоматты түрде кластың барлық элементтері «жабық» деп есептеледі және олар тек осы класс функцияларында қолданылады. Ал, оларды «ашық» түрде сипаттау үшін public, protected, private қызметші сөздерінің бірін қолдану керек.

Қарапайым класс мысалы:

# include <<iostream.h>

# include <math.h>

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 <iostream.h>

#include <process.h> {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 ( );

}

13.4. Конструкторлар мен деструкторлар

Конструкторлар класс айнымалыларын инициализациялауға және жадыдан орын бөлуге арналған айрықша функция болып табылады. Конструктор аты өзі тиісті класс атымен бірдей болады. Класс объектісін құру барысында қажетті конструктор автоматты түрде шақырылады. Егер класс сипатында конструктор сипатталмаған болса, онда компилятор стандартты класс құрады. 94

Деструктор – бұл да айрықша функция, жойылатын объект алып тұрған динамикалық жадыны босату қызметін атқарады. Деструктордың да аты класс атымен бірдей, тек алдында ~ (тильда) жазылады. Деструктор – класс объектісіне сілтейтін көрсеткіш арқылы анықталған delete операторы кездескенде шақырылады. Деструктордың конструктордан айырмашылығы ешқандай аргументтен тәуелді емес. Егер деструктор айқын түрде анықталмаса, компилятор класс үшін стандартты деструктор бөледі. Класс деструкторы мен конструкторы С++ тілінде динамикалық жадыны үлестіру және босату үшін сәйкесінше Nen, delete қолданылады.

# include <iostream.h>

# include <string.h>

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 << «Жол» <Qstring;

delete Q string;

Q string = (Char *) 0;

cout << “Босатылды \n”; }

void main ( ) {

string First («Алғашқы жол»); First - конструкторды шақыру}

{

string second («Екінші жол»); Second - үшін конструктор шақыру }

Конструкторлар мен деструкторлар құру мысалы:

«Комплекс сандар» мысалы:

#include <iostream.h>

class complex

{

float Re

float Im;

public:

complex ( );

complex (int, int);

~ complex ( );

<амалдар функциясы>

void Put ( );

void complex: Put ( ) {

cout <<«санның нақты бөлігі :» <<Re;

cout <<\n санның жорамал бөлігі : “<<Im;

}

complex :: complex (int R, int I) {

Re = R;

Im = I; }

Complex :: Complex ( ) {

Re = Im = 0; }

Complex :: ~ complex ( ) {

Re = 0;

Im = 0

}

void main ( ) {

{ complex a, b;

complex c (12, 24)

a. Put ( ), b. Put( ), c. Put( );

}

}

Бақылау сұрақтары:

1. ОБП дегеніміз не?

2. Класс экземпляры дегеніміз не?

3. Әдістерді қайта анықтаудың қандай тәсілдері бар?

Әдебиеттер: [1-9], [16]