Приложения
Для решения задачи была создана иерархию классов и обязательные методы, описанные в условии:
int main() {
int numElements;
std::cout << "Enter the number of elements: ";
std::cin >> numElements;
std::cin.ignore();
STRING** stringArray = new STRING*[numElements]; // Создание динамического массива со ссылками на строки
for (int i = 0; i < numElements; i++) {
// Блок кода, где пользователю предлагается выбрать тип строки и ввести начальное значение
// После этого создается соответствующий экземпляр STRING и заносится в массив.
char choice;
std::cout << "Choose the type of string (S/String, I/Identifier, C/Complex): ";
std::cin >> choice;
std::cin.ignore();
if (std::toupper(choice) == 'S') {
std::cout << "Enter a string: ";
char temp[100];
std::cin.getline(temp, 100);
stringArray[i] = new STRING(temp);
}
else if (std::toupper(choice) == 'I') {
std::cout << "Enter an identifier: ";
char temp[100];
std::cin.getline(temp, 100);
stringArray[i] = new IDENTIFIER_STRING(temp);
}
else if (std::toupper(choice) == 'C') {
std::cout << "Enter a complex number: ";
char temp[100];
std::cin.getline(temp, 100);
stringArray[i] = new COMPLEX_NUMBER(temp);
}
else {
std::cout << "Invalid choice. Defaulting to String." << std::endl;
std::cout << "Enter a string: ";
char temp[100];
std::cin.getline(temp, 100);
stringArray[i] = new STRING(temp);
}
}
// Основной цикл программы, где пользователю предоставляются разные возможности для взаимодействия со строками
for (int i = 0; i < numElements; i++) {
delete stringArray[i]; // Удаление динамических данных
}
delete[] stringArray; // Очистка массива указателей
return 0;
}
Для каждого класса определяется конструктор по умолчанию, конструктор копирования, деструктор, а также обязательные методы:
operator[] - возвращает символ строки по заданному индексу
read - выводит на экран символ строки по заданному индексу
Класс IdentifierString содержит дополнительные методы:
toLowerCase() - переводит все символы строки (кроме цифр) в нижний регистр
operator> - проверяет, больше ли строка, чем другая строка
operator= - переопределение оператора присваивания
Класс Complex содержит дополнительные методы:
operator/ - выполняет деление двух комплексных чисел
operator== - проверяет на равенство два комплексных числа
operator= - переопределение оператора присваивания
Тестовая программа должна:
динамически выделять массив указателей на базовый класс;
запрашивать у пользователя число элементов в массиве с помощью подпункта "Число элементов" в меню "Инициализация";
запрашивать начальные значения для элементов массива указателей на базовый класс с помощью подпункта "Начальное значение" в меню "Инициализация". Значения можно задавать несколько раз;
выполнять проверку всех разработанных методов для созданных экземпляров производных классов с помощью пункта меню "Тестирование";
для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в заданное место дисплея, используя статические члены класса.
Реализации функции main():
#include <iostream>
#include <cstring>
#include <cctype>
// Объявление класса STRING, который обрабатывает базовые операции над строками
class STRING {
protected:
char* str; // строка
