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>..){...}

次に、メインの適切な引数を使用して関数を呼び出します。

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..)

  • 最初のものと同様に、すべてのデータメンバーを保持する構造体を作成してから、その構造体を(refによって)各関数に渡します。

 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の方法は、おそらく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 に答える