29. Студенты30. Loot Box31. Адреса32. Титаник

29. Студенты

Ссылка для тренировки

С++

Опишите структуру с именем Student, содержащую следующие поля:

Напишите программу, в которой выполните следующие действия :

  1. Создайте массив/вектор студентов, состоящий из десяти структур типа Student и заполните его некоторыми данными по своему усмотрению;

  2. Для вывода на экран информации об одном студенте перегрузите оператор << для пары типов std::ostream и Student. Информация должна выводится в следующем виде, например:

  3. Для вывода на экран информации о нескольких студентах перегрузите оператор << для пары типов std::ostream и std::vector<Student>. Информация должна выводится в следующем виде, например для вектора из двух студентов:

  4. Для сортировки студентов используйте шаблон функции принимающий вектор из задания Шаблон BozoSort . Для этого перегрузите оператор сравнения > (или тот который использован в шаблоне функции) для пары типов Student и Student. При этом считается, что студент a больше студента b, если поле name студента a лексикографически больше поля name студента b, группа и оценки не играют роли.

    Примечание: std::string сравнивает строки лексикографически.

  5. Выведите в консоль данные о всех студентах, имеющих оценку 2 хотя бы по одному из экзаменов. Студенты должны быть отсортированы по возрастанию;

  6. Затем, в отдельно строке, выведите слово "Expulsion" и следом информацию об одном рандомно выбранном студенте из списка двоечников.

  7. Если студентов двоечников нет, выведите сообщение: "Not found".

Формат ввода
Нет ввода

Формат вывода
Согласно заданию.

Пример 1

Вывод
+-----------+-------+------+------+------+------+
| Name      | Group | Math | Phys | Hist | Prog |
+-----------+-------+------+------+------+------+
| Akihiko K | 1     | 5    | 2    | 2    | 5    |
+-----------+-------+------+------+------+------+
| Carmack J | 3     | 5    | 4    | 2    | 5    |
+-----------+-------+------+------+------+------+
| Kojima H  | 9     | 3    | 2    | 4    | 4    |
+-----------+-------+------+------+------+------+
| Persson М | 3     | 2    | 3    | 4    | 3    |
+-----------+-------+------+------+------+------+
Expulsion
+-----------+-------+------+------+------+------+
| Name      | Group | Math | Phys | Hist | Prog |
+-----------+-------+------+------+------+------+
| Persson М | 3     | 2    | 3    | 4    | 3    |
+-----------+-------+------+------+------+------+

Пример 2

Вывод
Not found

 

30. Loot Box

Ссылка для тренировки

С++

Реализуйте структуру Item состоящую из 2 частей:

  1. Элемент типа ItemType;

  2. Объединение (union) состоящее из 4 элементов:

    • Элемент типа Сoin;
    • Элемент типа Rune;
    • Элемент типа Weapon;
    • Элемент типа Armor.

ItemType — перечисление (тут и далее enum class), которое может принимать одно из 4х значений: СOIN, RUNE, WEAPON, ARMOR. Применяется для того, чтобы запомнить, что именно хранит структура Item. Сoin — структура состоящая из:

Rune — структура состоящая из:

Weapon — структура состоящая из:

Armor — структура состоящая из:

Вектору из элементов типа Item назначьте псевдоним LootBox. В дальнейшем коде используйте этот псевдоним.

Для работы с LootBox реализуйте функцию:

При этом каждый из предметов генерируется в соответствии с вероятностью указанной в таблице:

Тип предметаПараметрыВероятность, %
Coincount = 100050
Runelevel = 1; element = FIRE6
Runelevel = 1; element = WATER13
Runelevel = 1; element = EARTH7
Runelevel = 1; element = AIR14
Runelevel = 5; element = FIRE0.6
Runelevel = 5; element = WATER1.3
Runelevel = 5; element = EARTH0.7
Runelevel = 5; element = AIR1.4
Runelevel = 10; element = FIRE0.06
Runelevel = 10; element = WATER0.13
Runelevel = 10; element = EARTH0.07
Runelevel = 10; element = AIR0.14
Weapondamage = 100; critical = 0; durability = 1001.4
Weapondamage = 75; critical = 50; durability = 1001.4
Armorguard = 50; durability = 1002.8
Как генерировать

Для работы с вышеуказанными типами перегрузите операторы:

  1. Оператор префиксный ++ для типа Item. Оператор должен изменять содержимое переменной к которой применяется на случайное (в соответствии с таблицей) и возвращать новое значение.

  2. Оператор << для пары типов LootBox и Item. Оператор должен добавлять Item в LootBox и возвращать изменённый LootBox.

  3. Оператор << для пары типов std::ostream и Item. Выводит в поток информацию о предмете, в зависимости от того, что находится в Item. Вывод оформить по своему желанию (например так):

  4. Оператор << для пары типов std::ostream и LootBox. Выводит на экран все три предмета находящиеся в лутбоксе.

В основном коде программы:

  1. По максимуму используйте перегруженные операторы, в том числе и внутри других операторов.

  2. Выведите сообщение: "Открыть лутбокс? Yes/No".

  3. Если пользователь введёт Y или Yes (и маленькими тоже):

    • Создать и вывести на экран содержимое лутбокса;
    • Перейти к пункту 1.
  4. Если пользователь введёт N или No (и маленькими тоже) - завершить программу.

  5. При любом другом вводе - перейти к пункту 1.

