Глава №2. Итоговый тест

  Юрий  | 

  |

  Обновл. 10 Фев 2023  | 

 168020

 ǀ   125 

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

Теория

Целочисленные типы данных используются для хранения целых чисел. Не забывайте о проблемах деления и переполнения с ними. Используйте целочисленные типы с фиксированным размером.

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

Логический тип данных содержит 2 значения: true и false.

Символьный тип данных содержит целые числа, которые могут интерпретироваться в символы, соответствующие стандарту ASCII. Будьте осторожны при использовании фактических чисел и цифр, которые используются для представления символов. Также помните о проблемах переполнения.

Используйте спецификатор const для объявления символьных констант вместо использования директив #define. Это безопаснее.

Задание №1


Почему символьные константы лучше литеральных (магических чисел)? Почему использование const лучше использования директив #define?

Ответ №1

Использование литеральных констант (магических чисел) не только усложняет программу, но и затрудняет внесение в нее изменений. Символьные константы лучше, так как они дают понимание того, зачем и почему они используются, а также, если вам еще понадобится внести изменения — достаточно будет внести правки только в объявлении константы, а не искать их по всему коду. Значения констант, объявленных с помощью директивы #define, не отображаются в отладчике, вероятность возникновения конфликта имен у таких констант выше.

Задание №2

Выберите подходящий тип данных для переменных в каждой из следующих ситуаций. Будьте как можно более конкретными. Если ответом является целочисленный тип данных, то используйте соответствующий тип с фиксированным размером (например, int16_t). Если переменная должна быть константной, то так и отвечайте.

   Возраст пользователя.

   Нравится ли определенный цвет пользователю?

   Число Пи.

   Количество страниц в учебнике.

   Цена акций в долларах (дробь присутствует).

   Сколько раз вы моргнули за всю свою жизнь? (Примечание: Ответ исчисляется в миллионах)

   Пользователь выбирает опцию с помощью ввода определенной буквы.

Ответ №2

   int8_t не сможет хранить возраст человека, старше 127. Несмотря на то, что таких случаев в мире единицы (если есть вообще), в будущем это может быть вполне возможным. Так что int16_t здесь подойдет лучше.

   bool.

   const double.

   Так как большинство книг имеют больше 255 страниц, но меньше чем 32767, то int16_t — здесь наилучший вариант.

   float.

   int32_t.

   char.

Задание №3


Напишите следующую программу. Сначала пользователю предлагается ввести 2 числа типа с плавающей точкой (используйте тип double). Затем предлагается ввести один из следующих математических символов: +, -, * или /. Программа выполняет выбранную пользователем математическую операцию между двумя числами, а затем выводит результат на экран. Если пользователь ввел некорректный символ, то программа ничего не должна выводить. Например:

Enter a double value: 7
Enter a double value: 5
Enter one of the following: +, -, *, or /: *
7 * 5 = 35

Подсказка: Вы можете использовать ветвление if для того, чтобы распознать, ввел ли пользователь определенный математический символ (например, +) или нет. Детально об этом читайте в материалах урока №34.

Ответ №3

Задание №4

Это уже немного сложнее. Напишите небольшую программу-симулятор падения мячика с башни. Сначала пользователю предлагается ввести высоту башни в метрах. Не забывайте о гравитации (9,8м/с2) и о том, что у мячика нет начальной скорости (его держат в руках). Программа должна выводить расстояние от земли, на котором находится мячик после 0, 1, 2, 3, 4 и 5 секунд падения. Минимальная высота составляет 0 метров (ниже мячику падать нельзя).

В вашей программе должен быть заголовочный файл constants.h с пространством имен myConstants. В myConstants определите константу для хранения значения силы тяжести на Земле (9.8). В качестве напоминания смотрите урок №37.

Напишите функцию для вычисления высоты мячика через х секунд падения. Используйте следующую формулу: высота мячика над землей = константа_гравитации * x_секунд2/2.

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

Enter the initial height of the tower in meters: 100
At 0 seconds, the ball is at height: 100 meters
At 1 seconds, the ball is at height: 95.1 meters
At 2 seconds, the ball is at height: 80.4 meters
At 3 seconds, the ball is at height: 55.9 meters
At 4 seconds, the ball is at height: 21.6 meters
At 5 seconds, the ball is on the ground.

Примечания:

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

   Символ ^ не является экспонентом в языке C++. В формуле вместо него используйте знак умножения *.

