Доступ к элементам структур (полям данных)



Лабораторная работа № 16

Структуры: объявление структур и определение структурных объектов, инициализация и присваивание структур. Указатели на структуры.

В языке С++ возможно формирование производных (пользовательских) типов данных прежде всего на основе массивов, структур и объединений. Комбинирование этих типов данных позволяет программно моделировать достаточно сложные объекты реальности.

Агрегатным типом данных называется тип, конструируемый из элементов независимых (возможно различных) типов.

Структура – это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, который является однородным объектом (все элементы относятся к одному типу данных), структура может быть неоднородной. Таким образом, структура – это тип данных, сформированный из объектов однородных либо разнообразных типов данных.

Структуру можно представить себе как запись, состоящую из нескольких полей или элементов. Структуры обеспечивают удобный способ организации связанных по смыслу переменных. Структуры являются одновременно агрегатным и производным типом данных.

В некоторых языках программирования, в частности в Pascal, структуры называются записями. Структуры помогают в организации сложных данных (особенно в больших программах), поскольку позволяют группу связанных между собой переменных трактовать не как множество отдельных элементов, а как единое целое.

Традиционный пример структуры – строка платежной ведомости. Она содержит такие сведения о служащем, как его полное имя, адрес, номер карточки социального страхования, зарплата и т.д. Некоторые из этих характеристик сами могут быть структурами: например, полное имя состоит из нескольких компонент (фамилии, имени и отчества); аналогично адрес и даже зарплата. Другой пример – из области графики: точка на плоскости есть пара вещественных координат, шар в пространстве моделируется четырьмя вещественными числами и т. д.

Объявление структур и определение структурных объектов

Использование в программе структуры предполагает вначале определение (объявление) структуры-шаблона (типа структуры) и его структурного объекта (структурной переменной). Возможны их раздельное и совместное определения. Для шаблона структуры (с именем или без него) компилятор не выделяет в памяти компьютера место под структуру, а лишь фиксирует правила, необходимые для формирования структурного объекта (структурной переменной).

В момент определения структурного объекта компилятор выделяет место в памяти, где размещаются все компоненты структуры в соответствии с заданным шаблоном.

Ключевое слово struct сообщает компилятору об объявлении структуры. Допустимы три основные формы объявления структур.

1) С поименованным шаблоном:

struct ИмяСтруктурногоТипа {ОпределенияЭлементов};

где ИмяСтруктурногоТипа – идентификатор типа структуры. Следует обратить внимание на точку с запятой, которой заканчивается определяемая структура;

ОпределенияЭлементов – список определений типизированных компонентов (полей), из которых образуется шаблон структуры. Он в общем случае представляется так:

Тип1 Компонент11 [,Компонент12,...];

...................................

ТипК КомпонентК1 [,КомпонентК2,...];

Здесь допустимы компоненты различных типов. Все имена компонентов уникальны. Шаблон имеет видимость. Если он объявлен внутри блока, то это локальный шаблон, видимый только внутри него.

Например:

struct STUDENT {

           char name[50]; //Ф.И.О

           int passw; //шифр зачетной книжки

          };

При указанной форме объявления структуры структурные объекты определяются ниже в виде отдельной строки:

ИмяСтруктурногоТипа СписокСтруктур;

где СписокСтруктур – список идентификаторов, соответствующих именам структурных объектов.

Структурные объекты можно определить так:

STUDENT group0l, group02, //структурные объекты

   *univers, //указатель на структурный объект

   fam[100]; //массив структурных объектов

При определении структурного объекта (структурной переменной) СтруктурныйОбъект допустима инициализация его компонентов (полей):

struct ИмяСтруктурногоТипа СтруктурныйОбъект = {Инициализатор1,

                                          Инициализатор2,

                                          ..............

                                          ИнициализаторK

                                         };

Для вышеприведённого примера возможно следующее:

struct STUDENT group0l = {

                     "Сидоров ",

                     6374268

                    };

2) С совмещением определения структуры и структурных объектов:

struct ИмяСтруктурногоТипа {ОпределенияЭлементов}

  СписокСтруктур;

Структурный объект при такой схеме определения может быть также инициализирован.

Например, структура типа STUDENT с элементами ФИО и номером зачётной книжки:

struct STUDENT {

           char name[50];

           int passw;

          } *univers,//указатель на структурный объект

            fam[100],//массив структурных объектов

            group0l = {"Сидоров А.И.", 26276};

                      //инициализированный объект

При рассматриваемом подходе ИмяСтруктурногоТипа (STUDENT) можно опустить.

В пределах программы допустим один непоименованный тип структуры.

3) С использованием оператора typedef:

typedef struct [ИмяСтруктурногоТипа]

          {ОпределенияЭлементов}

          ОбозначениеСтруктурногоТипа;

где ОбозначениеСтруктурногоТипа – синонимы типа структуры. Это упрощает программу при определении структурных объектов. Кроме того, в упрощённом определении имя типа структуры можно опустить.

