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

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

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

{ int temp;

temp=*u; /* u сілтейтін мәнді temp-ке меншіктеу */

*u=*v;

*v=temp; }

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

x=5 y=10

x=10 y=5

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

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

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

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

өлшемдерді шығарды және оларды орындарымен ауыстыра алды.

8-дәріс.

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

Жоспар:

1. Бір өлшемді және екі өлшемді массивтерді өңдеу барысында

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

Массивтер және көрсеткіштер. Массивтерді баяндағанда мәліметтер

типі және талап етілетін жады класы көрсетіледі. қарапайым айнымалылар

жағдайындағы қарастырылған сәйкес қасиеттер массивтерге де баяндағанда

қолданылуы мүмкін. Массивті баяндауға мысал қарастырайық:

33

int b[30]; /*30 бүтін элементтен тұратын сыртқы массив*/

float a[30]; /*30 саннан тұратын float типті автоматты массив*/

static char c[20]; /* 20 символдан тұратын статикалық массив*/

extern b[ ]; /*сыртқы массив; өлшемі жоғарыда келтірілген*/

}

Жадылар класына байланысты сыртқы, статикалық, автоматты және

регистрлік массивтер болып ерекшеленеді. Массивті инициалдауды

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

массивтерді ғана инициалдауға болады. Сыртқы және статикалық

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

әкеледі. (Сонымен, статикалық және сыртқы массивтерді нөлдеу үшін

ешқандай шара қолданбауға болады). Сыртқы массивтің инициалдануына

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

тобының студенттер саны болады:

int stud[10]={10,12,14,16,12,10,17,10,15,13};

main( )

{ int i;

extern int stud{ }; /*маңызды емес баяндалу*/

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

printf(“Группа N %d %d студентов”, i+1, stud[i]); }

stud[10] массиві жақшаларға алынған тізіммен инициалдаған, тізімнің

элементтерін үтір арқылы бөлген. Тізімдегі элементтер саны массивтің

өлшеміне сәйкес болуы қажет. Егер Тізімдегі элементтер саны массивтің

өлшемінен аз болса, онда қалған массив элементтері нөлдік мәндерге ие

болады. Егер тізімде элементтер көп болса, онда қате тура хабарланады.

Массив элементтерін инициалдауды келесі түрде де көрсетуге болады:

int stud[ ]={10,12,15,16,17,11,18,10};

main ( )

{ int i;

extern int stud [ ];

for (i=0; i<sizeof stud/(sizeof(int)); i++)

printf (“Группа N %d %d студентов.\n”,i+1,stud[i]); }

Егер массивті инициалдауға бос батырмалар лар қолданылса, онда

компилятор өзі тізімдегі элементтер санын анықтайды және ол үшін қажетті

өлшемдегі массивті белгілейді. Массивтің өлшемін анықтау үшін sizeof

операторы қолданылады. sizeof операторы объектінің немесе типтің өлшемін

байтпен анықтайды. Массив элементтерінің санын анықтау үшін массив

орын алатын жалпы байттар санын 2-ге бөледі (берілген жүйеде int типті

әрбір элементтің өлшемі 2 байтқа тең). Жалпы жағдайда сәйкес типтің sizeof

айнымалысының мәніне бөледі.

Массивтердің көрсеткіштері. Жоғарыда айтылғандай, көрсеткіштер

символдық адрестермен жұмыс істеуді ұйымдастырады. (Бұл жағдайда

массивті өңдеу тиімдірек ұйымдасады). Массивті белгілеу жасырын түрде

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

34

Мысалы, массивтің аты сондай-ақ соңғы элементті анықтайды, яғни

егер a[] массив болса, онда соңғысы a[0].

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

болғандықтан, көрсеткіш типті константа болады. Оларды көрсеткіш типті

айнымалыға (мән ретінде) меншіктеуге болады және айнымалының мәнін

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

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

{ int a[4], *pti, i;

float b[4], *ptf;

pti=a; /*массив көрсеткішіне адресті меншіктейді */

ptf=b;

for (i=0, i<4,i++)

printf(“көрсеткіш +%d: %8u %10u\n”, i, pti+i, ptf+i); }

