2012-11-16 2 views
3

Я хотел проверить свои навыки на C++, выбив быстрое приложение fizzbuzz. Код для него размещен ниже. Однако, когда я запускаю это приложение, происходит что-то сумасшедшее. Вот мой код:FizzBuzz Disaster

#include <iostream> 
#include <string> 
using namespace std; 

bool ismultiple3(int i) { 
    int res = i%3; 
    if (res == 0) 
    return true; 
    return false; 
} 

bool ismultiple5(int i) { 
    int res = i%5; 
    if (res == 0) 
    return true; 
    return false; 
} 

int main() { 
    string output; 
    for (int i = 1; i <= 100; i++) { 
    output = i; 
    if (ismultiple5(i) || ismultiple3(i)) { 
     output = ""; 
     if (ismultiple3(i)) output.append("Fizz"); 
     if (ismultiple5(i)) output.append("Buzz"); 
    } 
    cout << output; 
    } 
} 

Поэтому, когда я запускаю и скомпилировал его, весь мой терминал перепутался. Кажется, что кодировка символов каким-то образом изменяется. Он по-прежнему принимает команды нормально, он просто отключается. Я попробовал продемонстрировать это. Compiled, ran, and ls Remainder of ls command

Edit: В случае, если кто-нибудь натыкается на это, я в конечном итоге добавив заявление еще и делать cout << i в нем, потому что моего компьютера г ++ компилятор не хватает поддержки C++ 11. Функции также были сокращены и объединены в одну функцию, которая принимает 2 аргумента, i и n.

+7

Линия 'output = i' не делает то, что вы думаете, что она делает! – ruakh

+1

Функция 'to_string' должна пригодиться. Также ваши функции 'ismultiple' намного длиннее, чем необходимо. –

+5

Я украл этот вопрос для моего следующего имени группы. – Blastfurnace

ответ

3

Как и другие комментаторы сказали, output = i это вопрос здесь. Значение i отличает от int до char, оставляя строку output с последовательностью ASCII characters при запуске этого цикла. Например, 97 == 'a', 144 == 'É' и так далее.

Я хотел бы переписать логику в основной функции, чтобы просто иметь три вызова cout << ... внутри блока if-else. Кроме того, функции ismultipleN() могут быть заменены на просто (i % 3 == 0) для краткости.

+0

Как я уже говорил, я расширил свои функции, чтобы сделать вещи более ясными для себя. Спасибо за совет, хотя. – Nathan

2

вместо

output = i; 

Вы должны использовать один из методов, предложенных в this answer.

Например:

std::string to_string(int x) { 
    std::stringstream out; 
    out << x; 
    return out.str(); 
} 
+0

Я попытался использовать to_string(), но, по-видимому, моя версия g ++ не поддерживает C++ 11. Yaaaay. Потоки потребуют реструктуризации, если нет несложного способа сброса потоков (что уже слишком сложно для приложения fizzbuzz). – Nathan

+1

@derekwolf, см. Http://stackoverflow.com/a/13388063/5987. В противном случае вам может потребоваться включить C++ 11 с помощью командной строки. –

+0

@derekwolf: Я сделал небольшое редактирование на свой пост. Вы можете легко взять один из примеров в этом посте и преобразовать его в функцию, например, я. Затем вместо 'output = i' вы должны выполнить' output = to_string (i) '. –