Menu
Coddy logo textTech

Итоговый отчет

Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 53 из 56.

Финальная возможность: вместо одной категории запустите весь квиз и сформируйте сводку по каждой категории в конце.

Вы будете опираться на все главы сразу: деструктуризация кортежей для итерации, «мягкое оценивание» из главы о строках, словари со значениями по умолчанию из главы о словарях, отсортированная итерация для детерминированного вывода.

Создайте счетчики для каждой категории в виде двух параллельных словарей:

var totals: [String: Int] = [:]
var rights: [String: Int] = [:]

Увеличивайте totals[cat, default: 0] += 1 для каждого вопроса; увеличивайте rights[cat, default: 0] только при правильном ответе. В конце переберите категории в алфавитном порядке, чтобы вывести отчет.

challenge icon

Задание

Средне

Тот же банк из шести вопросов из предыдущего урока. Прочитайте шесть ответов из stdin, по одному в строке, в том же порядке, что и в банке. Используйте мягкое оценивание (lenient grading).

Выведите в следующем порядке:

  1. По одной строке на категорию, отсортированных по алфавиту, в формате <category>: <right>/<total>
  2. Одну финальную строку: 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком