Со структурами C мы предварительно познакомились в предыдущей статье. Продолжаем знакомство.
Определение структури бажано розташовувати за межами main() функции. Тогда работать с ней смогут и другие определенные программистом функции, как показано в нашем примере из первой части. Такое объявление называют внешним.
Инициализация. Елементи структури можна форматувати відразу при оголошенні об'єкту.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include<iostream> using namespace std; struct Size { int breast; int waist; int hips; }; int main() { Size volume1 { 90, 60, 90 }; return 0; } |
Объявляем объект volume1 в строке 13 и проводим его инициализацию. Схоже на ініціалізацію елементів масиву – в фигурных скобках и через запятую. Эти данные запишутся в соответствующие элементы структуры по порядку. В каком порядке определены элементы в структуре – в таком и произойдет запись значений. Операцію одно можна не використовувати (согласно C 11).
Рассмотрим такую инициализацию на примере с более сложной структурой WonderfulWoman:
Об'єкт цієї структури можна форматувати так:
Але якщо структура містить більше двох-трьох елементів -Бажано так не робити. Это немного запутывает и усложняет читаемость и понимание программы.
Объявление объектов. Создать объект структуры можно сразу во время её определения. Для цього необхідно дати ім'я об'єкту між крапкою з комою і закриває фігурної дужки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include<iostream> using namespace std; struct Size { int breast; int waist; int hips; } volume1, volume2; // объявляем два объекта int main() { setlocale(LC_ALL, "rus"); volume1 = { 90, 60, 90 }; volume2 = { 100, 100, 100 }; return 0; } |
В С есть возможность определить структуру без дескриптора (без имени типа):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include<iostream> using namespace std; struct // дескриптор отсутствует { int breast; int waist; int hips; } volume1, volume2; // объявляем два объекта int main() { setlocale(LC_ALL, "rus"); volume1 = { 90, 60, 90 }; volume2 = { 100, 100, 100 }; return 0; } |
В таком случае надо обязательно объявлять объекты в определении структуры. В главной функции вы уже не сможете создать другие объекты этой структуры, так как дескриптора нет. Цей прийом є сенс застосовувати, если объектов структуры будет очень мало – 1 или 2.
Присваивание (=) для структур. Для объектов одной структуры можно применить операцию присваивания = . Операция присвоит элементам одного объекта значения элементов второго объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<iostream> using namespace std; struct Size { int breast; int waist; int hips; } volume1, volume2; // объявляем два объекта int main() { setlocale(LC_ALL, "rus"); volume1 = { 90, 60, 90 }; volume2 = volume1; cout << volume2.breast << '/'; cout << volume2.waist << '/'; cout << volume2.hips << endl; return 0; } |
Это так называемое поэлементное или почленное присваивание. На экране:
Сработало – всі елементи об'єкта структуриvolume2 стали рівні елементів об'єктаvolume1.
Пам'ять займана структурою. Рассмотрим пример: використовуючи операторsizeof, узнаем сколько памяти занимает каждый элемент структуры в отдельности. Порахуємо загальний обсяг пам'яті елементів. потім застосуємоsizeof к объекту структуры и увидим, що розміри не співпадають.
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 | #include<iostream> using namespace std; struct HandsomeMan { char name[16]; int age; int height; bool engKnowledge; }; int main() { setlocale(LC_ALL, "rus"); HandsomeMan Man = {}; cout << "sizeof(Man.name) = " << sizeof(Man.name) << endl; cout << "sizeof(Man.age) = " << sizeof(Man.age) << endl; cout << "sizeof(Man.height) = " << sizeof(Man.height) << endl; cout << "sizeof(Man.engKnowledge) = " << sizeof(Man.engKnowledge) << endl; cout << "Total size of the elements = "; cout << sizeof(Man.name) + sizeof(Man.age) + sizeof(Man.height) + sizeof(Man.engKnowledge); cout << endl << endl; cout << "Size of struct = " << sizeof(Man) << endl; return 0; } |
На экране:
sizeof показал нам сколько памяти занимает каждый элемент структуры HandsomeMan. Мы эти значения суммировали и получили 25. То есть по идее структура должна занимать 25 байт оперативной памяти. Но когда мы применяем оператор sizeof до структури – получаем значение 28.
Размер объекта структуры не всегда равен сумме размеров его элементов. Так трапляється через вирівнювання елементів різної довжини. Тому в структурі можуть зустрічатися безіменні ділянки пам'яті. Если вам надо знать сколько в действительности занимает структура в памяти – отриманоsizeof , как в примере.
Это видео из предыдущего урока. Кто не смотрел – уделите время
Мы узнали как определять структуры, как объявлять и инициализировать их объекты. Якщо нам знадобиться створити більше ніж 2-3 об'єкти структури, тогда лучше создать массив структур. Эту тему рассмотрим в следующей статье.
Тільки структуру потрібно було назвати PrettyWoman ;)
дивно, але з ім'ям в структурі біда, а точніше коли вводиш
обсяг = { “имя”, і т.д ;
А хто вас учив таке вводити?
Де ви таке в прикладах бачили?
Дан масив, в якому зберігаються дані про розклад поїздів на сього-
дняшній день: номер поїзда, назва (т.е. звідки куди, например, новий-
Російсько-Москва), час прибуття на станцію і час відправлення (годинник,
хвилини). За даним часу визначити, які з поїздів стоять зараз на
станції.
Потрібно вивести дані тих студентів, у яких оцінки з математики 8 или 9 і прізвище починається на А. Чому не можна не можна порівнювати адресу і щось ще в операторі if??
#include
using namespace std;
Struct Сорти // цю структуру ми вкладемо в структуру Student
{
фізика ІНТ;
Int математики;
ІНТ інформатика;
ІНТ хімія;
};
структура Student
{
char surname[32];
ІНТ year_of_birth;
ІНТ number_of_groope;
оцінки semester_grades; // вкладена структура(оцінки за семестр)
подвійний average_score;//середній бал
};
void showData( Студент * Obj);
недійсний showData_input(Студент * Obj);
int main()
{
setlocale(LC_ALL, “rus”);
дані Student[1];
for (int i = 0; i < 3; i )
{
cout << i + 1 << " студент: " << endl;
showData_input(&дані[i]);
showData(&дані[i]);
if ((&дані[i].surname[0]) == 'A' && (&дані[i].semester_grades.maths == 8 || 9))
{
showData(&дані[i]);
}
}
system("pause");
return 0;
}
void showData( Студент * Obj)
{
setlocale(LC_ALL, "rus");
cout << "Фамилия: " <surname << endl;
cout << "Год рождения: " <рік народження << endl;
cout << "Номер группы: " <number_of_groope << endl;
cout << " Оцінки за семестр: \nFizika: " <semester_grades.physics << "Математика: " <semester_grades.maths << "Информатика: " <semester_grades.informatics<<"Химия: " <semester_grades.chemistry << endl;
cout << "Средний балл: "<average_score;
cout << endl;
}
недійсний showData_input(Студент * Obj)
{
setlocale(LC_ALL, "rus");
cout << "__________________" << endl;
cout << "Input student data" << endl;
cout << "__________________" << endl;
cout <> Obj->surname;
cout <> Obj->рік народження;
cout <> Obj->number_of_groope;
cout <> Obj->semester_grades.physics >> Obj->semester_grades.maths >> Obj->semester_grades.informatics >> Obj-> semester_grades.chemistry;
cout <> Obj->average_score;
cout << endl;
}
Чет знову без будь-яких пояснень вилазять нові терміни та рядки, особливо у відео цього багато.