FizzBuzzライブラリ
twitterでFizzBuzzが書けないプログラマがどうのこうのという話題を目にしたので、日本のどこかにいるFizzBuzzが書けないプログラマさんの為に、FizzBuzz用のC++ライブラリを作ってみました。
ヘッダ(FizzBuzz.h)とソース(FizzBuzz.cpp)があるだけだから簡単にプロジェクトに追加できるよ!
使い方は下の方にありますです。
コード
FizzBuzz.h
#ifndef _FIZZBUZZ_H_ #define _FIZZBUZZ_H_ #include <map> #include <string> #ifdef __GNUC__ #define NONNULL __attribute__((nonnull)) #else #define NONNULL #endif class FizzBuzz : public ::std::map<int, ::std::string> { public: ::std::string& operator()(int n, ::std::string& str)const; ::std::string operator()(int n)const; char* operator()(int n, char* str)const NONNULL; }; #endif
FizzBuzz.cpp
#include <cstdio> #include <cstring> #include <sstream> #include "FizzBuzz.h" using namespace std; string& FizzBuzz::operator()(int n, string& str)const { bool added = false; for(const_iterator itr=begin(); itr!=end(); ++itr){ if(n % itr->first == 0){ if(added) str += ' '; else added = true; str += itr->second; } } if(!added){ stringstream sstr; sstr << n; str = sstr.str(); } return str; } string FizzBuzz::operator()(int n)const { string str; return operator()(n, str); } char* FizzBuzz::operator()(int n, char* str)const { if(str == NULL) return NULL; string s; operator()(n, s); strcpy(str, s.c_str()); return str; }
使い方
例えばこう
#include <iostream> #include "FizzBuzz.h" using namespace std; int main() { FizzBuzz fb; fb[3] = "Fizz"; fb[5] = "Buzz"; for(int i=0; i<=20; ++i){ cout << fb(i) << endl; } return 0; }
出力はこう
Fizz Buzz 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz Buzz 16 17 Fizz 19 Buzz
fb[n] = nの倍数の時に出力させたい文字列
これを最初に設定して、fb(n) とすれば文字列がstring型で返ってきます。
mapを継承しているので、clearするとかイテレータ回して何を設定したのかを確認するとか、色々出来ます。
これであなたも今日からFizzBuzzマスターだね!(