Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 16:

Структуры

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >

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

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

Инициализирующая запись – это заключенный в фигурные скобки список, элементы которого разделяются запятыми и являются константами. Любые неинициализированные элементы внешних или статических структур по умолчанию равны 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;
}
< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Андрей Садовщиков
Андрей Садовщиков
Россия