Tidemanの投票機能(CS50のpset 3)

Aug 23 2020

私は投票機能に対処しようとしていますが、あなたの助けを求めたい2つの質問があります。

  1. 投票関数の定義には、次のものがあります。
bool vote(int rank, string name, int ranks[])

ランクパラメータの目的と、なぜここで宣言されているのかわかりません。

  1. 投票機能の私の解決策は次のとおりです。
// Update ranks given a new vote
bool vote(int rank, string name, int ranks[])
{
    for (int j = 0; j < candidate_count; j++)
    {
        for (int k = 0; k < candidate_count; k++)
        {
            //Compare the name provided by the user with the name of the candidates numbered jth in the array candidates[MAX] which already populated above
            if (strcmp(name, candidates[k]) == 0)
            {
                ranks[j] = k;
                printf("ranks[%d] = %d\n", j, k);
                }
        }
        return true;
    }
    return false;
}

次のようなprintf関数の結果(候補= {a、b、c}、voter_count = 2):

ランク1:a、ランク[0] = 0; ランク2:b、ランク[0] = 1; ランク3:c、ランク[0] = 2; ランク1:c、ランク[0] = 2; ランク2:b、ランク[0] = 1; ランク3:a、ランク[0] = 0

ランク[j]のjの値は更新されませんでした。この問題を解決するにはどうすればよいですか?

あなたの助けをどうもありがとう!

回答

ManavDubey Aug 23 2020 at 23:35

ここにいくつかのコードがあります:

// Update ranks given a new vote    
bool vote(int rank, string name, int ranks[]){                      
    
    //We want to cycle through the list of candidates given
    for(int i = 0; i < candidate_count; i++){

        //If the candidate(s) in the array matches with string name, we will continue
        if(strcmp(candidates[i], name) == 0){

            //This is the tricky part to understand. Read below for answer.
            ranks[rank] = i;
            return true;
        }
    }
    
    return false;
}

int rank候補者に対するユーザーの指定されたランクを表し、int iの候補者の位置を表しますcandidates[]ranks[]正しいランクに合わせて更新したい。これはまだ理解するのがかなり混乱しているので、ここに例があります。


ジョン、ジム、サム、アレックスの4人の候補者がいます

string candidates[MAX];、ジョンはにcandidates[0]、ジムはにcandidates[1]、サムはにcandidates[2]、アレックスはにいcandidates[3]ます。

ユーザーが投票し、次の順序で投票するとします。

  1. アレックス
  2. ジョン
  3. ジム
  4. サム

で実行してみましょうbool vote(int rank, string name, int ranks[])

  1. vote(j, name, ranks)ここで、j = 0name = Alex、およびranksはranks []です。
  2. で見つかるまで、名前Alexをループしcandidates[MAX]ます。
  3. Alexはcandidates[i]i = 3の場所にあります。
  4. 更新したい ranks[]
  5. ranks[rank] = i;つまり、atranks[rank]は3であるiに等しいということです。言い換えると、ranks [0]はcandidates[MAX]。のAlexのi番目の位置に等しいということです。

次に、すべての投票者のランキングが完了するまで、このサイクルを繰り返します。