はじめに
こんにちは!ばーんです。
今回はC言語でFizzBuzz書いてみたのでその経緯などと、C言語初めて触った所感などを書いていきます。
ちなみにC言語は
- 自身が低レイヤの学びを大切にしており、もっと学んでいきたい
- 基本情報午後で書くタイミングがある
- アルゴリズム大好きでC++はいつか覚えたいと思っていた
といった理由で今回取り組みました。
初めての言語はとりあえずhello world書いてFizzBuzz書けばふんわり掴めるでしょー!
という安易な発想で進めていきました。
準備
今回はこちらのサイトを中心に進めていきました。内部仕様にも触れられており大変参考になりました。
環境構築
Windowsはいくつか手順踏むみたいです。
Macは1工程のみなので優しいですね^^(僕はXcode元々入れてたので0でした)
こちらの記事(↓)が見易かったですね
基本的な書き方(まずはhello world)
#include <stdio.h> /* 関数ライブラリを使うための記述。requireみたいなもの */
int main(void) /* 関数の実行宣言 */
{
printf("hello world\n"); /* hello worldの表示 */
// \nは改行コード
return 0; /* 正常終了の意味 */
}
// 実行結果
// hello world
実行方法
// sampleはファイル名です
// ccではなくgccでもOKです
// これはコンパイルして実行ファイル出力するだけ
cc sample.c
// こちらが実行コマンド
./a.out
node.jsで慣れてたのでコンパイルの処理と実行の処理分かれてるのはビックリしました。
(最初何回もコンパイルしてましたw)
ccとgccの違いについてはこちら(↓)
(http://zorinos.seesaa.net/article/458565453.html)
本題のFizzBuzz
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i <= 100; i++)
{
int FizzBuzz = i % 15;
int Fizz = i % 3;
int Buzz = i % 5;
if (FizzBuzz == 0 && i != 0)
{
printf("FizzBuzz: %d\n", i);
}
else if (Fizz == 0 && i != 0)
{
printf("Fizz: %d\n", i);
}
else if (Buzz == 0 && i != 0)
{
printf("Buzz: %d\n", i);
}
else
{
printf("i: %d\n", i);
}
}
return 0;
}
// 実行結果
// (中略)
Buzz: 95
Fizz: 96
i: 97
i: 98
Fizz: 99
Buzz: 100
何箇所か詰まったのが、
- 変数の宣言の場所
- 改行コード
- 変換指定子
といったところです。下記でさらっと説明していきます。
所感
変数宣言
変数を宣言する際に型の指定が必要。
これによってメモリの確保領域を変更しています。
グローバル / ローカル変数の概念もありますが今回JSライクに書こうとしたら詰まりましたw
(forの外側で変数宣言したものが値変わらずにそのままだった)
コンパイラの判断
コンパルした時にerrorだとコンパイルされません。
warningだと動きます。中の文章はどちらもちゃんと読む。
全部が全部型指定しなくても動いてくれます。が、一定のアルゴリズムで変換するので現代のモダンな言語みたいに「いい具合に」はやってくれませんでした
変換指定子 / エスケープシーケンス
"FizzBuzz: %d\n", i
のところでは
%d
が変換指定子
\n
がエスケープシーケンスです。
標準(入)出力を自分が理解し切れていないのでうまく説明できないのですが、
\n
書かないと改行されないとは思ってなかった…
VScodeの拡張機能
これがおすすめ(らしい)です。エラーも書いてる段階で表示されるし、入力補完もあったので使い易かったです。
ポインタ
入門サイトでもここがむずかしい!と書かれていたのですが、要は参照渡しなのか?値渡しなのか?ということかと(違ったらすいませんw)
構造体
変数宣言時に型を指定しますが、中に混ざっていてもOKというものみたい。
これもざっくりオブジェクトのようなもの(メソッドは入れれない)であってるはず…
標準ライブラリのinclude
JSでいうとこのrequireみたいなものですね(多分)。
C言語が低レイヤの言語なのでかなり簡単な処理でも関数の宣言が必要だったりします。
(例)文字と文字を結合する関数など
その数が中々多いので、使う関数をincludeする必要があります。
さいごに
最後までみていただいてありがとうございましたm_ m
全然ちゃうわ!みたいな自分の認識齟齬があれば言っていただけると大変助かりますm _m
次に何を作るか決めていないので「こんなのオススメやで」みたいなのあれば教えてください^^