Массив элементтерінің түрлеріне шектеулер
Қазақстан Республикасы Білім және ғылым министрлігі
Ш.Уалихаов атындағы Көкшетау мемлекеттік университеті.
ПОЛИТЕХНИКАЛЫҚ ФАКУЛЬТЕТІ
Ақпараттық жүйелер және есептеу техникасы
кафедрасы
" Объектіге бағытталған бағдарламалау I " пәні бойынша
Курстық жұмыс
Тақырыбы:"С++ тіліндегі массивтердің түрлері"
ОРЫНДАДЫ: Орынтай Ардақ ИСК91
ҚОРҒАУҒА ЖІБЕРІЛДІ
ОҚЫТУШЫ:ЕСМАГАМБЕТОВА Г.К.
БАҒАСЫ:
Көкшетау 2020
Мазмұны
Кіріспе
Негізгі Бөлім.
1 Бөлім Массив түсінігі
1.1 Массивтерді жариялау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...3
1.2Массивтермен жұмыс ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ...4
1.3 Есте сақтау ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..5
1.4 Массив элементтерінің түрлеріне шектеулер ... ... ... ... ... ... .. ... ... ... ... ..5
2 Бөлім. Массивтерді тегістеу және көшіру
2.1Араластыру ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .6
2.2Көшіру ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 8
3 Бөлім Массивтерді инициализациялау
3.1 Массивтің инициализациясы синтаксисі ... ... ... ... ... ... . ... ... ... ... ... ..10
3.2 Сынып мүшелерін инициализациялау ... ... ... ... ... ... ... ... ... ... ... ... ..11
3.3 Инициализаторға қойылатын талаптар ... ... ... ... ... ... ... ... ... ... ... ... ... .12
4 Бөлім Массив көрсеткіштері
4.1 Массив сілтемелері ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..14
5 Бөлім Көпөлшемді массивтер
5.1 Екі өлшемді бүтін сандар массиві кему ретімен орналастыру ... ... ... ...18
5.2. Екі өлшемді массивтің элементтерінің қосындысын табу ... ... ... ... ... .19
6 Бөлім Динамикалық массивтер
6.1. Динамикалық массивті құру және жою ... ... ... ... ... ... ... ... ... ... ... ... ..20
7 Бөлім Массивтерге арналған шаблондардың ішінара мамандануы
7.1. Массивтерге стандартты баламалар ... ... ... ... ... ... .. ... ... ... ... ... ... ... ..25
ҚОРЫТЫНДЫ ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..27
Қолданылған әдебиеттер тізімі ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ... ...28
Кіріспе
Курстық жұмыстың мақсаты:Осыған дейінгі қарастырылып келген мәлімет типтері қарапайым болып есептеледі. Себебі олар тек бір ғана объектіге яғни бір ғана санға немесе символға қатысты ғана пайдаланылады. С++ та бір типке жататын бірнеше элементтерден тұратын объектілерді де пайдалануға болады. Массив осындай бір типке жататын элементтерден құралатын құрылымдық тип болып келеді.
Курстық жұмыс мақсаты:Қарапайым типтер қатарына жататын стандартты (Integer ,real) және қолданушылар типтерінде бір айнылмалыны сақтау үшін ,негізінен компьютер жадысының бір ғана ұяшығы пайдаланылады. Бірақ көптеген программалар есептерінің шешімін табу барысында әрбір элементтің деректерін жеке айнымалыға сақтау орнына, оларды тізбектеп бір жерде сақтау анағұрлым тиімді болып саналады.
Курстық жұмыстың міндеті:Бір типтес берілгендердей құрылып, барлық элементтеріне бір ортақ атау берілген жиынды массив деп атаймыз. Массив құрылымдық типтер қатарына жатады. Массив элементтері нөмірленеді. Массивтің әррбір элементіне индексін көрсету арқылы жұмыс істеуге болады. Массивке мысал ретінде векторларды қарастыруға болады. Егер массивке кестелік берілгендер жабылса, онда элементтері екі индекс бойынша нөмірленеді.
-Массив сипаттамалары
-Типі- массив элементтерінің жалпы типі
Көлемі- массив индекстерінің саны
Шектелімі - әрбір индекстердің шектеу бойынша сәйкестігі
Пiшімі - көлем және шектеулер жиындары
Массивтермен элементтерімен жұмыс жасау барысында массив атауынан кейін міндетті түрде тік жақшаға алынған индекс көрсетіледі. Индекс ретінде сандар қолданылады.
Массивтің кез келген элементтерімен жұмыс істегенде программалау барысында олардың индексінің мәні типтер немесе айнымалылар бөлімінде сипатталған шектеуден аспауы керек. Егер массив индексінің мәні сипатталған шектеуден асып кетсе онда ,синтаксистік қате тіркеліп экранда Index type is not compatibie with declaration деген сөз тіркесі көрінеді.
Зерттелу деңгейі:Мaccивтер қолдaнылaтын программаларда {R+} диpekтивасын жазу арқылы масcивтің шектеулерін тексеруге болады. Егер
программада {R+} директивасы беріліп, массив индексі шектeyден
асыпкетсе, oнда экранға Range check error сөз тіркесі көрсетіледі. Массивтерді программада қолдану үшін С++ программалау тілінде оларды
бірден var бөлiмінде сипаттay жолы қapacтырылған.
1
Дерек көздері:С++ программалay тілі бір өлшeмді массивтермен қатар екі өлшемді және көп өлшeмді массивтерді қолданyға мүмкiндіктер бepеді.
Екi өлшeмді немece көп өлшемді массивтермен жұмыс істey үшін, олap сипаттаy бөлімінде кopсетілуі қажет. Екі өлшeмді массивтерді тiк төртбұрышты таблицалар неmece матрицалap деп қарастыpyға болaды. Coндықтан мұнда баған және жол ұғымдapы өз мағыналарында қолданылады.
Екі өлшемді мacсив элементтepі екі индекспен анықталады. Айталық mat[3,2]:=7 түріндегі өpнек mat матрицасының үшінші жолы және еkiнші бағaнының қиылыcуындағы элemeнті 7 ге тең екенін білдіреді. Екі өлшемдi массивтepді енгізу үшін far...doцикл оператopлары қолданылады.
Курстық жұмыстың құрылымы: Кіріспеден, 1 тараудан kopытынды және пайдаланылған әдебиеттepден құралған.
2
1.Массив түсінігі
Массив - қарапайым агрегат түрі. Ол бір типтегі элементтер жиынын үздіксіз жадында қатарға орналастырылған модельдейді. Массивтерді сол немесе басқа формада барлық дерлік бағдарламалау тілдері қолдайды және олардың C-дің алғашқы нұсқаларында пайда болып, содан кейін C ++ құрамына енуі таңқаларлық емес.
Массивтерді жариялау
Егер T қандай да бір тип болса, N тұрақты немесе компиляция кезінде бағаланған өрнек болса, онда оператор
T a [N];
a типті айнымалыны T типті N элементтер жиымы жариялайды. N типі std :: size_t типіне жанама түрде берілуі керек және оның мәні массивтің өлшемі деп аталатын нөлден үлкен болуы керек. Массивтің әрбір элементі үшін, сәйкесінше, sizeof (T) байт бөлінеді, барлық массивті орналастыру үшін қажет жадының өлшемі N * sizeof (T) байтқа тең. Бұл мән жоғарыдан платформамен және компилятормен шектелген. Массив типі T [N] деп белгіленеді, яғни оған элементтер типі мен массивтің өлшемі кіреді. Осылайша, элементтер типі бірдей, бірақ өлшемдері әр түрлі массивтердің түрлері болады.
Мұндай массивтерді массивтің басқа нұсқаларынан айырмашылығын баса көрсету үшін кірістірілген массивтер деп атайды (қарапайым массивтер), массив термині бағдарламалауда, оның ішінде C ++ тілінде өте кең қолданылады.
Массивтің жарнамалық декларациясының мысалдары:
const int N = 8;
constexpr int Square (int n) {return n * n; }
int a1 [1];
int a2 [N];
int a3 ['Q'];
int a4 [Квадрат (2)];
Массивтің дұрыс емес декларациясының мысалдары:
int n;
int b1 [0]; нөлдік өлшем
3
int b2 [n]; компиляция кезінде өлшемді анықтау мүмкін емес;
int b3 [Q] өлшемді size_t форматына ауыстыру мүмкін емес
Массив элементтеріне индексер арқылы қол жеткізіледі, индекс мәндері 0-ден N-1-ге дейін. Міне мысал:
int a [4];
a [0] = 42;
int t = a [3];
Массив шекарасынан тыс бақыланбайды, қате анықталмаған әрекетке әкелуі мүмкін.
Бір операторда бірнеше массивтерді жариялауға болады, бірақ әрқайсысы үшін өлшемі көрсетілуі керек.
int a [4], b [8];
Массив типтері үшін бүркеншік аттарды енгізуге болады. Сіз typedef дәстүрлі кілт сөзін қолдана аласыз:
typedef int I4 [4];
немесе қазіргі заманғы (C ++ 11) кілт сөзімен:
using I4 = int [4];
Осыдан кейін массивтер қарапайым айнымалы ретінде жарияланады:
I4 a, b;
Бұл сол сияқты болады
int a [4], b [4];
1.2. Массивтермен жұмыс
Массивтермен жұмыс істеу үшін сіз оператордың өлшемдерін және бірнеше стандартты функциялар мен макростарды қолдана аласыз.
Sizeof операторы жиымның жалпы көлемін байтпен қайтарады, яғни элементтің өлшемі массивтің өлшемінен үлкен болады.
_Countof () макросы (MSVS тақырыптық файлында cstdlib) массивтің өлшемін, яғни элементтердің санын қайтарады. C ++ 17-де std :: size () стандартты функция шаблоны пайда болды, ол дәл осылай жасайды (сонымен қатар стандартты контейнердің өлшемін анықтайтын шамадан тыс жүктелген нұсқасы бар).
int a [4];
4
std :: cout sizeof (a) '' std :: size (a) '\ n';
Қорытынды: 16 4
C ++ 11 стандартты кітапханада std :: begin () және std :: end () функцияларының еркін (мүше емес) шаблондары пайда болды. Массивке шақырылған std :: begin () көрсеткішті жиымның бірінші элементіне, std :: end () соңғы-соңғы элементке қайтарады. (Сондай-ақ тұрақты нұсқалары бар: std :: cbegin (), std :: cend ().) Бұл массивтерді for аралығында қолдануға мүмкіндік береді.
int a [4] {4, 3, 2, 1};
for(auto t: a)
{
std :: cout t '';
}
Сонымен қатар стандартты алгоритмдерде:
std :: sort (std :: begin (a), std :: end (a));
1.3. Есте сақтау
Егер массив статикалық түрде, яғни ғаламдық ауқымда, аттар кеңістігінде немесе кластың статикалық мүшесі ретінде жария етілсе, онда ол статикалық жадыға бөлінеді. Жергілікті жарияланған массивтер стекке бөлінген. (Жергілікті массивтерді өлшеу кезінде, әрине, стектің шектеулі мөлшері ескерілуі керек.) Статикалық емес класс мүшелері класс данасының шекараларында орналасады. Динамикалық массивтер (6-бөлімді қараңыз) динамикалық жадыда орналасқан.
1.4. Массив элементтерінің түрлеріне шектеулер
Элементтері жарамсыз массив құра алмайсыз.
Сілтемелер жиынын жариялай алмайды.
int u, v;
int & rr [2] = {u, v}; ошибка
Оның орнына тұрақты көрсеткіштер массивін қолдануға болады.
int * const rr [2] = {& u, & v};
C ++ 11 std :: reference_wrapper шаблонын ұсынды. Ол сілтеме
5
интерфейсін эмуляциялайды, бірақ инстанция даналарын контейнерлерде және кірістірілген массивтерде сақтауға болады. Бірақ әлі де сілтеме интерфейсінің эмуляциясы толығымен аяқталмаған, кейде get () функциясын қолдану керек. Міне, мысал.
int u = 42, v = 5;
std :: reference_wrapper int rr [2] = {u, v};
std :: cout rr [0] '' rr [1] '\ n'; вывод: 42 5
++ rr [0];
rr [1] .get () = 125; get () необходим
std :: cout u '' v '\ n'; вывод: 43 125
Сіз функциялар жиымын жариялай алмайсыз.
int ff [2] (double); ошибка
Оның орнына функционалды көрсеткіштер массивін қолдануға болады.
int (* ff [2]) (double);
Std :: reference_wrapper шаблонын функцияның типі бойынша нақтылауға болады, бірақ іс жүзінде көрсеткішке қарағанда ешқандай артықшылықтар жоқ - функцияны сілтеме арқылы ажыратусыз шақыруға болады, ал & операторынсыз функцияның атымен инициализациялауға болады. Функциялар массивін эмуляциялаудың тағы бір нұсқасы бар - бұл std :: function шаблонын қолдану, бірақ бұл шаблон басқа талқылауға арналған тақырып.
Массивті автоматты кілт сөзінің көмегімен жариялау мүмкін емес.
auto x [2] = {1, 2} ошибка
Const квалификаторы массив типіне емес, оның элементтерінің типтеріне ғана қолданылады.
I4 = int пайдалану [4];
const I4 ci; то же, что и const int ci[4];
2. Массивтерді тегістеу және көшіру
Бұл бөлімде массивтердің жалпы C ++ типті жүйесінен ерекшеленетін ерекшеліктері қарастырылады.
2.1. Араластыру
Жоғарыда айтылғандай, массивтің өлшемі массив типінің құрамдас бөлігі
6
болып табылады, бірақ белгілі бір жағдайларда ол жоғалады және бұл массив типін қандай да бір мағынада төменгі етеді. Бұл шығын массивтен көрсеткішке дейін ыдырау (ыдырау) деп аталады. (Кейде ыдырауды ыдырау деп те аударады.) Ақпараттың мәні кез-келген контексте жиым бірінші элементтің көрсеткішіне айналады және мөлшері туралы ақпарат жоғалады. Ерекшеліктер - өлшемдер операторы, & (адресті қабылдау) операторы және массив сілтемесінің инициализациясы. Оператордың өлшемдері 1.2 бөлімінде талқыланды, көрсеткіштер мен массив сілтемелері 4 бөлімде егжей-тегжейлі талқыланады. Decltype кілт сөзімен декларация сонымен қатар ақпаратсыз массивтің түрін дұрыс анықтайды.
Әрине, массивтер мен көрсеткіштер арасындағы тығыз байланысты жоққа шығаруға болмайды. Массивтің барлық элементтерін өңдеудің стандартты тәсілі (C-стилі):
const int N = 100;
int a [N];
for (int * d = a, * end = d + N; d end; ++ d)
{
* d = rand ();
}
Ақпаратты архаизмдерге жатқызуға болады, сондықтан олар мұқият және мұқият болуы керек, әйтпесе сіз ең жағымды тосын сыйларға тап болмайсыз.
Жиынтық функцияның декларациясына осылай әсер етеді. Функциялар
void Foo (int a [4]);
void Foo (int a []);
void Foo (int * a);
шамадан тыс жүктелген функциялар емес - олар бірдей. Өлшем міндетті емес параметр ретінде қабылдануы керек немесе өлшем үшін арнайы шарт қолданылуы керек (мысалы, жолдар үшін нөлдік аяқтау)
Массивті сырттан байлау кезінде тегістеу пайда болады.
file 1
int A [4];
2 file
extern int A [];
7
Өлшем үшін сізге қосымша айнымалыны қолдану керек немесе өлшемге арналған арнайы шартты қолдану керек.
Автоматты кілт сөзімен айнымалыны жариялаған кезде тегістеу де орын алады.
int a [4];
auto da = a; da типі int * түрінде шығарылады
Функция шаблонын құру кезінде
template typename T
void Foo (T t);
шаблон функциясының параметр типі, егер аргумент массив болса, көрсеткіш ретінде шығарылады.
Тегістеу мұраны пайдалану кезінде қосымша проблемалар тудырады. (С-да мұра жоқ.) Мысал қарастырайық.
class B { * ... * };
class D: жалпы B { * ... * };
void Foo (B [], int size); В типті элементтер массивін өңдеу
Келесі код қатесіз және ескертусіз құрастырылады.
D d [4];
Foo (d, _countof (d));
Бірақ егер sizeof (B) sizeof (D) болса, онда Foo () денесінде d жиым элементтерінің ығысуы (әрине, нөлден басқасы) қате анықталады және сәйкесінше әрдайым дерлік Foo () дұрыс жұмыс істемейді. Сондықтан полиморфты стильде массивтермен, негізгі классқа көрсеткіш арқылы жұмыс істеуге болмайды.
2.2. Көшіру
Тегістеумен қатар (және онымен тығыз байланысты) массив типінің тағы бір ерекшелігі бар, ол оны белгілі мағынада төмен етеді. Массивтер көшіру семантикасына негізделген инициализация мен тағайындаудың таныс синтаксисін қолдамайды:
using I4 = int [4];
I4 а;
I4 b = a; ошибка
8
I4 b2;
b2 = a; ошибка
Сонымен қатар, функция массивті қайтара алмайды.
I4 Foo (); ошибка
Бірақ егер массив класс құрылым одақтың мүшесі болса, онда көшірме (және тегістеу) мәселелері болмайды.
struct X
{
int A [4];
};
Бұл құрылым үшін компилятор массивті еш қиындықсыз көшіретін әдепкі көшірме конструкторын және сәйкес тағайындау операторын жасайды.
X Foo ();
X x;
X x2 = x;
X x3;
x3 = Foo ();
3. Массивтерді инициализациялау
Массивтерді инициализациялау ережелерін сипаттау үшін тривиальды түрлер туралы қысқаша айту керек.
Конструкторлар мен деструкторларды C ++ объектілік моделінің негізгі элементтері деп атауға болады. Объектіні құру кезінде міндетті түрде конструктор деп аталады, ал оны жойған кезде деструкторды атайды. Бірақ C-мен үйлесімділік мәселелері бізді ерекше жағдай жасауға мәжбүр етті және бұл ерекшелік тривиальды типтер деп аталады. Олар C типтерін және айнымалылардың өмірлік циклын модельдеу үшін конструктор мен деструктордың міндетті шақыруынсыз енгізілді. C коды, егер C ++ тілінде құрастырылса және орындалса, C-дегідей жұмыс істеуі керек. Тривиальды типтерге тривиальды типтерден тұратын сандық типтер, көрсеткіштер, санаулар, сонымен қатар класстар, құрылымдар, одақтар мен массивтер жатады. Сыныптар мен құрылымдар кейбір қосымша шарттарды қанағаттандыруы керек: тапсырыс берушінің, деструктордың болмауы, көшіру, тағайындау, виртуалды функциялар.
9
Тривиальды айнымалы инициализацияланбайды, егер нақты инициализацияның қандай да бір түрі қолданылмаса. Тривиальды класс үшін компилятор әдепкі конструктор мен деструктор жасай алады. Әдепкі конструктор нысанды жоққа шығарады, деструктор ештеңе жасамайды. Бірақ бұл конструктор нақты инициализацияның қандай да бір түрін қолданған кезде ғана жасалады және пайдаланылады, әйтпесе айнымалы инициализацияланбаған болып қалады.
Инициализацияланбаған айнымалының келесі құрылымы бар: егер ол аттар кеңістігінде жарияланған болса (глобальды түрде), онда барлық биттер нөлге ие болады, егер ол жергілікті болса немесе динамикалық түрде жасалса, ол кездейсоқ биттер жиынын алады. Мұндай айнымалыны қолдану бағдарламаның күтпеген мінез-құлқына әкелетіні анық. Массивтер көбінесе тривиальды типке ие, сондықтан олар үшін бұл проблема өте маңызды.
Тривиальды типтің инициализацияланбаған тұрақтыларын компилятор анықтайды, кейде ол басқа инициализацияланбаған айнымалыларды да анықтайды, бірақ статикалық код анализаторлары бұл тапсырманы жеңе алады.
C ++ 11 стандартты кітапханасында типтік белгілер деп аталатын шаблондар бар (тақырып файлы type_traits). Олардың бірі түрдің тривиальды емес екенін анықтауға мүмкіндік береді. Std :: is_trivial T :: мәнінің өрнегі шын мәніне бағаланады, егер T - тривиальды түр, ал басқаша - жалған.
3.1. Массивтің инициализациясы синтаксисі
Егер сіз нақты инициализацияны қолданбасаңыз, онда тривиальды емес типтегі массивтер үшін әр элемент үшін әдепкі конструктор шақырылатынына кепілдік беріледі. Әрине, бұл жағдайда мұндай конструктор болуы керек, әйтпесе қате пайда болады. Бірақ тривиальды типтегі массивтер үшін немесе әдепкі конструктор жоқ болса немесе жарамсыз болса, сіз нақты инициализацияны қолдануыңыз керек.
С күнінен бастап массивтер инициализациялаудың жиынтық синтаксисінің көмегімен инициализацияланды:
int a [4] = {1, 2, 3, 4};
C ++ 11 бірыңғай инициализацияны енгізді және енді оны инициализациялауға болады:
int a [4] {1, 2, 3, 4};
Әмбебап инициализация үшін сіз сонымен қатар = таңбасын қолдана аласыз және инициализацияның осы екі түрін ажырату әрдайым оңай бола
10
бермейді, бірақ өте қажет емес.
Массивтің өлшемін қалдыруға болады, содан кейін ол инициализаторлар санымен анықталады.
int a [] {1, 2, 3, 4};
Егер массивтің өлшемі көрсетілген болса, онда инициализаторлар саны массивтің өлшемінен аспауы керек. Егер массивтің өлшемі инициализаторлар санынан көп болса, онда қалған элементтер үшін әдепкі конструкторға кепілдік беріледі (олар, әрине, болуы керек), оның ішінде тривиальды типтер үшін. Осылайша, бос инициализация тізімін көрсете отырып, әдепкі конструктор тривиальды массивтің барлық элементтеріне шақырылатынына кепілдік береміз.
int a [4] {};
Тривиалды тұрақты массивтер міндетті түрде инициализация тізімін қажет етеді.
const int a [4] = {3, 2, 1};
Инициализаторлар саны массивтің өлшемінен аз болуы мүмкін, бұл жағдайда қалған элементтер әдепкі конструктормен инициалданады.
Символдар массивтерін әріптік әріппен инициализациялауға болады.
const char str [] = meow ;
const wchar_t wstr [] = L meow;
Мұндай массивтің өлшемі жолдағы символдар санынан артық болады; сіз аяқтайтын нөлдік таңбаны сақтауыңыз керек.
3.2. Сынып мүшелерін инициализациялау
C ++ 11-де кластың статикалық емес мүшелері болып табылатын массивтерді инициализациялау мүмкін болды. Мұны екі жолмен жасауға болады: тікелей декларациялау кезінде немесе конструкторды анықтау кезінде мүшелерді инициализациялау тізімінде.
class X
{
int a [4] {1, 2, 3, 4};
int b [2];
...
public:
11
X (int u, int v): b {u, v}
{}
...
};
Рас, бұл жағдайда сіз массивтің өлшемін әрдайым нақты қоюыңыз керек, инициализация тізімі арқылы өлшемді жасырын анықтауға жол берілмейді.
Статикалық массивтерді бұрынғыдай инициализациялауға болады, тек анықталған кезде, массивтің өлшемін инициализация тізімі арқылы анықтауға болады.
class X
{
static int A [];
...
};
int X :: A [] = {1, 2, 3, 4};
3.3. Инициализаторға қойылатын талаптар
Инициализация тізіміндегі өрнектер инициализациядан бұрын бірден бағаланады, оларды құрастыру кезінде білу қажет емес (әрине constexpr деп жарияланған массивтерден басқа). Инициализация тізімінің элементтеріне қойылатын талаптар массив элементімен бірдей типтегі параметрі бар функция аргументімен бірдей - инициализация тізімі элементінің типінен массив элементінің түріне жасырын түрлендіру болуы керек. Бізде массивтің декларациясы бар делік:
T a [] = {x1 *, ... * };
немесе
T a [] {x1 *, ... * };
Қажетті конверсияның болуы дұрыс нұсқаулыққа тең
T t = x1;
Инициализация тізімінің элементі инициализация тізімі болуы мүмкін. Бұл жағдайда бұл нұсқаулықтың дұрыстығы массив элементінің дұрыс инициализациялануына да кепілдік береді.
Мысалға тоқталайық.
12
class Int
{
int m_Value;
public:
Int(int v) : m_Value(v) {}
...
};
...
int x, y;
...
Int rr[] = { x, y };
Егер біз Int конструкторын анық деп жарияласақ, онда соңғы декларация жарамсыз болады. Бұл жағдайда сізге жазу керек болады
int rr [] = {Int (x), Int (y)};
Бұл мысалда инициализация тізімін қолдана отырып, әдепкі конструкторы жоқ типке массив қалай құруға болатындығы көрсетілген. Бірақ бұл жағдайда инициализаторлар саны массивтің өлшеміне сәйкес келуі керек.
4. Массив көрсеткіштері
Бізге массив жариялансын
T a [N];
Осы жиымға сілтеме келесі түрде жарияланып, инициализацияланады:
T (* pa) [N] = & a;
Дәстүрлі & оператор көрсеткішті алу үшін қолданылады. Массивтің көрсеткішінің түрі T (*) [N] деп белгіленеді.
Жақшаның қолданылуына назар аударыңыз, оларсыз біз N типті көрсеткіштің T элементіне массивтік декларация аламыз.
Массивтің көрсеткіші бірінші элементтің көрсеткіші болып табылмайды (бірақ олар әрине, биттік бірдей), ... жалғасы
Ш.Уалихаов атындағы Көкшетау мемлекеттік университеті.
ПОЛИТЕХНИКАЛЫҚ ФАКУЛЬТЕТІ
Ақпараттық жүйелер және есептеу техникасы
кафедрасы
" Объектіге бағытталған бағдарламалау I " пәні бойынша
Курстық жұмыс
Тақырыбы:"С++ тіліндегі массивтердің түрлері"
ОРЫНДАДЫ: Орынтай Ардақ ИСК91
ҚОРҒАУҒА ЖІБЕРІЛДІ
ОҚЫТУШЫ:ЕСМАГАМБЕТОВА Г.К.
БАҒАСЫ:
Көкшетау 2020
Мазмұны
Кіріспе
Негізгі Бөлім.
1 Бөлім Массив түсінігі
1.1 Массивтерді жариялау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...3
1.2Массивтермен жұмыс ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ...4
1.3 Есте сақтау ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..5
1.4 Массив элементтерінің түрлеріне шектеулер ... ... ... ... ... ... .. ... ... ... ... ..5
2 Бөлім. Массивтерді тегістеу және көшіру
2.1Араластыру ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .6
2.2Көшіру ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 8
3 Бөлім Массивтерді инициализациялау
3.1 Массивтің инициализациясы синтаксисі ... ... ... ... ... ... . ... ... ... ... ... ..10
3.2 Сынып мүшелерін инициализациялау ... ... ... ... ... ... ... ... ... ... ... ... ..11
3.3 Инициализаторға қойылатын талаптар ... ... ... ... ... ... ... ... ... ... ... ... ... .12
4 Бөлім Массив көрсеткіштері
4.1 Массив сілтемелері ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..14
5 Бөлім Көпөлшемді массивтер
5.1 Екі өлшемді бүтін сандар массиві кему ретімен орналастыру ... ... ... ...18
5.2. Екі өлшемді массивтің элементтерінің қосындысын табу ... ... ... ... ... .19
6 Бөлім Динамикалық массивтер
6.1. Динамикалық массивті құру және жою ... ... ... ... ... ... ... ... ... ... ... ... ..20
7 Бөлім Массивтерге арналған шаблондардың ішінара мамандануы
7.1. Массивтерге стандартты баламалар ... ... ... ... ... ... .. ... ... ... ... ... ... ... ..25
ҚОРЫТЫНДЫ ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..27
Қолданылған әдебиеттер тізімі ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ... ...28
Кіріспе
Курстық жұмыстың мақсаты:Осыған дейінгі қарастырылып келген мәлімет типтері қарапайым болып есептеледі. Себебі олар тек бір ғана объектіге яғни бір ғана санға немесе символға қатысты ғана пайдаланылады. С++ та бір типке жататын бірнеше элементтерден тұратын объектілерді де пайдалануға болады. Массив осындай бір типке жататын элементтерден құралатын құрылымдық тип болып келеді.
Курстық жұмыс мақсаты:Қарапайым типтер қатарына жататын стандартты (Integer ,real) және қолданушылар типтерінде бір айнылмалыны сақтау үшін ,негізінен компьютер жадысының бір ғана ұяшығы пайдаланылады. Бірақ көптеген программалар есептерінің шешімін табу барысында әрбір элементтің деректерін жеке айнымалыға сақтау орнына, оларды тізбектеп бір жерде сақтау анағұрлым тиімді болып саналады.
Курстық жұмыстың міндеті:Бір типтес берілгендердей құрылып, барлық элементтеріне бір ортақ атау берілген жиынды массив деп атаймыз. Массив құрылымдық типтер қатарына жатады. Массив элементтері нөмірленеді. Массивтің әррбір элементіне индексін көрсету арқылы жұмыс істеуге болады. Массивке мысал ретінде векторларды қарастыруға болады. Егер массивке кестелік берілгендер жабылса, онда элементтері екі индекс бойынша нөмірленеді.
-Массив сипаттамалары
-Типі- массив элементтерінің жалпы типі
Көлемі- массив индекстерінің саны
Шектелімі - әрбір индекстердің шектеу бойынша сәйкестігі
Пiшімі - көлем және шектеулер жиындары
Массивтермен элементтерімен жұмыс жасау барысында массив атауынан кейін міндетті түрде тік жақшаға алынған индекс көрсетіледі. Индекс ретінде сандар қолданылады.
Массивтің кез келген элементтерімен жұмыс істегенде программалау барысында олардың индексінің мәні типтер немесе айнымалылар бөлімінде сипатталған шектеуден аспауы керек. Егер массив индексінің мәні сипатталған шектеуден асып кетсе онда ,синтаксистік қате тіркеліп экранда Index type is not compatibie with declaration деген сөз тіркесі көрінеді.
Зерттелу деңгейі:Мaccивтер қолдaнылaтын программаларда {R+} диpekтивасын жазу арқылы масcивтің шектеулерін тексеруге болады. Егер
программада {R+} директивасы беріліп, массив индексі шектeyден
асыпкетсе, oнда экранға Range check error сөз тіркесі көрсетіледі. Массивтерді программада қолдану үшін С++ программалау тілінде оларды
бірден var бөлiмінде сипаттay жолы қapacтырылған.
1
Дерек көздері:С++ программалay тілі бір өлшeмді массивтермен қатар екі өлшемді және көп өлшeмді массивтерді қолданyға мүмкiндіктер бepеді.
Екi өлшeмді немece көп өлшемді массивтермен жұмыс істey үшін, олap сипаттаy бөлімінде кopсетілуі қажет. Екі өлшeмді массивтерді тiк төртбұрышты таблицалар неmece матрицалap деп қарастыpyға болaды. Coндықтан мұнда баған және жол ұғымдapы өз мағыналарында қолданылады.
Екі өлшемді мacсив элементтepі екі индекспен анықталады. Айталық mat[3,2]:=7 түріндегі өpнек mat матрицасының үшінші жолы және еkiнші бағaнының қиылыcуындағы элemeнті 7 ге тең екенін білдіреді. Екі өлшемдi массивтepді енгізу үшін far...doцикл оператopлары қолданылады.
Курстық жұмыстың құрылымы: Кіріспеден, 1 тараудан kopытынды және пайдаланылған әдебиеттepден құралған.
2
1.Массив түсінігі
Массив - қарапайым агрегат түрі. Ол бір типтегі элементтер жиынын үздіксіз жадында қатарға орналастырылған модельдейді. Массивтерді сол немесе басқа формада барлық дерлік бағдарламалау тілдері қолдайды және олардың C-дің алғашқы нұсқаларында пайда болып, содан кейін C ++ құрамына енуі таңқаларлық емес.
Массивтерді жариялау
Егер T қандай да бір тип болса, N тұрақты немесе компиляция кезінде бағаланған өрнек болса, онда оператор
T a [N];
a типті айнымалыны T типті N элементтер жиымы жариялайды. N типі std :: size_t типіне жанама түрде берілуі керек және оның мәні массивтің өлшемі деп аталатын нөлден үлкен болуы керек. Массивтің әрбір элементі үшін, сәйкесінше, sizeof (T) байт бөлінеді, барлық массивті орналастыру үшін қажет жадының өлшемі N * sizeof (T) байтқа тең. Бұл мән жоғарыдан платформамен және компилятормен шектелген. Массив типі T [N] деп белгіленеді, яғни оған элементтер типі мен массивтің өлшемі кіреді. Осылайша, элементтер типі бірдей, бірақ өлшемдері әр түрлі массивтердің түрлері болады.
Мұндай массивтерді массивтің басқа нұсқаларынан айырмашылығын баса көрсету үшін кірістірілген массивтер деп атайды (қарапайым массивтер), массив термині бағдарламалауда, оның ішінде C ++ тілінде өте кең қолданылады.
Массивтің жарнамалық декларациясының мысалдары:
const int N = 8;
constexpr int Square (int n) {return n * n; }
int a1 [1];
int a2 [N];
int a3 ['Q'];
int a4 [Квадрат (2)];
Массивтің дұрыс емес декларациясының мысалдары:
int n;
int b1 [0]; нөлдік өлшем
3
int b2 [n]; компиляция кезінде өлшемді анықтау мүмкін емес;
int b3 [Q] өлшемді size_t форматына ауыстыру мүмкін емес
Массив элементтеріне индексер арқылы қол жеткізіледі, индекс мәндері 0-ден N-1-ге дейін. Міне мысал:
int a [4];
a [0] = 42;
int t = a [3];
Массив шекарасынан тыс бақыланбайды, қате анықталмаған әрекетке әкелуі мүмкін.
Бір операторда бірнеше массивтерді жариялауға болады, бірақ әрқайсысы үшін өлшемі көрсетілуі керек.
int a [4], b [8];
Массив типтері үшін бүркеншік аттарды енгізуге болады. Сіз typedef дәстүрлі кілт сөзін қолдана аласыз:
typedef int I4 [4];
немесе қазіргі заманғы (C ++ 11) кілт сөзімен:
using I4 = int [4];
Осыдан кейін массивтер қарапайым айнымалы ретінде жарияланады:
I4 a, b;
Бұл сол сияқты болады
int a [4], b [4];
1.2. Массивтермен жұмыс
Массивтермен жұмыс істеу үшін сіз оператордың өлшемдерін және бірнеше стандартты функциялар мен макростарды қолдана аласыз.
Sizeof операторы жиымның жалпы көлемін байтпен қайтарады, яғни элементтің өлшемі массивтің өлшемінен үлкен болады.
_Countof () макросы (MSVS тақырыптық файлында cstdlib) массивтің өлшемін, яғни элементтердің санын қайтарады. C ++ 17-де std :: size () стандартты функция шаблоны пайда болды, ол дәл осылай жасайды (сонымен қатар стандартты контейнердің өлшемін анықтайтын шамадан тыс жүктелген нұсқасы бар).
int a [4];
4
std :: cout sizeof (a) '' std :: size (a) '\ n';
Қорытынды: 16 4
C ++ 11 стандартты кітапханада std :: begin () және std :: end () функцияларының еркін (мүше емес) шаблондары пайда болды. Массивке шақырылған std :: begin () көрсеткішті жиымның бірінші элементіне, std :: end () соңғы-соңғы элементке қайтарады. (Сондай-ақ тұрақты нұсқалары бар: std :: cbegin (), std :: cend ().) Бұл массивтерді for аралығында қолдануға мүмкіндік береді.
int a [4] {4, 3, 2, 1};
for(auto t: a)
{
std :: cout t '';
}
Сонымен қатар стандартты алгоритмдерде:
std :: sort (std :: begin (a), std :: end (a));
1.3. Есте сақтау
Егер массив статикалық түрде, яғни ғаламдық ауқымда, аттар кеңістігінде немесе кластың статикалық мүшесі ретінде жария етілсе, онда ол статикалық жадыға бөлінеді. Жергілікті жарияланған массивтер стекке бөлінген. (Жергілікті массивтерді өлшеу кезінде, әрине, стектің шектеулі мөлшері ескерілуі керек.) Статикалық емес класс мүшелері класс данасының шекараларында орналасады. Динамикалық массивтер (6-бөлімді қараңыз) динамикалық жадыда орналасқан.
1.4. Массив элементтерінің түрлеріне шектеулер
Элементтері жарамсыз массив құра алмайсыз.
Сілтемелер жиынын жариялай алмайды.
int u, v;
int & rr [2] = {u, v}; ошибка
Оның орнына тұрақты көрсеткіштер массивін қолдануға болады.
int * const rr [2] = {& u, & v};
C ++ 11 std :: reference_wrapper шаблонын ұсынды. Ол сілтеме
5
интерфейсін эмуляциялайды, бірақ инстанция даналарын контейнерлерде және кірістірілген массивтерде сақтауға болады. Бірақ әлі де сілтеме интерфейсінің эмуляциясы толығымен аяқталмаған, кейде get () функциясын қолдану керек. Міне, мысал.
int u = 42, v = 5;
std :: reference_wrapper int rr [2] = {u, v};
std :: cout rr [0] '' rr [1] '\ n'; вывод: 42 5
++ rr [0];
rr [1] .get () = 125; get () необходим
std :: cout u '' v '\ n'; вывод: 43 125
Сіз функциялар жиымын жариялай алмайсыз.
int ff [2] (double); ошибка
Оның орнына функционалды көрсеткіштер массивін қолдануға болады.
int (* ff [2]) (double);
Std :: reference_wrapper шаблонын функцияның типі бойынша нақтылауға болады, бірақ іс жүзінде көрсеткішке қарағанда ешқандай артықшылықтар жоқ - функцияны сілтеме арқылы ажыратусыз шақыруға болады, ал & операторынсыз функцияның атымен инициализациялауға болады. Функциялар массивін эмуляциялаудың тағы бір нұсқасы бар - бұл std :: function шаблонын қолдану, бірақ бұл шаблон басқа талқылауға арналған тақырып.
Массивті автоматты кілт сөзінің көмегімен жариялау мүмкін емес.
auto x [2] = {1, 2} ошибка
Const квалификаторы массив типіне емес, оның элементтерінің типтеріне ғана қолданылады.
I4 = int пайдалану [4];
const I4 ci; то же, что и const int ci[4];
2. Массивтерді тегістеу және көшіру
Бұл бөлімде массивтердің жалпы C ++ типті жүйесінен ерекшеленетін ерекшеліктері қарастырылады.
2.1. Араластыру
Жоғарыда айтылғандай, массивтің өлшемі массив типінің құрамдас бөлігі
6
болып табылады, бірақ белгілі бір жағдайларда ол жоғалады және бұл массив типін қандай да бір мағынада төменгі етеді. Бұл шығын массивтен көрсеткішке дейін ыдырау (ыдырау) деп аталады. (Кейде ыдырауды ыдырау деп те аударады.) Ақпараттың мәні кез-келген контексте жиым бірінші элементтің көрсеткішіне айналады және мөлшері туралы ақпарат жоғалады. Ерекшеліктер - өлшемдер операторы, & (адресті қабылдау) операторы және массив сілтемесінің инициализациясы. Оператордың өлшемдері 1.2 бөлімінде талқыланды, көрсеткіштер мен массив сілтемелері 4 бөлімде егжей-тегжейлі талқыланады. Decltype кілт сөзімен декларация сонымен қатар ақпаратсыз массивтің түрін дұрыс анықтайды.
Әрине, массивтер мен көрсеткіштер арасындағы тығыз байланысты жоққа шығаруға болмайды. Массивтің барлық элементтерін өңдеудің стандартты тәсілі (C-стилі):
const int N = 100;
int a [N];
for (int * d = a, * end = d + N; d end; ++ d)
{
* d = rand ();
}
Ақпаратты архаизмдерге жатқызуға болады, сондықтан олар мұқият және мұқият болуы керек, әйтпесе сіз ең жағымды тосын сыйларға тап болмайсыз.
Жиынтық функцияның декларациясына осылай әсер етеді. Функциялар
void Foo (int a [4]);
void Foo (int a []);
void Foo (int * a);
шамадан тыс жүктелген функциялар емес - олар бірдей. Өлшем міндетті емес параметр ретінде қабылдануы керек немесе өлшем үшін арнайы шарт қолданылуы керек (мысалы, жолдар үшін нөлдік аяқтау)
Массивті сырттан байлау кезінде тегістеу пайда болады.
file 1
int A [4];
2 file
extern int A [];
7
Өлшем үшін сізге қосымша айнымалыны қолдану керек немесе өлшемге арналған арнайы шартты қолдану керек.
Автоматты кілт сөзімен айнымалыны жариялаған кезде тегістеу де орын алады.
int a [4];
auto da = a; da типі int * түрінде шығарылады
Функция шаблонын құру кезінде
template typename T
void Foo (T t);
шаблон функциясының параметр типі, егер аргумент массив болса, көрсеткіш ретінде шығарылады.
Тегістеу мұраны пайдалану кезінде қосымша проблемалар тудырады. (С-да мұра жоқ.) Мысал қарастырайық.
class B { * ... * };
class D: жалпы B { * ... * };
void Foo (B [], int size); В типті элементтер массивін өңдеу
Келесі код қатесіз және ескертусіз құрастырылады.
D d [4];
Foo (d, _countof (d));
Бірақ егер sizeof (B) sizeof (D) болса, онда Foo () денесінде d жиым элементтерінің ығысуы (әрине, нөлден басқасы) қате анықталады және сәйкесінше әрдайым дерлік Foo () дұрыс жұмыс істемейді. Сондықтан полиморфты стильде массивтермен, негізгі классқа көрсеткіш арқылы жұмыс істеуге болмайды.
2.2. Көшіру
Тегістеумен қатар (және онымен тығыз байланысты) массив типінің тағы бір ерекшелігі бар, ол оны белгілі мағынада төмен етеді. Массивтер көшіру семантикасына негізделген инициализация мен тағайындаудың таныс синтаксисін қолдамайды:
using I4 = int [4];
I4 а;
I4 b = a; ошибка
8
I4 b2;
b2 = a; ошибка
Сонымен қатар, функция массивті қайтара алмайды.
I4 Foo (); ошибка
Бірақ егер массив класс құрылым одақтың мүшесі болса, онда көшірме (және тегістеу) мәселелері болмайды.
struct X
{
int A [4];
};
Бұл құрылым үшін компилятор массивті еш қиындықсыз көшіретін әдепкі көшірме конструкторын және сәйкес тағайындау операторын жасайды.
X Foo ();
X x;
X x2 = x;
X x3;
x3 = Foo ();
3. Массивтерді инициализациялау
Массивтерді инициализациялау ережелерін сипаттау үшін тривиальды түрлер туралы қысқаша айту керек.
Конструкторлар мен деструкторларды C ++ объектілік моделінің негізгі элементтері деп атауға болады. Объектіні құру кезінде міндетті түрде конструктор деп аталады, ал оны жойған кезде деструкторды атайды. Бірақ C-мен үйлесімділік мәселелері бізді ерекше жағдай жасауға мәжбүр етті және бұл ерекшелік тривиальды типтер деп аталады. Олар C типтерін және айнымалылардың өмірлік циклын модельдеу үшін конструктор мен деструктордың міндетті шақыруынсыз енгізілді. C коды, егер C ++ тілінде құрастырылса және орындалса, C-дегідей жұмыс істеуі керек. Тривиальды типтерге тривиальды типтерден тұратын сандық типтер, көрсеткіштер, санаулар, сонымен қатар класстар, құрылымдар, одақтар мен массивтер жатады. Сыныптар мен құрылымдар кейбір қосымша шарттарды қанағаттандыруы керек: тапсырыс берушінің, деструктордың болмауы, көшіру, тағайындау, виртуалды функциялар.
9
Тривиальды айнымалы инициализацияланбайды, егер нақты инициализацияның қандай да бір түрі қолданылмаса. Тривиальды класс үшін компилятор әдепкі конструктор мен деструктор жасай алады. Әдепкі конструктор нысанды жоққа шығарады, деструктор ештеңе жасамайды. Бірақ бұл конструктор нақты инициализацияның қандай да бір түрін қолданған кезде ғана жасалады және пайдаланылады, әйтпесе айнымалы инициализацияланбаған болып қалады.
Инициализацияланбаған айнымалының келесі құрылымы бар: егер ол аттар кеңістігінде жарияланған болса (глобальды түрде), онда барлық биттер нөлге ие болады, егер ол жергілікті болса немесе динамикалық түрде жасалса, ол кездейсоқ биттер жиынын алады. Мұндай айнымалыны қолдану бағдарламаның күтпеген мінез-құлқына әкелетіні анық. Массивтер көбінесе тривиальды типке ие, сондықтан олар үшін бұл проблема өте маңызды.
Тривиальды типтің инициализацияланбаған тұрақтыларын компилятор анықтайды, кейде ол басқа инициализацияланбаған айнымалыларды да анықтайды, бірақ статикалық код анализаторлары бұл тапсырманы жеңе алады.
C ++ 11 стандартты кітапханасында типтік белгілер деп аталатын шаблондар бар (тақырып файлы type_traits). Олардың бірі түрдің тривиальды емес екенін анықтауға мүмкіндік береді. Std :: is_trivial T :: мәнінің өрнегі шын мәніне бағаланады, егер T - тривиальды түр, ал басқаша - жалған.
3.1. Массивтің инициализациясы синтаксисі
Егер сіз нақты инициализацияны қолданбасаңыз, онда тривиальды емес типтегі массивтер үшін әр элемент үшін әдепкі конструктор шақырылатынына кепілдік беріледі. Әрине, бұл жағдайда мұндай конструктор болуы керек, әйтпесе қате пайда болады. Бірақ тривиальды типтегі массивтер үшін немесе әдепкі конструктор жоқ болса немесе жарамсыз болса, сіз нақты инициализацияны қолдануыңыз керек.
С күнінен бастап массивтер инициализациялаудың жиынтық синтаксисінің көмегімен инициализацияланды:
int a [4] = {1, 2, 3, 4};
C ++ 11 бірыңғай инициализацияны енгізді және енді оны инициализациялауға болады:
int a [4] {1, 2, 3, 4};
Әмбебап инициализация үшін сіз сонымен қатар = таңбасын қолдана аласыз және инициализацияның осы екі түрін ажырату әрдайым оңай бола
10
бермейді, бірақ өте қажет емес.
Массивтің өлшемін қалдыруға болады, содан кейін ол инициализаторлар санымен анықталады.
int a [] {1, 2, 3, 4};
Егер массивтің өлшемі көрсетілген болса, онда инициализаторлар саны массивтің өлшемінен аспауы керек. Егер массивтің өлшемі инициализаторлар санынан көп болса, онда қалған элементтер үшін әдепкі конструкторға кепілдік беріледі (олар, әрине, болуы керек), оның ішінде тривиальды типтер үшін. Осылайша, бос инициализация тізімін көрсете отырып, әдепкі конструктор тривиальды массивтің барлық элементтеріне шақырылатынына кепілдік береміз.
int a [4] {};
Тривиалды тұрақты массивтер міндетті түрде инициализация тізімін қажет етеді.
const int a [4] = {3, 2, 1};
Инициализаторлар саны массивтің өлшемінен аз болуы мүмкін, бұл жағдайда қалған элементтер әдепкі конструктормен инициалданады.
Символдар массивтерін әріптік әріппен инициализациялауға болады.
const char str [] = meow ;
const wchar_t wstr [] = L meow;
Мұндай массивтің өлшемі жолдағы символдар санынан артық болады; сіз аяқтайтын нөлдік таңбаны сақтауыңыз керек.
3.2. Сынып мүшелерін инициализациялау
C ++ 11-де кластың статикалық емес мүшелері болып табылатын массивтерді инициализациялау мүмкін болды. Мұны екі жолмен жасауға болады: тікелей декларациялау кезінде немесе конструкторды анықтау кезінде мүшелерді инициализациялау тізімінде.
class X
{
int a [4] {1, 2, 3, 4};
int b [2];
...
public:
11
X (int u, int v): b {u, v}
{}
...
};
Рас, бұл жағдайда сіз массивтің өлшемін әрдайым нақты қоюыңыз керек, инициализация тізімі арқылы өлшемді жасырын анықтауға жол берілмейді.
Статикалық массивтерді бұрынғыдай инициализациялауға болады, тек анықталған кезде, массивтің өлшемін инициализация тізімі арқылы анықтауға болады.
class X
{
static int A [];
...
};
int X :: A [] = {1, 2, 3, 4};
3.3. Инициализаторға қойылатын талаптар
Инициализация тізіміндегі өрнектер инициализациядан бұрын бірден бағаланады, оларды құрастыру кезінде білу қажет емес (әрине constexpr деп жарияланған массивтерден басқа). Инициализация тізімінің элементтеріне қойылатын талаптар массив элементімен бірдей типтегі параметрі бар функция аргументімен бірдей - инициализация тізімі элементінің типінен массив элементінің түріне жасырын түрлендіру болуы керек. Бізде массивтің декларациясы бар делік:
T a [] = {x1 *, ... * };
немесе
T a [] {x1 *, ... * };
Қажетті конверсияның болуы дұрыс нұсқаулыққа тең
T t = x1;
Инициализация тізімінің элементі инициализация тізімі болуы мүмкін. Бұл жағдайда бұл нұсқаулықтың дұрыстығы массив элементінің дұрыс инициализациялануына да кепілдік береді.
Мысалға тоқталайық.
12
class Int
{
int m_Value;
public:
Int(int v) : m_Value(v) {}
...
};
...
int x, y;
...
Int rr[] = { x, y };
Егер біз Int конструкторын анық деп жарияласақ, онда соңғы декларация жарамсыз болады. Бұл жағдайда сізге жазу керек болады
int rr [] = {Int (x), Int (y)};
Бұл мысалда инициализация тізімін қолдана отырып, әдепкі конструкторы жоқ типке массив қалай құруға болатындығы көрсетілген. Бірақ бұл жағдайда инициализаторлар саны массивтің өлшеміне сәйкес келуі керек.
4. Массив көрсеткіштері
Бізге массив жариялансын
T a [N];
Осы жиымға сілтеме келесі түрде жарияланып, инициализацияланады:
T (* pa) [N] = & a;
Дәстүрлі & оператор көрсеткішті алу үшін қолданылады. Массивтің көрсеткішінің түрі T (*) [N] деп белгіленеді.
Жақшаның қолданылуына назар аударыңыз, оларсыз біз N типті көрсеткіштің T элементіне массивтік декларация аламыз.
Массивтің көрсеткіші бірінші элементтің көрсеткіші болып табылмайды (бірақ олар әрине, биттік бірдей), ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz