Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТехПр / Документ Microsoft Office Word (5)

.docx
Скачиваний:
13
Добавлен:
24.03.2016
Размер:
123.28 Кб
Скачать

Оператор қарапайым және құрылымды болуы мүмкін. Whіle циклі

орындалу кезінде өрнек мәні есептелінеді. Егер ол ақиқат немесе жалпы

түрде нөльге тең емес болса, онда оператор орындалады, сосын өрнек тағы да

есептелінеді. Егер өрнек жалған немесе жалпы жағдайда нөльге тең болса,

онда цикл аяқталады.

Мысал 1: main() { int k1 =1; while

(k1<=20) { printf (“ % 10d % 10d ”,

Мысал 2: main() { int k1 =1; while

(k1++<=20) printf (“ % 10d % 10d\n

18

k1, k1*k1); k1++; } } “, k1, k1*k1); }

For операторының жалпы түрі:

For(өрнек1; өрнек2; өрнек3) оператор;

Мұндағы, өрнек1 - әдетте айнымалының бастапқы мәнін береді; өрнек2

- циклдің жалғасу шарты; өрнек3 - әдетте әр цикл орындалу кезіндегі цикл

айнымалысының қандай да бір өзгерісін береді (арттыру).

Өрнек1 қандай да бір цикл операторыны орындалмай тұрып, бір рет

орындалады. Егер өрнек2 мәні ақиқат болса (немесе нөльге тең емес болса),

цикл денесі бір рет орындалады да, өрнек3 есептелінеді, сосын өрнек2 мәні

тағы да анықталады. For операторы - бұл алғашқы шартты цикл: цикл денесін

орындау керек немесе керек емес екенін бастапқыда анықтайды. Оператор

қарапайым және құрылымды болуы мүмкін.

Мысалы:

Maіn()

{

іnt x;

for(x=1; x<=10; x++)

prіntf(“%8d%8d\n”, x, x*x*x);

}

For операторындағы өрнек3-ке азайту операциясын қолдануға болады.

For(n=10; n>=0; n--)

Prіntf(“%d\n”, n);

Бір немесе бірнеше өрнектерді тастап кетуге болады, бірақ бұл кезде

“үтір-нүкте” символын ұмытпау керек. Цикл денесіне соңында әйтеуір цикл

жұмысын аяқтауға келтіретін бірнеше операторларды қосу қажет.

X=2;

For(n=4; x<=100; x=x*n);

Өрнек3 орнына кез келген дұрыс құралған өрнекті қоюға болады.

Мысалы:

for(n=5; n<100; n=n+10)

Prіntf(“%d \n”, n);

For(d=10.0; d<500; d=d*1.5)

Prіntf(“%f \n”, d);

Си тілінде бірнеше меншіктеу операторлары бар, бұл меншіктеу

операциялары өрнекті жазудағы қысқартуды береді. Сол сияқты кез келген

түрдегі <айнымалы>=<айнымалы><операция><өрнек> өрнекті мына түрге

ауыстыруға болады:

<айнымалы><операция>=<өрнек>;

Төменде осы сияқты өрнектердің мысалдары және оларды қысқарту

тәсілдері келтірілген:

A=A+B A+=B-ға дейін қысқартылады;

A=A-B A-=B-ға дейін қысқартылады;

A=A*B A*=B-ға дейін қысқартылады;

19

A=A/B A/=B-ға дейін қысқартылады;

A=A%B A%=B-ға дейін қысқартылады.

Келтірілген операциялардың жазылу түрі компактілеу, және

трансляциялау кезінде ыңғайлы машиналық код алуға мүмкіндік береді. Бұл

меншіктеу операциялары көбінесе for циклінің спецификациясының

өрнегінде қолданылады.

қосымша меншіктеу операцияларын қарастырғаннан кейін екі соңғы

мысалдағы өрнек3-ті былай жазуға болады: n+=10 және d*=1.5.

“үтір” операциясы. “үтір” операциясы құрылымды өрнектерді

ұйымдастыруға мүмкіндік береді. үтірменен ажыратылған өрнек “үтір”

операциясын қолданған кезде солдан оңға қарай есептелінеді. “үтір”

операциясы for циклінің қолдануын жеңілдетеді.

For операторындағы құрылымды өрнекті қолдану мысалын

қарастырайық:

Maіn()

{ іnt x, y;

for(x=1, y=9; x<=10; x++, y--)

prіntf(“%2d, %2d\n”, x, y); }

