Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому welcome в комментарии!
Easy: Задание №1
Напишите программу пересчета расстояния из верст в километры (1 верста = 1.0668 км).
Пример результата выполнения программы:
Введите расстояние в верстах: 100
100 верст = 106.68 км
Medium: Задание №2
Напишите программу, которая вычисляет среднее арифметическое последовательности дробных чисел, вводимых с клавиатуры. После ввода пользователем последнего числа программа должна вывести минимальное и максимальное числа из последовательности. Количество чисел последовательности вводит пользователь.
Пример результата выполнения программы:
Введите количество чисел последовательности: 5
Введите последовательность: 5.4 7.8 3.0 1.5 2.3
Среднее арифметическое: 4.00
Минимальное число: 1.5
Максимальное число: 7.8
Hard: Задание №3
Напишите программу, которая объединяет два упорядоченных по возрастанию массива в один (тоже упорядоченный) массив.
Пример результата выполнения программы:
Введите элементы первого массива: 1 3 5 7 9
Введите элементы второго массива: 2 4 6 8 10
Массив-результат: 1 2 3 4 5 6 7 8 9 10
Задание 3.
Массивы (любой длины) из целых чисел вводит пользователь.
Задание № 2:
2 задание
3 задание было интересным, над ним поколдовать пришлось. Вот мое решение:
Задание №2.
После добавления кода в комментарий, в 4 и 5 строках кода снизу, там где "- 1", произошла автозамена "минуса" на "тире" и компилятор в этих местах выдает ошибку. Нужно изменить "тире" на "минус".
Задача №2 для С++ 20:
Задача №3 для С++ 20:
3)
sort или multiset слишком тривиально.
№3
задача 3:
3)
Задание №3:
Задание №2:
Задание 2 (знаю, многое не учтено, да и очень "просто")
Задание 1:
Задание 2:
Задание 3:
Quest #1
Если размер массива фиксирован, то 3 задача простая. Также хочу обратиться к знающим: можно ли как-то реализовать ввод любого кол-ва чисел и запись их в массив без конвертации из string? Запоминать постоянно меняющееся значение переменной может стек, но как реализовать остальное я не знаю.
Сам код:
Можно.
Если без обработки ошибок — то в цикле заполнять вектор введёнными пользователем числами и при введении "не числа" (при ошибке ввода) прерывать цикл заполнения.
Если с обработкой ошибок — то почти всё тоже самое, только для выхода из цикла нужно использовать определённый символ (например пробел) и для проверки использовать функции, возвращающие символ из буфера без его извлечения оттуда.
Задание №1 — Решение в "стиле Си"
Поправка — решение Задания 3
простое решение 3-го задания, правда без проверки на то, что массивы упорядочены
Решение третьего задания. По моему скромному мнению, очень простое решение.
Задача 3
Задание 2.
Задача 2.
Задача 1.
Задание №2
Задание №1
Моё решение задания №3:
Моё решение задания №2:
В условии задания не сказано, что числа должны быть положительными. В примере выполнения программы, данное в задании, мы видим вводимые числа находятся в одной строке через пробелы, а в Вашей программе так не получается, может это не существенно, но данный пример усложняет задачу
У меня предусмотрен ввод отрицательных чисел в том числе, тип ведь double. А насчёт того чтобы через пробел вводились, я решила упростить пользователю задачу и проверить за него, не дав возможность ввести лишнего.
Моё решение задания №1:
Задание №3
1) В первой функции параметр int*& array — это как? Массивы рекомендуется передавать по адресу. Второй параметр std::string str нужно передавать по ссылке.
2) int number[10]{}; // будет содержать числа (0 — 9) по порядку.Во-первых, почему бы Вам тогда не сделать его константным и не инициализировать сразу как = {0, 1, … , 9}? А во вторых, для использования массивов фиксированной длины есть уже готовый стандартный std::array. В-третьих же, "однозначные числа" имеют официальное название "цифры".
3) int j(0); // индекс элементов массива arr[] — а массива arr выше нет, только array. И название для индекса не очень говорящее.
4) while (1 * str.at(i) != 32) — 32 лучше было бы сделать константой с понятным названием. И зачем здесь умножение на 1? Чтобы неявно привести к целочисленному типу? Так явное приведение через static_cast было бы понятней.
5) Ну, Владимир…
int y(0); — что это за переменная? Вы, наверное, и сами уже не помните. Потому что назвали как попало.
for (int k = 0; k < 10; ++k)
— а ведь выше у нас была такая переменная
char k = 48; // соответствует символу '0'
Совпадение? Кстати, почему эту k Вы не сделали константой и не назвали, например, zero_symbol? И я вообще не нашла, где Вы её использовали…
6) Смысл функции примерно прояснился — получаем строку, переводим символы в цифры и заполняем массив числами. Но это не точно) В main же у Вас немного хаос, к примеру, зачем Вы вручную создаёте динамический массив, когда есть вектор? Почему не сделали сортировку массива в отдельной функции, и вывод итога — ещё одной. Это повысило бы читаемость и структурированность кода.
7) И вообще, почему Вы решили сделать реализацию этой программы через строки? Ведь можно было бы просто просить пользователя вводить числа и проверять ввод на корректность. Хотя и Ваша реализация тоже имеет место быть.
8) Упорядоченность по возрастанию исходных массивов (в Вашем случае — строк) тоже никак не проверяется. Хотя это можно считать одним из условий этой задачи…
Здесь я удивилась, встретив stoi(), никогда раньше его не встречала, а это, оказывается, весьма полезная вещь.
И поначалу меня смутила пляска с iii и jjj в функции combine, но потом я оценила её прелесть. Не понравилось только, что два else if под одним if и их код идут со всё большим отступом от if и его кода, а ведь это по сути три равноправных альтернативы, я бы сделала их на одном уровне. Но это дело вкуса.
По-моему, в C++ можно найти уже готовую библиотечную функцию почти под любую задачу)). С combine() долго пришлось возиться — два листа бумаги исписал прежде чем она нормально заработала, так как пришлось учитывать возможность совпадения чисел в массивах и разную длину массивов. Сейчас свежим взглядом посмотрел на "лестницу" if else if и она мне тоже не понравилась.
Ваша реализация не работает с отрицательными числами. Если интересно, как их включить, можете взглянуть на мою реализацию!
Марат, спасибо, что заметили.
Действительно, программа не работает с отрицательными и дробными числами, хотя в условиях задачи таких ограничений нет.
Задание №3. Корректировка 1.
— размер ведь не может быть отрицательным, почему тогда сразу не сделали тип unsigned?
А в остальном мне понравилась Ваша идея проверять ввод с шаблоном.
Здесь в уроках рекомендовалось без крайней необходимости unsigned не использовать. Меня очень порадовало, что мой код Вам понравился))
Задание №1
Задание №3.2
Первая версия проще понятнее и быстрее,но я всё же решил поломать себе мозги и придумал такой код:
Вся суть в этой функции, которая принимает два ОТСОРТИРОВАННЫХ вектора, и лепит их в один ОТСОРТИРОВАННЫЙ вектор
Хотя мне кажется что лучше использовать первую версию:
а)она универсальная(там можно использовать и НЕотсортированный вектора)
б)она проще и быстрее
в)мне просто хотелось сделать данное задание как-то по-другому, поэтому я и придумал данный костыль:
Всё довольно читабельно и логично, но Вы опять просите пользователя указать длину массивов (не по условию), перекладываете бремя сортировки каждого массива на плечи программы (это сарказм, но по условию их отсортированными вводит пользователь) и совсем не проверяете, что он (пользователь) там ввёл.
Задание №3.1
Задание №3.1.1(небольшое улучшение)
По условию мы не просим пользователя вводить длину передаваемых массивов. Вы просите. Ну, ок, тогда, раз длина уже известна. Почему бы её не использовать? Вы же почему-то опять вычисляете её через size.
Когда код повторяется, хоть и для разных массивов, это важный сигнал использовать функцию.
Нигде не проверяется корректность ввода от пользователя. И для Ваших программ к первым двум заданиям тоже.
И в целом это странно:
— в синтаксисе вектора нет его длины. Что Вы делаете, записываете длину как единственный элемент вектора?
— вектор у нас длины 1, так как там только один элемент, его длина. Так? Тогда здесь мы заполним только один элемент. Гм… Или что, блин, здесь происходит? почему не i < len1 ?
Я разобралась, что такой синтаксис для задания длины вектора уместен. Но всё равно это как-то не очень хорошо выглядит, ведь это же вектор, у него динамическая длина…
Задание №2:
Задание №1: