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

  Юрий  | 

    | 

  Обновл. 21 Апр 2019  | 

 10336

 ǀ   16 

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

Теория

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

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

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

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

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

Неявное преобразование типов данных происходит, когда один тип данных конвертируется в другой тип без использования одного из операторов casts. Явное преобразование типа происходит, когда один тип данных конвертируется в другой с помощью одного из операторов casts. В некоторых случаях это абсолютно безопасно, в некоторых — данные могут быть потеряны. Избегайте использования C-style cast, вместо него используйте оператор 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 (76 оценок, среднее: 4,91 из 5)
Загрузка...

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

  1. Аватар Aur1IIad0r:

    // Example program

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

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

    ____________________________________
    Вариант с enum:

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

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

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

  3. Аватар Alexey:

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

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

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

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

    1. Аватар zvezdonom:

      В строке

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

  6. Аватар rpa4:

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

    1. Юрий Юрий:

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

      1. Аватар rpa4:

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

        1. Юрий Юрий:

          Нормально.

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

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

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

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

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

    Уважаемый автор, какой смысл функцией 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 не будет опубликован. Обязательные поля помечены *