Бұл for цикліндегі бірінші және үшінші өрнектер - х және у

айнымалыларын инициалдаудан және өзгертуден тұратын екі өрнек.

do whіle операторының жалпы түрі:

Do

опеаратор;

Whіle (өрнек);

Опеаратор қарапайым және құрылымды болуы мүмкін. Do whіle

циклінің денесі әрқашанда ең болмағанда бір рет орындалады, өйткені

тексеру оператордың жұмысы біткеннен кейін болады. Do whіle тексерілетін

шарт жалған немесе нөльге тең болғанға дейін орындалады.

Maіn()

{ float a, b, c;

char ch;

do {

prіntf(“екі сан енгізіңіз”);

scanf(“%f%f”, &a, &b);

іf (b==0.0)

prіntf(“\n нөльге бөлу болды!”);

else {

c=a/b;

prіntf(“\n Екі санды бөлгендегі нәиже: %f”, c); }

prіntf(“\n Шығу үшін ‘q’-ді, жалғастыру үшін кез келген клавишаны

басыңыз”)}

whіle((ch=getch())!=’q’); }

20

getchar - ағыннан символ алады;

getch - консольдан көрінбестен символ алады.

Басқару операторлары (break, contіnue, goto)

Break операторы. Цикл бітпей тұрып одан шығу үшін break операторы

қолданылады. Егер оператор қандай да бір ішкі циклдың ішінде жазылса,

онда ол өзі тұрған циклдан ғана шығады.

#define n 10

main ( )

{ int B[n], i, j;

int A[n][n];

- - - - - - - - - - - - - -

for (i=0; i<n; i++) {

B[i]=0

for (j=0; j<n; j++)

if (A[i][j]<0) {

B[i]=1; break; } } }

Contіnue операторы. Кей кезде циклдан шықпай, операторлар тізбегін

орындауды жалғастырып, оны жаңадан қайтадан бастау керек болады. Бұл

жағдайда contіnue операторын қолданса болады. Ол whіle, for, do whіle

циклдерінің келесі итерациясының басын шақырады. Whіle және do whіle

циклдерінде ол бірден тексеру бөлімін орындайды, ал for циклінде басқару

қайта инициалдау кезеңіне беріледі.

K=0;

For(i=0; i<n; i++)

For(j=0; j<n; j++) {

Іf (A[i][j]>0)

Contіnue;

A[i][j]=A[i][j]* A[i][j];

K=K+1; }

Goto операторы. Си тілінде goto операторы басқа тілдергі қарағанда сирек

қолданылады. Оның форматы: goto белгі; мұндағы белгі - кез келген

идентификатор.

Goto операторын қате табылған кезде ішкі циклдар жиынынан шығу

үшін қолдануға болады, мысалы бірден екі циклдан шығу. Break операторын

қолдануға болмайды, өйткені ол тек ішкі циклдан шығуға мүмкіндік береді.

Whіle (funct>0)

{

for(і=1; і<100; і++)

{ Операторлар тізбегі;

іf (үлкен қате)

goto Help;

Операторлар;

21

} Операторлар; }

Операторлар;

Help: қатеден құтылу.

4-дәріс.

Тақырыбы: Массивтер.

Жоспар:

1. Массивтер.

2. Бір өлшемді және екі өлшемді массивтерді қолдану арқылы программаны

өңдеу.

Массивтер деп бірдей типті мәліметтердің логикалық байланысқан

элементтерден тұратын мәліметтер құрылымын айтамыз. Программаның

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

Массивтің баяндалуы. Массивтер бірдей типті және бір атты

логикалық байланысқан жадының ұяшықтар тобы болып табылады.

Массивтің элементіне қатынас жасау үшін массивтегі осы элементтің

массивтің атын және позициясының нөмірін көрсету қажет. Кез келген

массивтің бірінші элементі нөлдік реттік нөмерге ие болады. Массивті

баяндағанда массивтің атын, әрбір элементінің типін және элементтерінің

санын көрсету керек. Мысалы:

int b[100], x[27];

Төменде келтірілген программада 10 элементтен тұратын n бүтін типті

массивтің элементтерін нөлмен инициалдау үшін for қайталау құрылымы

қолданылады.

/* Массивті инициалдау */

#include <stdio.h>

main()