Нәтиже:

көрсеткіш +0: 56014 56026 (массивттердің бастапқы адрестері)

көрсеткіш +1: 56016 56030 (адреске бірді қосқандағы нәтиже)

көрсеткіш +2: 56018 56034

көрсеткіш +3: 56020 56038

Адрестеудің бірлігі байт болып табылады, бірақ int типі 2 байтты, ал float

типі 4 байтты қолданады.

«Көрсеткішке бірді қосу»-компилятор бірді жадыға қосады. Массив үшін

бұл келесі байт емес, келесі элементтің адресіне көшу болып табылады.

Сондықтан да көрсеткіш сілтенетін объектінің типі арнайы ескертіледі.

Келесі теңдікті қарастырайық:

a+2==&a[2]; /*екеуі де бірдей адрес*/

*(a+2)==a[2]; /*екеуі де бірдей мән*/

Бұл ара қатынастар массивтер мен көрсеткіштердің арасындағы

байланысты көрсетеді, яғни көрсеткішті массивтің жеке элементін, сондай-ақ

оның мәнін анықтау үшін қолдануға болады.

Нақтылы біз екі әртүрлі белгілеулерді бірдей қолданамыз. Шыныменде,

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

көрсеткіштер әдістері маңыздырақ.

Көрсеткіштерді қолданып, массивтермен жұмыс істеу. Массивтерді

қолданатын функцияны қарастырайық, содан кейін осы функцияны

көрсеткіштерді пайдаланып, жазу керек.

int func(a, l)

int a[ ], l;

{ int i, sum;

for (i=0, sum=0; i<l; i++)

if (a[i]%2!=0)

sum+=a[i];

return (sum); }

for (i=0,sum=0;i<l; i++)

sum+=a[i];

35

return ((int) (sum/l)); }

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

болады:

func(x, size);

Функцияны көрсеткіштерді қолданып, қайтадан жазамыз. Ра-ны int

типіне сілтенетін көрсеткіш деп баяндаймыз. Содан соң a[i] массив

элементтерін сәйкесінше *(pa+i) мәніне ауыстырамыз.

int func(pa, l)

int *pa, l;

{ int i, sum;

for (i=0, sum=0; i<l; i++)

sum+=*(pa+i);

return ((int) (sum/l));

}

for (i=0, sum=0; i<l; i++)

if (*(pa+i)%2!=0)

sum+=*(pa+i);

return (sum); }

Функцияны шақыру сол түрінде қалады:

func(x, size)/

Массив аты көрсеткіш болғандықтан, келесі баяндалу операторлары

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

int pa[ ]; и int *pa;

Программада бұлардың кез келгенін қолдануға болады, әйтсе де біз

екінші түрін *(pa+i)-ды қолданамыз.

Екі өлшемді массивтермен жұмыс істегенде көрсеткіштерді қолдану.

a[3][2] массивін қарастырамыз.

int a[3][2]; /* 3 жолдан және 2 бағаннан тұратын int типті

массив */

int *pri; /* бүтін типке сілтейді */

pri=a; /* көрсеткіш a[0][0] элементіне сілтейді */

a==&a[0][0]; /* pri+1 көрсеткіші a[0][1] элементке сілтейді

*/

Бұл массивті қарастырғанда келесі теңдеулер орынды:

pri==&a[0][0]; /* 1-ші жол, 1-ші баған */

pri+1==&a[0][1]; /* 1-ші жол, 2-ші баған */

pri+2==&a[1][0]; /* 2-ші жол, 1-ші баған */

pri+3==&a[1][1]; /* 2-ші жол, 2-ші баған */

pri+4==&a[2][0]; /* 3-ші жол, 1 -ші баған */

pri+5==&a[2][1]; /* 3-ші жол, 2-ші баған */

Екі өлшемді массив бір өлшемді массивтерден құрылған массив ретінде

қарастырылуы мүмкін. Яғни, берілген екі өлшемді массив 3 жолдан тұрады,

ал әрбір жол 2 элементтен тұратын массив болып табылады. Бірінші жолдың

аты a[0], екінші жолдың аты a[1 ], үшінші жолдың аты a[2]. Массивтің аты

36

берілген массивтің көрсеткіші болып табылады, яғни ол массивтің 1-ші

элементіне сілтейді. Сонымен келесі теңдеулер орынды:

a[ 0]==&a[0][0]

a[ 1]==&a[1][0]

a[ 2]==&a[2][0].

Бұл қасиет бір өлшемді массивке арналған функцияны екі өлшемді

массивпен жұмыс істеу үшін мүмкіндік береді.

main( )

{ static int b[3][4]={{6,4,8,10},

{10,20,30,40},

{20,40,60,80}};

int i;

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

printf(“Среднее значение строки %d равно %d\n”, i, func(b[i], 4));

/*b[i] - 4 элементтен тұратын бірөлшемді массив*/

}

/*Бірөлшемді массивтен орта мәнді табу*/

int func(x, n)

int x[ ],n;

{ int l;

float s;

for (l=0, s=0; l<n; l++)

s+=x[l];

return ((int) (s/n));

Бөлшектеп емес, барлық циклдарымен бірге екі өлшемді массивпен жұмыс

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

баяндалуын дұрыс жазу қажет.

main() функциясы келесі түрге ие болады:

main()

{ static int b[3][4]={{6,4,8,10},

{10,20,30,40},

{20,40,60,80}};

sr(b); }

sr(b) функцияның басы келтірілген:

sr(b)

int b[ ][4];

int mult (int b[ ][4], int m)

{ int i, j; p=1;

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

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

if (b[i][j]!=0) p=p*b[i][j]; }

Тағы бір әдісті қарастырамыз:

b[5,4] массиві берілген. Келесі баяндалуды келтіруге болады.:

37

mult (int a[ ], int size)

Функцияға қатынасқанда келесі түрді аламыз:

mult (b, 5*4); (b 20 элементтен тұратын бірөлшемді массив ретінде

қарастырылады).

9-дәріс.

Тақырыбы: Жолдар.

Жоспар:

1. Символдық жолдар және жолдарға қолданылатын функциялар.

Символдық қатарларды баяндау. Символдық қатарларды бірнеше

әдістер арқылы анықтауға болады. Келесі әдістер негізгі әдістерге жатады:

- қатарлық константаларды қолдану;

- символдық қатарлардан тұратын массивтерді және char типті массивтерді

қолдану.

қатарлық константалар тырнақшаларға алынады. Тырнақшаларға алынған

символдар және қатарлардың ең соңғы ‘/0’ символы жадының тізбектелген

ұяшықтарында жазылады. Компилятор қатарды жадыға орналастырғанда

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

қатарлық константаларды #define директивасының көмегімен анықтауға

болады. Егер қатарда тырнақша символын қолдану керек болса, онда бұл

символдың алдына кері бөлшек сызығы жазылады. Мысалы:

printf (“\” Сведения о сессии”\n”);

қатарлық константа осы жол жазылған жадыдағы орынға сілтейтін

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

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

баяндағанда қатарлық константа арқылы инициалдауға болады. (Статикалық

және сыртқы массивтер қолданылады).

char c[ ]=”Определение максимального балла”; (сыртқы массив)

Әдеттегі массивтерді қолданған жағдайдағы сияқты бұл массивтің аты

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

c==&c[0]; *c==’0’, және *(c+1)==c[1]==’n’;

қатарларды анықтау үшін көрсеткіштерді қолданамыз. Мысалы:

char *c1=”\n ввод баллов”;

Осы баяндалуға келесі баяндалу эквивалентті:

static char c1[ ]=”\n ввод баллов”;

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

көрсетеді. Жадының қажетті өлшемін айқын көрсетуге де болады. Сыртқы

баяндауда келесі қатарды мына түрде жазуға болады:

char c[35]=”определение максимального балла”; вместо

char c[ ]=”определение максимального балла”;

Элементтердің саны қатардың ұзындығынан бір символға артық болуы

керек (нөль-символын есептегенде).Басқа статикалық немесе сыртқы

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

нөлмен инициалданады (символдық түрде бұл нөль санының символыны

38

емес, нөль-символы болып табылады).

Символдық қатарлардан тұратын массивтер. Әрбір жолы символдық

массив болып табылатын символдық қатарлардан тұратын массивтерді

қарастырайық. Статикалық массивтің баяндалуын келесі түрде келтірейік:

static char *m[4]={“регистр”,”ячейка”,”указатель”,”элемент”};

*m[4] массиві символдық қатарларға сілтейтін 4 көрсеткіштен тұрады.

Сонымен, символдық қатарлар массивтер болып табылатын болса, онда осы

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

көрсеткіш болып m[0]-ші табылады. 2-ші жолға сілтейтін 2-ші көрсеткіш

m[1]. Сонымен, әрбір көрсеткіш сәйкес қатардың ең бірінші символына

сілтейді.

*m[0]==’р’; *m[1]==’я’; *m[2]==’у’; *m[3]==’э’;

инициалдау массивтерге арналған ережелер бойынша орындалады.

Тырнақшаларға жазылатын текстер жақшалы жазбаларға эквивалентті:

{{…},{…},…,{…}};

қатарлардан құрылған массивтерді баяндағанда символдық қатарлардың

өлшемін көрсетуге де болады және бұл баяндалуда қатарлардың ұзындығы

бірдей болады:

static char m[4][10];

статикалық (сыртқы) массивтің қатарларының қолданылмаған (артық)

элементтері ‘/0’ (нөль-символымен) символымен инициалданады.

Артық элементтер (яғни, жады тиімді жұмсалу үшін) болмас үшін

келесі баяндалуларды қолдануға болады:

static char *[4];

Мұнда әрбір қатардың ұзындығы массивтің сәйкес қатарын

инициалдайтын нақтылы қатармен анықталады.

Символдарды өңдеу библиотекасы. Символдарды өңдеу

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

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

аргумент ретінде int типін немесе EOF (файл соңы) индикаторын ұсынатын

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

функцияларымен жұмыс істеу үшін <ctype.h> тақырыптық файлды қосамыз.

Кестеде символдарды өңдеу библиотекасының функциялар тізімі келтірілген.

Кесте-Символдарды өңдеу библиотекасының функциялары

Прототип Функциялардың баяндалуы

int isdijit (int

c)

Егер с сан болып табылса , онда True мәнін қайтарады және

басқа жағдайларда 0 (false)

int isalpha (int

c)

Егер с әріп болып табылса, онда True мәнін қайтарады

және басқа жағдайларда 0

int isalnum

(int c)

Егер с сан немесе әріп болып табылса, онда True мәнін

қайтарады, және басқа жағдайларда 0.

int isxdijit (int

c)

Егер с он алтылық форматтағы символдардың бірі болса,

true мәнін қайтарады және басқа жағдайларда 0.

int islower (int Егер с төмеңгі регистрдің әрпі болса, true мәнін қайтарады

39

c) және басқа жағдайларда 0.

int isupper (int

c)

Егер с жоғарғы регистрдің әрпі болса, true мәнін қайтарады

және басқа жағдайларда 0.

int tolower

(int c)

Егер с жоғарғы регистрдің әрпі болса,онда tolower с-ны

төмеңгі регистрдің әрпі ретінде қайтарады. Басқа

жағдайларда tolower аргументті өзгеріссіз қайтарады.

int toupper

(int c)

Егер с төмеңгі регистрдің әрпі болса,онда toupper с-ны

жоғарғы регистрдің әрпі ретінде қайтарады. Басқа

жағдайларда toupper аргументті өзгеріссіз қайтарады.

int isspace (int

c)

Егер с бос орын (пробел) символы (' ') , жаңа бет (‘\f’), жаңа

жол (‘\n’), каретканы қайтару (‘\r’), горизонтальді табуляция

(‘\t’) или вертикальді табуляция (‘\v’) болып табылса, онда

true мәнін қайтарады және басқа жағдайларда 0.

int iscntrl (int

c)

Егер с басқарушы символ болса, онда true мәнін қайтарады

және басқа жағдайларда 0.

int ispunct (int

c)

Егер с баспаға шығарылғандағы бейнеленетін символ

болып тпбылса, true мәнін қайтарады, бірақ бос орын

символдаына, сандарға немесе әріптерге қатынасы жоқ

және басқа жағдайларда 0.

int isprint (int

c)

Егер с баспаға шығарылғандағы бейнеленетін символ

болып тпбылса, true мәнін қайтарады, мұнда (' ') бос орын

символын қосқанда және басқа жағдайларда 0.

int isgraph (int

c)

Егер с баспаға шығарылғандағы бейнеленетін символ

болып тпбылса, true мәнін қайтарады, мұнда (' ') бос орын

символын қосқпағанда және басқа жағдайларда 0.

Қатарларды түрлендіру функциялары. қатарларды түрлендіру

функцияларымен жұмыс істеу үшін <stdlib..h> тақырыптық файлды қосу

қажет. Бұл функциялар сандар қатарларын бүтін мәндерге және жылжымалы

нүктелі мәндерге түрлендіреді. Кестеде қатарларды түрлендіру функциялар

тізімі келтірілген.

Кесте-қатарларды түрлендіру функциялары

Прототип Функциялардың баяндалуы

double atof (const char *nPtr) nPtr қатарын double типіне

түрлендіреді.

int atoi (const char *nPtr) nPtr қатарын int типіне

түрлендіреді.

long atol (const char *nPtr) nPtr қатарын long int типіне

түрлендіреді.

double strtod (const char *nPtr, char

**endPtr)

nPtr қатарын double типіне

түрлендіреді.

long strtol (const char *nPtr, char

**endPtr, int base)

nPtr қатарын long типіне

түрлендіреді.

unsigned long strtoul (const char *nPtr, nPtr қатарын unsigned long типіне

40

char **endPtr, int base) түрлендіреді.

Стандартты енгізу/шығару библиотекасының функциялары.

Стандартты енгізу/шығару библиотекасы <stdlib.h> символдық және

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

тұрады. Кестеде стандартты енгізу/шығару библиотекасынан символдар мен

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

Кесте- Стандартты енгізу/шығару библиотекасының символдық мен

қатарларлық функциялары

Прототип Функциялардың баяндалуы

int getchar (void) Стандартты енгізу құралынан келесі

символды енгізеді және бүтін формат

түрінде қайтарады.

char *gets (char *s) S массивіне стандартты енгізу құралынан

символды жаңа жолдың символын немесе

файл соңының индикаторын

кездестіргенше егізеді. Осыдан кейін

массивке шектелетін NULL символы

қосылады.

int putchar (int c) С-да сақталынатын символды баспаға

шығару.

int puts (const char *s) Келесі символы жаңа қатар болатын s

қатарын баспаға шығару.

int sprintf (char *s, const char

*format, …)

Нәтиже экранда бейнеленбей s массивінде

сақталалуымен ерекшеленетін printf

функциясына эквивалентті.

int sscanf (char *s, const char

*format, …)

Енгізу клавиатура арқылы емес s массиві

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

scanf функциясына эквивалентті.

10-дәріс.

Тақырыбы: Жолдар.

Жоспар:

1. Жолдарға қолданылатын опреациялардың функциялары.

Қатарларды өңдеу библиотекасындағы қатарларға қолданылатын

функциялар. қатарларды өңдеу библиотекасы қатарларды анықтау және

қатарларды лексемаларға бөлу үшін, символдарды және басқа қатарларды

іздеу үшін, қатарларды салыстыру үшін, қатарлық мәліметтерге

қолданылатын операцияларды орындау үшін көптеген пайдалы

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

үшін <string.h> тақырыптық файлын қосу қажет. Кестеде бұл

функциялардың тізімі келтірілген.

Кесте-қатарларды өңдеу библиотекасындағы функциялар

Прототип Функциялардың баяндалуы

41

char *strcpy(char *s1, const char

*s2);

s2 қатарын s1 қатарына көшіреді. s1 мәнін

қайтарады. s2 қатарының құрамын

сыйдыру үшін s1 қатарының жеткілікті

өлшемін бар деп жорамалдайды.

char *strncpy(char *s1, const

char *s2, size_t n);

s1 қатарына s2 қатарынан n-нан көп емес

символдарды көшіреді. s1 мәнін

қайтарады..

char *strcat(char *s1, const char

*s2);

s1 қатарын s2 қатарымен біріктіреді. s1

қатарының NULL символын s2 қатарының

бірінші символына көшіреді. s1 мәнін

қайтарады..

char *strncat(char *s1, const char

*s2, size_t n);

s1 қатарымен s2 қатарының n-нан көп емес

символдардын біріктіреді. s1 қатарының

NULL символын s2 қатарының бірінші

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

Қатарларды өңдеу библиотекасындағы қатарларды салыстыру

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

қысқаша баяндалуы келтірілген.

Кесте-Салыстыру функциялары

Прототип Функциялардың баяндалуы

int strcmp(const char *sl, const

char *s2);

sl қатарын s2 қатарымен салыстырады.

Функция 0-ді, 0-ден кіші немесе нөлден үлкен

мәнді қайтарады, егер sl сәйкесінше s2-ге

тең, кіші немесе үлкен болса. .

int stricmp(const char *sl,

const char *s2);

Төмеңгі және жоғарғы регистрлердегі

символдардың арасындағы ерекшеліктерді

ескермей-ақ s1 қатарын s2 қатарымен

салыстырады. Функция 0-ді, 0-ден кіші немесе

нөлден үлкен мәнді қайтарады, егер sl

сәйкесінше s2-ге тең, кіші немесе үлкен

болса.

int strncmp(const char *sl,

const char *s2, size_t n);

s1 қатарының n-ге дейіңгі символдарын s2

қатарымен салыстырады. Функция 0-ді, 0-ден

кіші немесе нөлден үлкен мәнді қайтарады,

егер sl сәйкесінше s2-ге тең, кіші немесе

үлкен болса.

int strnicmp(const char *sl,

const char *s2, size_t n);

Төмеңгі және жоғарғы регистрлердегі

символдардың арасындағы ерекшеліктерді

ескермей-ақ s1 қатарының n-ге дейіңгі

символдарын s2 қатарымен салыстырады.

Функция 0-ді, 0-ден кіші немесе нөлден үлкен

мәнді қайтарады, егер sl сәйкесінше s2-ге

тең, кіші немесе үлкен болса.

Қатарларды өңдеу библиотекасындағы іздеу функциялары. Кестеде

42

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

келтірілген.

Кесте-Іздеу функциялары

Прототип Функциялардың баяндалуы

char *strchr(const char *s, int

c)

S қатарындағы с символдың біріншіші

кірісіндегі позициясын анықтайды. Егер с

табылса, онда функция s қатардағы с -ке

көрсеткішті қайтарады. қарсы жағдайда

NULL мәнді көрсеткіш қайтарылады.

char *strrchr(const char *s, int

c)

S қатарындағы с символдың соңғы кірісіндегі

позициясын анықтайды. Егер с табылса, онда

функция s қатардағы с -ке көрсеткішті

қайтарады. қарсы жағдайда NULL мәнді

көрсеткіш қайтарылады.

size_t strspn(const char *s1,

const char *s2)

S2 қатарына кіретін символдардан тұратын s1

қатарының бастапқы сегментінің ұзындығын

қайтарады және анықтайды.

size_t strcspn(const char *s1,

const char *s2)

S2 қатарына кірмейтін символдардан тұратын

s1 қатарының бастапқы сегментінің

ұзындығын қайтарады және анықтайды.

char *strpbrk(const char *s1,

const char *s2)

S1 қатарынан s2 қатарының кез келгегн

симводарының ішінен бірінші кірісіндегі

позициясын табады. Егер s2 қатарынан

символ табылса, онда функция көрсеткішті

s1 қатардағы сол символға қайтарады. қарсы

жағдайда NULL мәнді көрсеткіш

қайтарылады.

char *strstr(const char *s1,

const char *s2)

S2 қатардың ішіндегі қатардың бірінші

кірісіндегі позициясын табады. Егер қатар

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

көрсеткішті s1 қатардағы қатар ішіндегі

қатарды қайтарады. қарсы жағдайда NULL

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

char *strtok(char *s1, const

char *s2)

Функцияның тізбектелген шақырылуы s1

қатарының s2 қатарындағы символдарға

бөлінген лексемаларға (текстік қатардағы

сөздер сияқты логикалық бөлімдер)

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

шақырылғанда аргумент ретінде s1 қатарын

алады, ал келесі шақырылуларда сол қатарды

ұсақтауды жалғастыру үшін бірінші аргумент

ретінде NULL беріледі. Әрбір шақырылуда

көрсеткіш s1 қатарының ағынды лексемасына

қайтарылады. Егер функция кезекті

43

шақырылуында қатарда лексема қалмағанын

анықтаса, онда NULL қайтарылады.

Қатарларды өңдеу библиотекасындағы басқа функциялары

Кестеде қатарды өңдеу библиотекасындағы басқа функиялардың

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

Кесте - қатарларды өңдеу библиотекасындағы басқа функциялары

Прототип Функциялардың баяндалуы

int strlen (const char

*s)

S қатарының ұзындығын анықтайды. NULL символына

шек қоятын символдарын табады.

char *strlwr (char

*s)

s қатарындағы жоғарғы регистр символдарын төмеңгі

регистр символдарына түрлендіреді. Басқа символдарға

тимейді. Функция көрсеткішті s қатарына қайтарады.

char *strupr(char

*s)

s қатарындағы төмеңгі регистр символдарын жоғарғы

регистр символдарына түрлендіреді. Басқа символдарға

тимейді. Функция көрсеткішті s қатарына қайтарады..

сhar *strrev(char

*s)

S қатарындағы символдардың тәртібіне қатынайды және

көрсеткішті s қатарына қайтарады.

Төменде қатарлармен жұмыс істейтін

функцияларды келтірілген Мысал 1:

main( ) { static char l[ }=”Сведения о

результатах сессии”; puts(l); flen(l, 8);

puts(l); } flen (stroke, size) char *stroke; int

size; { if (strlen(stroka)>size)

*(stroke+size)=’\0’; } Результат: Сведения

о результатах сессии Сведения

қолданатын программалардың

мысалдары Мысал 3: #include

<stdio.h> # define NAME

“Ритчи” main() { char a[20];

puts (“Назовите автора языка

Си”); gets(a); while

(strcmp(a,NAME)!=0) {

puts(“Ввод следующего

варианта”); gets (a); }

puts (“Ответ принят”); }

Мысал 2: #include <stdio.h> main() { static

char name[80]; static char stud[ ]= “является

студентом факультета ИиВТ”; puts(“Ведите

ваше имя.”); gets(name); strcat (name,

stud); puts (name); puts (stud); }

Результат: Введите ваше имя Марат Марат

является студентом факультета ИиВТ

является студентом факультета ИиВТ

#include <stdio.h> #define

STROKA “С Новым годом!”

main() { static char

*ptr=STROKA; static char

res[25]; puts (ptr); puts (res);

strcpy (res,ptr); puts (ptr); puts

(res); } Результат: С Новым

годом! С Новым годом! С

Новым годом!

11-дәріс.

Тақырыбы: Мәліметтер және динамикалық құрылымдар.

Жоспар:

1. Си тіліндегі мәліметтер құрлымы.

Структуралық шаблонды анықтау. Әртүрлі типті мәліметтерді

баяндау үшін және жаңа типтерді ұйымдастыру үшін структура деген тип

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

44

баяндағанда алдымен структуралық шаблонды келесі түрде баяндауға

болады:

struct <rname>

{

<type> <fname>;

…………

<type> <fname>;

}

мұндағы rname - структура типінің аты, структура типінің атын

көрсетпесе де болады, } жақшада структура элементтерінің тізбегі

келтірілген және әрбір элементтің типі көрсетілген. Структуралық шаблон

анықталғаннан кейін структуралық айнымалының анықталуы келесі түрде

жазылады:

struct <rname> <vnames>;

vnames - структуралық айнымалының аты.

