Результаты теста
Добро пожаловать на последний урок курса по C++! В нём вы соберёте вместе всё, чему научились, и шаг за шагом напишете одну полезную программу: результаты теста, которые учитель математики выводит после проверки работ. Когда вы закончите, программа будет выводить такое:
Макс не учится в этом классе.
РЕЗУЛЬТАТЫ ТЕСТА
Адам, баллы: 45, оценка A
Эмма, баллы: 41, оценка B
Тимур, баллы: 50, оценка A
Павел, баллы: 17, оценка F
Лиза, баллы: 38, оценка B
Средний балл: 38.2
Лучший: Тимур (баллы: 50)
Не сдали: 1Программа выводит результат и оценку каждого ученика, считает средний балл, находит лучшего ученика, начисляет всем бонусные баллы и исправляет ошибку в результате одного из учеников. Вы будете использовать переменные, условия, векторы, циклы, функции, ссылки и строки: всё, что было в курсе. Каждое упражнение продолжает предыдущее (редактор открывается с его готовым кодом) и добавляет одну часть.
Данные. Результаты лежат в начале main(), в двух векторах. Вектор names хранит имена учеников, а вектор scores — сколько баллов набрал каждый из них (максимум 50). Элементы с одним и тем же индексом относятся друг к другу: names[0] — это "Адам", а scores[0] — его результат, 42. Индекс 1 принадлежит Эмме с 38 баллами, и так далее. В настоящей школе данные поступали бы из школьной онлайн-системы. Здесь программы берут данные из переменных.
План. Программа разбита на функции, у каждой — одна задача. Пока функция одна: printResults(), она выводит результаты для векторов, которые получает в аргументах. Пока что она выводит только заголовок. Она стоит над main(), потому что функция должна встречаться в программе раньше того места, где её вызывают. Это обычный вид программы: функции сверху, а main(), который их использует, внизу.
Оба параметра — константные ссылки. Благодаря & функция работает с векторами из main() напрямую, и ничего не копируется. Благодаря const она их только читает и не может изменить. Для вывода этого достаточно. У параметров те же имена, что и у векторов в main(): так делать не обязательно, но за кодом проще следить.
Вам нужны элементы обоих векторов с одним и тем же индексом. Поэтому проходите по ним циклом с индексом, а не циклом for (int score : scores), который даёт значения только одного вектора. Напоминание (внутри main()):
std::vector<std::string> subjects = {"Математика", "Физика", "История"};
std::vector<int> lessons = {4, 2, 2};
for (int i = 0; i < subjects.size(); i++) {
std::cout << subjects[i] << " — уроков в неделю: " << lessons[i] << std::endl;
}Математика — уроков в неделю: 4
Физика — уроков в неделю: 2
История — уроков в неделю: 2Условие — i < subjects.size(), а не <=. Последний индекс — это size() - 1, поэтому при <= цикл полез бы за элементом, которого в векторе нет.
Задание
- 1
В
printResults()под строкой, которая выводит заголовок, напишите циклforс переменнойi, которая начинается с0и растёт, покаiменьшеnames.size(). В цикле выводите имя каждого ученика (names[i]) на отдельной строке. - 2
Дополните строку в цикле, чтобы после имени выводился ещё и результат: после имени — запятая и пробел, слово
баллы, двоеточие, пробел, а затемscores[i]. Программа выводит:РЕЗУЛЬТАТЫ ТЕСТА Адам, баллы: 42 Эмма, баллы: 38 Тимур, баллы: 48 Павел, баллы: 14 Лиза, баллы: 27