C ++ Fizz Buzz альтернативная версия - PullRequest
0 голосов
/ 23 января 2019

Я относительно новичок в переполнении стека (да, я чрезвычайно новичок в кодировании), и в настоящее время я работаю над измененной версией вопроса Fizz Buzz.Может ли кто-нибудь помочь мне понять, что я делаю неправильно?Я не могу найти ответ на переполнение стека.Используйте цикл while вместо цикла for, чтобы написать программу, которая выводит строковое представление чисел от 1 до n.

Но для кратных трех следует вывести «Fizz» вместо числа и для кратныхпять выходных «Buzz».Для чисел, кратных трем и пяти, выведите «FizzBuzz».

Пример:

n = 15,

Вывод:

1

2

Fizz

4

Buzz

Fizz

7

8

Fizz

Buzz

11

Fizz

13

14

FizzBuzz

Мой код

   #include <iostream>
using namespace std;
int n = 0;
{
       cout << "Enter your number ";      // Prompt for input
       cin >> n;                          // Get the input.
       for (int i = 1; i <= n; i++) 
       {
               if ((i % 15) == 0)
                       cout << "FizzBuzz\n";
               else if ((i % 3) == 0)
                       cout << "Fizz\n";
               else if ((i % 5) == 0)
                       cout << "Buzz\n";
               else
                       cout << i << "\n";
       }
       return 0;
}

В то время как я получаю сообщение об ошибке для строки 4:

4:1: error: expected ',' or ';' before '{' token 

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы должны быть в состоянии сделать это одинаково хорошо с помощью цикла for или while. Однако это не то, почему ваша программа не работает. Как уже упоминалось ранее @EvilTeach, ваша программа в основном принимает входные данные из stdin (через cin) вне фигурных скобок ({}) в функции main ().

Подпись функции в C / C ++ определяется как: -

return-type funcName(ArgType1 arg1, ... , ArgTypeN argN) 
{
    // cin goes here
    // Your loop goes here
}
0 голосов
/ 22 марта 2019

В FizzBuzz важна эффективность кода;более короткие коды кажутся более загадочными, но более крупные из них, как правило, имеют более низкую кривую обучения (менее читаемые).Я выбрал три способа кодирования этого и измерения их продолжительности;Общеизвестно, что подобный код на С ++ требует больше времени и памяти, чем те, что написаны на C. Поэтому вы должны посмотреть свой способ кодирования в зависимости от конечного назначения двоичных файлов и временных рамок, которые у вас есть для этого.

#include <iostream>
#include <chrono>
#include <cstring>

void runOne(int n, void (*fnc)(int));
void fizzbuzzAnsiC(int n);
void fizzbuzzAnsiC2(int n);
void fizzbuzzCpp(int n);

using namespace std;
using namespace std::chrono;

int main(int argc, char *argv[])
{ long iter = 100;

  if (argc > 1)
    iter = strtol(argv[1], nullptr, 10);

  runOne(int(iter), fizzbuzzAnsiC2);
  cout << endl << "==============" << endl;
  runOne(int(iter), fizzbuzzAnsiC);
  cout << endl << "==============" << endl;
  runOne(int(iter), fizzbuzzCpp);
  cout << endl << "==============" << endl;

  return 0;
}

void runOne(int n, void (*fnc)(int))
{ high_resolution_clock::time_point t1 = high_resolution_clock::now();
  fnc(n);
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  auto duration = duration_cast<microseconds>( t2 - t1 ).count();
  cerr << "Lasted: " << duration << " us" << endl;
}

static const char* cszFizz = "Fizz";
static const char* cszBuzz = "Buzz";

void fizzbuzzAnsiC(int n)
{ int     i;
  char    szPrn[11];
  char    szNum[11]; //Suppose 9 digits number max (10e8-1)
  char    uMul;

  for (i = 1; i <= n; ++i)
  { uMul = i%15 == 0;
    strcpy(szPrn, uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : itoa(i, szNum, 10)));
    if (uMul) strcat(szPrn, cszBuzz);
    strcat(szPrn, "\n");
    fwrite(szPrn, 1, strlen(szPrn), stdout);
  }
}

void fizzbuzzAnsiC2(int n)
{ int i;
  const char *messages[] = {"%i\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};

  for (i = 1; i <= n; ++i)
    printf(messages[((i % 3) == 0) + 2*((i % 5) == 0)], i); //printf takes longer then str* functions
}

void fizzbuzzCpp(int n)
{ for (int i = 1; i <= n; ++i)
  { bool uMul = i%15 == 0;
    std::cout << (uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : std::to_string(i)));
    if (uMul) std::cout << cszBuzz;
    std::cout << std::endl;
  }
}

По мере увеличения числа итераций fizzbuzzAnsiC2 становится менее эффективным.Функция fizzbuzzAnsiC всегда наиболее эффективна.

0 голосов
/ 23 января 2019

Для начала вам нужно переместить брелок в фигурные скобки {}.Это должно пройти мимо вашей ошибки компиляции.Как правило, рекомендуется также выводить подсказку, когда вы запрашиваете ввод.Как правило, если вы обращаетесь за помощью, всегда включайте все ошибки компиляции, которые вы получаете.Это помогает сосредоточиться на проблеме.Добро пожаловать в переполнение стека.

#include <iostream>
using namespace std;
int main ()
{
       cout << "Enter your number ";      // Prompt for input
       cin >> n;                          // Get the input.
       for (int i = 1; i <= n; i++) 
       {
               if ((i % 15) == 0)
                       cout << "FizzBuzz\n";
               else if ((i % 3) == 0)
                       cout << "Fizz\n";
               else if ((i % 5) == 0)
                       cout << "Buzz\n";
               else
                       cout << i << "\n";
       }
       return 0;
}
...