Ответ №4

Файл constants.h:

Файл main.cpp:

Обратите внимание, функция calculateHeight() не выводит высоту на экран (помните о «правиле одного задания»). Мы используем отдельную функцию для вывода.


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

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

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

  1. Ibrohim:

    Here is my code for the 4th task:

  2. Taras Polishuk:

    У меня получилось так.

  3. Влад:

    4 задание, по простому

    main.cpp

    constants.h

  4. Сашуня:

    Второе задание:

    Constants.h

    Ball.cpp

    Первое задание:

  5. Рома:

    Долго думал над 4 зданием, в итоге пришлось себе сделать небольшую подсказку (до того что надо тупо пять раз одну функцию повторить я почему то не допёр. Если что то будет не правильно, поправьте меня пожалуйста.

  6. |Oleg|:

    В задании №3 захотелось поэкспрементировать с делением long double

    после вот такого кода получил следующий результат:

    Enter a double value:
    14.958
    Enter a second double value argument:
    97.1122331423
    Choose arithmetic operation by printing one of the following: +, -, *, or /:
    /
    14.958/97.1122331422999999981 = 0.154027968629676346378

    Конечно же, у меня был «нормальный» путь — создать отдельную переменную для результата деления. И надеяться на компилятор, потому как индекс ld/LD/lD/Ld будет негде поставить — инициализация такой переменной зависит от ввода пользователя…

    когда же я поменял setprecision на 22, то получил следующее:

    14.957999999999999999993/97.112233142299999998082 = 0.15402796862967634637762

    Что же произошло? Если всё правильно понял, то для выражений в cout у нас дефолтная точность double — 16 значащих цифр. И эта точность ‘как-то’ распределяется на два аргумента делимое/делитель.

    У первого 5 верных цифр, у второго 11(первый случай, точность 21). Всё нормально. НО уже во втором случае получается точность 4 + 11 = 15. Или всё-таки пятую цифру первого аргумента нужно считать, а я совсем не понимаю правил округления? Почему компилятор gcc взбесился именно от setprecision(22), а при setprecision(21) — точность long double — выдал вполне обычный, понятный результат?

    Благодарю, если кто-то заморочится с поиском истины, хотя это и не так важно. ))

  7. Valdemar:

    Юра, спасибо тебе за этот чудесный сайт!!!

    Служу сейчас в ЗСУ и в свободное время решил попробовать овладеть новыми знаниями (у меня образование медицинское).

    Дошел до Итогового теста 2-й главы и понял, что не смогу написать 4-е задание без заглядывания в ответы.

    Начал все заново с первого урока.

    Просил чат GPT дать дополнительные задачки по каждой теме.

    В итоге написал 4-е задание без подсказок и, не веря в работоспособность сего творения, нажал на на пуск)

    Как же я радовался, когда все получилось! Программа рабочая, но дай, пожалуйста, обратную связь, что я сделал не удачно?

    Слава Украине!

    constants.h

    main.cpp

    1. Фото аватара Юрий:

      Привет! По коду — бросается в глаза функция result(), которая перегружена «однотипным» кодом. Можно подумать, как избавиться от многочисленных if.

      То, что не всё дается сразу и легко — это нормально, таков процесс обучения не только в программировании, но и в других сферах. Слишком зацикливаться на подобных задачках не стоит, но и пропускать тоже не желательно.

      P.S. А вообще в программировании всегда есть много разных вариантов решения проблемы: одни — удачны, но сложны, другие — простые, но громоздкие, третьи — и сложны и громоздкие и т.д. Задача хорошего программиста состоит в том, чтобы подобрать наиболее удачное из существующих решение конкретной проблемы, учитывая обстоятельства ситуации. Это нелегко 🙂

    2. Vladyslav Grechykhin:

      Это отлично, я тоже начал осваивать С++, будучи экономистом. Много if . Использовать лучше либо switch, либо через цикл (ещё лучше, так как он красиво после каждой итерации тебе выведет остаток после каждой секунды)

      Слава Украине

      1. Valdemar:

        Спасибо за поддержку)

        Но ведь switch и циклы рассматриваются в 5 й главе и я до них не дошел? Или я где-то что-то пропустил?

  8. Владимир:

    Первое задание сделал с помощью добавления функции на получение времени. Костыль с «i<time +1″(цикл на 1 раз меньше выполняется из-за итератора) можно было через while пофиксить, но так тоже работает.

  9. Артём:

    Вот моё решение
    main.cpp

    constants.h

  10. Luffy:

    Добрый вечер! Вот мой код 🙂 все никак не научу себя применять функции, кроме как функции ввода)

  11. Вардан:

    Здравствуйте! Вот моё решение, все ответы совпали, как в примере. Подскажите пожалуйста, чем плох моё решение?

  12. Егор:

    Привет, посмотрел решение автора по заданию 4 и… Ничегошеньки не понял, очень мудреное, сложно читать и понять. Я сделал чуть полегче (по деревенски) и нарушил одно негласное правило. Но все же работает)

  13. Роман:

    Пытался сделать на If, но что то пошло не так. Код не сильно читабельный (У меня была цель — выполнить поставленную задачу со всеми проверками и тд.). Возможно код не оптимизирован, но зато работает (на любую высоту (в пределах double)). 🙂

    main.cpp

    constants.h

    1. Роман:

      Обновленный код (почищен, мелкие fix's). В принципе на этом все, всем удачи 🙂

      1. xshady:

        очень интересные названия функций))

  14. Alex:

    Добрый день!
    Спасибо авторам за такой замечательный ресурс!
    У меня есть вопросы по упр. 4:

    1. Почему в функции double calculateHeight в аргументе мы прописываем double initialHeight, int seconds.
    а в самой функции появляются переменные distanceFallen и currentHeight. Почему их не надо прописывать в имени функции, а initialHeight и seconds нужно прописать.

    2. Почему в main нам потребовалось объявить константой initialHeight?

    3. Почему в main в вызове функции calculateAndPrintHeight у нас указан аргумент initialHeight, но он разный, хотя мы его объявили константой. Почему нельзя использовать значение currentHeight (хотя, прописал в функции void calculateAndPrintHeight(double currentHeight, int seconds), и затем double height = calculateHeight(currentHeight, seconds); и все равно работает программа (вот как выглядит функция после изменения:

    )
    Спасибо за ответы.

    1. Виталий:

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

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

  15. myName:

    Как же я ломал голову по поводу передачи расстояния из функции с потерей остатка от деления. Оказалось что тип данных функции всего то нужно было превратить в тип double 😀

    main.cpp

    constants.h

  16. Артем:

    Задание №4. Решения других пользователей мне по какой-то причине кажутся очень сложными, пока разбирался в их коде заболела голова. Сам набросал такой код, кажется, что он куда проще и читабельнее.

    1. Egor:

      Интересно кончено, но только один вопрос: а зачем вообще нужно было добавлять bool boba, если можно в if вписать (bH > 0), что по сути тоже самое? Тот же вопрос к глобальной переменной check, которая по сути нужна ни для чего. Ведь в функции gMetr мы получаем значение, которое затем присваиваем переменной g и посылаем в функцию calcHeight, после чего, зачем-то, делаем это значение глобальным, при том что используется оно в единственной функции, в которой это значение уже и так есть

    2. Нина:

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

  17. Mari:

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

    1. Egor:

      Я, как любитель модульных программ (как моды для игр), люблю использование функций из-за одной важной детали: эти функции можно модифицировать и\или использовать в других программах. К тому же возможность проверить каждую функцию отдельно от кода бывает полезной (и я уже не говорю про возможность сворачивать функции, в которых ты уверен, в 1 строку (в VisualStudio)).
      Но в целом — да, для небольших программ можно и без функций

  18. nikkutuzov:

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

    main.cpp:

    myConst.h:

  19. Тим:

    Сколько раз вы моргнули за всю свою жизнь? (Примечание: Ответ исчисляется в миллионах)
    int32_t, зачем нам отрицательная часть) лучше заменить на uint32_t

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

      «Использовать тип unsigned (вместо signed) для получения еще одного бита для представления положительных целых чисел, почти никогда не является хорошей идеей» — Бьёрн Страуструп

      https://ravesli.com/urok-32-fiksirovannyj-razmer-integers-spor-naschet-unsigned/#toc-5

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

    Добрый день, мой вариант

  21. DeniZZka:

    третье задание

    1. Андрей:

      Неверно. Вернее, программа все равно выводит правильный ответ, но в начале строчки есть пробел. Это оттого, что else будет исполняться всегда, за исключением последнего случая(/). Чтобы программа правильно работала, все if-ы кроме первого нужно заменить на else if.

  22. Юлий:

    Задание №4

    Основной код:

    constants.h

    1. Юлий:

      При усовершенствовании программы пришлось разнести расчет данных и вывод их на экран по разным функциям) Наглядно видна разница.
      Спасибо Вам большое, Юрий! Этим урокам просто нет равных.

  23. Антон:

    Третье задание. Для каждой задачи свой файл.

    input.cpp

    input.h

    calculate.cpp

    calculate.h

    output.cpp

    output.h

    main.cpp

  24. ОЛЕГ:

    Третье задание:

    Файл main.cpp:

    Файл inNumber.cpp:

    Файл cimbol.cpp:

    Файл head.h:

  25. ОЛЕГ:

    Четвертое задание:

    Файл main/cpp:

    Файл constanta.h:

  26. Данил:

    Третье задание, нормально?

  27. Oleg:

    4 задание

    Что скажете?

  28. Артурка:

    4-е задание:

    FallingBall.h:

    BallFallConstants.h:

    FallingBall.cpp:

    Source.cpp:

  29. Артурка:

    3-е задание:

  30. Ангелина:

    Очень забавляют люди, которые используют для решения четвертой задачи циклы. Тут ведь соль задачи, как я понимаю, именно в том, чтобы решить её только с помощью имеющихся средств, то есть только с тем, что уже было пройдено ранее.

    У меня вышел такой вот код, к сожалению, отрицательную высоту все равно показывает, не понимаю, почему так(

    constants.h

    main.cpp

    1. Smail:

      Уже не актуально но всё же .Проверка в 16 строке не имеет смысла ,bW всегда будет положительная потому что умножение и деление не может сделать число отрицательным .Нужно проверять разницу начальной высоты и расчётной .У вас расчётная высота всегда возвращается и если она больше начальной то возникает минус .Например начальная высота 5 а расчёт вернул 10; 5-10=-5

      1. Ангелина:

        Всегда актуально, спасибо большое)

    2. Виктор:

  31. Slava:

    Сделал такой код.

    constants.h

    program.h

    main.cpp

  32. Slava:

    Калькулятор

  33. Elaiten:

    Не понимаю, почему после 3 секунды у меня начинаются отрицательные числа

    1. Raimok:

      1) Y в этой программе — не скорость, а значение текущей высоты.
      2) Условие в блоке if проверяется 1 раз при выполнении строчки, если в момент срабатывания if условие выполняется — вложенный цикл оттарабанит до конца, потому что внутри цикла ничто не может его прервать (не влияет на счетчик i). Вместо использованной конструкции if + for достаточно одного цикла while, где условием будет высота больше 0, а в теле будет, собственно, эта высота изменяться. Ну или же засунуть if на проверку высоты в тело цикла for (с последующим break), рабочий вариант, но более громоздкий.
      3. Зачем вывод функции через инициализацию double h? Исходя из того, как написана функция, достаточно типа void и все.

  34. Onium:

  35. Кто-то:

    Вышло как-то так

    myConstants.h

    main.cpp

  36. Антон:

    у меня так вышло

  37. Павел:

    Ну на самом то деле решение то не правильное. У Вас в задаче сказано x секунд, но решение дано только для 5-ти секунд. К сожалению решение этой задачи без знания цикла for на мой взгляд проблематично (у меня фантазия отказала((). Ниже мой пример реализации при которой плевать на высоту (до тех пор пока не будет переполнения), а так же делает столько шагов сколько надо, не останавливаясь на 5-ом.

    Решение:

    1. Павел:

      Спасибо автору статей за его бесценный труд.

  38. Данил:

    Последнее задание с циклом!

    https://pastebin.com/grjeADV2

    + там еще заголовочный файл с константой гравитации(не добавлял)

  39. mloborev:

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

  40. Юра:

    Я по своему реализовал калькулятор

  41. mloborev:

    Файл "main.cpp"
    ——————-

    Файл "myConstants.h"
    ————————-

    1. Inviser666:

      неплохо, только у Вас в строке 15 есть одна ошибка:

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

      1. mloborev:

        Точно, спасибо! Я когда дописал, заметил, что начальную высоту не указал, а к тому времени забыл про введённую переменную.

  42. Inviser666:

    легко

    main cpp:

    constants.h:

  43. Alex:

    Юрий, добрый день/вечер.

    Совсем было забросил обучение с++, работа и тп. Начала недавно с нуля, чтобы и пробелы залатать.

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

    Чуть переписал, но уже и использование ссылок.

    1. Kris:

      Очень странно делать переменные в сигнатуре тип const double&, ведь это простой тип, зачем брать от него ссылку и ставить константу. Ссылка необходима, если мы меняем значение самой переменной, и то, обычно, советуют для этого использовать указатели, чтобы было ясно, что мы меняем значение переменной (кроме тех функций, в которых это и так понятно, что будет изменено значение, например, swap(double&, double&)). В других случаях, обычно, используют ссылку для того, чтобы уменьшить время и память на копирование сложных объектов, но для double или int это выглядит нелепо.
      Const тоже, в данном случае, будет лишним (если передавать не как ссылку). Если же как у вас, в виде ссылки, то, конечно, да, необходимо const. Но, все таки, в данном случае, нету абсолютно никакого смысла передавать переменные как ссылки.

  44. Nikita:

    Такой вопрос, почему у вас получилась такая последовательность цифр после каждой итерации? Насколько я понял вы используете формулу равноускоренного движения. Так вот.
    Если судить по вашему листингу, то происходит следующее.
    При первой итерации:
    100-((9,8*(0*0))/2=100//тут все понятно.
    Вторая итерация:
    100-((9,8*(1*1))/2=95.1//тут тоже
    Третья итерация:
    95.1-((9.8*(2*2))/2=75.5//вот тут я и столкнулся с непониманием.
    …………….//Дальше по аналогии, но по итогу получаются совсем не те числа. Я просто накидал на коленке программу с использованием цикла, и у меня получились совсем не так, как у вас. Посему вопрос, может я что-то не так сделал?

    1. Mukha:

      У тебя тоже было так?
      Башня изначально 100 метров
      на 0 секунде — 100
      на 1 — 95.1
      на 2 — 75.5
      на 3 — 31.4
      на 4 — на земле

      1. Денис:

        Третья итерация у вас неверна.
        Каждый раз нужно отнимать от начальной высоты. а не от той, что получилась на предыдущем цикле.

  45. Slava:

    Не могу понять что не так

    1. Сергей:

      В 14 строчке return h, t;

      https://ravesli.com/urok-12-funktsii-i-return/

      Функция может возвращать только одно значение через return обратно в caller.

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

    Добрый день, получил решение задачи следующим путем. Какие недочеты у этого способа решения?

    Файл main.cpp

    const.h

  47. Алексей:

    Изучаю С++ неделю. Нашел ваш сайт. Спасибо за него. Долго мучал 2 итоговое задание. Долго понимал назначение
    void calculateAndPrintHeight(double initialHeight, int seconds).
    Потом вроде догнал, что объеденяет между собой функции вывода и расчета, чтобы в main() был вызов только одной. Верно?
    Мое решение.

  48. Проггер:

    Файл main.cpp:

    Файл const.h:

  49. Антон:

    Что не так? :/

    1. Данил:

  50. ZiF1R:

    Немного полегче сделал.

    myConstants.h:

    main.cpp:

  51. Valery:

    Вставлю так сказать свои 5 копеек))

    EarthConstants.h:

    io.h:

    io.cpp:

    Main.cpp:

  52. Михаил:

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

  53. Ivan:

    Здравствуйте! По поводу вашего ответа на 4 задание:
    Зачем мы в начале функции main вводим КОНСТАНТУ-параметр Initial height?

    Константа или нет, результат выполнения программы не меняется.

    1. Сергей:

      Как я понял, прост))
      Ну, даже если бы это была переменная, на протяжении всей программы она бы не меняла свое значение, ведь мы ее ввели один раз.
      Так зачем же нам делать из нее переменную?

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

    Почти три часа работы и она заработала!!!
    Хотела прокатить через условие или цикл (for), но потом внезапно вспомнила про цикл while. Какое облегчение)))

    constants.h:

    Height.cpp:

  55. Руслан:

    Буга-га-га-га )))))

  56. Руслан:

    )))))))))))

  57. zashiki:

    Здравствуйте, пыталась сделать, чтобы были более разные реакции:

    1 секунда - ....
    2 секунда -мяч коснулся земли...
    стоп

    или

    1 секунда-....
    ...
    5 секунда....
    за 5 секунд мяч так и не коснулся земли...

    Вроде работает.

    Понимаю, что можно короче с if, но как? (в пределах прошедших уроков). И какие еще замечания?:

    Заголовочный файл States.h

    Рабочий файл 1GetHeight.cpp

    Рабочий файл 2FindBTGheight.cpp

    Файл main.cpp

    1. Chestor:

      Допустим вот моя прога:

      main.cpp

      constant.h

      В принципе, в моей программе можно после цикла for использовать условие, что если height == 0, то тогда соответсвующее сообщение вывести 🙂

      1. zashiki:

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

    2. Chestor:

      И посторайтесь меньше свободного пространства оставлять, а то код-то больше становится (кол-во строк).

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

    Какие недостатки у такого исполнения 4-го задания, если они есть?

  59. neuro75:

    Здравствуйте, Юрий!
    Спасибо за Ваш курс. До него начинал читать ряд широко рекомендуемых в сообществе самоучителей, нигде предмет не раскрыт так толково и доходчиво!
    По теме: в 28 уроке Вы рекомендуете использовать uniform инициализацию переменных, а в примерах почти везде используете прямую (к примеру,- константа гравитации в constants.h ответа на 4 вопрос теста). Как более правильно?

    1. Фото аватара Юрий:

      Привет. Рад, что вам приглянулся этот курс. Я не раз в уроках упоминал, что то, что рекомендуется — может не всегда использоваться в примерах следующих уроков (дабы избежать усложнения подачи материала). На практике же рекомендуется использовать uniform инициализацию, хотя (если честно) сам я не всегда встречаю этот тип инициализации. Этот нюанс не настолько критичен и ещё рассматривается с точки зрения удобства его использования.

  60. zvezdonom:

    Переработал и дополнил программу на задание 4.
    Отдельно в файл calculate.cpp вынесены промежуточные функции.
    Добавлен ввод пользователем шага по времени.
    Использовался цикл while, чтобы вычислять любое количество шагов.

    calculate.h

    constants.h

    calculate.cpp

    main.cpp

    PS. Писал в Qt Creator-е.

  61. Cerberus:

    Несколько неудачные примеры во втором задании, и вот почему:

    — Цена акции. Тем, кому приходится работать с финансами, уже давно вдалбливают: хранишь где-то деньги — никаких float, только decimal (т.е. с фиксированной точкой) или его эмуляция на целых числах. Так-то понятно, что в диапазон float она должна вписаться, но тем не менее — bad practiсe.
    — Количество морганий — тут претензия только к формулировке: не "ответ в миллионах" (так получается, что ответ — это количество миллионов морганий, а тогда правильный тип — опять же decimal или хотя бы double), а "значение ответа — порядка нескольких миллионов" или что-то в этом духе.

    Впрочем, скорее всего, это придирки с высоты других языков 🙂

  62. Булат:

    Вот мой вариант, как вам?

  63. Геннадий:

    Юрий, здравствуйте!
    Подскажите, а такое решение правильно?
    Результат выводит такой — какой и требовался.

    С уважением Геннадий.

  64. Алексей:

    А, ну да, спасибо за задачку с оператором ветвления, которому не учили, спасибо класс. Тоже самое что школьнику который только выучил цифры сразу дать задание на таблицу умножения =)))

    1. Cerberus:

      Его разве в главе про тип boolean не было?

  65. Avraam:

    объясните пожалуйста почему не работает мой код

    1. fYm:

      Поменяй в самом начале "int" на "double"

  66. Alexey:

    Вот такой код, не ограничен 5 секундами, если задана большая высота. Если мяч долетит до земли вычисления закончатся.

  67. Вячеслав:

    Эксперементировал с именами функций в 4-м задании вот что получилось, но главное все работает!

  68. Вячеслав:

    в 3-м задании все сделал правильно сверился с ответом, но все равно он работает как калькулятор и считает со всеми операторами, а должен только с +

    1. Юра:

      Немного не понятна ваша проблема. Он выводит все результаты независимо от введенного оператора?

      1. Вячеслав:

        По заданию программа должна работать только с + , а -, * и / должна игнорировать, но работает со всеми операторами, как в простом калькуляторе

        1. Дмитрий:

          Читайте внимательно задание. Программа должна игнорировать все знаки, кроме +,-,*,/
          Суть в том, чтобы выполнить одну арифметическую операцию в зависимости от введенного знака(суммирование, вычитание, умножение, деление).

  69. Andrey:

    Доброго времени суток.
    Пробовал выполнить задание 4.
    Запрос высоты — сделал.
    Требуемую ф-цию, которая будет определять высоту мячика, — сделал.
    По всей (моей) логике следующим этапом должен быть пересчет этой самой высоты, опираясь на время (секунды) и предыдущие результаты. Ну т.е. какая высота будет на следующей секунде, потом еще на одной и т.д.
    Логика подсказывает, что нужно использовать циклы. Но в данном курсе они будут аж в 5-й главе, а из левой литературы я о них узнал пока только то, что они существуют 🙂
    Как без них сделать — не додумался. "Магически" определять секунды сразу в аргументы функции ведь нельзя, это я запомнил. Но как их правильно объявить и посчитать — я еще не знаю.

    Полез смотреть, как же оно реализовано в ответе (до этого подсматривал ток формулу, честное слово :)). В итоге запутался в последних двух ф-циях.. 🙁
    Последняя ф-ция нужна только для того, что бы передать введенную высоту башни и "магическую" секунду одним махом во все остальные, где это нужно? Словно ф-ция, которая собирает в кучу все остальные и заставляет их работать как надо?)
    Себе их скопипастил (с заменой переменных и т.д. на мои), вроде программа работает как должна. Но что-то мне в ней кажется все равно не правильным…
    В общем и целом считаю, что с заданием не справился (все таки пол программы (последние 2 ф-ции) нагло скомунизжено) 🙁

    Вот пример "моей" программы.
    constants.h

    main.cpp

  70. Роман:

  71. Евгений:

    Добрый день! Спасибо огромное за статьи! Стараюсь усложнить себе каждое задание по возможности, вот в последнем решил зациклить весь процесс до двух исходных( достижение земли, указание пользователем любой высоты и времени падения).
    Понимаю что код кривоват, с удовольствием услышал бы как его можно облегчить)

    1. Дмитрий:

      Используйте цикл while для определения оставшейся высоты (если высота меньше 0, то "прилетели"). В таком случае, шагом цикла должно быть количество секунд (в данном случае "считать каждую 1 секунду"). Пример моей программы (вводится начальная высота и шаг в секундах):

  72. Алексей:

  73. Алексей:

  74. Максим:

  75. Игорь...:

    Почему ранее ничего не упоминалось по поводу операторов (не)равенства? Про "==" сказали. А про ">" и "<" ничего. Я хоть и знал о них, но пытался выполнить задание на основании знаний, полученных из предыдущих уроков.
    calculateAndPrintHeight(initialHeight, 0) — это значит, что переменная seconds (вторая по счёту) в этой функции принимает второй параметр указанный во время вызова этой функции? Об этом тоже ничего не говорилось… А ведь всё кроется как раз в этих мелочах…
    А ответы вообще повеселили с их циклами… За это можно дать пирожок, но на данном этапе курса, я не должен знать о них…

  76. Илья:

    Здравствуйте! Во-первых, спасибо Вам большое за Ваши труды!=)
    Во-вторых, извините, не знаю, как копировать программу, чтобы она отображалась, как у вас.
    Буду очень благодарен, если Вы сможете прокомментировать мой код. Я сначала немного не так понял задание и хотел, чтобы программа в случае, если мяч достиг земли ранее 5 секунд, дальше не выдавала строчку на каждую секунду, что мяч лежит. Смутила надпись "дальше мячику падать нельзя" =)) Потом перечитал, понял, что всё таки программа должна выводить результат на каждой секунде, сделал. Но закралась идея сделать и так, как понял изначально (тем более, что это как то более логично, мне кажется=) ).
    Дописал программу не дома, пришлось доделывать через онлайн-компилятор, поэтому отсутствует заголовочный файл, константу вбил в основном файле.
    Вот, собственно, программа:

    И ещё один вопрос: подскажите, почему в примере решения 4-ой задачи используются "магические" числа в головной функции для передачи в Callee значение времени.
    Заранее большое спасибо!

    1. Фото аватара Юрий:

      Привет. То, что строчки программа не выводит, когда мяч находится уже на земли, а 5 секунд не прошли — это хорошо у тебя сделано. Насчет магических чисел — для этого примера подойдет их использование, так как программа не сложная, но то, что ты использовал переменную — это выглядит сложнее + больше повторяющегося кода (это не ошибка, а просто замечание), но такой вариант также вполне уместен в контексте данной программы — это то, к чему можно еще придраться, а так реализация у тебя реально хорошая 🙂

  77. Бенито:

    Вот такой вариант. А вообще почитав комменты понял, что с "i++" в данном случае лучше, чтобы строчки не плодить.

  78. artem:

    Тут можно написать любую высоту и покажется сколько секунд будет падать объект и на какой высоте будет на каждой из них

    1. Фото аватара Юрий:

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

      1. artem:

        Как видите для имен переменных я использую только 1-2 символа, но в ваших примерах(почти) все переменные названы словом, нужно ли называть переменные словами, лучше ли от этого читается код, и вообще есть ли разница в этом?

        1. Фото аватара Юрий:

          Если вам удобно читать код с названиями переменных в 1-2 символа — используйте такие имена. Названия переменных — это дело вкуса каждого отдельно и на выполнение самого кода/программы никак не влияет.

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

    Добрый день. Запутался с 4 заданием. Что куда идет, что куда возвращает, вроде разобрался, открыв ответ. Но самостоятельно решить аналогичную задачу не смогу.
    Как изначально строить логику выполнениния таких задач. Был бы благодарен за совет.

    1. Фото аватара Юрий:

      У вас есть пример в статье, по нему можете ориентироваться. Для задания, которое выполняется несколько раз, следует написать отдельную функцию. Одна функция должна выполнять одно задание, детальнее о разработке программ и логики их написания читайте здесь. Главный принцип, который использован в 4 задании — деление одного сложного задания на несколько легких.

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

      И еще не могу понять что мы делаем в функции
      void calculateAndPrintHeight.
      И почему нигде не используется currentHeight, куда она тогда передается? Как программа узнает текущее положение мяча?

      1. Фото аватара Юрий:

        В функции main() мы вызываем первый раз функцию calculateAndPrintHeight(). В calculateAndPrintHeight() вызывается calculateHeight(initialHeight, seconds), которая возвращает currentHeight. Затем этот currentHeight, который присваивается переменной height в функции calculateAndPrintHeight() выводится вместе с seconds.

        Затем в main() второй раз вызывается функция calculateAndPrintHeight(). В ней уже seconds имеет значение 1, поэтому в calculateHeight() мы получим другое значение (currentHeight).

        Потом в main() третий раз вызывается функция calculateAndPrintHeight(). В ней уже seconds имеет значение 2, поэтому в calculateHeight() мы получим опять другое значение (currentHeight), так как в расчете currentHeight участвует переменная seconds, которая с каждым новым вызовом calculateAndPrintHeight() в функции main() — меняется.

        И так и работает эта программа.

  80. Anton:

    Приветствую, можно критику по поводу 4-ого задания услышать, но не сильно пламенную? По мне код вроде меньше, по крайней мере я не так сильно теряюсь, глядя на множество букв и символов.
    Код в myConstants.h следующий:

    Код в .cpp следующий:

    1. Фото аватара Юрий:

      Смотрите, если не говорить о важности использования функции, о дальнейшей поддержке программы — ваше решение является лучше ответа из статьи. У вас максимально простой код, суть которого можно уловить буквально за несколько секунд. В ответе из статьи сделано всё с учетом того, как правильно должны писаться программы, чтобы и поддержка была простой и модифицировать можно было бы легко и просто.

      Т.е. ваше решение — это простое, понятное и достаточно удобное. Но в перспективе оно плохое (поддержка, модификации и т.д.).

      И еще одна проблема в вашем коде: у вас указывается минусовая высота (если взять высоту 100м и 5 секунд, то на 5-ой секунде у вас будет -22.5 meters. Чтобы этого не было — нужно добавить проверку:

      Готовая программа с проверкой:

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

    ИМХО, в задании №2 на первый вопрос лучше ответить uint8_t (врядли у человека будет отрицательный возраст или ему будет более 255 лет).
    Да, я читал, что беззнаковые переменные лучше не использовать, но здесь идеальная ситуация их применить.

    1. Фото аватара Юрий:

      Можно применить ваш вариант, если только потом с этим возрастом не проводить никаких операций. Так как если возраст задействовать в математических операциях (вычитание или деление), то если у нас будет unsigned, то может произойти overflow, что будет явно не желательным. Но вообще, ваш вариант тоже может быть приемлемым.

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

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