Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Дәріс. Массивтер және көрсеткіштер

Читайте также:
  1. Aуіпсіздік және еңбекті қорғaу бөлімі
  2. XIV-XVII ғасырлардағы Қазақстанның мәдениеті және әлеуметтік-экономикалық жағдайы
  3. А)Өндіріс алаңы және оның тегістеу жұмыстары
  4. Абынудың жасушалық және гуморалдық медиаторларының пайда болу және әсер ету жолдары
  5. Азаматгық қоғам және құқықтық мемлекет
  6. Антидиуреттік гормон, альдостерон және ренин-ангиотензиндік жүйенің, натрий-уретикалық фактордың қызметі.
  7. аржы, ақша айналымы және несие » пәнінен емтихан сұрақтары

Көпөлшемді массивтер. "C" тілінде тік бұрышты көп өлшемді массивтер қарастырылған, дегенмен практикада көрсеткіштердің массивіне қарағанда олар сирек қолданылады. Ай күнін жыл күніне, және керісінше түрлендіретін есепті қарастырайық. Мысалы, 1 наурыз толық емес жылдың 60-шы күні және толық жылдың 61-ші күні болып табылады. Осы түрлендірулерді орындау үшін екі функция енгізейік: day_of_year ай мен күнді жыл күніне түрлендіреді, ал month_day жыл күнін ай мен күнге түрлендіреді. Осы соңғы функция екі мән қайтаратын болғандықтан, ай мен жыл аргументтері көрсеткіш болуы керек:

month_day(1977, 60, &m, &d)

m 3-ке, және d 1-ге тең деп есептейді (1-ші наурыз).

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

static int day_tab[2][13] = {

(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),

(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)};

day_of_year(year, month, day) /* set day of year */

int year, month, day; /* from month & day */

