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

  Юрий  | 

  Обновл. 29 Авг 2020  | 

 4460

 ǀ   32 

Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому welcome в комментарии.

Easy: Задание №1

Напишите программу, которая вычисляет стоимость яблок.

Пример выполнения программы:

Цена за 1 кг. яблок: 8.5
Вес яблок: 2.3
Стоимость покупки: 19.55 руб.

Medium: Задание №2


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

Hard: Задание №3

В поезде 18 вагонов, в каждом из которых 36 мест. Информация о проданных на поезд билетах хранится в двумерном массиве, номера строк которых соответствуют номерам вагонов, а номера столбцов — номерам мест. Если билет на то или иное место продан, то соответствующий элемент массива имеет значение 1, в противном случае — 0. Напишите программу, определяющую число свободных мест в любом из вагонов поезда.


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

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

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

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

    Автору: нужен пример выполнения программы для второго задания. Потому что, как выяснилось, только я поняла это задание так, что нужно удалить все элементы, которые встречались больше двух раз. Пример работы моей программы:
    Программа удаляет числа, встречающиеся больше двух раз.
    Введите массив целых чисел через пробел, прочие знаки будут проигнорированы.
    Для окончания ввода нажмите enter: 5 98 43 5 87 5 4 5 98 98 5
    Получен массив: 5 98 43 5 87 5 4 5 98 98 5
    Результат обработки: 43 87 4

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

    Моё решение задания №3 (я испугалась, когда подумала, что придётся передавать двумерный массив с помощью указателя, но обошлось, передавала только одну строку):

  3. Аватар Анастасия:

    Моё решение задания №2 (получилось длинно, хотя я очень старалась не делать лишнего, позже посмотрю, как решили другие, даже интересно) :

  4. Аватар Анастасия:

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

  5. Аватар RockNRullz:

    Задание №3:

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

      Во-первых, задание было несколько другое.
      Во-вторых, я не знала, что двумерный массив можно передавать как bool (&arr)[18][36]. Но это ведь просто передача по ссылке, чтобы не копировать, так?
      В третьих, 18 и 36 очень просится завести как константы или по крайней мере передавать их как параметры, а то они повторяются в функциях и main как магические числа. Особенно жаль, что они же указываются при передаче массива в функцию, и они же используются в функции в отрыве от передачи.

  6. Аватар Shom:

    Задание №3.

  7. Аватар Shom:

    Задание №2.

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

      У меня тоже была мысль делать новый массив, но я подумала, что это будет не совсем честно, ведь по заданию нужно удалить из массива, а не сделать другой массив.
      И, получается, Вы тоже удаляете только лишние дубли, а не все элементы с повторами. То есть, если, например, есть массив:
      n***nn***n, то удалятся только первые два n. Причём, сначала Вы будете считать количество повторов для первого n, удалите его, потом для второго n и т.д. Хотя уже после первого подсчёта можно было бы "пометить" и остальные n, чтобы для них не пересчитывать отдельно. Понимаете, о чём я?
      На самом деле меня больше всего расстроило то, что только я поняла это задание так, что нужно удалить все такие элементы (n) из массива. Очень надеялась, что и Вы поняли так же, но не случилось)

      1. Аватар Shom:

        Как я понимаю, массивом в данном задании является набор чисел, этот набор в очищенном виде я сохраняю, просто в другом контейнере. Это во-первых. Во вторых: std::vector, при удалении из него элемента — просто перезаписывыется в другой более короткий динамический выделенный массив, после чего ему присваивается имя перезаписываемого массива с последующим удалением из памяти последнего. Так что, так или иначе, но возвращать придётся другой контейнер с данными или изменять значения дубликатов на специальные выражения.
        Если после первого подсчёта пометить остальные n, то при следующих подсчётах придётся проверять помечены эти n или нет — так что избежать операции сравнения в обоих случаях не удастся.
        И последнее, результат работы моей программы с вашим массивом:

        Ваш массив:
        5, 98, 43, 5, 87, 5, 4, 5, 98, 98, 5,

        Массив после очиски:
        43, 87, 4,

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

          Попыталась запустить у себя, чтобы проверить, потому что по коду я не понимаю, как выходит, что удаляются все повторяющиеся, а не кроме последних двух.
          Так вот, у меня не запустилось, т.к. компилятор не понимает std::getline, поэтому я добавила #include <string>. Так вот, тогда массив ввести не получается, программа просит завершить ввод пробелом, пробелов хоть десяток, она не завершает ввод. Если нажать enter, то только после второго пишет, что ошибка ввода.
          Но я поняла, как получается, что у Вас удаляются все. Вы ведь сначала всё считаете, помечаете дубли >2, а потом уже удаляете. Сначала неправильно поняла.

      2. Аватар Shom:

        Компиляторы, видимо, разные, но это не главное. А главное — Вы теперь не одна, кто так понял это задание и, значит, больше нет причин расстраиваться)

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

          =)

  8. Аватар Shom:

    Задание №1

  9. Аватар Kris:

    Приложу свое решение, оно не такое красивое внешне, но работает за O(n log n) времени и O(n) памяти.

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

      Кровь из глаз. Даже по функции и названиям переменных не догадаться, какую задачу Вы решали. Я предполагаю, что вторую. Но на расшифровку такого кода не хочется тратить время.

      1. Аватар Kris:

        Не велика потеря

  10. Аватар Владимир:

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

      Странно, но и Вы поняли задание также, как Алёна.
      Но вот здесь есть ловушка:

      почему Вы удаляете элемент j-1, ведь дубль найден на элементе j? Я в своём решении отказалась от for с инкрементом, так как после удаления элемента нужно было продолжать сравнение с того же индекса. А как у Вас будет работать, даже не знаю.

  11. Аватар Владимир:

  12. Аватар Алена:

    Задача 2.

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

      Алёна, Вы были первопроходцем в решении этой задачи здесь.
      И сначала, когда я читала Ваше решение, мне захотелось отметить, как ловко Вы получили вектор от пользователя.
      Но потом… Будем считать, мы с Вами просто по-разному поняли задание, потому что Вы удаляете только вторые и последующие дубли элемента, а сам элемент и его первый дубль остаются на месте.

  13. Аватар Алена:

    Задача 1.

  14. Аватар Илья:

    Задание 3:

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

      И всё-таки хромает у Вас диалог с пользователем:

      То есть что должен ввести пользователь? Номер места, предполагая, что номера идут от первого до последнего вагона по возрастающей? Да ещё и имя такое переменной дали — "userNumber", а что за намбэр — вопрос…
      А не проще было просто попросить его ввести номер вагона, как в задании…

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

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

  15. Аватар Илья:

    Задание 1:

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

      Илья, большой прогресс, что Вы начали общаться с пользователем. Но введённые данные опять не проверяете.

  16. Аватар Игорь:

    3-е Задание

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

      Почему массив называется studentMas? Причём здесь студенты?
      Потом, в main Вы первой строкой объявляете переменную с "говорящим" названием n, а используете её только через несколько строк.
      Странно выглядит и Ваш способ передачи массива в функцию — int mas[][MEST], int col, почему бы тогда не сразу int mas[col][MEST]?
      Не проверяете ввод пользователя на другие провалы, а ведь это просто…

  17. Аватар Пётр:

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

      Почему цена ха 1 кг — "ppo?" Не хватает проверки корректности ввода.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *