С. Құрылымдар
ҚҰРЫЛЫМДАР.
Құрылым - бұл айнымалылармен жұмыс істеу ыңғайлы болу үшін бір атауға топтастырылған бір немесе бірнеше айнымалылыр (әр түрлі болуы мүмкін). Құрылымдар күрделі мәліметтерді (әсіресе үлкен программаларда) ұйымдастыруға көмектеседі және өзара байланысқан айнымалылар тобын жиынның жеке элементіндей емес, бір тұтас ретінде түсіндіреді.
Құрлымның кең таралған мысалы - төлемдік ведомостардың жолдары. Ол ведомост қызметкерлердің толық аты, адресі, социалды сақтандыру карточкаларының нөмері, еңбек ақысы және т.б. мәліметтерден тұрады. Осы мінездемелердің кейбіреуінің өзі құрылым болуы мүмкін: мысалы, толық ат, сол сияқты адресі және еңбек ақының өзі бірнеше компоненттерден тұрады. Си үшін басқа әдеттегі, мысалы график аймағынан: нүкте координаттар жұбы, тікбұрыш нүктелер жұбы және т.б. болып табылады.
Құрылымдар көшірілуі мүмкін, олармен меншіктеу операциялары орындалуы мүмкін, оларды функцияға аргументтер ретінде беруге болады және ол функцияны олардың нәтижелері ретінде қайтаруға болады. Автоматты құрылым мен массивтер үшін сол сияқты инициализация рұқсат етіледі.
Нүкте құрлымының декларациясы келесі түрде болады:
struct point
{ int x; \\ декларация тізімі фигуралы жақшада
int y;
};
point - бұл құрылым тегі (аты) (tag - ярлык, этикетка).
Тег берілген түрдегі құрлымның атын береді және әрі қарай фигуралы жақшамен аяқталған декларацияның қысқаша белгіленуі ретінде қызмет атқарады.
Құрылымда тізілген айнымалылар мүшелер деп аталады. Тегтер мен мүшелердің аттары программаның кәдімгі айнымалыларының аттармен сәйкес келуі мүмкін. Мүшелердің аттары әртүрлі құрлымдарда кездесуі мүмкін. .
Құрлым декларациясы - бұл тип.
struct {...}x,y,z;
жазбасы құрлымдық типтің үш айнымалыларының сипаттамасын білдіреді.
Айнымалылар тізімінен тұрмайтын құрылым декларациясы жадыны резервке алмайды: ол тек шаблонды немесе құрылым үлгісін сипаттайды. Егер құрылымның тегі болмаса, онда осы тегтерді объектілерді анықтауда қолдануға болады. Мысалы, struct point pt; декларациясы struct point типті pt құрылымдық айнымалыны анықтайды.
Құрылымдық айнымалыны оны анықтауда инициализациялауға болады:
struct point maxpt = {320, 200};
Автоматты құрылымдарды (auto жады класының құрлымы) сәйкес келетін типтегі құрылым түрінде нәтижені қайтаратынменшіктеумен немесе функцияға айналдырумен инициализациялауға болады.
Құрлымның жеке мүшесіне қатынасу келесі түрдегі конструкциямен жүзеге асады:
құрылым мүшесінің_аты
Мысалы, pt координаттар нүктесін келесі түрде басып шығаруды жүзеге асыруға болады:
printf ("%d,%d", pt.x, pt.y);
Құрылымдар бір-біріне қойылуы мүмкін.
Құрылымдарға орындалатын операциялар - бұл оларды көшіру, меншіктеу, & операторының көмегімен аталатын адрес және олардың мүшелеріне қатысудың жүзеге асырылуы. Құрылымды функцияға аргумент ретінде беру және оларды нәтиже түрінде функциялардан қайтару. Сондай-ақ көшіру және меншіктеу операцияларына жатады. Құрылымдарды салыстыруға болмайды.
Құрылымдық объектілерді функцияға берудің үш тәсілі бар:
- компоненттерді (мүшелерді) жеке беру;
- барлық құрылымдарды түгелдей беру;
- көрсеткішті құрылымға беру.
Егер функцияға, оны түгелдей көшіретін үлкен құрылым берілсе, көрсеткішті оған беру тиімдірек.
struct point *pp; декларациясы рр - struct point типті структураға көрсеткіш екенін хабарлайды.
Егер рр - point құрлымына жіберілсе (одан болса), онда *рр-тің өзі құрылым, ал (*рр).х және (*рр).у - point құрлымының мүшелері болады. рр көрсеткішін қолдана отырып,
struct point origin, *pp;
pp=&origin;
printf ("origin:(%d,%d)\n",(*pp).x,(*pp).y );
жазуға болады
* операторының приоритетінен . операторының приоритеті жоғары болғандықтан, (*рр).х-дағы жақша қажет.
"Құрлымдағы көрсеткіш" түсінігімен байланысты мүшелерге қатынас жасау үшін жазбаның қысқаша формасы енгізіледі.Егер р - құрылымға көрсеткіш болса, онда p-құрылым_мүшесі - оның жеке мүшесі болады. Сондықтан printf-ты келесітүрде жазуға болады.
printf("origin:(%d,%d)\n",pp-x,pp- y);
Екі және - операторларда солдан оңға қарай орындалады.
Құрылым мүшелеріне қатынас жасау. және - операторлары функцияны шақыру ( ) және массивті индекстеу [ ] операторларымен бірге приоритеттер иерархиясында ең жоғарғы орынға ие және басқа кез-келген операторлардан бұрын орындалады.
Мысалы, егер декларация берілсе
struct
{ int len;
char*str;
} *p;
онда ++(р - len) өрнекте жақшалар айқын түрде болғандықтан көрсеткіштердің өзі емес, ++р - len бір мәнге lenструктурасының мүшесін өсіреді.
Операциялардың орындалу тәртібін өзгерту үшін анық жақшалар керек. (++р) - len-де len-нің мәнін алмас бұрын, программа р көрсеткішін жылжытады.
Си программасының мәніне кіретін әр кілттік сөздердің санын анықтайтын программаны құрастырайық. Бұл үшін біз кілттік сөздерді стрингтің массиві түрінде, сондай-ақ кілттік сөздерді есептеуді бүтін массивтер түрінде сақтай білуіміз керек болатын, варианттардың біреуі - бұл екі паралель массив болу керек.
char *keyword [NKEYS];
int keycount [ NKEYS];
Бірақта олардың параллелдігі, сақтаудың басқаша - құрылым массиві арқылы ұйымдастыруды ойға салады. Әр кілттіксөзді келесі сипаттамалар түрімен
char *word;
int count; жазуға болады
Мұндай жұптар массивті құрайды.
struct key
{ char *word;
int count;
}keytab[NKEYS];
декларациясы key типті құрылымды сипаттайды және keytab массивін анықтайды және әйтеуір бір жерде жады бөлінетін жәнеосы типтің әр элементі құрылым болады. Мұны басқаша жазуға да болады:
struct key
{ char *word;
int count;
};
struct key keytab[NKEYS];
keytab массиві тұрақты аттардың жиынынан тұратындықтан, оны сыртқы массив ретінде жасаған жеңіл және анықтаукезінде бір рет инициализациялаған дұрыс:
struct key {
char *word;
int count;
} keytab[ ]={"auto",0,"break",0,*...*"while ",0};
keytab массивтің элементтерінің саны инициализаторлардың мөлшері бойынша есептелінеді.
Си-де компиляция кезінде жұмыс жасайтын sizeof, унарлы оператор бар. Оны кез-келген объектінің өлшемін есептеу үшін қолдануға болады.
sizeof объект және sizeof (тип аты)
өрнегі көрсетілген объектінің өлшеміне немесе байттың типіне тең бүтін мәндерді береді. Объект айналымы, массив немесе құрылым болуы мүмкін. Тип аты ретінде базалық типтің аты немесе туындылы типтің аты, мысалы құрылымның немесе көрсеткіштің қолданылуы мүмкін.
----------------------------------- ----------------------------------- ----------
Начало формы
C ++ және құрылымдар (бірнеше мұраға ие)
Мен жұмыс істеп жатқан жоба үшін C ++ мен құрылымдарын қарадым; Қазіргі уақытта деректер өрістеріне жалған белгілер ретінде қосу үшін тізілген үлгі құрылымдарын пайдаланып жатырмын.
Бұл жұмыс істеп тұрғанымен, төмендегі мысалдағыдай бірнеше мұраға ұқсас нәрсені қалаймын деп ойлаймын:
----------------------------------- ----------------------------------- ----------
struct a {
----------------------------------- ----------------------------------- ----------
int a_data;
----------------------------------- ----------------------------------- ----------
};'Trait' A
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct b {
----------------------------------- ----------------------------------- ----------
int b_data;
----------------------------------- ----------------------------------- ----------
};'Trait' B
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct c : public a, public b {
----------------------------------- ----------------------------------- ----------
int c_data;
----------------------------------- ----------------------------------- ----------
};A composite structure with 'traits' A and B.
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct d : public b {
----------------------------------- ----------------------------------- ----------
int d_data;
----------------------------------- ----------------------------------- ----------
};A composite structure with 'trait' B.
Менің экспериментальды код мысалдарым олар жақсы жұмыс істеп жатқанын көрсетеді, бірақ мен оны күрделі болғанда қалай жұмыс істейтіні туралы біраз түсінбеймін.
Мысалға:
----------------------------------- ----------------------------------- ----------
b * basePtr = new c;
----------------------------------- ----------------------------------- ----------
cout basePtr-b_data endl;
----------------------------------- ----------------------------------- ----------
b * basePtr = new d;
----------------------------------- ----------------------------------- ----------
cout basePtr-b_data endl;
Бұл әрдайым жақсы, тіпті функционалдық қоңыраулар арқылы параметр ретінде көрсеткішпен жұмыс істейді.
Менің сұрағым: код b_data қайдан алынған құрылымдардың бірінде сақталғанын біледі? Айта кетейін, құрылымдар әлі де қосымша деректермен тығыздалған құрылымды қолданады (яғни, 3-ші құрылымдар тек 12 байтты, 2 дюйм 8 байтты және т.б). Әрине, a_data және b_data осы құрылымда сақталатын орын туралы айта кету үшін қосымша деректер өрісі қажет пе?
Бұл қызығушылығын тудыратын мәселе болып табылады, себебі бәрі қарамастан жұмыс істейді, және егер бірнеше қолданыс болса, қуаныштымын бір мысалды қабылдаймын. Мен бұл мәселені бірізділікке айналдыруды қаласам да, осы құрылымдардың артындағы байттарды кезекаралық процедура кезегі арқылы аударғым келеді және екінші жағынан OK декодталғанын білгіңіз келеді (кезектегі кез-келген бағдарлама сол компилятор арқылы құрастырылған және бірыңғай платформада жұмыс жасайтын).
3
қосылды 16 Қаңтар 2013 кіреді 08:39 автор Doug редакцияланған 16 Қаңтар 2013 кіреді 08:51
Көріністер: 8
көзі
RONLJARUFRESPTDEHIBNARUZBETRUK
ешқашан ҚОСЫМША АҚПАРАТ дегенді қаласаңыз, CAST-тің негізге алынатын көрсеткішін, әсіресе ... жалғасы
Құрылым - бұл айнымалылармен жұмыс істеу ыңғайлы болу үшін бір атауға топтастырылған бір немесе бірнеше айнымалылыр (әр түрлі болуы мүмкін). Құрылымдар күрделі мәліметтерді (әсіресе үлкен программаларда) ұйымдастыруға көмектеседі және өзара байланысқан айнымалылар тобын жиынның жеке элементіндей емес, бір тұтас ретінде түсіндіреді.
Құрлымның кең таралған мысалы - төлемдік ведомостардың жолдары. Ол ведомост қызметкерлердің толық аты, адресі, социалды сақтандыру карточкаларының нөмері, еңбек ақысы және т.б. мәліметтерден тұрады. Осы мінездемелердің кейбіреуінің өзі құрылым болуы мүмкін: мысалы, толық ат, сол сияқты адресі және еңбек ақының өзі бірнеше компоненттерден тұрады. Си үшін басқа әдеттегі, мысалы график аймағынан: нүкте координаттар жұбы, тікбұрыш нүктелер жұбы және т.б. болып табылады.
Құрылымдар көшірілуі мүмкін, олармен меншіктеу операциялары орындалуы мүмкін, оларды функцияға аргументтер ретінде беруге болады және ол функцияны олардың нәтижелері ретінде қайтаруға болады. Автоматты құрылым мен массивтер үшін сол сияқты инициализация рұқсат етіледі.
Нүкте құрлымының декларациясы келесі түрде болады:
struct point
{ int x; \\ декларация тізімі фигуралы жақшада
int y;
};
point - бұл құрылым тегі (аты) (tag - ярлык, этикетка).
Тег берілген түрдегі құрлымның атын береді және әрі қарай фигуралы жақшамен аяқталған декларацияның қысқаша белгіленуі ретінде қызмет атқарады.
Құрылымда тізілген айнымалылар мүшелер деп аталады. Тегтер мен мүшелердің аттары программаның кәдімгі айнымалыларының аттармен сәйкес келуі мүмкін. Мүшелердің аттары әртүрлі құрлымдарда кездесуі мүмкін. .
Құрлым декларациясы - бұл тип.
struct {...}x,y,z;
жазбасы құрлымдық типтің үш айнымалыларының сипаттамасын білдіреді.
Айнымалылар тізімінен тұрмайтын құрылым декларациясы жадыны резервке алмайды: ол тек шаблонды немесе құрылым үлгісін сипаттайды. Егер құрылымның тегі болмаса, онда осы тегтерді объектілерді анықтауда қолдануға болады. Мысалы, struct point pt; декларациясы struct point типті pt құрылымдық айнымалыны анықтайды.
Құрылымдық айнымалыны оны анықтауда инициализациялауға болады:
struct point maxpt = {320, 200};
Автоматты құрылымдарды (auto жады класының құрлымы) сәйкес келетін типтегі құрылым түрінде нәтижені қайтаратынменшіктеумен немесе функцияға айналдырумен инициализациялауға болады.
Құрлымның жеке мүшесіне қатынасу келесі түрдегі конструкциямен жүзеге асады:
құрылым мүшесінің_аты
Мысалы, pt координаттар нүктесін келесі түрде басып шығаруды жүзеге асыруға болады:
printf ("%d,%d", pt.x, pt.y);
Құрылымдар бір-біріне қойылуы мүмкін.
Құрылымдарға орындалатын операциялар - бұл оларды көшіру, меншіктеу, & операторының көмегімен аталатын адрес және олардың мүшелеріне қатысудың жүзеге асырылуы. Құрылымды функцияға аргумент ретінде беру және оларды нәтиже түрінде функциялардан қайтару. Сондай-ақ көшіру және меншіктеу операцияларына жатады. Құрылымдарды салыстыруға болмайды.
Құрылымдық объектілерді функцияға берудің үш тәсілі бар:
- компоненттерді (мүшелерді) жеке беру;
- барлық құрылымдарды түгелдей беру;
- көрсеткішті құрылымға беру.
Егер функцияға, оны түгелдей көшіретін үлкен құрылым берілсе, көрсеткішті оған беру тиімдірек.
struct point *pp; декларациясы рр - struct point типті структураға көрсеткіш екенін хабарлайды.
Егер рр - point құрлымына жіберілсе (одан болса), онда *рр-тің өзі құрылым, ал (*рр).х және (*рр).у - point құрлымының мүшелері болады. рр көрсеткішін қолдана отырып,
struct point origin, *pp;
pp=&origin;
printf ("origin:(%d,%d)\n",(*pp).x,(*pp).y );
жазуға болады
* операторының приоритетінен . операторының приоритеті жоғары болғандықтан, (*рр).х-дағы жақша қажет.
"Құрлымдағы көрсеткіш" түсінігімен байланысты мүшелерге қатынас жасау үшін жазбаның қысқаша формасы енгізіледі.Егер р - құрылымға көрсеткіш болса, онда p-құрылым_мүшесі - оның жеке мүшесі болады. Сондықтан printf-ты келесітүрде жазуға болады.
printf("origin:(%d,%d)\n",pp-x,pp- y);
Екі және - операторларда солдан оңға қарай орындалады.
Құрылым мүшелеріне қатынас жасау. және - операторлары функцияны шақыру ( ) және массивті индекстеу [ ] операторларымен бірге приоритеттер иерархиясында ең жоғарғы орынға ие және басқа кез-келген операторлардан бұрын орындалады.
Мысалы, егер декларация берілсе
struct
{ int len;
char*str;
} *p;
онда ++(р - len) өрнекте жақшалар айқын түрде болғандықтан көрсеткіштердің өзі емес, ++р - len бір мәнге lenструктурасының мүшесін өсіреді.
Операциялардың орындалу тәртібін өзгерту үшін анық жақшалар керек. (++р) - len-де len-нің мәнін алмас бұрын, программа р көрсеткішін жылжытады.
Си программасының мәніне кіретін әр кілттік сөздердің санын анықтайтын программаны құрастырайық. Бұл үшін біз кілттік сөздерді стрингтің массиві түрінде, сондай-ақ кілттік сөздерді есептеуді бүтін массивтер түрінде сақтай білуіміз керек болатын, варианттардың біреуі - бұл екі паралель массив болу керек.
char *keyword [NKEYS];
int keycount [ NKEYS];
Бірақта олардың параллелдігі, сақтаудың басқаша - құрылым массиві арқылы ұйымдастыруды ойға салады. Әр кілттіксөзді келесі сипаттамалар түрімен
char *word;
int count; жазуға болады
Мұндай жұптар массивті құрайды.
struct key
{ char *word;
int count;
}keytab[NKEYS];
декларациясы key типті құрылымды сипаттайды және keytab массивін анықтайды және әйтеуір бір жерде жады бөлінетін жәнеосы типтің әр элементі құрылым болады. Мұны басқаша жазуға да болады:
struct key
{ char *word;
int count;
};
struct key keytab[NKEYS];
keytab массиві тұрақты аттардың жиынынан тұратындықтан, оны сыртқы массив ретінде жасаған жеңіл және анықтаукезінде бір рет инициализациялаған дұрыс:
struct key {
char *word;
int count;
} keytab[ ]={"auto",0,"break",0,*...*"while ",0};
keytab массивтің элементтерінің саны инициализаторлардың мөлшері бойынша есептелінеді.
Си-де компиляция кезінде жұмыс жасайтын sizeof, унарлы оператор бар. Оны кез-келген объектінің өлшемін есептеу үшін қолдануға болады.
sizeof объект және sizeof (тип аты)
өрнегі көрсетілген объектінің өлшеміне немесе байттың типіне тең бүтін мәндерді береді. Объект айналымы, массив немесе құрылым болуы мүмкін. Тип аты ретінде базалық типтің аты немесе туындылы типтің аты, мысалы құрылымның немесе көрсеткіштің қолданылуы мүмкін.
----------------------------------- ----------------------------------- ----------
Начало формы
C ++ және құрылымдар (бірнеше мұраға ие)
Мен жұмыс істеп жатқан жоба үшін C ++ мен құрылымдарын қарадым; Қазіргі уақытта деректер өрістеріне жалған белгілер ретінде қосу үшін тізілген үлгі құрылымдарын пайдаланып жатырмын.
Бұл жұмыс істеп тұрғанымен, төмендегі мысалдағыдай бірнеше мұраға ұқсас нәрсені қалаймын деп ойлаймын:
----------------------------------- ----------------------------------- ----------
struct a {
----------------------------------- ----------------------------------- ----------
int a_data;
----------------------------------- ----------------------------------- ----------
};'Trait' A
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct b {
----------------------------------- ----------------------------------- ----------
int b_data;
----------------------------------- ----------------------------------- ----------
};'Trait' B
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct c : public a, public b {
----------------------------------- ----------------------------------- ----------
int c_data;
----------------------------------- ----------------------------------- ----------
};A composite structure with 'traits' A and B.
----------------------------------- ----------------------------------- ----------
----------------------------------- ----------------------------------- ----------
struct d : public b {
----------------------------------- ----------------------------------- ----------
int d_data;
----------------------------------- ----------------------------------- ----------
};A composite structure with 'trait' B.
Менің экспериментальды код мысалдарым олар жақсы жұмыс істеп жатқанын көрсетеді, бірақ мен оны күрделі болғанда қалай жұмыс істейтіні туралы біраз түсінбеймін.
Мысалға:
----------------------------------- ----------------------------------- ----------
b * basePtr = new c;
----------------------------------- ----------------------------------- ----------
cout basePtr-b_data endl;
----------------------------------- ----------------------------------- ----------
b * basePtr = new d;
----------------------------------- ----------------------------------- ----------
cout basePtr-b_data endl;
Бұл әрдайым жақсы, тіпті функционалдық қоңыраулар арқылы параметр ретінде көрсеткішпен жұмыс істейді.
Менің сұрағым: код b_data қайдан алынған құрылымдардың бірінде сақталғанын біледі? Айта кетейін, құрылымдар әлі де қосымша деректермен тығыздалған құрылымды қолданады (яғни, 3-ші құрылымдар тек 12 байтты, 2 дюйм 8 байтты және т.б). Әрине, a_data және b_data осы құрылымда сақталатын орын туралы айта кету үшін қосымша деректер өрісі қажет пе?
Бұл қызығушылығын тудыратын мәселе болып табылады, себебі бәрі қарамастан жұмыс істейді, және егер бірнеше қолданыс болса, қуаныштымын бір мысалды қабылдаймын. Мен бұл мәселені бірізділікке айналдыруды қаласам да, осы құрылымдардың артындағы байттарды кезекаралық процедура кезегі арқылы аударғым келеді және екінші жағынан OK декодталғанын білгіңіз келеді (кезектегі кез-келген бағдарлама сол компилятор арқылы құрастырылған және бірыңғай платформада жұмыс жасайтын).
3
қосылды 16 Қаңтар 2013 кіреді 08:39 автор Doug редакцияланған 16 Қаңтар 2013 кіреді 08:51
Көріністер: 8
көзі
RONLJARUFRESPTDEHIBNARUZBETRUK
ешқашан ҚОСЫМША АҚПАРАТ дегенді қаласаңыз, CAST-тің негізге алынатын көрсеткішін, әсіресе ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz