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

На сортировку / 2 / 1 курс / 5.Алгоритм и языки программ / С ДӘРІСТЕР ЖИНАҒЫ / 11-дәріс.Мәліметтер және динамикалық құрылымдар

..docx
Скачиваний:
30
Добавлен:
20.02.2017
Размер:
20.73 Кб
Скачать

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); }

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

#include <stdio.h>

#define num 5

#define len 15

#define is “Наука”

struct isd

{ char namisd[len];

int godisd; }

struct knig

{ char author[len];

char title[len]

struct isd isdat; }

main()

{ static struct knig masking[num]={{“Петров В.”,

“Информатика”

{“Наука”, 1998}},

{“Савельев В.”,

“Физика”,

{“Наука”,1985}}};

int i;

47

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

if (masking[i].isdat.nanidd==IS)

printf (“%s %s \n”, masking[i].author, masking[i].title); }

Рассмотрим использование указателя на структуры. Ранее было

отмечено, что структуры не могут использоваться в качестве аргумента

функции, а использование указателей на структуры дает возможность

осуществить доступ к элементам структуры при помощи указателей.

Описание указателя приводится ниже ( рассматривается тот же массив

структур):

Struct knig *ptrst;

Создан указатель ptrst для ссылок на любые структуры типа knig.

Имеют место:

Ptrst==&masking[0];

*ptrst==masking[0];

ptrst->author - это эквивалентно masking[0].author.

Если ptrst является указателем на структуру masking[0], то следующие

обозначения эквивалентны

Masking[0].author==(*ptrst).author==ptrst->author

Ptrst+1 ссылается на masking[1] .Необходимо отметить , что в данном

примере 1 к указателю ptrst прибавляет 47 к адресу, потому, что каждая

структура типа ААА занимает 47 байт.

Рассмотрим пример, в котором адрес структуры используется в качестве

аргумента функции:

struct ZP

{ char *name;

char *MEC;

float NACH;

float PREM; } SOTR={ “Зуев П”,”январь” 1020.45, 250.15 };

main()

{ float s, fadd();

printf (“Зуеву П. за январь всего начислено %6.2а тенге \n“, fadd(&sotr));

}

float fadd (ptrst)

struct zp *ptrst;

{ float s=0;

s=ptrst->nach+ptrst->prem;

return (s); }

Заметим, что применяется операция & для получения адреса структуры.

В отличие от имени массива имя структуры само по себе не является

синонимом своего адреса. Рассмотрим массив структур. Имя массива

является синонимом его адреса, потому его можно передавать функции.

Struct zp

{ char *name;

char *MEC;

48

float NACH;

float PREM; } sort[6]={ {“Зуев П.”,”январь”, 8020.45, 1250.15},

……………

{“Потапов М.”,”январь”,6000.50, 1500.20} };

main()

{ float ITS, fadd ( );

printf (“Группе сотрудников за январь всего начислено %10.2f тенге

\n”, fadd(sort)); }

float fadd (ptrst)

struct zp *ptrst;

{ float ITS;

int i;

for (i=0, ITS=0; i<6; i++; ptrst++)

ITS+=ptrst ->nach+ptrst->prem;

Return (ITS); }