大袈裟にFizzBuzzを実装した話
なんとなくしたくなったからしただけです
開発経験はろくにないのでいじめないでください
半分ネタ記事です
FizzBuzzが何かについては適当にググってください
一応先に言っておくと普通は下のコードで何も問題ないです(多分)
#include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { if (i%15 == 0) { cout << "FizzBuzz" << endl; } else if (i%3 == 0) { cout << "Fizz" << endl; } else if (i%5 == 0) { cout << "Buzz" << endl; } else { cout << i << endl; } } }
成果物
github.com
入出力編
標準入出力なんて一般に使わないのでファイル入出力にする
標準入出力したいならechoとかcatとか適当に使えばいい
逆にリダイレクトで飛ばそうとすると環境によってBOMとか紛れ込むことあってめんどい
仕様編
FizzBuzzは3の倍数のときFizz、5の倍数のときBuzz、15の倍数のときFizzBuzzだけど拡張したいよね
nの倍数のときname(n)を出力するという条件がいくつかあって、出力の後ろにname(n)を連結していけばよさそう
また、デフォルトだと1~nについて出力するけど、st~enみたいに開始の位置もしていできたほうがいい
細かいinputの仕様はREADME見て
ファイルの数字をちょっと書き換えるだけで色々なFizzBuzzができてうれしい
アルゴリズム編
FizzBuzzなんて基本的に計算量気にする必要もないんだけど、仕様にあるように条件がたくさんあると遅いかもしれない
愚直に範囲内のすべての数について全ての条件を試すより、各条件についてnの倍数だけ見てそこの出力の後ろにname(n)を加えていくようにしたほうが高速
実装は超楽
雑に並列化とかしようかとも思ったけどキリがなさそうなのでやめた
ソースコード編
- repとか使ってはいけない
競プロerがたまに使うtype量を減らすためのマクロとか
当然使わない
- bits/stdc++.hとかインクルードしてはいけない
競プロerが好んで使う全てのライブラリをインクルードするもの
必要なものだけインクルードする
- using namespace stdとかしてはいけない
一般によく使われる
名前の衝突とか起きるとしんどいので使わない
- グローバル変数とか使ってはいけない
奇麗じゃないから使わない
名前衝突しやすくなるしあちこちからアクセスできるのは嬉しくない
- 一文字変数とか使わない
読みにくくなるから使わない
- インデントとかちゃんとする
当たり前だよなぁ
- コメントを書く
関数が何をやってるのかとか書くといいと思う
- エラー処理を書く
ファイルのopenとか失敗したらちゃんとエラー文吐いて異常終了する
また、不適切な入力とかもちゃんとはじくようにする。実行時エラーをなくす
- 処理を分割する
処理ごとに関数を作ろうな
その他編
- サンプルを追加する
サンプルがあると他の人が仕様を理解しやすい
動作チェックにも使える
- Makefileを書く
makeってやるだけでビルドできるようにする
サンプルはmake testってだけで動くようにする
cleanも書いておく
- ディレクトリ分割
ソースコード、入力、出力など役割に応じてディレクトリをわける
中身がないとaddできないので.gitkeepとか適宜置く
- GitHubを使う
GitHubで管理をする
ちゃんとgit add -pでaddするものをチェックするし、commitメッセージはちゃんとする
- READMEを書く
ちゃんと使い方とか何のプロジェクトなのかとか書く
イケてるREADMEがあると中身がhogeでもかっこいい
- LICENCEを追加する
適当にMITライセンスとかにする
ライセンスないと他の人が使いにくい
- .gitignoreを追加する
実行ファイルなどはcommitしない
- 自動ビルド
Travis-CIでちゃんとビルドができることをpushのたびにチェックする
使ったことないのでよくわからんが.travis.ymlを適当にそれっぽくする
一応サンプル(普通のFizzBuzz)がちゃんと動くかもチェックする
READMEにbadgeも貼ってカッコよくする