2011-01-28 2 views
0

У меня возникли проблемы с упражнением в ускоренном 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)); 
} 

Тогда, по-видимому, можно получить функция write_analysis работает, что, похоже, не для меня. Я попытался

double analysis(const Student_info& s) 
{ 

optimistic_median(s); 

} 

Но это не работает. Любой, кто может помочь?

+0

Вы можете правильно отформатировать свой код, отложив его в четыре пробела. –

+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 из них, это то, что вы передаете в.

Я думаю, что ваша функция анализа следует принять 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