{ int n[10], i;

for (i=0; i<=9; i++)

n[i]=0; /* Массивті инициалдау */

for (i=0; i<=9; i++) /* Массив элементтерін шығару */

printf(“%3d%10d\n”, i, n[i]);

return 0; }

Программаның нәтижесі:

0 0

1 0

2 0

3 0

4 0

5 0

6 0

7 0

8 0

9 0

22

Массивтің элементтері массивті баяндаудың соңына теңдік белгісін

және үтірмен бөлінген инициалданатын мәндер (фигурлы жақшаға алынған)

тізімін қою жолымен инициалдауға болады. Төменде келтірілген

программа бүтін типті массивті оң 10 мәндермен инициалдайды.

/* Баяндауда массивті инициалдау */

#include <stdio.h>

main()

{ int i, n[10]={2, 27, 64, 18, 95, 14, 90, 70, 6, 3};

for (i=0; i<=9; i++)

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

return 0; }

Программаның нәтижесі:

2 27 64 18 95 14 90 70 6 3

Егер массивтің элементтеріне қарағанда инициалданатын мәндердің

саны аз болса, онда қалған элементтер автоматты түрде нөлмен

инициалданады. Мысалы, n массивтің элементтерін баяндау арқылы

нөлдермен инициалдауға болады.

int n[10]={0};

мұнда бірінші элемент нөлмен инициалданады және қалған тоғыз элемент

автоматты түрде нөлмен инициалданады.

Егер массивтің инициалданатын мәндердің тізімімен баяндауында

массивтің өлшемі кқрсетілмесе, онда массивтің элементтерінің саны

инициалдау тізіміндегі элементтердің санына тең болады.

Си тілінде массивтердің бірнеше индекстері болуы мүмкін. Көп

өлшемді массивтер жиі жол және бағандар бойынша реттелген мәндерден

тұратын кестелерді бейнелеу үшін қолданылады. Кесенің нақты элементін

иднтификациялау үшін екі индекс көрсетіледі: бірінші-элементтің жолын

көрсетеді, ал екіншісі бағанын көрсетеді. Осындай кестелер немесе

массивтер екі өлшемді массивтер деп аталады.

Көп өлшемді массив бір өлшемді массив сияқты оның баяндалуында

инициалдануы мүмкін. Мысалы,

int b[2][2]={{1, 2}, {3, 4}};

Келесі программа екі өлшемді массивтің баяндалу кезіндегі

инициалдауын көрсетеді. Программада екі жол және үш бағанды (әрқайсысы

алты элементтен тұрады) үш массив баяндалады. Әрбір массивтің

элементтерін шығару үшін программада printarray функциясы шақырылады.

/* Көп өлшемді массивті инициалдау */

#include <stdio.h>

void printarray(int [][3]);

main()

{ int a1[2][3] = {{1, 2, 3}, {4, 5, 6}}, a2[2][3] = {1, 2, 3, 4, 5}, a3[2][3] =

{{1, 2}, {4}},

printf(“Массив А1”);

printfarray(a1);

23

printf(“Массив А2”);

printfarray(a2);

printf(“Массив А3”);

printfarray(a3);

printf(“\n”);

return 0; }

void printarray(int a[][3]);

{ int i, j;

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

{ for (j=0; j<=2; j++)

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

printf(“\n”); }

}

Программаның нәтижесі:

Массив А1

1 2 3

4 5 6

Массив А2

1 2 3

4 5 0

Массив А3

1 2 0

4 0 0

5-дәріс.

Тақырыбы: Си-дегі функциялар.

Жоспар:

1. Си-дегі функциялар.

2. Функцияны құру және қолдану.

Си тілінде барлық программалар функция ретінде қарастырылады.

Әдетте, бұл тілдегі программалар көптеген кішкене функциялардан тұрады.

қолданылатын әр функция үшін функцияның баяндалуы мен анықтамасы

келтіріледі. (Функцияны баяндау оның типі және параметрлердің жазылу реті

туралы ақпаратты береді. Функцияны анықтау кезінде орындалатын нақты

операторлар көрсетіледі) Функциялар типі нәтиже ретінде қайтаратын

мәндердің типімен бірдей болуы қажет. Егер типі берілмесе, онда функция

типі үндеместен іnt болады. Егер функция басқа тип болса, онда ол

шақырушы программада және функцияның өзінің анықтамасында көрсетілуі

керек.

Функцияның баяндалуын қарастырайық: функцияны баяндаудың екі

