И 08. 14/02 Қазақстан Республикасы Білім және Ғылым министрлігі


Функция  аргументі  ретінде  массивті



Pdf көрінісі
бет7/21
Дата09.12.2019
өлшемі3,21 Mb.
#53264
1   2   3   4   5   6   7   8   9   10   ...   21
Байланысты:
baibaktina 6
ДСШ баяндама

 
Функция  аргументі  ретінде  массивті  беруге  болады,  мұнда  функция 
массивтің бірінші элементінің адресін көрсеткіш түрінде қабылдап алады.  
Мысалы: 
#include  
void summ_pr(int *prmas); 
int main() 

int inmas[5]={10,4,16,0,45}; 
summ_mas(inmas); 
return(0); 

void summ_pr(int *prmas) 

int t,s; 
for (t=s=0; t<5; t++) s+=prmas[t]; 
printf(“массивтің элементтерінің қосындысы=%i \n”,s); 

 
Функцияның  аргументі  ретінде  массивті  беру  барысында  массивті  өлшемі 
белгісіз түрде де көрсетуге болады.  
 
Мына түрде   
void pr_mas(float mas[]) сипатталады. 
 
 
Ескерту:  С++  тілінде  сілтемеге  сілтеме,  биттік  өріске  сілтеме,  сілтемелер 
массивіне сілтеме және сілтемелерге көрсеткіштер қолданылмайды. 
 
 
 
7.4. Рекурсия. Рекурсивті алгоритмдер 
 
 
Өзін өзі шақыратын функция рекурсия деп аталады. 
Рекурсия  тереңдігі  дегеніміз  –  функция  мәнін  есептеуде  өзін-өзі  шақыру  саны. 
Рекурсивті программалау стек принципіне сүйенеді. 

66 
 
 
Рекурсия түрлері мынадай: 
  сызықтық рекурсия; 
  параллель рекурсия; 
  қосалқы рекурсия; 
  жоғары ретті рекурсия. 
 
Рекурсивті алгоритмдер мысалдары: 
  6!- алты факториялды есептеу алгоритмі: 
#include  
double fact(int n); 
int n=6; 
double f; 
f=fact(n); 
printf(‘6!=%10.0f\n”,f); 
return (0); 

 
double fact(int n) 

  if (n<1) return(1.0) 
               else 
                return(n*fact(n-1); 

 
  Евклид  алгоритмі  бойынша  екі  санның  ең  үлкен  ортақ  бөлгіші  табу 
алгоритмі: 
#include  
 
#include  
 
double euob(double n, double m); 
 
int main () 
 

 
 double f; 
 
double n=1470; 
 
double m=693; 
 
f=euob(n,m); 
 
printf(“f=%10.0f \n”, f);return(0); 
 

 
double euob(double n, double m) 
 

 
w=floor(fmod(n,m); 
 
if (w==0) return(m); 
 
else return(euob(m,w)); 
 

 
 

67 
 
Бақылау сұрақтары: 
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. Жолдардағы көрсеткіштер  
 
 

69 
 
 
Жолдық  тұрақтылар негізінде соңғы элементі   \К символ болатын символдық 
массив  болып  табылады.  Жолға  көрсеткішті  төмендегідей  сипаттау  және 
инициализациялау тәсілдері  бар: 
 
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  болатын  ұяшықта 
орналасқан,  ал  rb  айнымалысы  1000  адресті  ұяшықта  десек,  онда  жоғарыдағы 
жолдар орындалған соң pix Көрсеткішіндегі мән 502-ге, ал prb Көрсеткішіндегі мән 
1004-ке    тең  болады.  Яғни  инкрементті  (++)  және  дикрементті  (--)  операторлар 
операнд-көрсеткіштер мәнін олардың жадыдан алатын ұяшықтарының өлшеміне тең 
санға өсірді немесе кемітеді. 
  Көрсеткіштегі адресті кез-келген бүтін санды қосу және алу арқылы өзгертуге 
де болады. Мысалы, адресті 14 ұяшыққа жылжыту үшін prb=prb+14; 
  Көрсеткіштен  бүтін  мәнді  шегеруге  де  болады,  бұл  жағдайда  ағымды 
ұяшықта  тұрған көрсеткіш солға қарай  көрсетілген шамаға ығысып, сондағы 
элементке сілтейді. 
  Бір  көрсеткішті  екінші  көрсеткіштен  шегеруге  болады  (2кКөрсеткіш  те  1 
массивке  сілтеуі  тиіс)  мұның  нәтижесі  олар  сілтеп  тұрған  ұяшықтар 
арасындағы  элементтер  санына  тең  болады.  Егер  бұл  өрнекте  екі  әртүрлі 
типті  көрсеткіш  қарастырылса  және  олар  әртүрлі  массивке  сілтесе  амал 
орындалғанда нәтижесі мағынасыз (түсініксіз) мән қайтарады. 
  Көрсеткіштерді  салыстыру  амалы  қолданылады.  Бұл  <=,  =,  >=  операторлары 
көмегімен  салыстырылады  нәтижесінде  false  немесе  true  мәндерін 
қабылдайды.  Бұл  мәнді  шартты  өрнектерде  қолдануға  болады  және  бүтін 
типті айнымалыға меншіктетуге болады. 
  Көрсеткішті  нөлмен  салыстыруға  болады.  Егер  нөлге  тең  болса,  онда  оның 
ешқандай  объектімен  байланыспағанын  білдіреді.  Нөлді  кезкелген  типті 
көрсеткішке меншіктетуге болады. 
  Көрсеткішті нәтижесі нөлге тең тұрақты өрнекпен салыстыруға болады. 
  Сол секілді void типті басқа көрсеткішпен де салыстыруға болады. 
  Көрсеткіштерді бір-біріне қосуға, бөлуге және көбейтуге болмайды. 
 
Бақылау сұрақтары: 
1.  Динамикалық жады дегеніміз не? 
2.  С/С++-тегі көрсеткіштерді қолдану несімен ерекшеленеді? 
3.  Көрсеткіштерге амалдар қолдануға бола ма?  
4.  Амалдар приоритетін білу қаншалықты маңызды? 
 
Әдебиеттер:[1-2]. 
 
 
 
Дәріс №9. СТРУКТУРАЛАР 
Дәріс  мақсаты:  Әртүрлі  типті  мәліметтерді  біріктіріп  басқару  барысында 
құрылатын структура түсінігін беру. Структура құрылымы мен қолданылу ретттерін 
таныстыру. 

72 
 
Кілттік 
сөздер: 
Структура, 
структура 
элементтері, 
структура 
тегі, 
структуралар массиві, структураларға көрсеткіш. 
Жоспары: 
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. Структуралар массиві.  

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

77 
 
Дәріс мақсаты:  Әртүрлі  өлшемді  объектілерді  жадының  белгілі  бір 
аймағында  сақату  жұмысын  ұйымдастыруда  қолданылатын  біріктірулер  туралы 
түсініктерін қалыптастыру және біріктірулерді құру тәсілдерін көрсету. 
Кілттік  сөздер:  Бірігу,  бірігуге  қолданылатын  амалдар,  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(“типі дұрыс емес”); 
 

78 
 
Бірігуді  массивтер  мен  структураларға    немесе  керісінше  енгізуге  болады. 
Структураларға  енгізілген  бірігу  элементтерін  іштестірілген  структуралардағы 
секілді қолдануға болады: 
  
 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 типті мәнді тағайындайды. 
 

Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   10   ...   21




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет