Здавалка
Главная | Обратная связь

Действия над структурами.



Итак, разберем операции, которые допустимо производить над структурами.

  1. Доступ к элементу структуры с помощью операции "." (точка).
  2. Доступ к элементу структуры по указателю с помощью операции "->" в виде: <указатель на структуру>"->"<элемент_структуры>. Так, обращения pd->year и (*pd).year эквивалентны. Круглые скобки (*pd) необходимы, поскольку операция "." доступа к элементу структуры старше, чем "*".
  3. Определение адреса структуры с помощью операции "&".
#include <iostream>using namespace std; //Описание структуры с именем date.struct date{ int day; int month; int year; char mon_name[12];}; //Создание и инициализация объекта структуры.date d = { 2,5,1776,"July" }; //d - переменная типа date. void main (){ // Указатель p указывает на структуру типа date. struct date *p; // Показ содержимого структуры на экран //(обращение через объект) cout<< d.day << " "; cout<< d.year << " "; cout<< d.month << " "; cout<< d.mon_name << "\n\n"; // запись адреса объкта структуры в указатель p = &d; // Показ содержимого структуры на экран //(обращение через указатель) cout << p->day << " "; cout << p->month << " "; cout << p->year << " "; cout << p->mon_name << "\n\n";}
  1. Присваивание структуры как единого целого.
#include <iostream>using namespace std; struct date { int day; int month; int year; char mon_name[12];}; date a = { 14,7,1954,"July" };date b; void main (){ // показ содержимого объекта a cout<< a.day << " "; cout<< a.year << " "; cout<< a.month << " "; cout<< a.mon_name << "\n\n"; // инициализация объкта b объектом a b = a; // показ содержимого объекта b cout<< b.day << " "; cout<< b.year << " "; cout<< b.month << " "; cout<< b.mon_name << "\n\n";}
  1. Передача структуры в качестве параметра функции и возвращение структуры в результате работы функции.
#include <iostream>using namespace std; struct date { int day; int month; int year; char mon_name[12];}; void Show(date a){ // показ содержимого объекта a cout<< a.day << " "; cout<< a.year << " "; cout<< a.month << " "; cout<< a.mon_name << "\n\n";} date Put(){ // формирование объкта date temp; cout<<"DAY ? "; cin>>temp.day; cout<<"MONTH ? "; cin>>temp.month; cout<<"YEAR ? "; cin>>temp.year; cout<<"MONTH NAME ? "; cin>>temp.mon_name; return temp;} date a = { 14,7,1954,"July" };date b; void main (){ // передача объекта в функцию Show(a); // получение объекта в качестве возвращаемого значения b=Put(); // показ содержимого объекта b Show(b); }
  1. Передача отдельных компонент структуры в качестве аргументов функции. Например, для функции day_of_year1:
#include <iostream>using namespace std; // вспомогательный массив, отвечающий за месяцы в годуint day_tab[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31}; struct date { int day; int month; int year; int dayyear; char mon_name[12];}; void Show(date a){ // показ содержимого объекта a cout<< a.day << " "; cout<< a.year << " "; cout<< a.month << " "; cout<< a.dayyear << " "; cout<< a.mon_name << "\n\n";} int day_of_year1 (int day,int month,int year){ //Вычисление дня в году с помощью месяца и года. int i, leap; leap = year%4==0 && year%100!=0 || year%400==0; for (i=1; i < month; i++) day += day_tab[leap][i]; return (day);} date a = {20,7,1981,0,"July"}; void main (){ // передача отдельных членов функцию a.dayyear=day_of_year1(a.day,a.month,a.year); // показ содержимого объекта a Show(a); }

А теперь, рассмотрим порядок выполнения некоторых наиболее распространенных операций над элементами структуры на примере следующего описания:

struct{ int x; int *y; } *p; // p - указатель на структуру.
    • (++p)->x - операция увеличивает p до доступа к x;
    • (p++)->x - операция увеличивает p после доступа к x (круглые скобки не обязательны, так как по старшинству раньше будет применена операция "->");
    • *p->y - выбирается содержимое объекта, на который указывает y;
    • *p->y++ - увеличивается y после обработки того, на что он указывает (аналогично *s++);
    • *p++->y - увеличивает p после выборки того, на что указывает y;
    • (*(*p).y)++ - увеличивает то, на что указывает y.

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

Предыдущая Оглавление Следующая  
Предыдущая Оглавление Следующая
           

Оператор sizeof.

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

sizeof(Выражение);

Результат операции sizeof имеет тип int.

Получение размера объекта.

#include <iostream>using namespace std;void main (){ int a; char b; unsigned c; int *p; /* ----------------------------- */ cout<<"sizeof(a)="<<sizeof(a)<<"\n"; cout<<"sizeof(b)="<<sizeof(b)<<"\n"; cout<<"sizeof(c)="<<sizeof(c)<<"\n"; cout<<"sizeof(p)="<<sizeof(p)<<"\n"; cout<<"sizeof(int)="<<sizeof(int)<<"\n"; cout<<"sizeof(int *)="<<sizeof(int *)<<"\n";}Результат работы программы:sizeof(a)=4sizeof(b)=1sizeof(c)=4sizeof(p)=4sizeof(int)=4sizeof(int *)=4

Размеры структуры.

Наверняка, вы предполагаете, что размер структуры равен сумме размеров ее членов. Это не так. Вследствие выравнивания объектов разной длины в структуре могут появляться безымянные "дыры". Так, например, если переменная типа char занимает один байт, а int - четыре байта, то для структуры:

#include <iostream>using namespace std;struct Test{ char c; int i;};void main (){ Test d={'#',78}; cout<<sizeof(Test)<<" "<<sizeof(d)<<"\n\n";}

может потребоваться восемь байт, а не пять. Правильное значение возвращает операция sizeof.

Предыдущая Оглавление Следующая  
Предыдущая Оглавление Следующая
           

Домашнее задание

1. Создать структуру ВИДЕОМАГАЗИН со следующими полями:

  • Название фильма
  • Режиссер
  • Жанр
  • Рейтинг популярности
  • Цена диска

    Реализовать следующие возможности:
  • Поиск по названию
  • Поиск по жанру
  • Поиск по режиссеру
  • Самый популярный фильм в жанре
  • Показ всех записей и добавление
Предыдущая Оглавление Следующая

 


 

Предыдущая Оглавление Следующая

Урок №17.

  • Краткие сведения из курса двоичной арифметики. Использование нескольких систем исчисления.
  • Битовые операции.
  • Объединения.
  • Битовые поля.
  • Домашнее задание
Предыдущая Оглавление Следующая  
Предыдущая Оглавление Следующая
           






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.