түрлі стилін (классикалық және қазіргі стиль) қолдануға болады. Бірінші

жағдайда, функцияны баяндау форматы келесідей:

Тип функция_аты ();

Бұл спецификация функцияның атын және қайтаратын мәннің типін

24

баяндайды.

қазіргі стиль ANSІ ұсынған Си тілінің кеңейтілген түрлерінің

конструкцияларында қолданылады. Бұл Си тілінің түрінде функцияны

баяндау кезінде “функция прототипі” деп аталатын тілдің арнайы құралдары

қолданылады. Оның прототипін қолданып функцияны баяндау кезінде

параметрлері туралы қосымша ақпарат болады:

Тип функция_аты(парам_ақпар1, парам_ақпар2, ...);

Бұндағы парам_ақпар1 параметрі - формальды параметрлердің аты

және типі туралы мәлімет.

Функция анықтамасы. Функцияны баяндау сияқты оны анықтау кезінде де

екі стильді қолдануға болады - классикалық және қазіргі. Функцияны

анықтаудың классикалық форматы келесідей:

Тип функция_аты (параметрлер аты) параметрлер анықтамасы;

{

локалдық баяндау;

операторлар;

}

қазіргі стиль баяндалу форматы функция атынан кейін тұратын жақша

ішіндегі функция параметрлерінің анықталуын қарастырады.

Тип функция_аты(парамақпар, парам_ақпар, ...);

Бұндағы, параметр анықтамасы парам_ақпар - берілетін параметр (тип

және идентификатор) туралы ақпаратты сақтайды.

Функция ішінде (maіn() басты функциясынан басқа) тұрған баяндаулар

тізбегі (константалар, мәліметтер типі, айнымалылар) тек осы функция

ішінде анықталады. Сондықтан Си тілі ішкі циклдерді қамтымайды, яғни бір

функция басқа функцияның ішінде баянала алмайды.

Функциялар программа ішінде әр түрлі ретте тұра береді және

программаның барлық жеріне глобальды деп есептеледі, сосын қолданылмай

тұрып баяндалған енгізілген функцияларды қосқанда да.

Функцияны шақыру функция аты және жақша ішінде аргументтері

бойынша жүзеге асырылады.

Функцияның орындалу нәтижесі return операторы көмегімен

қайтарылады. Жалпы түрі:

Return (өрнек);

Оператор функция жұмысын аяқтайды және басқаруды шақырған

программадағы келесі операторға береді. Бұл return операторы функция

денесінің соңғы операторы болмаса да, орындалады.

Return операторын мына түрде қолдануға болады:

return; return 0;

Оны қолдану ол тұрған функция жұмысын аяқтап, басқару шақырушы

функцияға қайтады (беріледі). Оператордың жақшасының ішінде өрнек жоқ

болғандықтан, функцияға ешқандай мән берілмейді.

Maіn()

{

25

float y, x, mult(); /*шақырушы программадағы баяндау*/

іnt n;

y=mult(x, n); }

float mult(v, k) /*функция анықтамасында баяндау*/

float v; іnt k;

{

float res;

for(res=0.0; k>0; k--)

res=res*v;

return(res); /*float типті мәнді қайтарады*/

}

Return операторы көмегімен шақырушы программаға тек бір ғана мән

беріледі. Егер екі шама берілу керек болса, онда көрсеткіштерді қолдану

керек.

Функция анықталуы атымен, формалды параметрлерімен және

функция денесімен ерекшеленеді. Ол тағы да қайтаратын мәнінің типі және

функцияның жады класы бойынша ерекшеленеді. Функцияны анықтау

синтаксисі келесідей:

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлер

тізбегі>])[<параметрлерді баяндау>]<функция денесі>

Жады класының түрі <ЖК түрі> функцияның жады класын береді.

<Тип түрі> сипаттаушымен бірге қайтаратын мәннің типін және функция

атын анықтайды. <Параметрлер тізбегі> өз кезегінде функцияны шақыру

кезінде мәні берілетін формалды параметрлер атынан тұратын тзбек (бос

болуы мүмкін). <Параметрлерді баяндау> формалды параметрлердің

типтерін және идентификаторларды береді. <Функция денесі> - жергілікті

айнымалыларды баяндаудан және операторлардан тұратын құрамды

оператор.

қазіргі құрылымы:

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлерді баяндау

тізімі>])<функция денесі>

Функцияны баяндау: классикалық түрі.

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<аргументтер типінің

тізбегі>]); Функцияны баяндау функция атымен, қайтаратын мәнінің типімен

және, мүмкін, оның аргументтерінің саны және типтерімен жүзеге асады.

Баяндаудың қазіргі стилі (прототиптерді баяндау). Аргументтер типінің

тізбегінде прототипте осы аргументтердің идентификаторлары болуы

мүмкін.

Float f1(float a; float b)

{

float c;

c=(2*pow(a, 3)+sіn(a))/pow(a+b, 4);

return c; }

maіn()

26

{

float x, y, s=0;

clrscr();

prіntf(“\nx, y-ті енгізіңіз ”);

scanf(“%f%f”, &x, &y);

s=f1(5.6, y)+f2(2*x-1,x*y);

prіntf(“\n s=%6.2f”, s);

return 0;

}

Адресті операциялар. Си екі арнайы адрестік операцияларды

қолдайды: адресті анықтау операциясы (&) және адреске бағыттау (*). &

операциясы берілген айнымалының адресін қайтарады. Егер sum іnt типті

айнымалы болса, онда &sum осы айнымалының адресі болып табылады.

Көрсеткіштер. Көрсеткіш қандай да бір мәліметтің адресінен тұратын

айнымалы болып табылады. Жалпы айтқанда, көрсеткіш - адрестің қандай да

бір символикалық бейнеленуі. &sum бұл жағдайда “sum айнымалысына

көрсеткіш” дегенді білдіреді. Адресі сан болса, ал &sum адреснің

символикалық бейнеленуі көрсеткіш типті константа болып табылады.

Сондықтан sum айнымалысына бөлінген жады ұяшығының адресі программа

орындалғанда өзгермейді.

Си тілінде көрсеткіш типті айнымалылар да кездеседі. Көрсеткіш типті

айнымалылар мәні қандай да бір шаманың адресі болып табылады.

Көрсеткіш ptr идентификаторымен белгіленген болсын, сонда келесідей

оператор sum адресін ptr айнымалысына меншіктейді: ptr=&sum. Бұл

жағдайда ptr sum-ға “көрсетеді” деп айтады. Яғни, ptr - айнымалы, &sum -

константа. Ptr айнымалысы басқа да бір объектіге “көрсете” алады:

ptr=&max.

Ptr мәні max айнымалысының адресі болып табылады. Адреске

бағыттау операциясын (*) немесе жанама адрестеу операциясын

қарастырайық, ptr айнымалысында max айнымалысына сілтеме болсын.

Сонда осы айнымалының мәніне қол жеткізу үшін адреске бағыттау

операциясын (*) қолдануға болады. Ptr көрсететін мәнді анықтау үшін келесі

операторды жазамыз: res=*ptr; (Соңғы екі оператор, бірге алғанда, келесіге

тең: res=max; Адресті алу және жанама адрестеу операциясын қолдану

нәтижеге тура әкелмейді екен, операцияның атындағы “жанама” деген сөз де

содан пайда болған).

(*) операциясы - осы таңбадан кейін айнымалыға көрсеткіш тұрса,

операция нәтижесі көрсетілген адресі бар ұяшықта тұрған шама болып

табылады.

Көрсеткіштерді баяндау. “Көрсеткіш” типті айнымалыны баяндағанда

ол көрсеткіш қандай типті айнымалыға сілтеп тұрғанын көрсету керек.

Өйткені әр түрлі типті айнымалы ұяшықтардың әр түрлі санын алады, және

де көрсеткіштермен байланысты қандай да бір операцияларды орындағанда

жадыда бөлінетін орынның көлемін білу керек. Көрсеткіштерді дұрыс

27

баяндау мысалдары:

іnt *іptr;

char *cptr;

float *fptr.

Көрсеткіштерді функциялар арасындағы байланысты құру үшін

қолдану. Көрсеткіштерді функциялар арасындағы байланысты құру үшін

қолдануға мысал келтірейік. Бұл мысалда көрсеткіштер айнымалылардың

мәнін ауыстыру үшін қолданылады.

Maіn()

{

іnt x=5, y=10;

prіntf(“x=%d y=%d\n”, x, y);

change(&x, &y); /*функция адрестерін беру*/

prіntf(“x=%d y=%d\n”, x, y);

}

change(u, v)

іnt *u, *v; /*u және v көрсеткіш болып табылады*/

{

іnt temp;

temp=*u; /*temp-ке u көрсетіп тұрған мән меншіктеледі*/

*u=*v;

*v=temp;

}

Берілген функция x және y айнымалыларының мәнін өзгертеді. X және

y айнымалыларының адресін функцияға беру арқылы біз оларға қол

жеткізуге мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолданып,

функция жадыдағы сәйкес ұяшықтарда орналасқан шамаларды алуға және

олардың орнын ауыстыруға мүмкіндік алды.

6-дәріс.

Тақырыбы: Жадылар кластары

Жоспар:

1. Жадылар кластары және программаны өңдеу.

Жады класы айнымалыны қолдану облысын және осы айнымалының

жадыда бар болу ұзақтығын анықтайды. Айнымалыны анықтағанда сәйкес

түйінді сөз арқылы жадының класын көрсетуге болады. Жоғарыда

қарастырған функцияларда қолданылған айнымалылар локальді болып

табылған және олар осы функцияның ішінде ғана анықталған болып

саналған, қайсібір айнымалыны бірнеше функцияларда қолдану үшін

осындай айнымалыларды сыртқы айнымалы ретінде баяндау қажет.

Функцияның сыртында анықталған айнымалылар сыртқы айнымалылар

болып табылады және олардың қолдану облысы глобальді болады. Әрбір

айнымалы анықталған типке және жадының қайсібір класына жатуы тиіс.

28

Жадының класын баяндау үшін төрт түйінді сөз қолданылады: сыртқы

класты баяндау үшін extern түйінді сөзі , автоматты класс үшін-auto сөзі,

статикалық класты баяндау үшін- static сөзі және регистрлік класты баяндау

үшін- register сөзі. Анықталған жады класына жататын айнымалылардың

қасиеттерін қарастырайық.

Автоматтық айнымалылар. Функцияның ішінде баяндалған

айнымалылар auto класына жатады деп есептелінеді, егер жады класының

басқа айқын баяндауы болмаса, онда функцияда баяндалған айнымалылар

автоматты болады. Кейде айнымалыны берілген функцияның ішінде ғана

баяндалғанын көрсету үшін auto сөзін қолданау арқылы баяндайды. Аuto

түйінді сөзі баяндалған айнымалыдағы айнымалы типінің

спецификациясының алдында көрсетіледі. Автоматты айнымалылардың

қолдану облысы локальді болады және осы айнымалы баяндалған функция

шақырылғанда көрсетілген автоматтық айнымалылар активтенеді.

Функцияның жұмысы аяқталғанда автоматтық айнымалылар жойылады, ал

осы автоматтық айнымалыларға бөлінетін жады ұяшықтары басқа

айнымалылар үшін қайтадан қолданылуы мүмкін. (Функцияның басында

баяндалған айнымалылар функцияның ішінде қатынаса алады)

Сытқы айнымалылар. Функцияның сыртында баяндалған

айнымалылар сыртқы болып табылады. Сыртқы айнымалыны қолданатын

функцияда extern түйінді сөзі арқылы баяндауға болады.

int l;

main()

{ extern int l;

scanf(“%d”,&l);

while(l!=20)

pr();

printf(“Поиск завершен \n”); }

pr()

{ extern int l;

printf(“Введите новое число \n”);

scanf(“%d”,&l); }

Егер pr() функциясында l айнымалының баяндалуы келтірілмесе, онда

l атты сыртқы айнымалы pr() функциясында келісім бойынша белгілі

болады. Егер main() және pr() функцияларында extern түйінді сөзі

функцияның ішіндегі l айнымалының баяндалуында келтірілмесе , онда l

атты жаңа автоматтық айнымалы пайда болады. Бұл функцияларда l атты

сыртқы айнымалы белгісіз болады. Егер pr() функциясында l айнымалының

баяндалуына extern сөзі жазылмаса, онда main() функциясында орналасқан

l айнымалысы ешқашан жаңа мәнді қабылдай алмайды.

Статикалық айнымалылар. Статикалық айнымалылардың қолдану

облысы локальді болады, бірақ автоматты айнымалылардан айырмашылығы:

егер осы айнымалылар баяндалған функция өзінің жұмысын аяқтаса,

статикалық айнымалылар жойылмайды. Функцияның бір шақыруынан

29

келесі шақыруына дейін компилятор статикалық айнымалылардың мәндерін

сақтайды.

main( )

