что является альтернативой для циклов "while" / "for" - PullRequest
1 голос
/ 24 марта 2019

У меня есть домашнее задание, где я должен снова и снова делать какие-то действия, пока не напишу «stop» в консоли, НО я не могу использовать for, while, goto, switch, [], typedef во всем моем коде.Так как я могу заменить цикл?

Ответы [ 3 ]

9 голосов
/ 24 марта 2019

Рекурсия может быть использована. Этот пример повторяет то, что вы вводите, пока не наберете «stop» в качестве примера:

#include <iostream>
#include <string>

void do_it()
{
  std::string s;
  std::cin >> s;
  if (s == "stop")
    return;
  std::cout << s << '\n';
  do_it();
}

int main()
{
  do_it();
  return 0;
}

Возможно, это не тот случай, но рекурсия имеет свои недостатки. Во-первых, это медленнее, чем простой цикл, потому что в таких языках, как C ++, вызов функций относительно дорог. И это может вызвать переполнение стека, если оно повторяется слишком много раз. Сказав это, рекурсивная версия функции иногда может быть чище и легче для чтения / понимания. Вы можете узнать больше о плюсах и минусах рекурсии здесь .

2 голосов
/ 24 марта 2019

Как отмечается в комментариях Джеспера Джуля, они запретили goto, но забыли запретить setjmp / longjmp!

В отличие от решений на основе рекурсии, setjmp / longjmp не можетможет вызвать переполнение стека, если вы выполняете слишком много раз.

#include <csetjmp>
#include <iostream>
#include <string>

int main()
{
    std::string s;

    std::jmp_buf jump_buffer;
    setjmp(jump_buffer);

    std::cin >> s;

    if (s == "stop")
        return 0;

    std::cout << s << '\n';
    std::longjmp(jump_buffer, 0);
}

Обратите внимание, что longjmp потенциально опасен, поскольку не вызывает деструкторы.Поэтому этого следует избегать, когда это возможно.

1 голос
/ 24 марта 2019

Вызов принят - версия C для оригинального тега

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
    if (strcmp(*argv, "stop")) {
        char *in = malloc(99);       // assume it worked
        fgets(in, 99, stdin);        // assume it worked
        *(in+strcspn(in, "\n")) = 0; // remove trailing ENTER
        main(argc + 1, &in);         // memory leak
    } else {
        printf("Stopped after %d entries.\n", argc - 1);
    }
}

См. Код, работающий на ideone: https://ideone.com/Slx4g9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...