{

int i, leap;

leap = year%4 == 0 && year%100!= 0 \!\! year%400 == 0;

for (i = 1; i < month; i++)

day += day_tab[leap][i];

return(day);

{

month_day(year, yearday, pmonth, pday)

/*set month,day */

int year, yearday, *pmonth, *pday;

/* from day of year */

{

leap = year%4 == 0 && year%100!= 0 \!\! year%400 == 0;

for (i = 1; yearday > day_tab[leap][i]; i++)

yearday -= day_tab[leap][i];

*pmonth = i;

*pday = yearday;

}

 

day_tab массиві day_of_year үшін де, month_day үшін де сыртқы массив болуы керек, себебі оны осы функциялардың екеуі де қолданады. day_tab массиві біз қолданып отырған екі өлшемді массивтердің алғашқысы болып табылады. Анықтама бойынша "C" тілінде екі өлшемді массив негізгі мәнісінде әрбір элементі массив болып табылатын бір өлшемді массив болып табылады. Сондықтан олардың индекстері басқа тілдердегідей day_tab [i, j] емес, day_tab[i][j] деп жазылады. Қалған жерлерінде массивтермен басқа тілдердегідей қатынас жасауға болады. Элементтері жол бойынша сақталады, яғни элементтерге олардың жадыда орналасу реті бойынша қатынас жасаған уақытта оң жақ шетте орналасқан индекс жылдамырақ өзгереді.

Массив фигуралы жақшаға алынған бастапқы мәндер тізімінің көмегімен инициалданады; екі өлшемді массивтің әрбір жолы сәйкес ішкі тізімі арқылы инициалданады. Біз day_tab массивінің басына ай нөмірлері 0-ден 11-ге дейін емес, 1-ден 12-ге дейін өзгеріп тұруы үшін нөлдерден құралған бағанды орналастырдық. Әзірше жады көлемін үнемдеу біз үшін аса маңызды болмағандықтан, индекстерді келтіргеннен гөрі осындай тәсіл жеңілдеу болады.

Егер екі өлшемді массив функцияға берілетін болса, онда функцияның тиісті аргументінің сипатталуында бағандар саны болу керек; жолдар саны маңызды емес, себебі оның орнына бұрынғыдай көрсеткіш беріледі. Біздің жағдайда бұл – int типті 13 саннан құралған массив болып табылатын объекттердің көрсеткіші. Осылайша, егер day_tab массивін f функциясына беру керек болса, онда f функциясындағы сипатталуы төмендегідей болатын еді:

f(day_tab)

int day_tab[2][13];

{

...

}

Жолдар саны маңызды емес болғандықтан, f функциясындағы аргументтің сипатталауы мынадай:

int day_tab[][13];

немесе мынадай болуы мүмкін еді:

int (*day_tab)[13];

мұнда аргумент 13 бүтін саннан құралатын массивтің көрсеткіші болып табылатыны айтылады. Мұндағы жай жақшалар міндетті болып табылады, себебі [ ] квадрат жақшалар *- ға қарағанда жоғары деңгейге ие; жай жақшаларсыз жағдайда

int *day_tab[13];

бүтін сандардың 13 көрсеткішінен құралатын массивтің сипаттамасы болып табылады.

Көрсеткіштер және көп өлшемді массивтер. "C" тілін жаңадан оқып бастағандар кейде екі өлшемді массив пен көрсеткіштер массивінің айырмашылығы туралы мәселеде тұйыққа тіреліп қалады. Егер төмендегідей сипатталулар болса,

int a[10][10];

int *b[10];

онда a мен b- ны бірдей жолмен пайдалануға болады, себебі a[5][5] те b[5][5] те int типті бөлек санға сілтеме болып табылады. Бірақ a – нағыз массив болып табылады: оған жадының 100 ұяшығы бөлінеді және кез келген көрсетілген элементті табу үшін тік бұрышты индекстермен әдеттегі есептеулер жүргізіледі. Алайда b- ға бұл сипатталу тек 10 көрсеткіш қана бөледі; әрбір көрсеткіш бүтін сандар массивіне сілтейтіндей етіп орнатылуы керек. Егер олардың әрқайсысы 10 элементтен құралған массивке сілтейді деп алсақ, онда шамамен жадының 100 ұяшығы және оған қоса көрсеткіштер үшін тағы 10 ұяшық бөлінеді. Осылайша, көрсеткіштер массиві жадының көбірек бөлігін қолданады және анық инициалдау қадамын талап етуі мүмкін. Бірақ бұның екі артықшылығы бар: элементке көбейту және қосу арқылы емес, көрсеткіш арқылы жанама түрде қатынас жасалады, және массив жолдарының ұзындығы әр түрлі бола алады. Бұл дегеніміз – b- ның әрбір элементі 10 элементтен құралған векторға сілтеуі міндетті емес; кейіберулері екі элементтен, басқалары жиырма элементтен тұратын векторға сілтеуі мүмкін, ал үшіншілері еш нәрсеге сілтемеуі де мүмкін.

 

Негізгі әдебиет: 1 [104-108], 2[344-405], 3[192-214], 5[94-124]

Қосымша әдебиет: 1[239]

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

1. Әр түрлі массив түрлерін инициалдау мысалдарын келтіріңіз.

2. Көрсеткіштер мән ретінде нені сақтайды?

3. Көрсеткішті инициалдау үшін қандай үш мән қолданыла алады?

4. Қандай кластағы айнымалыларға адресті алу операциясы қолданыла алмайды?

5. Массив аты массивтің қай элементіне көрсеткіш болып табылады?

 


Дата добавления: 2015-07-08; просмотров: 534 | Нарушение авторских прав


Читайте в этой же книге: Пәнді қысқа сипаттау | Модульдер бойынша жүргізілетін аралық бақылауларға арналған сұрақтар тізімі | Дәрістік сабақтардың конспектілері | Программаның құрылымы | Error директивасы | Келтіру операторлары | Дәріс. Циклдар - басқару операторлар | Дәріс. Массивтер. Бірөлшемді және екіөлшемді массивтерді өңдеуге арналған программаларды құру | Жолдарға қолданылатын операциялардың функциялары | Дәріс. Құрылымдар және мәліметтердің басқа формалары. |
<== предыдущая страница | следующая страница ==>
Көрсеткішті сипаттау| Ші дәріс. Символдық жолдар және қолданылатын функциялар

mybiblioteka.su - 2015-2024 год. (0.008 сек.)