Например:

typedef struct {

           char name[50];

           int passw;

          } NSTUstudent;

            //NSTUstudent - псевдоним типа структуры

Определение структурного объекта для данного случая можно организовать так:

NSTUstudent *pt, //указатель на структуру

groupStudent; //структурная переменная

Здесь также допускается инициализация определяемых структурных объектов.

Можно определить структуру с использованием макроопределения:

#define Идентификатор struct ИмяТипа

Далее следует

Идентификатор {ОпределенияЭлементов};

Например:

#define COMPLEX struct R7

COMPLEX {

    float real;

    float imag;

   };

Инициализация структуры

Инициализация структуры заключается в присваивании начальных значений элементам структуры. Структуры могут быть проинициализированы при их объявлении.

Инициализирующая запись – это заключенный в фигурные скобки список, элементы которого разделяются запятыми и являются константами. Любые неинициализированные элементы внешних или статических структур по умолчанию равны 0. Значения неинициализированных элементов автоматических структур не определены.

Для инициализации структур значения ее полей перечисляются в фигурных скобках.

Например:

Первый способ

struct Student {

           char name[20];

           int kurs;

           float rating;

          };

Student s={"Королев",1,3.5};

Второй способ

struct {

   char name[20];

   char title[30];

   float rate;

  } employee={"Петров", "программист",58000};

В соответствии с синтаксисом языка компонентами структур могут быть данные любых типов, за исключением функций и структур того же типа, что и определяемый тип. Элементом структуры может быть структура, тип которой уже определен.

Например:

stuct mix {int N; double *d;}

struct hole {

        struct mix exit;

        float b;

       }

Присваивание структур

Для переменных одного и того же структурного типа определена операция присваивания. При этом происходит поэлементное копирование.

Student t=s;

Информация, содержащаяся в одной структуре, может быть присвоена другой структуре того же типа с помощью одиночного оператора присваивания, то есть не нужно присваивать значение каждого члена по отдельности.

Например:

#include <stdio.h>

void main(){

struct {

   int a;

   int b;

  } x, y;

x.a = 10;

x.b = 20;

y = x;

printf("Содержимое y: %d %d", y.a, y.b);

}

Доступ к элементам структур (полям данных)

С помощью операций прямого и косвенного выбора (соответственно символы точка '.' и '->') организуется доступ к элементам структур. Первая операция используется со структурными объектами, а вторая – при наличии указателя на структурный объект.

Операция прямого доступа к элементам структуры ('.') – результатом является значение элемента структуры.

Синтаксис операции прямого доступа к элементам структуры:

ИмяСтруктуры.ИмяЭлементаСтруктуры

Данная операция используется для доступа к элементу структуры с тем, чтобы присвоить ему значение, напечатать его, использовать его значение в арифметической операции и т.д. Эта операция является первичной и находится в самой верхней строке таблицы приоритетов операций языка С++.

Именем структуры можно пользоваться сразу же после его появления в программе.

Например:

struct A {

     int j;

     char titl[10];

     char x;

     } Аа, Аb = {128,"Мир",'Q'};

Здесь допустимы операторы присваивания вида Аа=Аb;. В этом случае элементы структурного объекта Аа будут иметь значения, совпадающие со значениями соответствующих элементов объекта Аb.

 

Пример 1 .

//Инициализация структуры и вывод значений ее элементов

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[]) {

struct goods {

           char* name;

           long price;

           float percent;

           int vol;

           char date[9];

          };

struct goods coat={"пиджак черный",4000,7.5,220,"12.01.09"};

printf("\n Товар на складе:");

printf("\n Наименование: %s.", coat.name);

printf("\n Оптовая цена: %ld руб.", coat.price);

printf("\n Наценка: %3.1f %%.", coat.percent); 

printf("\n Цена товара: %ld руб.",

     (long)(coat.price*(1.0+coat.percent/100))); 

printf("\n Объем партии: %d штук.", coat.vol);

printf("\n Дата поставки: %s.",coat.date);

system("pause");

return 0;

}

 

Пример 2 . Сложение комплексных чисел

#include "stdafx.h"

#include <iostream>

using namespace std;

typedef struct {

            double real;

            double imag;

           } complex;

 

int _tmain(int argc, _TCHAR* argv[]) {

complex x,y,z;

printf("\n Введите два комплексных числа:");

printf("\n Вещественная часть:"); scanf("%lf", &x.real);

printf("\n Мнимая часть:"); scanf("%lf", &x.imag);

printf("\n Вещественная часть:"); scanf("%lf", &y.real);

printf("\n Мнимая часть:"); scanf("%lf", &y.imag);

z.real=x.real+y.real;

z.imag=x.imag+y.imag;

printf("\n Результат: z.real=%f z.imag=%f", z.real,z.imag);

system("pause");

return 0;

}


Дата добавления: 2021-07-19; просмотров: 194; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!