Часть №4: Практические задания по С++

  Юрий  | 

  Обновл. 27 Май 2021  | 

 16660

 ǀ   41 

Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому 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


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (19 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 41

  1. Валентин:

    Задание 2 (знаю, многое не учтено, да и очень "просто")

  2. Rock:

    Задание 1:

    Задание 2:

    Задание 3:

  3. Slava:

    Quest #1

  4. Павел:

    Если размер массива фиксирован, то 3 задача простая. Также хочу обратиться к знающим: можно ли как-то реализовать ввод любого кол-ва чисел и запись их в массив без конвертации из string? Запоминать постоянно меняющееся значение переменной может стек, но как реализовать остальное я не знаю.

    Сам код:

    1. Shom:

      Можно.
      Если без обработки ошибок — то в цикле заполнять вектор введёнными пользователем числами и при введении "не числа" (при ошибке ввода) прерывать цикл заполнения.
      Если с обработкой ошибок — то почти всё тоже самое, только для выхода из цикла нужно использовать определённый символ (например пробел) и для проверки использовать функции, возвращающие символ из буфера без его извлечения оттуда.

  5. Денис:

    Задание №1 — Решение в "стиле Си"

    1. Денис:

      Поправка — решение Задания 3

  6. pleb:

    простое решение 3-го задания, правда без проверки на то, что массивы упорядочены

  7. Марат:

    Решение третьего задания. По моему скромному мнению, очень простое решение.

  8. Александр:

    Задача 3

  9. Александр:

    Задание 2.

  10. Алена:

    Задача 2.

  11. Алена:

    Задача 1.

  12. Владимир:

    Задание №2

  13. Владимир:

    Задание №1

  14. Анастасия:

    Моё решение задания №3:

  15. Анастасия:

    Моё решение задания №2:

    1. Владимир:

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

      1. Анастасия:

        У меня предусмотрен ввод отрицательных чисел в том числе, тип ведь double. А насчёт того чтобы через пробел вводились, я решила упростить пользователю задачу и проверить за него, не дав возможность ввести лишнего.

  16. Анастасия:

    Моё решение задания №1:

  17. Владимир:

    Задание №3

    1. Анастасия:

      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) Упорядоченность по возрастанию исходных массивов (в Вашем случае — строк) тоже никак не проверяется. Хотя это можно считать одним из условий этой задачи…

  18. Shom:

    1. Анастасия:

      Здесь я удивилась, встретив stoi(), никогда раньше его не встречала, а это, оказывается, весьма полезная вещь.
      И поначалу меня смутила пляска с iii и jjj в функции combine, но потом я оценила её прелесть. Не понравилось только, что два else if под одним if и их код идут со всё большим отступом от if и его кода, а ведь это по сути три равноправных альтернативы, я бы сделала их на одном уровне. Но это дело вкуса.

      1. Shom:

        По-моему, в C++ можно найти уже готовую библиотечную функцию почти под любую задачу)). С combine() долго пришлось возиться — два листа бумаги исписал прежде чем она нормально заработала, так как пришлось учитывать возможность совпадения чисел в массивах и разную длину массивов. Сейчас свежим взглядом посмотрел на "лестницу" if else if и она мне тоже не понравилась.

        1. Марат:

          Ваша реализация не работает с отрицательными числами. Если интересно, как их включить, можете взглянуть на мою реализацию!

    2. Shom:

      Марат, спасибо, что заметили.
      Действительно, программа не работает с отрицательными и дробными числами, хотя в условиях задачи таких ограничений нет.

      Задание №3. Корректировка 1.

  19. Shom:

    1. Анастасия:

      — размер ведь не может быть отрицательным, почему тогда сразу не сделали тип unsigned?

      А в остальном мне понравилась Ваша идея проверять ввод с шаблоном.

      1. Shom:

        Здесь в уроках рекомендовалось без крайней необходимости unsigned не использовать. Меня очень порадовало, что мой код Вам понравился))

  20. Shom:

    Задание №1

  21. Илья:

    Задание №3.2
    Первая версия проще понятнее и быстрее,но я всё же решил поломать себе мозги и придумал такой код:

    1. Илья:

      Вся суть в этой функции, которая принимает два ОТСОРТИРОВАННЫХ вектора, и лепит их в один ОТСОРТИРОВАННЫЙ вектор

      Хотя мне кажется что лучше использовать первую версию:
      а)она универсальная(там можно использовать и НЕотсортированный вектора)
      б)она проще и быстрее
      в)мне просто хотелось сделать данное задание как-то по-другому, поэтому я и придумал данный костыль:

    2. Анастасия:

      Всё довольно читабельно и логично, но Вы опять просите пользователя указать длину массивов (не по условию), перекладываете бремя сортировки каждого массива на плечи программы (это сарказм, но по условию их отсортированными вводит пользователь) и совсем не проверяете, что он (пользователь) там ввёл.

  22. Илья:

    Задание №3.1

    1. Илья:

      Задание №3.1.1(небольшое улучшение)