Лекция: 30 саѓат Лаборатория: 15 саѓат С¤Ж: 45 саѓат обс¤Ж: 45 саѓат Барлыќ саѓат саны: 135 саѓат


Лекция 21. Тақырыбы: Массивтер функция аргументі ретінде



бет15/24
Дата14.06.2016
өлшемі1.16 Mb.
#135127
түріЛекция
1   ...   11   12   13   14   15   16   17   18   ...   24

Лекция 21.

Тақырыбы: Массивтер функция аргументі ретінде


(1 сағат)
1. Массивтер функция аргументі ретінде

2. Массив шекарасынан шығып кету


Пайдаланылатын әдебиеттер:

а) негізгі

1. К.Паппас, У.Мюррей “Программирование на С и С++”, Киев, 2000

2. А.Кетков, Ю.Кетков “Практика программирования Бейсик,

Си, Паскаль”, М.: 2001



б) қосымша

3. Шилдт Г. “Теория и практика С++”, Санкт-Петербург, 1996

4. Березин Б.И., Березин С.Б. “Начальный курс С и С++”, М.:1999
1. Массивтер функция аргументі ретінде

Басқа айнымалылар сияқты массивтер де функция аргументтері ретінде беріле алады. Айталық, элементтері бүтін сандар болған inum массивінің элементтерінің қосындысын есептейтін isum() функциясы бар болсын. Функция жұмыс істеуі үшін 2 аргумен т қажет: iarray_adress көрсеткіші, (массив адресінің копиясын қабылдайды) және қосу амалына қатысатын соңғы элементтің индексін сақтайтын imax_size айнымалысы. Онда isum() функциясының тақырыбы былай жазылады:

int isum(int iarray_adress[], int imax_size)
Бірінші аргументтің жанындағы квадрат жақұшалар оның массив екендігін білдіреді. Бұл жерде массив өлшемі көрсетілмеген.

Программа ішінде функцияны шақыру мына көріністе болады:

isum(inum, index);
Бұл массивтерді функцияға берудің қарапайым әдісі. Іс жүзінде isum() функциясы масивтің бірінші элементінің адресін қабылдап алатындықан, оны былайша шақыруға да болады:

ito = isum(&inum[0], iact);


Функцияға мәні бойынша берілетін (яғни функция ішінде айнымалының локал копиясы құрылады) айнымалылардан айырмашылығы массивтер нұсқау бойынша беріледі, және функция ішіндегі есептеулерді копиясы емес массив элементтерінің өздері қатысады.

Бұл “stack overruns heap” (стек перегружен) түрдегі хабарламалардың шығуынан сақтайды. Мысалы, Pascal тілінде егер программист формальді аргументтерді сипаттау барысында массив атауының алдынан var сөзін жазуды ұмытса, онда жоғарыда көрсетілген хабарлама шығарылады. Массивтер мұнда мәндері бойынша берілетіндіктен компилятор олардың көшірмесін алуға мәжбүр болады(дублировать). Үлкен массивтермен жұмыс істегенде бұл процесс көп уақыттты және бос жадыны талап етеді.

Келесі мысалда 5 элементтен тұратын массив құрылады, ал imin() функциясы олардың ең кішісін анықтайды. Сондықтан imin() функциясына массив аты және салыстырылатын элементтердің саны (біздің жағдайда массив элементінің барлығы) беріледі.
#include

# define iMAX 10

int imin (int iarray[], int imax);
main()

