Мое домашнее задание требует от меня использования логических функций. Нужно ли передавать их в функции? - PullRequest
0 голосов
/ 15 апреля 2019

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

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

void A1();
bool A100(bool INTIM);
void A167();
void A232();
void A290();
void A13();
void A212();
void A173();
void A159();
void A161();

int main() {
bool INTIM;

A1();
cout << INTIM << endl;
return 0;
}
void A1()
{
  int choice;
  cout << "Well, Mr Artanon, ...\n 1. ’It’s you who’ll get a rare cut 
across that corpulent neck of yours if you don’t speed things along, you 
feckless blob of festering lard.’\n 2. ’Surely in such an industrious 
kitchen, there must be a starter or two ready to send along and sate His 
Abhorentness’s appetite?’\n (enter a menu option): ";
  cin >> choice;

  while (choice != 1 && choice != 2)
  {
    cout << "Enter in a valid choice (1 or 2)";
    cin >> choice;
  }

  if (choice == 1)
  {
    A100();
  }

  if (choice == 2)
  {
    A167();
  }
}

bool A100(bool INTIM)
{
  int choice;
  INTIM = true;
  cout << " Repugnis turns a paler...\n 1. Onwards, Mr Artanon.\n (enter 
in a menu option): ";
  cin >> choice;

  while (choice != 1)
  {
    cout << "Enter in a valid option (1)";
  }
  return INTIM;
  A232();
  }

Я хочу, чтобы boim INTIM передавался таким образом, чтобы я мог отобразить его обратно в main с помощью оператора cout. Я знаю, что это будет просто 1 или 0 в конце, но я просто пытаюсь заставить его отображаться, по крайней мере, в конце, когда я его отображаю. Опять же, есть функции внутри функций в этой программе, и это может быть моей проблемой, но я бы так не думал. Есть также функции, которые идут после этого, это не конец программы, и если мне нужно опубликовать все это, я

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вызов A100 как написано, вам нужно передать INTIM и принять возвращаемое значение

INTIM = A100(INTIM);

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

INTIM = A100();

и измените A100, чтобы оно выглядело как

bool A100()
{
  int choice;
  cout << " Repugnis turns a paler...\n 1. Onwards, Mr Artanon.\n (enter in a menu option): ";
  cin >> choice;

  while (choice != 1)
  {
    cout << "Enter in a valid option (1)";
    cin >> choice; // added here because otherwise choice never changes
                   // and this loop will go on for a long, long time.
  }
  A232(); // moved ahead of return. Code after a return is not run
  return true;
}

Но так как A232 вызывается и может устанавливать дополнительные флаги, которые вы не можете вернуть, у вас есть недостаток дизайна: что если A232 также изменяет логическое значение? Вы можете вернуть только одну вещь из функции. Вы можете передать логическое значение A232 по ссылке, но как оно тогда A232 вызывает B484, и у него также есть логическое значение?

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

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

0 голосов
/ 16 апреля 2019

Нужно ли передавать их [логические результаты] в функции?

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

Но ваш вопрос: "Вам нужно , чтобы пройти их ...".

Ответ - нет.

Потому что

a) вы отметили это сообщение как C ++, а

b) ключевой особенностью C ++ является пользовательский класс.


  1. Подумайте об объявлении каждой «авантюрной функции» вашей истории в рамках класса.

  2. Каждая «приключенческая функция», в качестве атрибута класса, реализована с одним «скрытым» параметром - указателем this на экземпляр класса.

  3. Итак ... если вы поместите все свои логические значения 'result' в качестве атрибутов данных класса, то при вызове любой "приключенческой функции" также будут "переданы" все атрибуты данных экземпляра класса (все ваши bools!) как часть вызова. На самом деле никакие данные не перемещаются, только указатель, указатель 'this'.


Это может выглядеть примерно так:

#include <iostream>
using std::cout, std::cerr, std::flush, std::endl;
// using std::cin;

#include <iomanip>
using std::setw, std::setfill;

#include <sstream>
using std::stringstream;

#include <string>
using std::string;


namespace AS  // Adventure Story
{
   class CreateYourOwnAdventureStory_t
   {
   private:
      // diagnostic purposes
      stringstream ssUI;
      // command line arguments concatenated into one string
      // contents:  strings convertable to ints to mimic cin

      bool INTIM;
      // other results go here

   public:
      int operator()(int argc, char* argv[]) {return exec(argc, argv);}

   private:

      int exec(int argc, char* argv[])
         {
            int retVal = 0;

            // capture all command line arguments into a string
            for (int i=1; i<argc; ++i)
               ssUI << argv[i] << "  ";

            cout << "\n  ssUI: " << ssUI.str() << "\n\n\n";

            A1();
            cout << "\n  INTIM : " << INTIM << endl;

            // ?more here?

            return retVal;
         }


      void A1()
         {
            int choice = 0;
            cout << "Well, Mr Artanon, ...\n "
               "\n 1. ’It’s you who’ll get a rare cut across that corpulent neck of yours "
               "if you don’t speed things along, you feckless blob of festering lard. "
               "\n 2. ’Surely in such an industrious kitchen, there must be a starter or two "
               "ready to send along and sate His Abhorentness’s appetite?’"
               "\n (enter a menu option): ";

            ssUI >> choice; // cin >> choice;

            if (choice == 1) { A100(); }

            if (choice == 2) { A167(); }
         }


      void A100()
         {
            int choice = 0;
            INTIM = true;
            ssUI >> choice; // cin >> choice;

            cout << "\n\n  A100()  choice:" << choice 
                 << "  INTIM: " << INTIM << endl;
         }

      void A167()
         {
            int choice = 0;
            INTIM = false;
            ssUI >> choice; // cin >> choice;

            cout << "\n\n  A167()  choice:" << choice 
                 << "  INTIM: " << INTIM << endl;
         }

      // other action-functions go here

   }; // class CreateYourOwnAdventureStory_t
   typedef CreateYourOwnAdventureStory_t  CreateYOAS_t;

} // namespace AS

int main(int argc, char* argv[]){return AS::CreateYOAS_t()(argc,argv);}

Примечания:

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

Вы заметили, что вам (вероятно) не понадобятся предварительные объявления для ваших функций? Компилятор должен сканировать большую часть объявления класса, чтобы решить различные проблемы, и, таким образом, может выяснить, что A100 (и A167) фактически находятся в области действия AS :: CreateYOAS_t ::. Функции по-прежнему можно перемещать в файл cpp, так что вы можете использовать преимущества отдельной компиляции. (и, возможно, сэкономите некоторые усилия при компиляции небольших файлов и только измененных файлов.)

Заметили ли вы, что функции, обращающиеся к INTIM, просто используют bool, не требуя каких-либо 'this->' для удаления ссылки?

Main вызывает простой Functor. Ничего больше. Основной вызывает оператор (). Простой, минимальный. Ctor и Dtor в настоящее время по умолчанию. Если вам нужно использовать ctor для инициализации результатов или другой промежуточной информации, я бы просто добавил его рядом с реализацией operator ().

PS: Вы упомянули использование bools для возврата результатов. В качестве альтернативы вы можете использовать строковый поток ... один поток с текстом ... использовать его в качестве журнала для записи текущей игры или для простого простого общего отчета пользователю.

Удачи.

...