Изучив структуры C в этом уроке, перед вами по справжньому прочиниться простір для творчості в програмуванні. До этого урока, мы могли использовать стандартные (встроенные) типи даних для переменных в своих программах (int, float, char, bool). Зараз же ми навчимося самостійно створювати щось на зразок свого власного типу даних. Це робиться за допомогою структур.
Как всегда, в начале статьи разберемся зачем нам это может понадобиться. Допустим, необходимо сохранить данные о девушке модели. Нам надо хранить о ней такие данные: имя, вік, рост, вес, обсяги і знання / незнання англійської мови. Як бачите, всі дані про модель будуть відрізнятися типами: имя надо хранить в массиве типа char, обсяги – в переменных типа int, для отметки о владении английским подойдет переменная типа bool…
Получается, что для хранения этих данных, массив мы никак не сможем использовать, так как он хранит однотипные данные. Используя структуры появляется возможность сгруппировать все эти данные, условно объединенные логической связью, в одно целое. Смотрим:
Для определения структуры используется ключевое слово struct. После него указывается дескриптор (имя нового типа данных). Ім'я дає програміст. Оно подчиняется тем же правилам, что и имена переменных. У нас дескриптор структуры – це WonderfulWoman.
В фигурных скобках размещаются элементы (члены) структуры – іменовані змінні або масиви будь-якого типу даних С ++. Структура може зберігати елементи різних типів. Как видите в нашей структуре есть элементы типа int, char і bool. Завершается определение структуры точкой с запятой ;
Після того, как структура определена, ми можемо створювати змінні типу структури – объекты структуры. Создаются они точно так же, как и переменные типа bool, int, char… пишемо дескриптор (“тип”) і даємо ім'я об'єкту структури. Например в main-функции создаем переменную
WonderfulWoman firstWoman; Здесь WonderfulWoman буде грати роль типу, а firstWoman – роль оголошеної змінної.
Елементом структури також може бути об'єкт іншого, определённой ранее, структури. Тобто структури можна вкладати одну в іншу. Розглянемо приклад. В нём также разберемся, как обращаться к элементам структуры, чтобы записать в них данные, например, і потім показувати на екран.
Йдемо по порядку. Строки 4 – 9: визначення структуриSize. Она содержит три элемента типа int, которые будут хранить замеры модели – объемы груди, талии, бёдер. Эту структуру мы вложим в расположенную под ней структуру – WonderfulWoman. Она содержит элементы разных типов – символьный массив, переменные типа int, bool.
В рядку 17 объявлен объект volume типуSize. Это и есть вложение структуры. У 21-му рядку знаходиться прототип функції, яка буде відображати дані структуриWonderfulWoman на екран. Об этой функции поговорим ниже, когда дойдем до её определения.
рядок 27 – оголошення об'єкта структури: WonderfulWoman firstWoman = {}; тут зрозуміло: WonderfulWoman – дескриптор (тип), firstWoman – объект структуры. Такая запись = {}; встановить всі значення елементів структури WonderfulWoman в нуль. В тому числі, всіх елементів символьного масиву буде присвоєно значення \0 . Так як об'єктvolumeє елементом структуриWonderfulWoman, його елементів так само будуть присвоєні нулі. Тобто такий запис дозволить очистити всі елементи структури від сміття (остаточных данных от других программ).
Обращение к элементам структуры. Щоб записати або витягти дані нам треба звернутися до конкретного елементу об'єкта структури. Для цього застосовується операція приналежності . (точка): firstWoman.age = 23; Треба нам внести дані про вік – пишем имя объекта структуры, за ним . (точка) и далее имя элемента структуры, в котором должно храниться количество лет модели. Щоб зберегти ім'я – використовуємо бібліотечну функціюstrcpy_s() илиstrcpy() (в залежності від вашої середовища розробки).
Внимательно посмотрите на строки 36 – 38. Там мы присваиваем значения элементам вложенной структуры. Наприклад: firstWoman.volume.breast = 90; Як і раніше пишемо ім'я об'єкта структури, за ним . (точка). Далее имя объекта вложенной структуры, знову . (точка). И только теперь выбираем элемент вложенной структуры breast, к которому надо обратиться.
Последнее – структуру свободно можно передавать в функцию и возвращать из функции, как и обычные переменные. Определение функции для вывода данных структуры на экран – в строках 45 – 54. Так як нам треба тільки показати дані і дуже бажано їх не зіпсувати в функції, передаем структуру с использованием оператора const. Виклик функції знаходиться в рядку 40. Тут просто передаем объект структуры в функцию, указав его имя. Результат:
Домашнее задание для вас: написать еще одну функцию для нашей программы, в которой пользователю предлагается вводить данные о модели с клавиатуры. Внести данные надо будет о трёх моделях и показать их на экран.
В этом видео рассказано о структурах с 4-й минуты:
В этой статье (первой части) мы очень поверхностно рассмотрели структуры C . У додатковійстатье (во второй части) о структурах еще поговорим об особенностях определения структуры, об инициализации объектов структуры, про присвоєнні структур з використанням операції = и о том скільки пам'яті виділяється під об'єкти структур.
мене завжди лякають нові теми в С ++. Так і зі структурами ))) Страшно було і підступитися. Почитала то там, то там. Потім зайшла на ваш сайт – як завжди все коротко і зрозуміло. Чекаю другу частину уроку про структурах. І масив структур дуже цікавить :)
Вітаю! Підкажіть, а звідки взялося &Obj в 45 рядку? Я думав це посилання на змінну Obj, але вона ніде не оголошена. В загальному, з цим я заплутався. Роз'ясніть будь ласка.
перепрошую, затупил! вже розібрався!
“Тут просто передаємо об'єкт структури в функцію, указав его имя”. Але ж у нас ім'я об'єкта структури – це firstWoman, а ми передаємо Obj. А якщо об'єктів буде кілька, як передати конкретний з них?
Вибачте, дійшло
Вітаю! я новачок, питання, правильно чи цей код складає фути і дюйми?
#include “stdafx.h”
#include
using namespace std;
структура Відстань
{
ІНТ ноги;
поплавок дюймів;
};
відстань addengls(відстань, відстань);
недійсний engldisp(відстань);
INT _tmain(INT ARGC, _TCHAR * ARGV[])
{
setlocale(0, “”);
відстань d1, d2, d3;
cout <> d1.feet;
cout <> d1.inches;
cout <> d2.feet;
cout <> d2.inches;
d3 = addengls(d1, d2);
cout <<endl;
engldisp(d1); cout << " + ";
engldisp(d2); cout << " = ";
engldisp(d3); cout <= 12.0)
{
dd3.inches - = 12.0;
dd3.feet ++;
}
dd3.feet + = dd1.feet + dd2.feet;
повернення DD3;
}
недійсний engldisp(відстань дд)
{
cout << dd.feet << "\'-" << dd.inches << "\"";
}
Gm, а до мене не дійшло.
Будівництво &Obj ніде раніше не зустрічалася і тут, без жодних пояснень – nate, Гаваї.