Итоговый отчет
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 53 из 56.
Финальная возможность: вместо одной категории запустите весь квиз и сформируйте сводку по каждой категории в конце.
Вы будете опираться на все главы сразу: деструктуризация кортежей для итерации, «мягкое оценивание» из главы о строках, словари со значениями по умолчанию из главы о словарях, отсортированная итерация для детерминированного вывода.
Создайте счетчики для каждой категории в виде двух параллельных словарей:
var totals: [String: Int] = [:]
var rights: [String: Int] = [:]Увеличивайте totals[cat, default: 0] += 1 для каждого вопроса; увеличивайте rights[cat, default: 0] только при правильном ответе. В конце переберите категории в алфавитном порядке, чтобы вывести отчет.
Задание
СреднеТот же банк из шести вопросов из предыдущего урока. Прочитайте шесть ответов из stdin, по одному в строке, в том же порядке, что и в банке. Используйте мягкое оценивание (lenient grading).
Выведите в следующем порядке:
- По одной строке на категорию, отсортированных по алфавиту, в формате
<category>: <right>/<total> - Одну финальную строку:
Total: <right>/<total>по всему прогону
Для входных данных 4 / 3.14 / Paris / Atlantic / green / WATER вывод будет следующим:
geo: 1/2
math: 2/2
science: 2/2
Total: 5/6Шпаргалка
Используйте два параллельных словаря для отслеживания баллов по категориям:
var totals: [String: Int] = [:]
var rights: [String: Int] = [:]
// Для каждого вопроса с категорией cat:
totals[cat, default: 0] += 1
// При правильном ответе:
rights[cat, default: 0] += 1Обойдите категории в алфавитном порядке, используя sorted() для детерминированного вывода:
for cat in totals.keys.sorted() {
let r = rights[cat, default: 0]
let t = totals[cat]!
print("\(cat): \(r)/\(t)")
}Вычислите общие итоги по всем категориям, суммируя значения словаря:
let totalRight = rights.values.reduce(0, +)
let totalAll = totals.values.reduce(0, +)
print("Total: \(totalRight)/\(totalAll)")Попробуйте сами
let questions: [(String, String, String)] = [
("math", "2 + 2?", "4"),
("math", "Value of pi to 2 decimals?", "3.14"),
("geo", "Capital of France?", "Paris"),
("geo", "Largest ocean?", "Pacific"),
("science", "Color of grass?", "green"),
("science", "H2O is?", "water")
]
// TODO: прочитать 6 ответов; нестрогое оценивание; сформировать итоги/правильные ответы по категориям;
// вывести отсортированные строки сводки + Total
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря