Введение

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

В этой части нашего путешествия по программированию на C++ мы рассмотрим следующие темы:

  • Хранение совокупной информации
  • Структуры

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

Агрегированные данные: раскрывает ли ваша стратегия хранения весь свой потенциал?

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

const int MAX_EMPLOYEES = 100;

// Arrays to store employee information
std::string employeeNames[MAX_EMPLOYEES];
int employeeAges[MAX_EMPLOYEES];
float employeeSalaries[MAX_EMPLOYEES];
std::string employeeDepartments[MAX_EMPLOYEES];

int main() {
    // Example data for three employees
    employeeNames[0] = "John Doe";
    employeeAges[0] = 30;
    employeeSalaries[0] = 5000.0;
    employeeDepartments[0] = "Sales";

    employeeNames[1] = "Jane Smith";
    employeeAges[1] = 35;
    employeeSalaries[1] = 6000.0;
    employeeDepartments[1] = "Marketing";

    employeeNames[2] = "David Johnson";
    employeeAges[2] = 40;
    employeeSalaries[2] = 7000.0;
    employeeDepartments[2] = "Finance";

    // Accessing and printing employee information
    for (int i = 0; i < 3; ++i) {
        std::cout << "Employee " << (i + 1) << ":\\n";
        std::cout << "Name: " << employeeNames[i] << "\\n";
        std::cout << "Age: " << employeeAges[i] << "\\n";
        std::cout << "Salary: " << employeeSalaries[i] << "\\n";
        std::cout << "Department: " << employeeDepartments[i] << "\\n";
        std::cout << "\\n";
    }

    return 0;
}

В приведенном выше коде мы объявляем четыре отдельных массива:

  • имена сотрудников
  • сотрудникВозраст
  • сотрудникЗарплата
  • сотрудникОтделы

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

Давайте посмотрим, что произойдет, если мы не сможем правильно их обновить:

int main() {
    // Updating the salary of the second employee using the wrong index
    employeeSalaries[2] = 800.0;

    // Accessing and printing employee information
    for (int i = 0; i < 3; ++i) {
        printEmployeeInfo(i);
    }

    return 0;
}

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

/* OUTPUT
Employee 1:
Name: John Doe
Age: 30
Salary: 5000
Department: Sales

Employee 2:
Name: Jane Smith
Age: 35
Salary: 6000 // Incorrect data
Department: Marketing

Employee 3:
Name: Daniel Williams 
Age: 45 
Salary: 800 // Incorrect data        
Department: HR 
*/

Еще одним недостатком является управление распределением памяти. Выделение и освобождение памяти более сложны с отдельными массивами. По мере того, как размер данных увеличивается или изменяется динамически, изменение размера массивов по отдельности может стать неэффективным. Обеспечение эффективности использования памяти и предотвращение утечек памяти может стать сложной задачей.

Раскрытие потенциала агрегированных данных: почему структуры являются идеальным решением

В C++ struct не является отдельной переменной; скорее, это план для определяемого пользователем типа данных. Он похож на класс, но с открытым доступом для его членов по умолчанию.

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

// Structure definition
struct Employee {
    std::string fname;
    std::string lname;
    int age;
    double hwage;
};

Сначала мы определяем структуру с именем Employee с четырьмя переменными-членами: fname (имя), lname (фамилия), age(возраст сотрудника) и зарплата (почасовая оплата труда сотрудника). Эта структура служит контейнером данных для хранения информации о каждом сотруднике.

int main() {
    // Create an array of Employee instances
    Employee employees[3];

    // Employee 1
    employees[0].fname = "John";
    employees[0].lname = "Doe";
    employees[0].age = 30;
    employees[0].hwage = 5000;

    // Output employee information for the first employee only
    std::cout << "Employee 1:\\n";
    std::cout << "Name: " << employees[0].fname << " " << employees[0].lname << std::endl;
    std::cout << "Age: " << employees[0].age << std::endl;
    std::cout << "Salary: " << employees[0].hwage << std::endl;
    std::cout << "Department: " << "Department 1" << std::endl; // Assuming department information is not provided

    return 0;
}

Создав массив структур Employee, мы можем эффективно хранить данные нескольких сотрудников и получать к ним доступ по мере необходимости.

Подведение итогов

В этой части нашего путешествия по программированию на C++:

  • Мы обсудили хранение агрегированных данных с помощью отдельных массивов и его недостатки.
  • Как структуры C++ обеспечивают более чистое и организованное решение для управления агрегированными данными по сравнению с использованием отдельных массивов для каждого атрибута.