{

int iarray[iMAX]={3,7,2,1,5,6,8,9,0,4};



int i, ismall;

printf(“Массив элементтері мынау:”);

for (i=0; i

printf (“%d”, iarray[i]);

ismall= imin(iarray, iMAX);

printf(“\n Минимал мән: %d\n”, ismall);

return(0);

}
int imin(int iarray[], int imax)

{

int i, icur_min;



icur_min=iarray[0];

for (i=1, i

if (iarray[i]

icur_min=iarray[i];

return(icur_min);

}
2. Массив шекарасынан шығып кету

Массивтермен жұмыс істеу барысында элемент индексі массив өлшемінен аспауы қажет. С/С++ тілдері ассемблер тілдеріне ұқсас құрылғандықтан мұндай қателерді тексеру функциялары компиляторға ендірілмеген. Мысалы келесі программаны компиляция жасаған уақыттта қате табылмайды, алайда массив шекарасынан шығып кету программа орындалуы барысында басқа айнымалылардың мәні өзгеріп кетуі және программаның дұрыс аяқталмауына себеп болады.
/*

* Бұл программаны іске қоспаңыз

*/
# include
# define iMAX 10

# define iOUT 50


main()

{

int inot[iMAX], index;


for (index=; index

inot[index]= index;


return(0);

}

лекция 22.

тақырыбы: Көрсеткіштер


(2 сағат)
1. Көрсеткіштер

2. Көрсеткіштерді анықтау

3. Көрсеткіштерді қолдану
Пайдаланылатын әдебиеттер:

а) негізгі

1. К.Паппас, У.Мюррей “Программирование на С и С++”, Киев, 2000

2. А.Кетков, Ю.Кетков “Практика программирования Бейсик,

Си, Паскаль”, М.: 2001



б) қосымша

3. Шилдт Г. “Теория и практика С++”, Санкт-Петербург, 1996

4. Березин Б.И., Березин С.Б. “Начальный курс С и С++”, М.:1999
1. Көрсеткіштер

Ќарапайым айнымалылар ‰шін жады автоматты т‰рде программа не функцияны іске т‰сірген уаќытта бµлініп, жєне программа не функция ж±мысын аяќтауымен бµлінген жады да жойылады. Жадыдаѓы мєнді пайдалану бізге белгілі айнымалы аты арќылы ж‰ргізіледі. Мысалы,

mem+=10

Айналмалыныњ мєнін пайдаланудыњ таѓы бір жолы б±л осы айналмалыныњ адресі жазылѓан басќа айнымалыны ќолдану.



Айталыќ int типтегі mem атаулы айнымалы жєне оѓан сілтеме жасайтын яѓни адресін кµрсететін add деген айнымалы берілсін. С/С++ тілінде айнымалыныњ адресін алу операторы & бар екендігі белгілі. Сондыќтан, бір айнымалыѓа басќа бір айнымалыныњ адресін меншіктеудіњ синтаксисін т‰сіну ќиын болмайды.

Add=&mem


Басќа бір айнымалылардыњ адрестерін саќтайтын айнымалыларды кµрсеткіштер деп атайды. Mem айнымалысы компьютердіњ жадында 7751 ±яшыќ адресінде жазылѓан.
mem add




Мына суретте айнымалымен оныњ кµрсеткіші арасындаѓы байланыс кµрсетілген.

Адресі басќа бір айнымалыда саќталѓан (м/ы: add) айнымалыныњ мєнін пайдалану ‰шін * операторы ќолданылады: *add. Б±л жазба жады ±яшыѓыныњ адресі бар кµрсеткіш атауы арќылы сол жадыныњ ±яшыѓыныњ мєнін жанама пайдалану дегенді білдіреді.

Тµменде жазылѓан 2 ќатарды орындаудыњ нєтижесінде mem айнымалысы 20 деген мєнді ќабылдайды.

add=& mem,

*add=20
add кµрсеткіші mem айнымалысыныњ адресін саќтайтынын ескерсек, келесі 2 ќатардыњ екеуі де бір нєтиже береді: mem айналысына 20 мєнін меншіктейді.

mem=20


*add=20
2. Кµрсеткіштерді аныќтау.
С/С++ тілінде айнымалылар алдын ала аныќталуы керек.

add кµрсеткішін аныќтау былай жазылады:
int *add
* символы кµрсеткіш ќ±рылатындыѓын білдіреді. Б±л кµрсеткіш int типті айнымалыныњ адресін аныќтайтын болады.

Тµмендегі мысалда айнымалысы int типті кµрсеткіш деп аныќталѓан.

int *pi;

float r=98.26;

pi=&r;
‡шінші ќатарда рі кµрсеткішіне int типтегі емес float типтегі айнымалы адресі меншіктеліп отыр. Б±л жаѓдайда компьютер ќателік туралы хабар береді.
3.Кµрсеткіштерді ќолдану.

Келесі программа ‰зіндісінде кµрсеткіштер арќылы resa жєне resb айнымалыларыныњ мєндері ауыстырылады.

int resa =15, resb=37, tem;

int *pir;

pir=&res;

tem=*pir;

*pir=resb;

resb=tem;


Бірінші ќатар айнымалыларды сипаттайды. Олар ‰шін жадыдан ‰ш ±яшыќ бµлінеді. Б‰тін санды єр бір ±яшыќќа атау беріледі. Екеуіне бастапќы мєндер жазылып ќойылады.

Айталыќ resa айнымалысыныњ мєні 5328 адіресті ±яшыќќа саќталѓан болсын,ал resb-њ мєні 7916 адресті ±яшыќќа ,ал tem- 2385 адіресті ±яшыќ бµлінсін.

resa resb tem pir


[5328] [7916] [2385] [1920]
Программаныњ 2-ші ќатарында pir кµрсеткіші ќ±рылады, єрі оѓан жады ±яшыѓы (1920) бµлінеді.

‡шінші ќатарда pir кµрсеткішіне resa айнымалысныњ адресі меншіктеледі .

Тµртінші ќатарда tem айнымалысына *pir µрнегі арќылы алынып отырѓан resa айнымалысыныњ мєні меншіктеледі.

15
resa resb tem pir


37



15

5328



[5326] [7916] [2385] [1920]


5-ші ќатарда res b айнымаласыныњ мєні pir кµрсеткіші арќылы адірестелетін (адіресі кµрсетілген) жады ±яшыѓына кµшіріледі.

37
resa resb tem pir


37



15

5328



[5326] [7916] [2385] [1920]


Соњѓы ќатарда tem айнымалысыныњ мєні res айнымалысына меншіктеледі.
resa resb tem pir

[5326] [7916] [2385] [1920]





Достарыңызбен бөлісу:
1   ...   11   12   13   14   15   16   17   18   ...   24




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

    Басты бет