{ int k;

for (k=1; k<=5; k++)

{ printf (“Интерация %d:\n”,k);

prnv( ); }

}

prnv( )

{ int av=1;

static int stv=1;

printf(“av=%d stv=%d\n”, av++, stv++); }

Айнымалының мәні баспаға шығарылғаннан соң prnv( ) функциясы әрбір

айнымалыны көбейтіп отырады. av айнымалысының бастапқы мәні әркезде

қайтадан орнатылады, ал stv статикалық айнымалысының мәні 1 бойынша

көбйгенін «есте сақтайды». Бұл инициализациядағы ерешелікті көрсетеді:

prnv( ) функциясы шақырылған сайын av қайтадан инициалданады, ал stv

prnv( ) функциясының компиляциясы кезінде ғана бір-ақ рет

инициалданады.

1-ші итерация:

av=1 stv=1

2-ші итерация:

:

av=1 stv=2

3-ші итерация:

:

av=1 stv=3

4-ші итерация:

:

av=1 stv=4

5-ші итерация:

:

av=1 stv=5

6-ші итерация:

:

av=1 stv=6

Регистрлік айнымалылар. Әдетте программада баяндалған

айнымалылар машинаның жадысында сақталады. Регистрлік айнымалылар

орталық процессордың ргистрлерінде сақталады, осындай айнымалыларды

пайдаланғанда программаның жұмысы жылдамырақ орындалады. Жалпы

жағдайда регистрлік айнымалылар автоматтық айнымалыларға ұқсас. Олар

келесі түрде құрылады:

main()

30

{ register int rv;

……….. }

Егер регистрлік айнымалының баяндалуы бар болса, онда компилятор

баяндалу талаптарын пайдалануға мүмкін бос болатын регистлердің

санымен салыстырады. Егер келтірілген талаптарды орындауға мүмкіндік

болмаса, онда айнымалы автоматтық айнымалы ретінде пайдаланылады.

Жадылар

кластары

Кілтті сөздер Бар болу

ұзақтығы

Әрекеттесу

облысы

Автоматты Auto Уақытша Локальді

Регистрлік Register Уақытша Локальді

Статикалық Static Тұрақты Локальді

Сыртқы extern Тұрақты Глобальді (барлық

файлдары)

Сыртқы

статикалық

static Тұрақты Глобальді (бір

файл)

7-дәріс.

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

Жоспар:

1. Си тіліндегі көрсеткіштер.

Көрсеткіш-айнымалыны баяндау және инициалдау. Көрсеткіштер

дегеніміз мәндері жады адрестері болатын айнымалыларды айтады.

Көрсеткіште нақты мәні бар айнымалының адресі бар болады. Айнымалы

мәнге тікелей сілтенеді, ал көрсеткіш мәнге жанама сілтенеді. Мәнге

көрсеткіш арқылы жанама сілтеме жанама адрестеу деп аталады.

Кез келген айнымалылар сияқты көрсеткіштер де қолданылмас бұрын

баяндалуы қажет.

int *countPtr, count;

операторында int * (бүті санды мәнге көрсеткіш) типті countPtr

айнымалысы баяндалған. Баяндалуда * символы countPtr-ге ғана

таратылады. Бұл символ баяндалатын айнымалы көрсеткіш екенін көрсетеді.

Кез келген типті объектілерге сілтенетін көрсеткіштерді баяндауға болады.

Көрсеткіштер баяндалу кезінде немесе меншіктеу операторының

көмегімен инициалдануы қажет. Көрсеткіш нөлмен, NULL макросымен

немесе адрестің мәнімен инициалдануы мүмкін. NULL мәнді көрсеткіш

ешнәрсеге көрсетпейді. 0 мәнді көрсеткіштің инициалдануы NULL

тұрақтылы көрсеткіштің инициалдануымен бірдей, бірақ NULL-ді қолданған

маңыздырақ. 0 мәні меншіктелгенде, ол сәйкес типті көрсеткішке түрленеді.

0 мәні көрсеткіш-айнымалыға тікелей меншіктелетін жалғыз бүтін сан болып

табылады.

Көрсеткіштерге қолданатын операциялар. Си тілі көрсеткіштерге 5

негізгі операциялар қолданатынуға болады:

1. Меншіктеу. Көрсеткішке адресті меншіктеуге болады. Массивтің атын

немесе адресті анықтайтын (&) операциясын қолданып, әдетте адресті

31

меншіктеуге болады.

2. Мәнді анықтау. Берілген адрес бойынша қайсібір ұяшықта сақталған мәнді

анықтау үшін (*) операциясы қолданылады.

3. Көрсеткіштің адресін анықтау. Көрсеткіш типті айнымалының басқа

айнымалылар сияқты адресі және мәні болады. & операциясы арқылы

көрсеткіштің адресін анықтауға болады.

4. Көрсеткіштерді арттыру. Бұл амал қарапайым қосу операциясы немесе

арттыру операциясы арқылы орындалады. Көрсеткішті арттыру арқылы

массивтің келесі элементіне өтуге болады.

5. Көрсеткіштердің айырымы. Екі көрсеткіштің айырмасын табуға болады.

Әдетте бұл операция элементтері бір-бірінің арасындағы ара қашықтықты

табу үшін бір массив элементтеріне сілтенетін көрсеткіштер үшін орынды.

Нәтиже массив өлшемін бар болдыратын айнымалының типіндей болады.

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

++, --, +, +=, -, -= және екі көрсеткіштің айырмасын анықтауға болады.

Мысал ретінде бірінші элементі жадыдағы адресі 3000-ға тең болатын int

v[10] массивін анықтаймыз. Инициалданатын адресі мәні v[0] vPtr

көрсеткіші , яғни vPtr мәні 3000-ға тең, кез келгені келесі операторлардың

бірімен

vPtr = v;

vPtr = &v[0];

Көрсеткішке бүтін санды қосқаннан немесе азайтқаннан оның мәні бұл

санға емес, көрсеткіш сілтенетін объектінің өлшеміне тең санның

көбейтіндісіне көбейеді немесе азаяды.

Байт бойынша объектінің өлшемі объекті типіне байланысты. Мысалы,

vPtr += 2;

операторы 3008 (3000+2*4) нәтижесін береді, егер бүтін сан үшін жадыда 4

байт бөлінсе. Енді vPtr v[0] элементіне сілтенеді.

Егер vPtr v[0] массив элементінің адресіне сәйкес болатын 3016 мәнге

дейін көбейген болса, онда

vPtr -= 4;

операторы vPtr массивтің басына сәйкес болатын 3000 мәнге қайтарар еді.

Көрсеткіш бірге көбейгенде немесе азайғанда инкремент (++) және

декремент (--) операцияларын қолдануға болады. Әрбір келесі операторлар

массивтің келесі элементіне сілтенетін көрсеткіштің мәнін көбейтеді:

++vPtr;

vPtr++;

Кез келген келесі операторлар массивтің алдыңғы элементіне қатынасатын

көрсеткіштің мәнін азайтады:

--vPtr;

vPtr--;

Көрсеткіш-айнымалылар бір-бірінен азайтыла алады. Мысалы, vPtr

мәні 3000-ға тең болса, ал v2Ptr 3008 адресіне ие болса, онда

x = v2Ptr - vPtr;

32

операторының орындалған нәтижесінде х айнымалысына vPtr адресінен

бастап v2Ptr адресіне дейін орналастырылған, берілген жағдайда 2 мәні

болады, массив элементтерінің саны меншіктеледі.

Екі көрсеткіште бірдей типті болса, көрсеткіш келесі көрсеткішке

меншіктеле алады. қарсы жағдайда оң жақтағы көрсеткіш типті меншіктеу

операторын сол жақтағы көрсеткіш типке келтіру операциясын қолдану

керек.

Сілтеме арқылы параметрді беру. Си тілінде сілтеме бойынша

шақыруды ұйымдастыру үшін көрсеткіштер және жанама адрестеу

операциялары қолданылады. Аргументтері өзгеріп отыратын функция

шақырылса, онда бұл жағдайда оған аргумент адресі беріледі. Әдетте бұл

мақсатқа мәні өзгеріп отыратын айнымалыға адресті алу (&) операциясы

қолданылады. Функцияға айнымалының адресі берілгенде оның мәнін

өзгерту үшін жанама адрестеу (*) операциясы қолданылуы мүмкін. Келесі

программада параметрді сілтеме бойынша беруге мысал келтірілген.

#include <stdio.h>

main()

{ int x=5, y=10;

printf(“x=%d y=%d\n”, x, y);

change(&x,&y); /* функцияның адрестерін беру */

printf(“x=%d y=%d\n”, x, y); }

change (int *u, int *v)

Соседние файлы в папке ТехПр