Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, c-smile, Вы писали:
P>В моей книжке вот эта строчка:
P>
P> double final_grade = students[i].grade;
P>
P>Выглядит так:
P>
P> double final_grade = grade(students[i]);
P>
Вот. Дьявол он в деталях.
Тут люди уже чуть морды бить не начали и теории тотального шастя возводить, а оказывается тот try/catch там вообще не нужен. Нигде.
P>Страница 90, вверху.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, varnie, Вы писали:
CS>>>>>А где там ошибка может быть? С одним студентом.
P>>>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>>>Где?
V>>кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
CS>Что? (сходится)
CS>Где там в теле цикла может генерироваться std::domain_error ?
на 78 стр. имплементирована ф-ция grade
/*
вычисляем итоговую оценку студента на основе оценок, полученных на экзаменах в середине и конце семестра,
а также на основе вектора оценок за выполнение домашних заданий,
эта ф-ия не копирует свой аргумент, т.к. ф-ция median делает это за нас.
*/double grade(double midterm, double final, const vector<double>& hw)
{
if (hw.size() == 0)
throw domain_error("студент не сделал ни одного домашнего задания");
return grade(midterm, final, median(hw));
}
которая и генерирует исключение в случае отсутствия выполненных заданий у студента
да, по логике описания к примеру очень подходит! теперь этот пункт ясен.
а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.
Здравствуйте, varnie, Вы писали:
V>Здравствуйте, Pretender, Вы писали:
V>да, по логике описания к примеру очень подходит! теперь этот пункт ясен. V>а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.
Этого я и не приметил. Думаю, это какая-нибудь ошибка переписчика. Незнаю этому оправдание.
Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, varnie, Вы писали:
V>>хочу узнать, почему бы не сделать вот так:
P>Потому что ошибка с одним студентом не должна означать, что обработка студентов прервана. В твоём же примере первое же исключение прервёт цикл.
А где там ошибка может быть? С одним студентом.
try (при данном коде) лучше действительно вынести за пределы цикла.
Можно сделать по разному ... и будет работать.
А разница в том, что в первом примере при возникновении исключения цикл не прервется, а во втором, при возникновении исключения цикл прерывается и дальнейшего перебора нет.
Вывод: первый пример (из книги) более правильный. (Кстати второй пример более быстрый с точки зрения кода)
Доброго времени суток! Мир Вам! С уважением Clevelus.
Если мой ответ понравился — оцените, ни на что не влияет, но будет приятно.
Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, c-smile, Вы писали:
CS>>А где там ошибка может быть? С одним студентом.
P>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Pretender, Вы писали:
P>>Здравствуйте, c-smile, Вы писали:
CS>>>А где там ошибка может быть? С одним студентом.
P>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>Где?
кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
Здравствуйте, varnie, Вы писали:
CS>>>>А где там ошибка может быть? С одним студентом.
P>>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>>Где?
V>кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
Что? (сходится)
Где там в теле цикла может генерироваться std::domain_error ?
Здравствуйте, varnie, Вы писали:
CS>>Где там в теле цикла может генерироваться std::domain_error ?
V>на 78 стр. имплементирована ф-ция grade V>
V>/*
V>вычисляем итоговую оценку студента на основе оценок, полученных на экзаменах в середине и конце семестра,
V>а также на основе вектора оценок за выполнение домашних заданий,
V>эта ф-ия не копирует свой аргумент, т.к. ф-ция median делает это за нас.
V>*/
V>double grade(double midterm, double final, const vector<double>& hw)
V>{
V> if (hw.size() == 0)
V> throw domain_error("студент не сделал ни одного домашнего задания");
V> return grade(midterm, final, median(hw));
V>}
V>
V>которая и генерирует исключение в случае отсутствия выполненных заданий у студента
Давай я тебя уже тогда по английски спрошу если уж по русски не полючается понять.
Оставим этот косяк на совести Кёнига, может быть он просто забил на секундочку на опасность срезки или решил в учебном примере об этом вообще не запариваться. Давайте я поясню что имел в виду, ловя исключение внутри цикла. У нас есть список студентов. Для каждого нужно либо вывести среднюю оценку, либо строчку что он забил на учёбу Если вы поймаете исключение вне цикла, то если студент #3 забил на учёбу, то до студента #4 очередь просто не дойдёт.
Хочу также добавить что в production-quality code такой оверхед по времени выполнения на ситуацию, не являющуюся исключительной на самом деле (разве есть нечто исключительное в том, чтобы студент забил на занятия?) никто на ревью не пропустит. Так что в качестве домашнего задания можете переписать функцию grade так, чтобы она не кидала лишних исключений и соответственно убрать лишние try/catch из тела цикла.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Ну, если внимательно изучить текст, то я совершенно прав: C>>Вывод: первый пример (из книги) более правильный. (Кстати второй пример более быстрый с точки зрения кода)
Что касается скорости, то она критична только для realtime кода, да и то спорно на сколько второй код быстрее первого. С точки зрения кода, независимо от компилятора второй пример более быстрый. Но как показано в посте про оверхед — в "нормальном" компиляторе на скорости цикла практически не скажется. Что касается модуля try — то его нужно применять правильно и в общем во всех спорных участках кода, исходя из этого первый пример более правильный.