
前回はMicrosoft社の Visual Studio で初めてC言語でソースコードを書いて、"hello, world" を表示するプログラムをビルドで作成するまですすめました。
今回は前回のソースコードがどんな内容だったのかを理解して、コードを変えてみて、簡単な迷路モドキを表示させるところまで行きたいと思います。
最初は内容は詳しくわからないけど、なんとなく動いているというところから始めて、徐々に理解していくというステップになるかと思いますが、一緒にがんばりましょー。(最初は覚えることが多くて特に大変です。)
前回、「hello, world」を表示するプログラムを作るために、こんなソースコードを書きました。
#include <stdio.h>
void main ()
{
printf("hello, world\n");
}
簡単にそれぞれの行がなにやってるのかをお話したいと思います。あ、その前になのですが、ソースコードは、基本的には上から下のほうに実行されていきます。今回のようなシンプルなソースコードはとりあえず一番上から順に見ていけば、どんなプログラムになるのか、想像がつきやすいです。
ワンポイント 一つ一つ読み込みながらCPUに命令を実行させることを逐次処理(ちくじしょり) と呼んだりします。
まず1行目の「#include <stdio.h>」ですが、この行はいろんなC言語のソースコードの頭にでてくる、"おまじない" として有名です。いろんなC言語の解説でもとりあえずおまじないとして最初に書いてー、と書かれてることが多いです。
「#include」はインクルード文と呼ばれます。
「#include
とりあえず、ファイルの最初に書いておけばOKくらいの認識でも構いません!後の方の章で必要になったとき詳しく説明するかと思います。
2行目の「void main ()」はmain関数と呼ばれます。
コンソールプログラムでは、プログラムはここから開始されます。
C言語の解説書によっては 「main()」とか「int main ()」 とか「int main( void )」とか「int main( int argc, char *argv[] )」なんて書いてあるかもですが、どれもちゃんと動きますし、どれも間違えというわけではないです。どれも main 関数でありプログラムがここからはじまるのも一緒です。
この行では main 関数を宣言 しており、この後の行で実際に main 関数の中身の命令を書いていく、という定義をしています。
詳細は後の章に譲るとし、まずは main関数を宣言&定義している ということ。main関数からコンソールプログラムが実行される、ということを覚えておけばOKです。
ちなみに、main関数をタイプミスで打ち間違えたりして一つもプロジェクトの中に存在しない状態だと、コンソールプログラムがスタートする場所がなくなってしまうので、ビルド時にエラーがでます。(プログラムが実行できないです)
この辺は具体的には次の記事で書こうと思います。
ワンポイント int main の書き方は C言語の仕様書(C11 N1570)には例として 「int main( void ) 」、「int main ( int argc, char *argv[] ) 」 の二つが挙げられています。ですのでどれが良いかと聞かれれば、一応上記2つがお勧めとなります。
3行めの「{」は関数の中身など、命令のカタマリを書くときの最初に書きます。一つの前の行が main 関数のはじまりを書いていていて、次の行に「{」と書いてあるので、これは「ここから main 関数の中身をかくよ」という意味
になります。こまかな一つ一つの役割は頭の片隅においておいて、最初のうちは、このあたりは丸暗記でも良いかと思います。 「{」は必ず「}」の記号で終わります。
「}」は5行目に書いてありますね。
この記号で関数の始まりと終わりの範囲を表すことができます。
main関数のブロック
ワンポイント C言語だけではなく、いろいろなプログラミング言語で、関数等の開始と終了を表す記号として、「{」「}」の記号が良く使われます。関数等で順番に命令が実行されるカタマリはブロック構造と呼ばれます。 英語ではココの記号「{」「}」のことを brace と呼びます。
(通常は)コンソールウィンドウ上に文字を出力するための 関数とよばれ、プログラムとして実行される命令の一つです。 今回のプログラムを実行すると「hello, world」と文字が出たと思いますが、この関数が文字を出しているのです。
数学で下のような式をみたことがあるかと思います。
f(x) = x + 1
これは変数x を与えてあげると、x + 1
という計算を行った結果を出す f という名前の関数です。
例えば x に 1 を入れると、 2 という結果になります。
C言語でも関数の形はとても似ています。
C言語で関数を呼び出すときは以下のように呼び出します。後の章で関数の書き方はまた詳しく書くので、ここでは基本だけお話しときます。
関数名 ( 1個目の引数, 2個目の引数, 3個目の引数,… );
引数(ひきすう)とは、 関数を呼び出すときに関数に渡してあげる数値や文字を渡す場所 です。関数によって引数で渡せる数やモノ(数字とか文字とか)が違います。引数がまったくない関数もあります。
引数と引数の間は 記号「,」(カンマ)で区切り ます。
今回の printf はカンマで区切ったりしていないので、1個の引数を指定して呼び出ししていますね。
最後に「;」(セミコロンと呼びます)が書いてありますが、これは関数(命令)を呼び出す記載はここまで。 という意味です。これを書き忘れるとエラー となります。(そしてセミコロンの書き忘れはとても良くあることです・・!)
ついでに、引数がまったくない関数の呼び出し方も書いておきます。
関数名 ( );
こんな感じで呼び出すことができます。 「(」「)」の間に何も書かなければ(見やすさのためにスペースとかいれても大丈夫です)引数0個の関数を呼び出すことができます。
記号「"」~「"」は文字のカタマリを定義するときに使います。
この文字のカタマリを文字列とよく呼びます。今回の printf でも使っています。
printf("hello, world\n");
オレンジ色で下線引いたところが文字列です。
printf 関数の1個目の引数が 「"hello, world\n"」ですので、今回は 「hello, world\n」 という文字列を表示せよ、という命令になります。
記号「,」カンマは関数を呼び出すときの引数の区切りとお話しましたが、「"」~「"」に囲まれた場所では、引数の区切りではなく、文字列の一部として扱われます。
最後の2文字「¥n」は「改行せよ」という特殊な文字を表します。 「¥」と「n」の2文字が連続で書いてないと効果がでません。ここで「¥」のかわりに 「\」(バックスラッシュと読みます)で文字が表示されていることがあるかもしれませんが、
これは「¥」(日本の円の記号)と同じ意味、同じ文字です。
海外のPC上では通常「¥」は「」で表示されます。
いくつか「」と組み合わせた2文字で効果を発揮する特殊文字というものが存在するので 必要に応じてお話しようと思いますが、特に重要なのはこの改行のための特殊文字です。 コイツ(\n)は改行コードとよく呼ばれています。 C言語だけでなくいろんなところで登場するので、覚えておくときっと役に立ちます。
ソースコードの解説が一通りおわったので、ソースコードの中身を書き換えて遊んでみましょう!printf は文字を表示する関数です。この中身を書き換えれば、別のメッセージを表示したりできます。
通常のOS環境であれば、日本語もそのまま入力して表示できるかと思います。下に書いたコードのように、printfの中身を日本語で書いてみて、
→ {keyboard}デバッグなしで開始(H)、もしくは、 + を押してみましょう。
#include <stdio.h>
void main ()
{
printf("日本語も大丈夫!\nここから2行目。\n");
}
うまくいくとウィンドウが表示され結果が見えるはず。
printfで日本語を2行表示
実行するとこんな結果になりました。
「日本語も大丈夫!」の後に「\n」があり、コンソールに表示されるときここで改行が入ります。 その後、「ここから2行目」という文字列が表示され、その後に「\n」でさらに改行されて、プログラムが終了する、という流れです。
ワンポイント 「続行するには何かキーを押してください・・・」はビルドの設定で、プログラム終了時にキー入力するように前の記事 で設定したために表示されています。
今度は printf 関数を複数書いてみましょう。
#include <stdio.h>
void main ()
{
printf("日本語も大丈夫!\nここから2行目。\n");
printf("3行目だ!");
printf("3行目の続き。\n");
}
複数のprintf関数で文字を表示
main関数からプログラムがスタートし、上から順番に実行されていきます。
順番に追っていけばそんなに難しくないですね。
簡単な迷路みたいなものを表示してみます。とりあえず今回は表示するだけなので、印刷して紙で遊ぶことくらいしかできないです。笑 実行するたびに違う迷路ができあがるものはこの記事シリーズで後々ご紹介しようと思います。
#include <stdio.h>
void main()
{
printf("あなたは身に覚えのない借金を背負い\n");
printf("洞窟で財宝を探しています。\n");
printf("財宝までつながってるのは1~3番のうち何番でしょう?\n");
printf("*--+--+-----+---+----+---*\n");
printf("|1 | 2| | | | |\n");
printf("| | | | | | | |\n");
printf("| +-----+----+ +-+ | | |\n");
printf("| | +-++ | |\n");
printf("+----+ -----+ | | | | |\n");
printf("| 3 | +-+-+ --+ ++ |\n");
printf("| | | | | | | |\n");
printf("| ++-++-+ | | +-----+ -+\n");
printf("| --+ | | +-+ | |\n");
printf("| | | | 財宝 |\n");
printf("+-----+---+---+-+--------+\n");
}
結果、ちゃんと迷路が表示されました!
printf で財宝探しの迷路を表示
迷路の答えは・・・わかりましたでしょうか。笑 ぱっと見、ちゃんと道が空いているのかみえずらくて混乱するかもです。
単純に文字を表示する方法はこれで分かったかと思います。
次の記事ではエラーを取り除く初歩的な見方を書いていこうと思います。
今回はここまで。お疲れさまでした。
あれっ、迷路に出口つくってない・・。 そしたらどれをえらんでも結局・・。
出口のない迷宮
更新日 | 更新内容 |
---|---|
2018.6.21 | アイキャッチなどを修正 |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: