С++
Опишите структуру с именем Student
, содержащую следующие поля:
name
— фамилия и первая буква имени (строка состоящая из латинских символов и пробела в формате: Persson М);group
— номер группы (целое число );exams
— результаты экзаменов по шкале (словарь в котором ключ - это название предмета, значение - оценка по предмету. Список предметов: mathematics, physics, history, programming).Напишите программу, в которой выполните следующие действия :
Создайте массив/вектор студентов, состоящий из десяти структур типа Student
и заполните его некоторыми данными по своему усмотрению;
Для вывода на экран информации об одном студенте перегрузите оператор <<
для пары типов std::ostream
и Student
. Информация должна выводится в следующем виде, например:
xxxxxxxxxx
+------------+-------+------+------+------+------+
| Name | Group | Math | Phys | Hist | Prog |
+------------+-------+------+------+------+------+
| Molyneux P | 1 | 5 | 5 | 5 | 5 |
+------------+-------+------+------+------+------+
Для вывода на экран информации о нескольких студентах перегрузите оператор <<
для пары типов std::ostream
и std::vector<Student>
. Информация должна выводится в следующем виде, например для вектора из двух студентов:
xxxxxxxxxx
+----------+-------+------+------+------+------+
| Name | Group | Math | Phys | Hist | Prog |
+----------+-------+------+------+------+------+
| Meier S | 1 | 5 | 5 | 5 | 5 |
+----------+-------+------+------+------+------+
| Newell G | 3 | 3 | 3 | 3 | 3 |
+----------+-------+------+------+------+------+
Для сортировки студентов используйте шаблон функции принимающий вектор из задания Шаблон BozoSort . Для этого перегрузите оператор сравнения >
(или тот который использован в шаблоне функции) для пары типов Student
и Student
. При этом считается, что студент a больше студента b, если поле name
студента a лексикографически больше поля name
студента b, группа и оценки не играют роли.
Примечание: std::string
сравнивает строки лексикографически.
Выведите в консоль данные о всех студентах, имеющих оценку 2 хотя бы по одному из экзаменов. Студенты должны быть отсортированы по возрастанию;
Затем, в отдельно строке, выведите слово "Expulsion" и следом информацию об одном рандомно выбранном студенте из списка двоечников.
Если студентов двоечников нет, выведите сообщение: "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 |
С++
Реализуйте структуру Item
состоящую из 2 частей:
Элемент типа ItemType
;
Объединение (union
) состоящее из 4 элементов:
Сoin
;Rune
;Weapon
;Armor
.ItemType
— перечисление (тут и далее enum class
), которое может принимать одно из 4х значений: СOIN
, RUNE
, WEAPON
, ARMOR
. Применяется для того, чтобы запомнить, что именно хранит структура Item
.
Сoin
— структура состоящая из:
count
определяющего количество монет (целое число ).Rune
— структура состоящая из:
level
определяющего уровень руны (целое число );element
определяющего тип стихии руны (перечисление Element
- возможные значения [FIRE
, WATER
, EARTH
, AIR
]).Weapon
— структура состоящая из:
damage
определяющего урон оружия (целое число );critical
определяющего шанс критического удара в процентах (целое число );durability
определяющего процент износа оружия (целое число ); Armor
— структура состоящая из:
guard
определяющего защиту от урона (целое число );durability
определяющего процент износа брони (целое число );Вектору из элементов типа Item
назначьте псевдоним LootBox
. В дальнейшем коде используйте этот псевдоним.
Для работы с LootBox
реализуйте функцию:
xxxxxxxxxx
// Возвращет лутбокс с тремя случайными предметами
LootBox generateLootBox();
При этом каждый из предметов генерируется в соответствии с вероятностью указанной в таблице:
Тип предмета | Параметры | Вероятность, % |
---|---|---|
Coin | count = 1000 | 50 |
Rune | level = 1; element = FIRE | 6 |
Rune | level = 1; element = WATER | 13 |
Rune | level = 1; element = EARTH | 7 |
Rune | level = 1; element = AIR | 14 |
Rune | level = 5; element = FIRE | 0.6 |
Rune | level = 5; element = WATER | 1.3 |
Rune | level = 5; element = EARTH | 0.7 |
Rune | level = 5; element = AIR | 1.4 |
Rune | level = 10; element = FIRE | 0.06 |
Rune | level = 10; element = WATER | 0.13 |
Rune | level = 10; element = EARTH | 0.07 |
Rune | level = 10; element = AIR | 0.14 |
Weapon | damage = 100; critical = 0; durability = 100 | 1.4 |
Weapon | damage = 75; critical = 50; durability = 100 | 1.4 |
Armor | guard = 50; durability = 100 | 2.8 |
Для работы с вышеуказанными типами перегрузите операторы:
Оператор префиксный ++
для типа Item
. Оператор должен изменять содержимое переменной к которой применяется на случайное (в соответствии с таблицей) и возвращать новое значение.
Оператор <<
для пары типов LootBox
и Item
. Оператор должен добавлять Item
в LootBox
и возвращать изменённый LootBox
.
Оператор <<
для пары типов std::ostream
и Item
. Выводит в поток информацию о предмете, в зависимости от того, что находится в Item
. Вывод оформить по своему желанию (например так):
xxxxxxxxxx
1000 gold // для Coin
Rune of fire 1 lvl // для Rune
God Killer // для Weapon damage = 100; critical = 0;
Demon Slayer // для Weapon damage = 75; critical = 50;
Bronezhiletka // для Armor
Оператор <<
для пары типов std::ostream
и LootBox
. Выводит на экран все три предмета находящиеся в лутбоксе.
В основном коде программы:
По максимуму используйте перегруженные операторы, в том числе и внутри других операторов.
Выведите сообщение: "Открыть лутбокс? Yes/No".
Если пользователь введёт Y или Yes (и маленькими тоже):
Если пользователь введёт N или No (и маленькими тоже) - завершить программу.
При любом другом вводе - перейти к пункту 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 |
С++
Часть I.
Переопределите оператор <<
для пары типов std::ostream
и std::vector<int>
, при этом оператор должен принимать std::vector<int>
по константной ссылке. По ссылке, чтобы НЕ создавать копию передаваемого аргумента, по константной, чтобы можно было передавать временные объекты (например полученные как результат из другой функции).
Оператор должен выполнять следующие действия (весь вывод в одну строку):
|
и пробел;&
).В функции main
создайте пустой std::vector<int>
и откройте файл "data.txt" для ввода, затем в цикле 64 раза выполните следующие действия:
<<
, чтобы сохранить данные в файл;Запустите программу и после её выполнения изучите "data.txt". Попарно сравните адреса элементов вектора с одинаковыми индексами (если в вашем текстовом редакторе включена функция переноса строк, то её нужно отключить).
Вопрос 1. Попытайтесь объяснить увиденную закономерность.
Вопрос 2. Если запомнить адрес нулевой ячейки вектора при его длине 15 элементов, а затем внести изменения по запомненному адресу при длине вектора 25 элементов. Изменится ли значение нулевой ячейки вектора? Объяснить почему.
Часть II
После первого цикла добавьте ещё один, в котором выполните следующие действия, пока вектор не станет пустым:
pop_back()
);<<
, чтобы сохранить данные в файл;Запустите программу и после её выполнения изучите "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 ... |
С++
Скачайте и изучите файл "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 - для чисел и пустая строка для строк).
Обратите внимание:
,
, но этот же символ встречается в поле Name
;Name
могут встречаться например такие значения: "Nakid, Miss. Maria (""Mary"")"
, что должно быть считано как: Nakid, Miss. Maria ("Mary")
;'\r'
, а не '\n'
;getline
.Перегрузите оператор <<
для пары типов std::ostream
и std::vector<Passenger>
. Оператор должен сохранять в файл содержимое массива std::vector<Passenger>
(соблюдение формата CSV не обязательно).
Реализуйте функцию сортировки по возрастанию (способ сортировки любой) принимающий вектор указателей на структуру Passenger
(std::vector<Passenger*>
) , при этом сортироваться должны не сами указатели, а значения на которые они указывают. Passenger
a считается больше b, если поле Age
у a больше поля Age
у b.
Используя вышеописанные функции выполните следующее:
Age
. Для этого добавьте адреса всех выживших пассажиров женского пола 1 класса в массив указателей и отсортируйте его;Формат ввода
Входные данные (для компактности, представлен только часть)
Формат вывода
Выходные данные (для компактности, представлен только часть)