将此程序从 1 个功能转换为模块化的多功能程序?

问题描述

我对 C++ 非常陌生,并且有一个程序,我在下面包含了这个程序。

我正在开发的程序从输入文件中读取文本,并计算文本中每个字母的单词数和出现次数,然后打印结果。我的程序运行良好,但问题是所有代码都写在 main 函数中,我需要将它分解成几个函数以使程序模块化,但我不确定如何去做。

我相信这很简单,但我不确定从哪里开始。我正在考虑实现两个 void 函数,一个用于读取/解释从数据文件中读取的内容,另一个用于显示结果;然后在 main 函数中调用它们,但我不确定这些函数的参数是什么。

int main()
{
    // Declaring variables
    char c; // char that will store letters of alphabet found in the data file
    int count[26] = {0}; // array that will store the # of occurences of each letter
    int words = 1; // int that will store the # of words
    string s; // declaring string found in data file

    // Opening input file stream
    ifstream in;
    in.open("word_data.txt");

    // Reading text from the data file
    getline(in,s);
    //cout << s << endl;

    // If input file fails to open,displays an error message
    if (in.fail())
    {
        cout << "Input file did not open correctly" << endl;
    }


    // For loop for interpreting what is read from the data file
    for (int i = 0; i < s.length(); i++) {

        // Increment word count if new line or space is found
        if (s[i] == ' ' || s[i] == '\n')
            words++;

        //If upper case letter is found,convert to lower case.
        if (s[i] >= 'A' && s[i] <= 'Z')
            s[i] = (tolower(s[i]));

        //If the letters are found,increment the counter for each letter.
        if (s[i] >= 'a' && s[i] <= 'z')
            count[s[i] - 97]++;
    }


    // Display the words count
    cout << words << " words" << endl;

    // Display the count of each letter
    for (int i = 0; i < 26; i++) {
        if (count[i] != 0) {
            c = i + 97;
            cout << count[i] << " " << c << endl;
        }
    }
         
    // Always close opened files
    in.close();

    return 0;

}

解决方法

我会像这样重写它:

class FileReader {
public:
    FileReader() {
        // Any init logic goes here...
    }
    ~FileReader() {
        // Always close opened files.
        in.close();
    }

    void open(std::string &filePath) {
        in.open(filePath);
    }

    std::string readLine() {
        std::string s;
        getline(in,s);
        return s;
    }

    bool hasErrors() const { // remove const if you get compile-error here.
        return in.fail();
    }

private:
    ifstream in;
};

class LetterCounter {
public:
    void process(std::string &s) {
        // For loop for interpreting what is read from the data file
        for (int i = 0; i < s.length(); i++) {
            // Increment word count if new line or space is found
            if (s[i] == ' ' || s[i] == '\n')
                words++;

            //If upper case letter is found,convert to lower case.
            if (s[i] >= 'A' && s[i] <= 'Z')
                s[i] = (tolower(s[i]));

            //If the letters are found,increment the counter for each letter.
            if (s[i] >= 'a' && s[i] <= 'z')
                count[s[i] - 97]++;
        }
    }

    void logResult() {
        char c; // char that will store letters of alphabet found in the data file.

        // Display the words count
        cout << words << " words" << endl;

        // Display the count of each letter
        for (int i = 0; i < 26; i++) {
            if (count[i] != 0) {
                c = i + 97;
                cout << count[i] << " " << c << endl;
            }
        }
    }

private:
    int count[26] = {0}; // array that will store the # of occurences of each letter
    int words = 1; // int that will store the # of words
};

int main()
{
    // Opening input file stream.
    FileReader reader;
    reader.open("word_data.txt");

    // Reading text from the data file.
    std::string s = reader.readLine();

    // If input file fails to open,displays an error message
    if (reader.hasErrors()) {
        cout << "Input file did not open correctly" << endl;
        return -1;
    }

    LetterCounter counter;
    counter.process(s);
    // Display word and letter count.
    counter.logResult();
    
    return 0;
}

注意我没有测试就写了(原谅任何错误),
但这应该可以让您大致了解它应该如何。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...