Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Действия над структурами.)

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

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

  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";
    }
    
    
  4. Присваивание структуры как единого целого.
    #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";
    }
    
  5. Передача структуры в качестве параметра функции и возвращение структуры в результате работы функции.
    #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);
     
    }
    
  6. Передача отдельных компонент структуры в качестве аргументов функции. Например, для функции 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.

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


Категория: C | Добавил: DEN-SHP (05.11.2012)
Просмотров: 816 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]