2011-01-28 11 views
0

Accelerated C++の練習に問題があります。次のように 主な機能は次のとおりC++の問題を加速する - 関数を呼び出す関数

int main() 
{ 
// students who did and didn't do all their homework 
vector<Student_info> did, didnt; 

// read the student records and partition them 
Student_info student; 
while (read(cin, student)) { 
    if (did_all_hw(student)) 
    did.push_back(student); 
    else 
    didnt.push_back(student); 
} 

// verify that the analyses will show us something 
if (did.empty()) { 
    cout << "No student did all the homework!" << endl; 
    return 1; 
} 
if (didnt.empty()) { 
    cout << "Every student did all the homework!" << endl; 
    return 1; 
} 


// do the analyses 
write_analysis(cout, "median", median_analysis, did, didnt); 
write_analysis(cout, "average", average_analysis, did, didnt); 
write_analysis(cout, "median of homework turned in", 
       optimistic_median_analysis, did, didnt); 

return 0; 
} 

機能write_analysisは、5つのパラメータ、その第三の、分析をとる関数です。次のように

書き込み分析は次のとおりです。

void write_analysis(ostream& out, const string& name, 
        double analysis(const vector<Student_info>&), 
        const vector<Student_info>& did, 
        const vector<Student_info>& didnt) 
{ 
out << name << ": median(did) = " << analysis(did) << 
       ", median(didnt) = " << analysis(didnt) << endl; 
} 

質問は楽観中央値であり、optimistic_median呼び出すための解析関数を記述するために読者を尋ねる:

double optimistic_median(const Student_info& s) 
{ 
vector<double> nonzero; 
remove_copy(s.homework.begin(), s.homework.end(), 
      back_inserter(nonzero), 0); 

if (nonzero.empty()) 
    return grade(s.midterm, s.final, 0); 
else 
    return grade(s.midterm, s.final, median(nonzero)); 
} 

その後、おそらく、1を得ることができますwrite_analysis関数が動作するようになっています。これは私のためにはないようです。 私は試しました

double analysis(const Student_info& s) 
{ 

optimistic_median(s); 

} 

しかし、それは動作しません。 誰でも手伝っていただけますか?

+0

4つのスペースをインデントすることで、コードの書式を正しく設定できます。 –

+0

将来は、コードスニペットを強調表示してCtrl + Kキーを押すか、エディタで '{}'ボタンを押すことでコードスニペットをフォーマットしてください。 – birryree

+0

「動作しません」と定義します。それは何をしますか、あなたは何を期待していますか? –

答えて

0

まず、分析関数に適切な名前を使用する必要があります。それはoptimistic_median_analysisになります。次に、ベクトルへの参照を取り込み、各アイテムを反復して、optimistic_median関数を適用する必要があります。

double optimistic_median_analysis(const vector<Student_info> &v) 
{ 
    return std::accumulate(v.begin(), v.end(), 0.0, optimistic_median)/v.size(); 
} 

これは、各生徒の平均を示しますが、必要な出力が正確には不明です。

0

あなたanalysis関数のパラメータは、あなたが渡しているもので、単一の学生ではなく、それらのvectorです。

私はあなたの分析機能がそれぞれ1を反復処理する、学生のvectorを受け入れるべきだと思います、各生徒のためにoptimistic_medianと呼んでください。

0
void write_analysis(ostream& out, const string& name, 
        double analysis(const vector<Student_info>&), 
        const vector<Student_info>& did, 
        const vector<Student_info>& didnt) 

ここで問題となるのは、関数をパラメータとして関数に渡そうとしていることです。あなたはそれを行うことはできません - 実際の関数ではなく、関数へのポインタを渡すことができます。

-1

私は練習をしており、これは正しい答えです。本の110ページに記載されているように、我々は "各グループの中央値のグレード"を報告しなければならない。楽観的な中央値群。

double optimistic_median_analysis (const vector<Student_info> &s) { 
    vector<double> optgrades; 
    transform(s.begin(), s.end(), back_inserter(optgrades), optimistic_median); 
    return median(optgrades); 
} 
+0

なぜ-1?これは正しいバージョンです。 – FRD

関連する問題