русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Звертання до елементів структур


Дата додавання: 2014-04-22; переглядів: 2821.


В мові С++ існує дві операції для звертання до елементів (полів) структур: операція «крапка», яка застосовується при звертанні до полів структур, заданих через зміну; операція «стрілка», яку позначають парою знаків -> (мінус і більше), і використовують для звертання до поля структури через вказівник на цю структуру. Обидві операції мають найвищий пріоритет і асоціативність зліва направо.

Виділення поля структури, заданої через змінну, виконує така синтаксична конструкція:

 

ім’я_структурної_змінної.ім’я_поля

 

Цей вираз називають уточненим іменем елемента структури. Його значенням є значення змінної, яка формує відповідне поле структури. Поля структур повністю зберігають властивості даних свого типу, над ними можна виконувати всі операції, що допускаються для цього типу.

Знайдемо відстань між двома точками, заданими за допомогою структур.

 

#include <iostream>

using namespace std;

int main() {

struct point {

double x;

double y;

};

struct point p1, p2 = { 1.0, 2.0 };

p1.x = 2.0;

p1.y = 3.0;

double d = sqrt(pow(p1.x - p2.x, 2.) + pow(p1.y - p2.y, 2.));

cout << d << endl;

}

 

Якщо полем структури є масив, або виконується звертання до масиву структур, то операції крапка і квадратні дужки, які мають однаковий пріоритет, виконуються зліва направо.

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

int rating;

};

struct student s = { "James Bond", 12, 75 };

cout << s.name << endl;

cout << s.name[ 6 ] << endl;

cout << * ( s.name + 6 ) << endl;

}

 

Тут полем структури є масив символів name. Вираз s.name[ 6 ] обчислюється зліва направо, тобто спочатку виконується операція крапка, її результатом буде значення поля char name[ 40 ], тобто адреса першого елементу масиву. Після цього над отриманою адресою виконується операція «квадратні дужки», тобто індексне звертання до елементу масиву.

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

int rating;

};

struct student as[ 3 ] = {

{ "James Bond", 12, 75 },

{ "Bill Gates", 13, 98 },

{ "Steve Jobs", 12, 100 }

};

cout << as[ 2 ].rating << endl;

}

 

В цьому прикладі є масив структур as з трьох елементів. Вираз as[ 2 ].rating обчислюється зліва направо, тобто спочатку виконується операція «квадратні дужки», результатом якої є адреса третьої структури, після цього виконується операція крапка – звертання до відповідного поля цієї структури (поля rating).

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

int rating;

};

struct student s = { "James Bond", 12, 75 };

cout << s.name << endl;

cout << s.name[ 6 ] << endl;

cout << * ( s.name + 6 ) << endl;

struct student as[ 3 ] = {

{ "James Bond", 12, 75 },

{ "Bill Gates", 13, 98 },

{ "Steve Jobs", 12, 100 }

};

cout << as[ 2 ].name[ 6 ] << endl;

}

 

Тут при обчисленні виразу as[ 2 ].name[ 6 ] операції теж виконуються зліва направо – знаходимо адресу третьої структури, звертаємося до поля name – отримуємо адресу початку масиву, звертаємося до сьомого елементу масиву name.

Операція «стрілка» спрощує звертання до полів структур, які виконуються через адреси цих структур або вказівники на структури. Синтаксис цих операцій такий:

 

вказівник_на_структуру -> ім’я_поля

 

Наприклад, звернення до поля rating третього елемента масиву as з попереднього прикладу можна зробити таким чином:

 

cout << ( as + 2 )->rating << endl;

 

А звертання до сьомого елементу масиву name третього елемента масиву as таким:

 

cout << *(( as + 2 )->name + 6) << endl;

 

Вказівникову форму звертання до елементів структур зручно використовувати, коли для роботи з масивами структур використовують зовнішні вказівники, базовий тип яких збігається з типом структур – елементів масиву. Знайдемо середній бал студентів, інформація про яких зберігається в масиві структур.

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

int rating;

};

const int NS = 5;

struct student as[ NS ] = {

{ "James Bond", 12, 80 },

{ "Bill Gates", 13, 92 },

{ "Paul Allen", 14, 93 },

{ "Steve Jobs", 15, 95 },

{ "Stephen Wozniak", 16, 96 }

};

struct student * ps, *plast;

int avg;

for ( ps=as, plast = &as[ NS-1 ], avg=0; ps <= plast; ps++ ) {

cout << ps->name << "\t";

cout << ps->number << "\t";

cout << ps->rating << "\n";

avg += ps->rating;

}

avg /= NS;

cout << avg << endl;

}

 

Мова С++ не допускає, щоб вкладена структура мала той самий тип, що й структура, елементом якої вона є. Але поле структури може бути вказівником з довільним базовим типом, в тому числі і вказівником на структуру. Тому дозволено, щоб поле структури було вказівником на структуру свого типу. Це використовують при створенні динамічних структур даних, наприклад, динамічних списків:

 

#include <iostream>

using namespace std;

int main() {

struct student {

int id;

int rating;

student * next;

} * first = NULL, * p;

// Створюємо першого студента у списку

first = new student;

first->id = 1;

first->rating = 90;

first->next = NULL;

// Створюємо наступного студента у списку

p = new student;

p->id = 2;

p->rating = 92;

p->next = first;

first = p;

// Створюємо наступного студента у списку

p = new student;

p->id = 3;

p->rating = 95;

p->next = first;

first = p;

// виводимо список студентів на екран

p = first;

while ( p ) {

cout << p->id << "\t";

cout << p->rating << "\n";

p = p->next;

}

// Звільняємо пам’ять

do {

p = first;

first = first->next;

cout << "deleting " << p->id << endl;

delete p;

} while ( first );

}


<== попередня лекція | наступна лекція ==>
Структури і об’єднання. Оголошення і ініціалізація структур | Перейменування типів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн