139
9 ҚОЛДАНУШЫ АНЫҚТАЙТЫН МӘЛІМЕТТЕР ТИПТЕРІ
МЕН ҚҰРЫЛЫМДАРДЫ ПАЙДАЛАНУ
Практикалық есептерде ӛңделуге тиіс мәліметтердің қҧрылымы кҥрделі де
болуы мҥмкін. Соларды айқын, әрі анық бейнелеу ҥшін қарапайым типтер,
жиымдар және нҧсқауыштар негізінде жасалған мәліметтер типтері
қолданылады. C++ тілі программалаушыға ӛз типін анықтап, солармен жҧмыс
істеу ережелерін де анықтауға мҥмкіндік береді. Бҧлар қолданушы немесе
программалаушы анықтайтын типтер деп аталып жҥр.
9.1 Типтердің атын ӛзгерту (typedef)
Программа жҧмысын тҥсінуді жеңілдету ҥшін, typedef тҥйінді сӛзі
арқылы типке жаңа ат беріледі:
typedef тип жаңа_ат [ өлшемі ];
typedef
сӛзі тип спецификаторын анықтайды. Мҧндай сипаттама (хабарлау)
қолданушы анықтаған типтерге қысқа және мағыналы аттар беру ҥшін
қолданылады. Мысалы:
typedef char name [100];
мҧндағы тік жақша синтаксис элементі болып табылады. Ӛлшемі кӛрсетілмеуі
де мҥмкін. Мысалдар:
typedef unsigned int UINT;
typedef char sg[10];
Осылай енгізілген атаулар стандарттық типтердің аттары сияқты қолданылады:
UINT i, j;
// unsigned int типті 2 айнымалы
sg a;
// символдардан тұратын a[10] жиымы
Тағы бір мысал:
typedef char Massiv[20];
typedef struct {
char fio[30];
int date, code;
double zarplata;} Worker;
Осылай енгізілген тип атын кейіннен пайдалануға болады:
Massiv str[10]; /* әрқайсысы 20 символдан тұратын 10 жолы
бар массив */
Worker sotrudniki[50]; /* 50 құрылымнан тұратын массив */
9.2 Тізбелер (перечисления – enum)
Программа жазу кезінде бір типтегі әр тҥрлі мәндер қабылдай алатын
шамаларды анықтау да кездесіп жатады. Ол ҥшін тізім тҥріндегі мәліметтер
типін – тізбелерді қолданған жӛн. Enum тҥйінді сӛзі арқылы жасалған тізбелер
программаны оқып тҥсінуді жеңілдетеді. Тізбелерге кіретін константалар int
типінде болады. Келісім бойынша бірінші константа 0-ге тең, келесісі – 1-ге,
140
сонан соң – 2-ге, т.с.с. бола береді. Бір тізбедегі барлық константалардың
аттары әр тҥрлі болуы тиіс. Тізбенің жазылу форматы:
enum [тип_аты] {константалар_тізімі};
Тип аты программада осы типтегі айнымалыларды анықтау керек болған
жағдайда беріледі. Компилятор осындай айнымалылардың константалар
тізіміндегі мәндерді ғана қабылдауын қамтамасыз етеді. Константалар бҥтін
санды типте болуы тиіс және олар алғашқы мәндерді кәдімгідей тҥрде
қабылдауы (инициалдануы) керек. Инициалдану болмаса, бірінші константа
нӛл болып саналады да, келесісі алдыңғысынан бірге артық мән қабылдайды.
Мысалы:
enum {two = 2,three,four,ten = 10,eleven,fifty = ten + 40};
мҧнда three және four константаларына 3 және 4 мәндері, ал eleven
константасына – 11 мәні меншіктеледі.
enum color {r,g,b}; // r=0, g=1, b=2
enum color {r=2,g=4,b=6}; // типті жариялау және инициалдау
enum color {r,g=3,b}; // r=0, g=3, b=4
Компилятор int және enum типтерінің арасында айырмашылық бар деп
есептемейді, сондықтан тізбе типіндегі айнымалыларға программада бҥтін
санды мәндер меншіктеле береді. Бірақ C++ тілінде мҧндай меншіктеу типті
нақты тҥрде келтіру арқылы орындалады, әйтпесе компилятор ескертпе
жасайды. Мысалы:
enum weekdays { /* жұмыс күндер: */ Monday, Tuesday,
Wednesday, Thursday, Friday};
/* Monday – 0 , Tuesday – 1, т.с.с. */
weekdays today; today = (weekdays)1;
Тізбедегі константалар аттары бірегей (қайталанбайтын) болуы тиіс, ал мәндері
бірдей де бола береді. Тізбелерді қолданудың жай константаларды және #define
директивасын пайдаланудан артықшылығы байланысқан константалардың
кӛрнекілігінде жатыр және компилятор константаларға бастапқы мән бергенде
олардың типін тексере алады.
Келесі программада С тілінде тізбемен жҧмыс істеу мысалы кӛрсетілген.
#include
enum Months { /* айлар */
January = 1, February, March, April, May, June, July,
August, September, October, November, December } months;
/* мұнда тізбе түрінде 1-ден 12-ге дейінгі сан тізбегі
алынған, өйткені January айнымалысына 1 меншіктелген */
void main ()
{int present_month;
int diff;
/* үстіміздегі ай нөмірін (1 ... 12) енгізу */
printf ("Input the present month number (1-12): ");
scanf ("%d",&present_month);
141
months = December;
diff = (int) months - presentjnonth;
/* жыл соңына дейін ... ай қалды */
printf ("There are %d months till the end of the year\n",
diff);
}
Программаны орындау нәтижесі:
Input the present month number (1-12): 5
There are 7 months till the end of the year
Press any key to continue
9.3 Құрылымдарды пайдалану
С тіліндегі жиымдар бір типтегі мәліметтерді сақтайтын болса, қҧрылымдар
ӛзара логикалық байланысқан әртҥрлі типті мәліметтерді байланыстырады.
Мысалы, бір жиымда 50 қызметкердің жалақысын сақтай аламыз. Егер сол-
армен байланыстыра отырып, қызметкерлердің аты-жӛнін, жасын, реттік
(табельдік) нӛмірін сақтайтын болсақ, мынадай мәліметтер типтерін жазуға
тура келеді:
char name;
// фамилияcы
int age;
// жасы
float salary;
// жалақысы
unsigned employee_number;
// реттік нөмірі
Мҧндайда байланысқан әртҥрлі мәліметтерді бір атаумен сақтау мҥмкін-
дігін беретін қҧрылымды пайдаланады. Мысалы:
struct Employee {
char name[64];
// фамилиясы
int age;
// жасы
float salary;
// жалақысы
unsigned employee_number;
// реттік нөмірі
};
Бҧл қҧрылымның аты Employee идентификаторы болып табылады. Оны
қҧрылымның тәгі деп, ал оның ішкі элементтерін қҧрылым ӛрістері деп те
атайды. Ӛрістер кез келген типте немесе соларға нҧсқауыш тҥріндегі қҧрылым-
ның адресі арқылы қатынасу амалы ретінде де бола береді.
9.4 Құрылымдарды сипаттау
Мәліметтердің қҧрылымдық типтері келесі сипаттаумен анықталады:
struct құрылым_аты
{ элементтерді сипаттау; };
Қҧрылымның атауын, яғни тәгті жазу міндетті емес. Егер қҧрылым атаусыз
болса, онда оны сипаттау кезінде осы типке кіретін бірнеше айнымалылардың
аты бірден кӛрсетіледі:
// Құрылымдар жиымын және құрылымға нұсқауышты анықтау
struct {
char name[64];
// фамилиясы
Достарыңызбен бөлісу: |