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

  Юрий  | 

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

 5770

 ǀ   32 

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

Easy: Задание №1

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

Medium: Задание №2


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

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

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

Hard: Задание №3

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


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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Аватар RockNRullz:

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

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

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

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

  5. Аватар RockNRullz:

    Задание 1:

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

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

  6. Аватар Shom:

    Задание №3:

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

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

      1. Аватар Shom:

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

  7. Аватар Shom:

    Задание №2.

  8. Аватар 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 пропустит этот элемент, так как он будет идти до начала цифр в строке.
        Надеюсь, у меня получилось ответить на ваши вопросы. Если нет — пишите, будем дальше разбираться)

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

    Задача 2.

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

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

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

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

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

    Задача 1.

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

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

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

    Задание №1

  14. Аватар Юлия:

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

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

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

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

    Задание 3:

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

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

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

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

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

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

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

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

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

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

    Задание 2:

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

    Задание 1:

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

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

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

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

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

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