Мысал:

struct sved

{

char fam[25];

char adr[20];

int gr;

};

struct sved inf;

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

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

шаблон осы функцияның ішінде ғана пайдаланылуы мүмкін. Егер

структуралық шаблон функцияның сыртында орналасқан болса, онда бұл

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

функцияларында қолданылуы мүмкін. Мысалы, басқа бір функцияның

ішінде inf1 атты басқа структуралық айнымалыны келесі түрде анықтауға

болады: inf1 в виде struct sved inf1;

Берілген баяндалудан тұратын функция шаблон анықталғаннан кейін

орналасады деп жорамалданады. Егер структураны баяндағанда оның

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

пайдаланылатын структуралық айнымалылар программаның басқа бір

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

түрде көрсету қажет. Структуралық айнымалының анықталуын пайдаланып,

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

(структураның әрбір элементінің баяндалуын ескереді). Мәліметтер

структураларын баяндағанда структуралық шаблон анықтауын және

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

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

атын жазбаса да болады. Мысал,

struct

45

{

char fam[25];

char adr[20];

int gr;

} inf;

Егер структуралық шаблон бір реттен көп қолданылса, онда әдетте

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

Структураларда инициалдау. Сыртқы және статикалық структуралық

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

типке жататыны шаблонның анықталған орнына байланысты емес, осы

айнымалы программаның қандай жерінде анықталғанына байланысты. Келесі

бар деп жорамалдайық:

static struct sved inf;

Бұл жағдайда статикалық жады қолданылады және структураны келесі

түрде инициалдауға болады:

static struct sved inf= {“Попов”,

“Сатпаева, 20”,

1978}

Пример: (доступ к элементам структуры)

#include <stdio.h>

main()

{ struct

{ char fam[25];

char adr[20];

int gr;

} inf;

printf(“Введите фамилии : \n”);

gets(inf.fam); /*доступ к элементу fam*/

printf(“Введите адрес: \n”);

gets(inf.adr);

printf(“Введите год рождения : \n”);

scanf(“%d”,&inf.gr);

printf (“%s, %s , %d\n”, inf.fam, inf.adr, inf.gr); }

Структуралардан құрылған массивтер. Есептерді шығару барысында

структуралардан құрылған массивтер пайдаланылады, яғни структуралық

айнымалы массивтің элементі болып табылады. Структуралардан құрылған

массивтер келесі түрде баяндалады:

struct sved inf[10];

sved типті структура inf[10] массивтің элементі болып табылады.

Структуралардан құрылған массивтің элементтерін анықтағанда бөлек

алынған структура жағдайындағы сиықты структураның аты структура

элементінің атынан нүкте “.” (элементті алу операциясы) символы арқылы

бөлектенеді. Мысалы :

inf[0].fam - первый элемент массива

46

inf[1].fam - второй элемент массива

…………………..

inf[9].fam - 10-й элемент массива

(inf[1] - имя структурной переменной)

#include <stdio.h>

#define num 10

struct cved

{ char fam[25];

char adr[20];

int gr; };

main()

{ struct sved inf[num];

int l=0, i;

while (l<num)

{ printf(“Ввод фамилии \n”);

gets (inf[l].fam);

printf(“Адрес: \n”);

gets (inf[l].adr);

printf(“год рождения \n”);

scanf(“%d”, &inf[l].gr);

l++; }

printf(“Сведения о студентах группы \n”);

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

printf(“%s, %s, %d\n”, inf[i].fam, inf[i].adr, inf[i].gr); }

Рассмотрим вложенные структуры

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