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

  Юрий  | 

  Обновл. 16 Сен 2021  | 

 27889

 ǀ   39 

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

Easy: Задание №1

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

Medium: Задание №2


В указанной пользователем строке вместо первого символа поставьте пробел, а вместо последнего — точку.

Пример результата выполнения программы:

Введите строку: Сегодня хороший день
Результат:  егодня хороший ден.

Hard: Задание №3

На первом курсе M = 40 студентов. Каждый из студентов в понедельник получает оценку по программированию, во вторник — оценку по математике, в среду — по физике в пределах от 2 до 5 каждая. Всего в году N = 35 недель, когда студенты учатся. Лучшим считается студент, который наибольшее количество недель продержался без троек (т.е. получал не ниже 4). Сформируйте три целочисленных массива нужного размера. Задайте оценки с помощью генерации случайных чисел. Найдите лучшего студента.


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

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

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

  1. Юрий:

    Задание 1:

  2. Антон:

    Задание №1. Поскольку мы тмеем дело с массивами а не с векторами то мое решение следующее.

  3. WAR:

    Задание №2:

  4. WAR:

    Задание №1:

  5. Rock:

    Задание 1:

    Задание 2:

    Задание 3:

  6. Максим:

    Задание 3

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

    Моё решение задания №3 (оно оказалось легче задания №1):

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

      каюсь, что проверяла хорошие недели слишком сложно:

      хотя, вместо этого можно было просто брать оценки больше тройки:

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

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

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

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

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

  10. RockNRullz:

    Задание №3. "Объединил 3 массива в один":

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

      — это боль. Зачем делать глобальную переменную c таким названием??? Почему она глобальная и что она делает? Разумеется, у неё должно быть нормальное название или хотя бы комментарий, поясняющий, почему она глобальная.
      И что я вижу дальше?

      "гениально". Уж если Вы не умеете писать комментарии, то хотя бы функции называйте нормально. Давайте я вас научу. Что делает эта функция? Увеличивает переменную k на 1. Дак так и назовите: add_1_to_k (что такое k до сих пор не ясно)
      Извините, но продолжать читать этот код дальше желания просто нет.

  11. RockNRullz:

    Задание 1:

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

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

  12. Shom:

    Задание №3:

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

      Неплохо. Вкусовщина, конечно, но мне резануло, что в main просто создаётся объект класса. Объёмное определение лучших студентов можно было разделить на два метода или частично запихнуть в конструктор, и сделать один метод с говорящим названием публичным, который и поместить в main. А то как-то слишком много Вы взвалили на один класс.

      1. Shom:

        Мне наоборот нравится всё возможное внутри одного класса делать — меньше параметров приходится передавать, проще отслеживать что где и как изменяется.

  13. Shom:

    Задание №2.

  14. Shom:

    Задание №1

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

      Я не знаток кодировок символов, поэтому лично мне числа 45, 48 и 57 ни о чём не говорят. По комментариям я догадалась, что
      Вы отбираете цифры. Мне кажется, что раз уж Вы прибегли к этим сравнениям с этими кодами несколько раз, можно было бы вынести это в отдельную функцию, где и пояснить, что это за числа. А так… не очень эстетично это выглядит. Это раз.
      Второй момент — отрицательные числа (они ведь тоже целые и могут быть введены пользователем), для этого Вы должны рассматривать знак минус. В коде Вы его не рассматриваете (он должен быть строго в начале числа). Возможно, кодировки его учитывают, но я не в курсе, правда.
      И третье. Поясните, пожалуйста, магию вот этого куска:

      Нет, я понимаю, что происходит, но всё-таки:
      После создания temp без инициализации там, скорей всего, мусор. Или 0? Если у Вас работает, то, допустим, 0. Ок, но тогда в

      Вы используете ссылку на 0… Зачем? Почему не просто temp? Или я просто не в курсе, и этого требует синтаксис stoi?
      И следующая строчка:

      temp ведь нигде в этом цикле не увеличивается, не меняется (то есть как был 0, так и остался, по нашему предположению). Почему в этой строчке Вы предполагаете удаление обработанной части строки?
      Буду благодарна за Ваши комментарии по моим вопросам.

      1. Shom:

        Анастасия, очень польщён вашим развёрнутым комментарием)
        И так, символ под номером 45 — это знак "минус" (-), от 48 до 57 включительно идут последовательно символы цифр от '0' до '9'. Вы правильно догадались, что обработка отрицательных чисел в программе учитывается. Можно, конечно, вынести цикл обработки ввода в отдельную функцию, но не видел в этом смысла, так как он используется всего один раз — здесь, как Вы часто говорите "дело вкуса". Согласен с тем, что желательно было бы в комментариях расшифровать значение кодов символов.
        в строке

        &temp — это адресс переменной temp — необязательный параметр функции, нужен для сохранения индекса первого непреобразованного символа, то-есть, символа, который stoi не смогла преобразовать. Вы снова права: просто temp функция не примет, её синтаксис требует именно "адрес переменной целочисленного типа".
        Ну и на счёт строки

        Как мы уже определились, в temp хранится индекс первого непреобразованного элемента, который встретила stoi, а в функции erase эта переменна указывает количество удалямых элементов с начала строки — так как первый параметр функции 0.
        В следующей итерации этого цикла stoi пропустит этот элемент, так как он будет идти до начала цифр в строке.
        Надеюсь, у меня получилось ответить на ваши вопросы. Если нет — пишите, будем дальше разбираться)

  15. Алена:

    Задача 2.

  16. Владимир:

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

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

  17. Владимир:

  18. Алена:

    Задача 1.

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

      Ваше решение мне понравилось, но просить пользователя ввести количество чисел в массиве несколько упростило задачу.

  19. Владимир:

    Задание №1

  20. Юлия:

    №3
    Громоздко получилось, но зато работает, как надо. Правда, решила через векторы (чтоб меньше путаться). Но это тоже ведь массивы 🙂

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

      Мне Ваше решение не понрмавилось.
      1) зачем использовать векторы, если длина массивов заранее задана и не меняется
      2) Вы столько раз пробегаете по всем этим массивам, храните данные студентов, что не требуется, заводите целый массив, чтобы отметить хорошие недели, сначала считаете, какие хорошие, потом какие лучшие, потом у каких студентов лучшие… Можно было это всё сократить до минимума циклов, не сохраняя лишние данные.

  21. Илья:

    Задание 3:

    1. Владимир:

      Илья, Вы объявили массив

      для подсчета успешных недель и к его мусорным значениям суммируете недели студентов, затем эти мусорные значения сравниваете для определения лучших. Далее в процессе определения наибольшего количества успешных недель у студентов, определяете соответствие успеваемость студентов промежуточным значениям goodWeeks, в итоге при тесте получаем: результат — 4 студента с 3, 6, 6 и 8 успешными неделями соответственно. И как узнать какие именно студенты являются лучшими, это тайна, мы получаем только их количество

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

      Владимир правильно подметил про отсутствие инициализации для массива с хорошими неделями.
      И ещё здесь:

      нулевой элемент инициализируется -1, а остальные элементы — нулём.
      А далее мы и нулевой элемент делаем нулевым:

      Что это было? Зачем? Мне и смысл переменной length (что в переводе на русский "длина") не ясен. Но Владимир разобрался, значит дело во мне. В целом код очень даже хорошо начинался, всё было ясно и логично, а закончился совсем как-то всмятку.

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

        я разобралась, зачем length, но конец реально зажёван. Допустим, мы получили лучшего студента с индексом в начале, потом одинакового с ним по неделям (увеличили length), потом превосходящего их ещё одного студента, которого ставим вместо второго… И в итоге мы просто выводим 0, 1, и т.д. до какого-то промежуточного количества лучших студентов. Ужасно.

  22. Илья:

    Задание 2:

  23. Илья:

    Задание 1:

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

      Илья,
      я ничего не знала о возможности сделать resize для динамического массива до Вашего этого кода. Расскажите, пожалуйста, почему именно 5?.. То есть длину и капасити Вы увеличиваете на 5 и числа вставляете в массив через каждые 5 элементов… Или это я чего-то не понимаю? Если честно, я даже не поняла, зачем вообще Вы завели переменную капасити… Такой небольшой код и столько вопросов…

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

        Ок, функция resize оказалась самописной, я не сразу заметила. В ней Вы даже освобождаете память. А почему не освобождаете память под массив в конце программы?

        1. Alex:

          Если освободить память arr2, то вызов return потеряет смысл.
          Мы оставляем память массива, чтобы передать его программе дальше

Добавить комментарий для Алена Отменить ответ

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