Структуры данных: нужна помощь в уточнении моих функций - PullRequest
0 голосов
/ 04 сентября 2018

Это задание приводит меня в замешательство, и мне некуда деваться - путать до крайности Я новичок в структурах данных, и домашнее задание на этой неделе потеряло меня, и я не знаю, куда обратиться за помощью. Изучать язык было легко, но я должен сказать, что программирование структур данных довольно сложно! Моя проблема? Я не знаю, как конкретизировать функции, которые я создал. Вот назначение для справки:

A подпись строки представляет собой целое число, полученное из этого строка. Для этого назначения вы создадите подпись для строк начиная с общей суммы нуля и, для каждого символа (назовите его с) в строке обновите сумму, используя: total = total*2 + static cast<int>(c);

Примечание. Символы строки s могут быть доступны следующим образом:

for (string::size_type index = 0; index <s.length(); ++index)
   //process char s[index]

Создать контейнерный класс, в котором хранится коллекция строк. У класса должно быть три открытых члена: конструктор, который инициализирует пустая коллекция, функция вставки, которая добавляет одну строку в коллекция и функция, которая получает значение данных / строки и возвращает одно из значений данных (строка / слово) в коллекции - в частности, значение, подпись которого численно ближе всего к подпись параметра. Примечание: класс должен не хранить подписи всех данных (он должен рассчитываться по мере необходимости, используя частный метод). Также предоставьте основную функцию и любой другой код / ​​инструменты для завершите программу, которая проверяет ваш класс.

Как должен выглядеть выделенный набор функций? Как мне начать? Я застрял!

Я на правильном пути? Как я могу конкретизировать свои функции, чтобы точно отразить указанное назначение? Спасибо!

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

//c = 0;
//total = total * 2 + static cast<int>(c);
//for (string::size_type index=0; index <s.length() ; ++index) //process char s[index]

class Container
{
public:
    Container();
    string insert();
    string returns();
    string a[100];
    int size = 0;

private:
    int calculateSignature();



};

Container::Container()
{


}

string Container::insert()
{
    int size = 0;

    while (true)
    {
        string word;
        cout << "Enter a string." << endl;
        cin >> word;
        if ("xyzzy" == word) break;
        a[size] = word;
        ++size;

    }

}

string Container::returns()
{
    for (int a = 0; a < 100; size - 1);


}

int Container::calculateSignature()
{


}



int main()
{
    return 0;

}

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете интерпретировать это так же, как и в случае с проблемой слов в математическом классе: буквально переведите каждую строку:

Создать контейнерный класс, в котором хранится коллекция строк.

Я использую вектор, потому что мы не знаем, сколько строк мы будем хранить. Если вам необходимо использовать массив, и вы знаете, что максимальное количество строк НИКОГДА не превысит 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;
    }
};

Хорошо, теперь нам просто нужно выяснить, что делает извлечение:

... функция, которая получает значение данных / строки и возвращает ... значение, сигнатура которого численно ближе всего к сигнатуре параметра

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

Я оставлю это для вас, но это не сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...