Урок 9. Структуры в c++

Theory

Structures in C++

  • A data structure is a group of data elements grouped together under one name. These data elements, known as members, can have different types and different lengths.
    • Example:

      1
      2
      3
      4
      5
      6
      7
      
      struct product {
        int weight;
        double price;
      } ;
       
      product apple;
      product banana, melon;
      This declares a structure type, called product, and defines it having two members: weight and price, each of a different fundamental type. This declaration creates a new type (product), which is then used to declare three objects (variables) of this type: apple, banana, and melon. Note how once product is declared, it is used just like any other type.
    • Right at the end of the struct definition, and before the ending semicolon (;), the optional field object_names can be used to directly declare objects of the structure type. For example, the structure objects apple, banana, and melon can be declared at the moment the data structure type is defined:
    • 1
      2
      3
      4
      
      struct product {
        int weight;
        double price;
      } apple, banana, melon;
      In this case, where object_names are specified, the type name (product) becomes optional: struct requires either a type_name or at least one name in object_names, but not necessarily both.

    Access to the objects’ members

  • Once the three objects of a determined structure type are declared (apple, banana, and melon) its members can be accessed directly. The dot notation is used. Dot (.) must be inserted between the object name and the member name. For example, we could operate with any of these elements as if they were standard variables of their respective types:
  • 1
    2
    3
    4
    5
    6
    
    apple.weight
    apple.price
    banana.weight
    banana.price
    melon.weight
    melon.price
    Each one of these has the data type corresponding to the member they refer to: apple.weight, banana.weight, and melon.weight are of type int, while apple.price, banana.price, and melon.price are of type double.

    Pointers to structures

  • Structures can be pointed to by its own type of pointers:
  • 1
    2
    3
    4
    5
    6
    7
    
    struct Product_t {
      int weight;
      double price;
    } apple, banana, melon;
     
    Product_t aproduct;
    Product_t * pproduct;
    Here aproduct is an object of structure type Product_t, and pproduct is a pointer to point to objects of structure type Product_t.
  • Therefore, the following code would also be valid:
  •  
    pproduct = &aproduct;
    
    The value of the pointer pproduct would be assigned the address of object aproduct.
  • The following example serve to introduce a new operator: the arrow operator (->):
  • //...
    struct Product_t {
      int weight;
      double price;
    } ;
     
    int main ()
    {
      string mystr;
     
      Product_t aproduct;
      Product_t * pproduct;
      pproduct = &aproduct;
     
      cout << "Enter weight: ";
      cin >> pproduct ->weight;
      cout << "Enter price: ";
      cin >> pproduct ->price;
     
      cout << "\nYou have entered:\n";
      cout << pproduct ->weight << " ";
      cout << pproduct ->price;
     
      return 0;
    }

    Tuples

  • A tuple is an object that can hold a collection of items. Each item can be of a different type.
  • Example:

    #include <string>
    #include <tuple> // std::tuple, std::get, std::tie, std::ignore
     
    using namespace std;
     
    int main()
    {
      tuple<int, char, string> t {4, 'z', "C++"}; // the 1-st way of declaration
      auto x = make_tuple(4, 'z', "C++"); // the 2-d way of declaration
     
      auto s1 = get<2>(x);  // access element
      get<0>(t) = 20; // set to another value
      int i; char c; string s;
      tie(i, c, s) = t; // unpack elements
      tie(ignore, ignore, s) = t; //unpack (with ignore) 
    }

    Лабораторные работы

    Лабораторная работа 1:
    Выполнить: Создать структуру Books_t, хранящую сведения о книгах. Добавить следующие поля структуры:

    • название книги
    • год издания

    Задания:

    1. Создать структуру Books_t
    2. Реализовать метод структуры для вывода сведений:
    3. void printBook(Books_t book);
    4. Создать два объекта (например, Pushkin, Chekhov).
    5. В основной программе создать два объекта-книги и вывести краткую информацию о них.

    примерный вывод:

    Lab 1:
    Введите год работы Чехова под названием Три сестры:
    1897
    Работа Пушкина:
     Евгений Онегин 1823
    Работа  Чехова:
     Три сестры 1897
    

    ✍ Алгоритм:

      1. Создайте структуру Books_t для хранения данных о книгах. Добавьте следующие поля объекта: название книги, год издания.

    • Структура должна быть определена внутри заголовочного файла. Откройте structBooks8.h и добавьте код для определения структуры с двумя полями — title и year:
    • struct Books_t
      {
      	string title;
      	int year;
      };
      

      2. Реализуйте метод для вывода информации об объекте.

    • Также внутри заголовочного файла следует определить метод с параметром типа Books_t, чтобы принимать в качестве параметра определенную книгу. Добавьте код после структуры:
    • //метод для вывода информации об объектах
      void printBook(Books_t book);
      
    • Реализация функции должна быть помещена в файл structBooks8.cpp:
    • void printBook(Books_t book)
      {
      	cout << book.title;
      	cout << " " << book.year << endl;
      }
      

      3. Создайте два объекта (например, Пушкин и Чехов).

    • Откройте файл main.cpp и добавьте код для создания двух объектов типа:
    • Books_t Pushkin;
      Books_t Chekhov;
      

      4. В основной программе создайте как минимум 2 книги, выведите информацию по этим книгам.

    • После определений объектов добавьте код для инициализации полей с определенными значениями. Попросите пользователя ввести значение одного из полей, например, года издания книги:
    • Pushkin.title = "Eugene Onegin";
      Pushkin.year = 1823;
      
      Chekhov.title = "Three Sisters";
      cout << "Enter year of Chekhov work Three Sisters: "<cin >> Chekhov.year;
      
    • Выведите информацию о книгах, используя метод printBook:
    • cout << "Pushkin's work is:\n ";
      printBook(Pushkin);
      cout << "And Chekhov's:\n ";
      printBook(Chekhov);
      
      system("pause");
      
    • Запустите программу и проверьте выходные данные.
    Задание 1:

    Выполнить: Создать структуру Cars_t для хранения информации об автомобилях. Добавьте поля для хранения цвета автомобиля, марки автомобиля и года выпуска. Создайте не менее 4 объектов и выведите информацию об этих объектах, используя метод printCars.

    Указание: Заголовок метода printCars должен быть следующим:

    void printCars(Cars_t car);

    Примерный вывод:

    Task 1:
    Введите марку автомобиля:
    >>audi
    Введите цвет автомобиля:
    >>grey
    Введите год выпуска автомобиля:
    >>1997
    Информация:
    audi grey 1997
    bmw green 2009
    suzuki white 2015
    honda black 2019
    

    [Solution and Project name: Lesson_9task1, file name L9Task1main.cpp, L9Task1imp.cpp, L9Task1.h]

    Лабораторная работа №2, массив типа structure:

    Выполнить: Создать структуру Toys_t для хранения данных об игрушках для продажи. Добавьте следующие свойства (поля) структуры:

    • название игрушки - тип string
    • для какого возраста ребенка - тип integer

    Задачи:

    1. Реализовать метод для вывода информации об объектах:
    2. void printBook(Toys_t toy);
    3. Реализовать метод вывода игрушек для маленьких детей (до 4 лет):
    4. void printToy4(Toys_t toy);
    5. Создайте массив объектов игрушек.
    6. В основной программе создайте не менее 4 элементов массива, отобразите информацию по этим игрушкам.

    Примерный вывод:

    Введите название игрушки:
    >>cat
    Введите возраст ребенка:
    >>2
    Краткая информация:
    car 3
    doll 4
    crocodile 6
    cat 2
    Краткая информация по игрушкам для маленьких детей:
    car 3
    doll 4
    cat 2
    

    ✍ Алгоритм:

      1. Создайте структуру Toys_t для хранения данных об игрушках

    • Структура должна быть определена внутри заголовочного файла. Откройте structToys8.h и добавьте код для определения структуры с двумя свойствами (полями)- title и age:
    • struct Toys_t
      {
      	string title;
      	int age;
      };
      

      2. Реализовать метод для вывода информации об объектах.

    • Также внутри заголовочного файла необходимо определить метод с параметром типа Toys_t. Добавьте код после структуры:
    • //метод для вывода информации
      void printToys(Toys_t toy);
      
    • Реализация функции должна быть помещена в файл structToys8.cpp:
    • void printToys(Toys_t toy)
      {
      	cout << toy.title;
      	cout << " " << toy.age << endl;
      }
      

      3. Реализовать метод вывода информации об игрушках для маленьких детей (до 4 лет)

    • Внутри заголовочного файла определите метод с параметром типа Toys_t :
    • //вывод инфо об игрушках для маленьких
      void printToy4(Toys_t toy);
      
    • Реализация функции должна быть помещена в structToys8.cpp файл:
    • void printToy4(Toys_t toy)
      {
      	if (toy.age <= 4) {
      		printToys(toy);
      	}
      }
      

      4. Создайте массив объектов.

    • Откройте файл main.cpp и внутри функции main добавьте код для создания массива объектов типа структуры:
    • Toys_t toys[4];
      

      5. В основной программе создайте не менее 4 элементов массива, отобразите информацию по этим игрушкам.

    • Добавьте код для инициализации элементов (полей) определенными значениями. Попросите пользователя ввести значения одного из элементов массива:
    • toys[0].title = "car";
      toys[0].age = 3;
      toys[1].title = "doll";
      toys[1].age = 4;
      toys[2].title = "crocodile";
      toys[2].age = 6;
      cout << "Введите название: " << endl;
      cin >> toys[3].title;
      cout << "Введите возраст: " << endl;
      cin >> toys[3].age;
      
    • Выведите информацию об игрушках, используя метод printToys, и информацию об игрушках для маленьких детей:
    • cout << "Информация:\n ";
      for (auto x: toys)
      	printToys(x);
      cout << "Информация об игрушках для маленьких:\n ";
      for (auto x : toys)
      	printToy4(x);
      
      system("pause");
      
    • Запустите программу и проверьте выходные данные.
    Задание 2:

    Выполнить: Создать структуру Tours_t для хранения информации об экскурсиях по тур. поездкам. Добавьте поля, чтобы ввести следующую информацию о туре: название страны, количество человек, количество дней, стоимость поездки по стране (double). Создайте метод для вывода данных, а также метод для расчета стоимости поездки на основе формулы: количество людей * количество дней * тариф по стране. Создайте массив объектов tours. Для элементов массива должны вызываться оба метода.

    Указание: Сигнатура метода printTourCost должна быть следующей:

    // возвращает результат вычисления (double)
    double printTourCost(Tours_t tour);

    Примерный вывод:

    Task 2:
    информация:
     Sweden: people 2, days 3, rate 155.5
     the price is 933
    Norway: people 1, days 3, rate 265.5
     the price is 796.5
    UK: people 2, days 4, rate 455.5
     the price is 3644
    

    [Solution and Project name: Lesson_9task2, file names L9Task2main.cpp, L9Task2imp.cpp, L9Task2.h]

    Лабораторная работа №3, указатели на структуры:

    Выполнить: Создать структуру Movies_t для хранения данных о фильмах. Добавьте следующие свойства (поля) структуры:

    • название фильма - типа string
    • год выпуска (целочисленный тип)

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

    Примерный вывод:

    введите название: 
    >>Matrix
    введите год: 
    >>1999
    
    Краткая информация:
    Matrix 1999
    Titanic 1997
    

    ✍ Алгоритм:

    • Структура должна быть определена в заголовочном файле. Откройте structMovies9.h и добавьте код для определения структуры с двумя свойствами (полями) - title и year:
    • struct Movies_t {
      	string title;
      	int year;
      };
      
    • Также внутри заголовочного файла необходимо определить метод с параметром типа Movies_t для вывода информации. Добавьте код после структуры
    • void printMovies(Movies_t* movie, int n);
      
    • Реализация функции должна быть в файле structMovies9.cpp:
    • void printMovies(Movies_t* array, int n) {
      	Movies_t *ptr = array;
      	for (int i = 0; i < 2; i++) {
      		cout << ptr->title << " " << ptr->year << endl;
      		ptr++;
      	}
      }
      
      *ptr - указатель, указывающий на местоположение, на которое указывает *array (нулевой элемент).
      Стрелочный оператор (->) - это оператор разыменования, который используется исключительно с указателями на объекты, имеющие поля. Этот оператор служит для доступа к элементу объекта непосредственно по его адресу.
    • Откройте файл mainMovies9.cpp и в функции main добавьте код для создания массива объектов структурного типа и указатель, указывающий на этот массив:
    • Movies_t amovie[3];
      Movies_t * pmovie;
      
      pmovie = amovie;
      
    • Добавьте код для инициализации свойств (полей) конкретными значениями. Попросите пользователя ввести значения одного элемента массива:
    • amovie[1].title = "Titanic";
      amovie[1].year = 1997;
      cout << "Введите название: ";
      cin >> pmovie->title;
      cout << "Введите год: ";
      cin >> pmovie->year;
      
    • Выведите информацию о фильмах с помощью метода printMovies :
    • cout << "\nИнформация:\n";
      printMovies(amovie, 2);
      
      system("pause");
      
    • Запустите программу и проверьте выходные данные.
    Задание 3:

    Выполнить: Создать структуру Employee_t для хранения информации о сотрудниках какой-либо компании. Добавьте поля для реализации следующей информации о сотрудниках: имя, отдел, телефон, зарплата. Создайте массив сотрудников. Реализуйте метод для вывода информации об объектах, используйте указатель на эти объекты и стрелочный оператор. Также создайте метод smallSalary для вывода информации о сотрудниках, зарплата которых составляет менее 30 000 рублей.

    Указание: Заголовок методы smallSalary:

    void smallSalary(Employee_t* array, int n);

    Примерный вывод:

    Task 3:
    Информация:
    Ivanov: бухгалтерия, t. 233-33-33, 28000 roubles
    Petrov: ИТ-отдел, t. 233-33-34, 45000 roubles
    Sidorov: клиентский отдел, t. 233-33-35, 25000 roubles
    
    с зарплатой менее 30 000 рублей:
    Ivanov
    Sidorov
    

    [Solution and Project name: Lesson_9task3, file names L9Task3main.cpp, L9Task3imp.cpp, L9Task3.h]