Формат ввода В ответ на вопрос: "Открыть лутбокс? Yes/No". В одной строке вводится слово состоящее из латинских символов.

Формат вывода Согласно заданию.

Пример

Вывод
Открыть лутбокс? Yes/No
y
1000 gold
1000 gold
1000 gold
Открыть лутбокс? Yes/No
yes
1000 gold
Rune of air 5 lvl
1000 gold
Открыть лутбокс? Yes/No
yep
Открыть лутбокс? Yes/No
No

 

31. Адреса

Ссылка для тренировки

С++

Часть I.

Переопределите оператор << для пары типов std::ostream и std::vector<int>, при этом оператор должен принимать std::vector<int> по константной ссылке. По ссылке, чтобы НЕ создавать копию передаваемого аргумента, по константной, чтобы можно было передавать временные объекты (например полученные как результат из другой функции).
Оператор должен выполнять следующие действия (весь вывод в одну строку):

  1. Отправлять в поток размер вектора, табуляцию, символ | и пробел;
  2. Отправлять в поток адреса всех элементов вектора разделяя их пробелом. Адрес, всё так же берётся, с помощью оператора взятия адреса (&).

В функции main создайте пустой std::vector<int> и откройте файл "data.txt" для ввода, затем в цикле 64 раза выполните следующие действия:

  1. Добавьте один любой элемент в вектор;
  2. Воспользуйтесь оператором <<, чтобы сохранить данные в файл;

Запустите программу и после её выполнения изучите "data.txt". Попарно сравните адреса элементов вектора с одинаковыми индексами (если в вашем текстовом редакторе включена функция переноса строк, то её нужно отключить).

Вопрос 1. Попытайтесь объяснить увиденную закономерность.
Вопрос 2. Если запомнить адрес нулевой ячейки вектора при его длине 15 элементов, а затем внести изменения по запомненному адресу при длине вектора 25 элементов. Изменится ли значение нулевой ячейки вектора? Объяснить почему.

Часть II

После первого цикла добавьте ещё один, в котором выполните следующие действия, пока вектор не станет пустым:

  1. Удалите последний элемент вектора (метод pop_back());
  2. Воспользуйтесь оператором <<, чтобы сохранить данные в файл;

Запустите программу и после её выполнения изучите "data.txt".

Вопрос 3. Попытайтесь объяснить увиденную закономерность.

Часть III

Внесите изменения в оператор << теперь он должен принимать std::vector<int> по значению.

Запустите программу и после её выполнения изучите "data.txt".

Вопрос 4. Есть ли отличия от результатов полученных во 2й части задания? Объяснить почему.

Все ответы добавьте в виде комментариев в исходный код.

Формат ввода Ввод отсутствует.

Формат вывода Согласно заданию.

Пример

data.txt (фрагмент)
1	| 01178D68 
2	| 0117DCE8 0117DCEC 
3	| 0117DD58 0117DD5C 0117DD60 
4	| 01174E20 01174E24 01174E28 01174E2C 
5	| 01175B60 01175B64 01175B68 01175B6C 01175B70 
6	| 01175B60 01175B64 01175B68 01175B6C 01175B70 01175B74
...

 

32. Титаник

Ссылка для тренировки

С++

Скачайте и изучите файл "train.csv" расположенный в каталоге "data" в этом репозитории. Описание формата CSV.

На основании файла "data_dictionary.txt" создайте структуру Passenger для хранения одной записи из файла "train.csv".

Перегрузите оператор >> для пары типов std::istream и std::vector<Passenger>. Способ каким оператор >> должен принимать std::vector<Passenger> определите самостоятельно, если известно, что:

Оператор >> должен заполнять вектор std::vector<Passenger> значениями из файл "train.csv", первая заголовочная строка пропускается (например с помощью ignore). Если при чтении очередной строки какие-то данные в ней отсутствуют, то для них устанавливается значение по умолчанию (0 - для чисел и пустая строка для строк).

Обратите внимание:

  1. В качестве разделителя ячеек используется символ ,, но этот же символ встречается в поле Name;
  2. В поле Name могут встречаться например такие значения: "Nakid, Miss. Maria (""Mary"")", что должно быть считано как: Nakid, Miss. Maria ("Mary");
  3. Конец строки символ '\r', а не '\n';
  4. Может пригодится функция getline.

Перегрузите оператор << для пары типов std::ostream и std::vector<Passenger> . Оператор должен сохранять в файл содержимое массива std::vector<Passenger> (соблюдение формата CSV не обязательно).

Реализуйте функцию сортировки по возрастанию (способ сортировки любой) принимающий вектор указателей на структуру Passenger (std::vector<Passenger*>) , при этом сортироваться должны не сами указатели, а значения на которые они указывают. Passenger a считается больше b, если поле Age у a больше поля Age у b.

Используя вышеописанные функции выполните следующее:

  1. Считайте содержимое файла "train.csv" в вектор;
  2. Отсортируйте в этом векторе выживших пассажиров женского пола 1 класса по возрастанию поля Age. Для этого добавьте адреса всех выживших пассажиров женского пола 1 класса в массив указателей и отсортируйте его;
  3. Сохраните в файл изменённый вектор.

Формат ввода
Входные данные (для компактности, представлен только часть)

Формат вывода
Выходные данные (для компактности, представлен только часть)