Вы можете интерпретировать это так же, как и в случае с проблемой слов в математическом классе: буквально переведите каждую строку:
Создать контейнерный класс, в котором хранится коллекция строк.
Я использую вектор, потому что мы не знаем, сколько строк мы будем хранить. Если вам необходимо использовать массив, и вы знаете, что максимальное количество строк НИКОГДА не превысит 100, тогда вы можете использовать массив, который вы имели в коде вашего вопроса. Лично слово НИКОГДА не является для меня большим предупреждением, поэтому я бы использовал вектор:
class Container
{
private:
vector<string> strings;
};
Класс должен иметь ... конструктор, который инициализирует пустую коллекцию
Вектор не нуждается в инициализации, потому что у него есть собственный конструктор, поэтому нам не нужен код в конструкторе:
class Container
{
private:
vector<string> strings;
public:
Container() {}
};
Класс должен иметь ... функцию вставки, которая добавляет одну строку в коллекцию
Таким образом, функция вставки должна принимать строку для добавления, но не должна ничего возвращать:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
};
Класс должен иметь ... и функцию, которая получает значение данных / строки и возвращает одно из значений данных (строка / слово) в коллекции
Итак, ваша функция получения должна принимать строку и также возвращать строку:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
string retrieve(string parameter); // definition provided later
};
... класс не должен хранить подписи всех данных (он должен вычисляться по мере необходимости, используя закрытый метод).
Итак, нам нужен закрытый метод, который принимает строку и возвращает число:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
string retrieve(string parameter); // definition provided later
private:
int calculateSignature(string parameter); // definition provided later
};
Теперь, когда у нас есть схема класса, нам нужно выяснить, что делает CalculateSignature:
... вы создадите сигнатуру для строк, начиная с общей суммы, равной нулю
Итак, мы начинаем с нуля и в конце должны вернуть его:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
string retrieve(string parameter); // definition provided later
private:
int calculateSignature(string parameter)
{
int total = 0;
// process parameter
return total;
}
};
для каждого символа (назовите его c) в строке, обновите сумму ... Доступ к символам строки s возможен следующим образом: for (string::size_type index = 0; index <s.length(); ++index) // process char s[index]
Итог - это то, что мы делаем для каждого символа, поэтому нам нужен цикл:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
string retrieve(string parameter); // definition provided later
private:
int calculateSignature(string parameter)
{
int total = 0;
for (string::size_type index = 0; index <parameter.length(); ++index)
// process char parameter[index]
return total;
}
};
для каждого символа (назовите его c) в строке, обновите сумму, используя: total = total*2 + static cast<int>(c);
А потом мы обновляем общее количество:
class Container
{
private:
vector<string> strings;
public:
Container() {}
void insert(string parameter) { strings.push_back(parameter); }
string retrieve(string parameter); // definition provided later
private:
int calculateSignature(string parameter)
{
int total = 0;
for (string::size_type index = 0; index <parameter.length(); ++index)
total = total*2 + static cast<int>(parameter[index]);
return total;
}
};
Хорошо, теперь нам просто нужно выяснить, что делает извлечение:
... функция, которая получает значение данных / строки и возвращает ... значение, сигнатура которого численно ближе всего к сигнатуре параметра
Таким образом, нам нужно будет вычислить сигнатуру параметра, выполнить цикл по вектору и вычислить сигнатуру для каждой отдельной записи, сравнить их и сохранить индекс ближайшей сигнатуры и, наконец, вернуть этот индекс из вектора.
Я оставлю это для вас, но это не сложно.