Точно так же, як ми можемо створювати масиви будь-яких вбудованих типів даних (int, char…), можно создавать массивы структур. Розглянемо це на прикладі зі структурою WonderfulWoman знайомої нам з первой і второй частей статьи о структурах C .
Надо внести данные о 7-ми моделях. Данные показать на экран в виде таблицы, чтобы было легче их сравнить. Схематично так:
Чтобы это реализовать – набирайте код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<iostream> #include<windows.h> // для system("cls"); using namespace std; struct Size { int breast; int waist; int hips; }; struct WonderfulWoman { char name[64]; int age; int height; int weight; Size volume; bool engKnowledge; }; void showData(const WonderfulWoman Obj[], int amount); int main() { setlocale(LC_ALL, "rus"); const int amountOfGirl = 7; WonderfulWoman Woman[amountOfGirl] = {}; for (int i = 0; i < amountOfGirl; i++) { cout << "Имя: "; cin.getline(Woman[i].name, 32); cout << "Возраст: "; cin >> Woman[i].age; cout << "Рост: "; cin >> Woman[i].height; cout << "Вес: "; cin >> Woman[i].weight; cout << "Английский (1 - да, 0 - нет): "; cin >> Woman[i].engKnowledge; cout << "Объемы (грудь, талия, бедра): "; cin >> Woman[i].volume.breast; cin >> Woman[i].volume.waist; cin >> Woman[i].volume.hips; cin.get(); // считывает из потока Enter который пользователь нажимает после ввода возраста cout << endl; } showData(Woman, amountOfGirl); return 0; } void showData(const WonderfulWoman Obj[], int amount) { system("cls"); // сработает только для windows cout << "№\t" << "Имя\t" << "Возраст\t" << "Рост\t" << "Вес\t" << "Объёмы\t\t" << "Английский" << endl; cout << "==================================================================" << endl; for (int i = 0; i < amount; i++) { cout << i + 1 << '\t' << Obj[i].name << '\t' << Obj[i].age << '\t' << Obj[i].height << '\t' << Obj[i].weight << '\t' << Obj[i].volume.breast << '/' << Obj[i].volume.waist << '/' << Obj[i].volume.hips << '\t' << Obj[i].engKnowledge << endl; } } |
Массив объектов структуры WonderfulWoman оголошений в рядку 29 и в этой же строке все элементы объектов в этом массиве инициализированы нулями. Як бачите – кроме того, что вместо встроенного типа мы написали дескриптор структуры, більше нічого нового в цьому оголошенні для нас немає. Дали имя массиву, указали количество элементов (объектов), инициализировали нулями – всё. Таким образом мы создали массив объектов структуры.
Как обратиться к элементу конкретного объекта структуры? Звичайне звернення через точку вже не підійде:
Конечно, ведь непонятно в какой именно объект из 7 надо внести данные. Так как каждый объект теперь является ячейкой массива структур, щоб звернутися до її елементів треба спочатку вказати індекс об'єкта в квадратних дужках. Только потом точку и имя элемента:
У рядках 31- 49 находится цикл for. С его помощью вносятся данные во все объекты массива структур. Зверніть увагу на строку 47. Без цього оператора cin.get(); ви зіткнетеся з помилкою, о которой компилятор вам не сообщит. Она заключается в том, що після внесення даних в елемент Woman[i].volume.hips и нажатия Enter, в потоці введення залишається символ кінця рядка. Коли цикл продовжить роботу – цей символ автоматично запишеться в Woman[i].name следующего объекта и нам сразу будет предложено ввести возраст. То есть имя внести мы не сможем. Чтобы этого избежать, надо считать из потока этот символ с помощью cin.get(); .
Результат – заполняем структуры данными :
После ввода данных всех моделей, экран очистится (за что отвечает system(“cls”);) и мы увидим таблицу:
В этой статье поговорим ещё об указателях на структуры. Если, например, надо написать функцию, в якій будуть записуватися дані в елементи структури, то необходимо передать эту структуру по указателю. Інакше зміни не будуть збережені. Рассмотрим пример со структурой Size из предыдущего листинга. Надо написать функцию, в которой пользователь вносит данные в элементы структуры.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include<iostream> using namespace std; struct Size { int breast; int waist; int hips; }; void setSizes(Size* Obj); void showSizes(const Size* Obj); int main() { setlocale(LC_ALL, "rus"); Size* Volume = new Size; cout << "Введите объемы (грудь, талия, бедра): "; setSizes(Volume); showSizes(Volume); Volume->waist = 62; Volume->hips = 92; showSizes(Volume); delete Volume; return 0; } void setSizes(Size* Obj) { cin >> Obj->breast; cin >> Obj->waist; cin >> Obj->hips; cout << endl; } void showSizes(const Size* Obj) { cout << "Объемы = "; cout << Obj->breast << '/' << Obj->waist << '/' << Obj->hips << endl; } |
Объявляя указатель на структуру, не забывайте о том, что надо выделить память под неё – рядок 18. покажчик оголошений. Давайте разберёмся теперь, как обращаться к элементам структуры, через указатель. Припустимо треба внести значення в елемент waist. використовувати . – операцію доступу по об'єкту вже не вийде:
Ошибку подсвечивает потому, что указатель должен хранить адрес, а он пытается обратиться к элементу типа int. Спробуємо разименовать покажчик на структуру:
Теперь все нормально, но это не совсем удобная запись. В С ++ є спеціальна операція доступу за вказівником (стрелочка – состоит из тире и знака больше) -> . Она как бы показывает, на какой элемент структуры ссылается указатель:
Так что просто запомните – если вы работаете с указателем на структуру, то для доступа к элементам этой структуры надо применять не точку, а стрелку. Перепишите пример, который расположен выше – так будет легче понять и запомнить.
Результат:
а чому не звертатися через посилання? так само легше
Valume->талії = 62;
можна замінити на
Valume[0].талії = 62;
Наскільки я знаю, system(“cls”) лежить в stdlib. годину. Чи я не правий?
Дякую, все зрозуміло!)
Як так можно делать Guide по реченню ні ну на справді ето както смешно роби на одном язьке а так большое дякую за урок.
а навіщо груди талія стегна
“Об'єми” ? ема ви че?
СПАСІБ Я ХОЧЕ ВЧИТИ ПРАГРАМУВАТИ ВИ ПАМАГЛІ