Перейти к содержимому
Topos Uranos

Краткое содержание

Этот урок открывает шестой раздел курса, посвящённый составным данным. Он объясняет, для чего нужен раздел: научить представлять коллекции данных (последовательности фиксированного и переменного размера, таблицы и записи) и обрабатывать их базовыми алгоритмами, написанными вручную и взятыми из библиотеки, оценивая их сложность; представляет шесть его уроков и нить, которая их связывает; напоминает, что раздел считает известным, прежде всего циклы с инвариантом и передачу по константной ссылке; формулирует задачу, которую решает раздел, задачу программы, которая должна хранить данные в заранее неизвестном количестве и которая, будучи написанной с отдельными переменными, молча пропускает лишние; заранее вводит сложность как вторую меру алгоритма наряду с его корректностью; и показывает, куда ведёт раздел, в следующих разделах и в курсе «Программирование на C++ II».

Цели обучения

  1. Описывать последовательность содержания раздела и объяснять, что каждый урок даёт следующему.
  2. Вспомнить циклы, их инварианты и передачу параметров (по значению, по ссылке и по константной ссылке) и при необходимости повторить их.
  3. Заранее понять на примере сложность алгоритма как вторую меру его качества наряду с его корректностью.
  4. Понимать, что ожидается уметь по окончании раздела, и отличать это от того, что будет изучено в следующих разделах.

Входная проверка

Прежде чем проходить раздел, полезно определить исходный уровень. Эта проверка является самопроверкой: она не оценивается, и её единственная цель состоит в том, чтобы направить занятия. Первые четыре вопроса касаются того, что раздел считает известным: инварианта цикла, который ищет максимум, способа передачи большого параметра, числа итераций двух вложенных циклов и беззнаковой арифметики. Следующие шесть в порядке уроков касаются центральных идей раздела: допустимых индексов последовательности, создания вектора, числа делений размера пополам, поиска в упорядоченных данных, двойного индекса таблицы и опасности хранить в отдельных коллекциях данные одной и той же сущности. Никто не обязан пока отвечать на них верно, а в некоторых из них «пока не знаю» является честным ответом: каждый ответ, верный или нет, объясняет суть дела и называет урок, где она разбирается. Те же умения измеряются снова в конце, в уроке итогов.

Входная проверка

Перед началом раздела оцени свою отправную точку. Это короткая самопроверка: она не оценивается, а результат хранится только в твоём браузере.

  1. Вопрос 1Из предыдущих разделовФрагмент int largest{0}; int t{}; while (std::cin >> t) { if (t > largest) { largest = t; } } должен оставить в largest наибольшую из прочитанных температур. На каких входных данных он ошибается?

  2. Вопрос 2Из предыдущих разделовФункция подсчитывает, сколько гласных в тексте из миллиона символов, хранящемся в std::string, и не изменяет его. Как лучше объявить её параметр?

  3. Вопрос 3Из предыдущих разделовСколько раз выполняется ++count в for (int i{0}; i < 6; ++i) { for (int j{0}; j < i; ++j) { ++count; } }?

  4. Вопрос 4Из предыдущих разделовЧто выводит std::println("{}", 0u - 1); в системе, где unsigned int имеет 32 бита?

  5. Вопрос 5В последовательности из nn элементов, занумерованных как в C++, какие индексы ii обозначают элемент?

  6. Вопрос 6Что содержит v после std::vector<int> v(3, 7);?

  7. Вопрос 7Сколько итераций делает for (int m{1024}; m > 1; m /= 2) { ... }?

  8. Вопрос 8В телефонном справочнике миллион имён в алфавитном порядке. Чтобы найти одно из них, справочник открывают посередине, отбрасывают половину, где имени быть не может, и повторяют то же с другой половиной. Сколько раз, самое большее, придётся его открыть?

  9. Вопрос 9При std::vector<std::vector<int>> t{{1, 2, 3}, {4, 5, 6}}; чему равны t[1][0] и t.size()?

  10. Вопрос 10Программа хранит имена группы в одном векторе, а их оценки в другом, так что оценка grades[i] принадлежит names[i]. Что произойдёт, если отсортировать только вектор оценок?