0

我的代码已经在工作了,在这里看到:http: //pastebin.com/mekKRQkG

现在,我的函数可以工作,但globally我猜想使用我声明的信息,并且我想将它们转换为如上所示的格式lines 11-15,但我不确定如何将它们转换为这样做。简而言之,我正在尝试将我的功能转换为

"void add_county_election_file"

格式为

"void add_county_election_file(const string, const vector &, const vector &, const vector &, const vector &)"

我不知道从哪里开始,甚至不知道如何开始。

有人可以帮助我并向我展示如何为第一个功能执行此操作,以便我可以全面实施它吗?

多谢你们!

4

5 回答 5

1

您的函数声明应如下所示:

void add_county_election_file(const string, vector<int>&, vector<string>..);

确保你的向量模板的参数列表是正确的(这是你放在 <> 之间的类型)

然后将您的函数的实现与声明相匹配:

   void add_county_election_file(const string, vector<int>&, vector<string>..){...}

现在在 main 中使用适当的 argumentmtns 调用您的函数:

string s;
vector<int> arg;
vector<string> sv;
void someFunction (s, arg, sv ...);
于 2012-11-05T06:02:09.407 回答
1

我认为您在声明的功能方面做得正确 void add_county_election_file(const string, vector<int>&, vector<int>&,..);

所以您只需要使用所需的参数调用上述函数,因为现在您没有传递参数并且您当前的定义不接受任何参数。

作为一个很好的做法,在你的int main()函数中你可以使用switch而不是使用if else.

于 2012-11-05T06:06:49.627 回答
0
  • 将变量和函数存储在一个类中,重载运算符并创建函数来访问这些变量。
  • 声明所有变量int main()并设置要传递给每个函数的参数,例如

    void print_results() 被修改为

    void print_results(std::vector<int> vec, int nCount, etc..)

  • 与第一个类似,创建一个结构来保存所有数据成员,然后将结构(通过引用)传递给每个函数。

 struct CountryTracker
    {
        std::vector<int> ID;
        std::string name;
        //etc...
    }
`void print_results(CountryTracker& Obj) //pass single struct into functions`
于 2012-11-05T05:57:59.820 回答
0

执行此操作的 OOP 方法是创建一个名为 maybe 的类ElectionInfo,其中:

这些将是它的成员字段:

vector <string> countyNameVector;
vector <int> countyNCount;
vector <int> countyFCount;
vector <int> countyOCount;
int NCount;
int FCount;
int OCount;
int NTotal;
int FTotal;
int OTotal;

这些将是它的成员函数:

void add_county_election_file(const string);
void search_county(const string);
void print_results();

这样,您根本不必将引用传递给向量,而是您可以这样做:

ElectionInfo an_elect_info;
char selection = get_menu_choice();

// some if-statements to decide which of the following to call:

an_elect_info.add_county_election_file(county_name);
an_elect_info.search_county(county_name);
an_elect_info.print_results();

但是,如果您更愿意使用当前的功能方法:

在 main 方法中声明并初始化以下内容:

vector <string> countyNameVector;
vector <int> countyNCount;
vector <int> countyFCount;
vector <int> countyOCount;
int NCount;
int FCount;
int OCount;
int NTotal;
int FTotal;
int OTotal;

注释掉的函数声明的语法应调整为如下所示:

void add_county_election_file(const string, vector<string>&, vector<int>&, vector<int&, vector<int>&);

(当然定义也要跟上)

你会像这样调用它:

add_county_election_file(countyname, countyNameVector, countyNCount, countyFCount, countyOCount);

对象自动通过引用传递。

于 2012-11-05T06:04:46.833 回答
0

重构的基本过程首先应该只涉及代码分组和放置,并且应该只涉及编写新逻辑的最低限度。以此为原则,您可以首先按以下方式修改代码。

string ReadInputString(const char* title)
{
    string s

    cout << title;
    cin >> s;

}

void add_county_election_file(const std::string& filename
    , std::vector<string>& countyNameVector
    , std::vector<int>& countyNCount
    , std::vector<int>& countyFCount
    , std::vector<int>& countyOCount
    )
{
        int NCount = 0;
        int FCount = 0;
        int OCount = 0;
        int NTotal = 0;
        int FTotal = 0;
        int OTotal = 0;
        char vote;
    std::ifstream input((filename).c_str());
    string countyName;
    if(input.is_open())
        {
        input >> countyName;
        countyNameVector.push_back(countyName);
        while(input >> vote)
                        {
                        if(vote == 'N' || vote == 'n')
                                {
                NCount = NCount + 1;
                }
                                else if(vote == 'F' || vote == 'f')
                                        {
                                        FCount = FCount + 1;
                                        }
                                        else
                                                {
                                                OCount = OCount + 1;
                                                }
                        }
            countyNCount.push_back(NCount);
            countyFCount.push_back(FCount);
            countyOCount.push_back(OCount);
        }
        cout << countyName << endl;
}

void add_county_election_file()
{
  string fn = ReadInputString("Enter the county file to process: ");
  add_county_election_file(fn,g_countyNameVector,g_countyNCount,g_countyFCount,g_countyOCount);
}

如您所见,我刚刚提取了您的代码并将它们移动到单独的函数中并更改了名称以具有一定的意义。就像函数 ReadInputString 一样——“cin >> s”行最初是“cin >> filename”。抽象名称“s”表示 ReadInputString 不知道或不关心它从控制台读取的字符串的语义含义。

为了不更改您的主要功能 - 我添加了一个重载的 add_county_election_file ,它调用一个函数,然后调用另一个函数。这个想法是你应该保持一些不变并改变其他的(永远),然后在需要时交替。而且我已经更改了全局变量的名称,以使用“g_”将它们与局部变量区分开来——关键是“g_”只能在代码中的极少数地方找到。

于 2012-11-05T06:08:56.573 回答