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

  Юрий  | 

  Обновл. 15 Сен 2020  | 

 23363

 ǀ   25 

В этой главе мы рассмотрели много материала. Если вы дошли до этого момента, то я вас поздравляю — вы проделали немало работы и это уже хороший шаг на пути к изучению языка C++ в частности и программированию в целом! Сейчас же давайте закрепим пройденный материал.

Оглавление:

Теория

Блок стейтментов (или «составной оператор») обрабатывается компилятором так, как если бы это был один стейтмент. Составные операторы помещаются в фигурные скобки { и } и используются почти везде.

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

Глобальные переменные создаются, когда программа запускается, и уничтожаются, когда она завершает свое выполнение. Они могут использоваться в любом месте программы. Неконстантные глобальные переменные следует избегать, потому что это — зло.

Ключевое слово static может использоваться для преобразования глобальной переменной во внутреннюю (с внутренней связью), чтобы её можно было использовать только в том файле, в котором она объявлена. Также ключевое слово static используют для указания того, что локальная переменная должна иметь статическую продолжительность жизни. А это означает, что она будет сохранять свое значение даже после выхода из своей области видимости.

Пространство имен — это область, в которой гарантируется уникальность всех имен. Отличный способ избежать конфликтов имен. Не используйте стейтменты using вне тела функций.

Неявное преобразование типов данных происходит, когда один тип данных конвертируется в другой тип без использования одного из операторов явного преобразования. Явное преобразование типа происходит, когда один тип данных конвертируется в другой с помощью одного из операторов явного преобразования. В некоторых случаях это абсолютно безопасно, в других случаях данные могут быть потеряны. Избегайте использования конвертации C-style, вместо нее используйте оператор static_cast.

std::string — это простой способ работы с текстовыми строками (текст помещается в двойные кавычки).

Перечисления позволяют создавать собственные (пользовательские) типы данных. Классы enum — это те же перечисления, но надежнее и безопаснее. Используйте их вместо обычных перечислений, если ваш компилятор поддерживает C++11.

typedef позволяет создавать псевдонимы для типов данных. Целочисленные типы данных с фиксированным размером реализованы с помощью typedef. Псевдонимы типов полезны для присваивания простых имен сложным типам данных.

И, наконец, структуры. Они позволяют сгруппировать отдельные переменные в единое целое. Доступ к членам структуры осуществляется через оператор выбора членов (.). Объектно-ориентированное программирование в значительной степени основывается именно на структурах, поэтому, если вы изучили только одну вещь из этой главы, то лучше, чтобы это были структуры.

Тест


При разработке игры мы решили, что в ней должны быть монстры, потому что всем нравится сражаться с монстрами. Объявите структуру, которая представляет вашего монстра. Монстр может быть разным: ogre, goblin, skeleton, orc и troll. Если ваш компилятор поддерживает C++11, то используйте классы enum, если нет — обычные перечисления.

Каждый монстр также должен иметь имя (используйте std::string) и количество здоровья, которое отображает, сколько урона он может получить, прежде чем умрет. Напишите функцию printMonster(), которая выведет все члены структуры. Объявите монстров типа goblin и orc, инициализируйте их, используя список инициализаторов, и передайте в функцию printMonster().

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

This Goblin is named John and has 170 health.
This Orc is named James and has 35 health.

Ответ C++11

Ответ до С++11

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

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

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

  1. Аватар Руслан:

  2. Аватар VEX:

    Капец, сделал архитектуру программки, все сделал правильно, а в итоге получил 9 ошибок и 5 сообщений, а как только поменял местами структуру и перечисление типов монстров, все стало работать отлично.

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

    Сделал небольшую игру)

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

    Не судите строго, пожалуйста)

  5. Аватар Андрей:

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

    Объясните пожалуйста.

    p.s я в ответ не заглянул,ибо не хочу списывать.

    1. Аватар Сергей:

      Понимаю,что код плохой, но я только начал программировать.

  6. Аватар Yerdurshlak:

  7. Аватар Марат:

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

  9. Аватар Aur1IIad0r:

    // Example program

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

    Добрый день!
    Знаете, если честно, я так и не понял преимущества использования enum. Я написал две программы. Принципиально с enum, чтобы разобраться с ними, и без enum, так, как на мой взгляд проще. И могу сказать, что без enum действительно получилось намного проще и, на мой взгляд, код тоже читать проще.
    Вот и сижу, мучаюсь догадками. Есть три предположения=))
    1) Вы плохо объяснили все преимущества перечислителей. В этом я сильно сомневаюсь, т.к. всем предыдущие уроки прошли на ура, Вы очень хорошо расписываете материал=)
    2) "На вкус и цвет товарищей нет" — т.е. каждый работает по своему, у каждого свои принципы работы и каждый делает так, как ему удобно (не пренебрегая, конечно, общими правилами, чтобы други могли разобраться в коде)
    3) Перечислители действительно не так уж и полезны, как утверждают некоторые кодеры=)
    Очень интересно узнать Ваше мнение по этому поводу=)Заранее спасибо!
    Вот те самые программы с enum и без (программа без enum была написана последней, поэтому в ней, опять же на мой взгляд, лучше подобраны имена переменных и т.п.). Без перечислителей:

    ____________________________________
    Вариант с enum:

    1. Аватар Алексей:

      Возможно, экономия памяти. Если к примеру известно что переменная может хранить значение только "Самолёт взлетел", "Самолёт летит" и "Самолёт приземлился", "Самолёт разбился",то для этого можно использовать перечисление. Тогда переменная будет иметь объём 4 байта (на моём компиляторе, VS 2019 Windows 10 x64, на другом может быть будет по-другому). Причём даже не важно, будут строки эти длиннее или короче, чем мною приведённые. А если использовать для этого строки, то понадобится не меньше 20 байт. Но это опять таки только догадка, возможно, у перечислений есть ещё какие-то преимущества.

      PS. В универе нам тоже не объяснили накой перечисления сдались. Зато во всю заставляли использовать)))))

  11. Аватар Alexey:

    Игра против компьютера…

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

  13. Аватар Дмитрий:

    Так же решил создать мини игру, на основании изученного с данного сайта материала.
    Комментировал на сколько мог, надеюсь кому то пригодится для разбора.
    Спасибо автору сайта, за предоставленную возможность.
    П.С. Циклы просматривал до этого, с другого сайта (но мельком). 🙂

    1. Аватар zvezdonom:

      В строке

      опечатка/ошибка.
      Должно быть

  14. Аватар rpa4:

    Вот, исходя из всех уроков 4-й главы, сделал такую вот игру с монстрами. Прошу прощения за длинный код.

    1. Юрий Юрий:

      Реально прикольно получилось 🙂 Долго делал?

      1. Аватар rpa4:

        Ну где-то часик 🙂

        1. Юрий Юрий:

          Нормально.

        2. Аватар Константин:

          Уважаемый rpa4! Подскажите мне, пожалуйста, как Вы кодите предложение, в котором тип монстра задаётся буквами, а не как у меня — числом:

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

      Тоже была такая же идея) Но я что-то не пойму, я что, где-то пропустил циклы в предыдущих уроках?

  15. Аватар Герман:

    Уважаемый автор, какой смысл функцией getMonsterTypeString(Monster monster) проверять логические условия, если типы "монстров" и так объявлены в enum class MonsterType?
    Заранее спасибо!

    1. Юрий Юрий:

      В getMonsterTypeString мы присваиваем значения для MonsterType::GOBLIN и MonsterType::ORC — Goblin и Ork соответственно. Если бы мы не использовали getMonsterTypeString, то вместо MonsterType::GOBLIN выводилось бы 1, а вместо MonsterType::ORC — 3. Функция getMonsterTypeString — это инициализация элементов структуры и заодно проверка.

      1. Аватар Герман:

        Про инициализацию элементов структуры я не сообразил. Спасибо!

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

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