プログラミング③ プログラミングの約束事

プログラミング

実際にプログラムを書きながら、最も大事で、根幹をなす考え方を学習します。

最速でプログラミング環境を手に入れるために、オンラインサービスを利用させてもらいます。

「OnlineGDB」というサービスです。
C言語、C++言語、C#言語、Java言語、Python言語など多数の言語で書かれたプログラムを実行できます。
以下のURLにアクセスしてください。

GDB online Debugger | Compiler - Code, Compile, Run, Debug online C, C++
Online GDB is online compiler and debugger for C/C++. You can compile, run and debug code with gdb online. Using gcc/g++...

このサイトの右上、「language」から「C」を選択します。
まずはC言語でプログラムを記述してみます。

もともと書かれているコードを消して、
以下のソースコードを入力してください。

#include <stdio.h>

int main()
{
    char hello[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
    
    printf("%s \n", hello);
    return 0;
}

入力後、「Run」を押します。

すると、下の「input」の欄に実行結果が表示されます。
「Hello」が表示されましたでしょうか。

まず「#include <stdio.h>」に注目ください。stdioは「Standard Input/Output」の意味です。
「#include」は誰かが作ったプログラムの機能を利用するための命令です。
stdioには画面に文字を出力する「printf」関数が定義され、そして、その機能が提供されています。
つまり、「printf」を使用するためには、絶対にこの文が必要になります。
使いたい関数と、その関数が定義されているヘッダーファイルやライブラリファイルの組み合わせは、インターネットで検索することができます。
たとえば、以下のように、「必要条件」に「必須ヘッダー」として<stdio.h>との記載があります。

printf、_printf_l、wprintf、_wprintf_l
詳細情報: printf、_printf_l、wprintf、_wprintf_l

他人が作った関数のすべてを覚えている人はいませんので、常に使い方を調べて、指示通りに記述するのがプログラムの基本です。

次に、「int main()」と書きます。ここには2つの大事なことがあります。

まずは、「int」です。
intは数字の型です。開発環境によって多少の差異があるのですが、一般に、

データ型の範囲
詳細情報: データ型の範囲

のように数値の表現方法と代入できる範囲が決まっています。ざっくりとした使用用途は以下の通りです。

int:桁数が少ない整数で、0,1,2,3…などの値です。ループを回すときなどに、何回目のループなのかを入れておくための数値などに使います。
float:実数。小数点があるもので、計算速度重視であれば、float型で計算します。
double:実数。値が大きい、あるいは有効数字を多くとりたいなどの理由で、floatでは値が溢れそうなら、こちらを使用します。

これらの数値の型ですが、適当に定義すると溢れて、周囲のプログラムを巻き込んでコンピュータのデータを破壊する可能性もあります。通常は、データ破壊が起きる前にプログラムが緊急停止しますが、グラフィックカードのメモリなどにアクセスしているときは、エラーを吐く前に、データが壊れたりします…

データ破壊のリスクがあるのはC言語の特徴です。
ちなみに、「データを壊さないように、コンピュータが最適な変数範囲を決めてくれればよいではないか」と考えるのは当然です。そのため、C言語以降の言語では、変数を勝手に決めてくれたりします。
便利なのですが、その分、プログラムの実行速度が落ちます。また、変数の型を理解していない人が書いたプログラムでは、データ構造がおかしいのに、無理にコンピュータが頑張って辻褄合わせをしてしまうがために、その間違いの発見が遅れたりすることもあります。
型指定はめんどくさいことですが、数値の状態把握はプログラミングの基本スキルです。

続いて、「main()」です。
まず「()」が付いている命令は「関数」とよばれていて、機能のひとまとまりを表します。
先ほど紹介した「printf(…)」も文字を出力する機能をもった関数です。

ただし、「main()」関数は特殊な関数です。すべてのプログラムに、ひとつだけあります。
この関数の使用は必須なので、標準で組み込まれており、「#include」などで取り込む必要はありません。
コンピュータはプログラム内の「main()」関数から計算を始めます。
関数は「{」から計算を始め、「}」で終了します。

更に続いて、「char hello[6] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’ };」です。
「char」は character の意味で、その後に続く変数 「hello」 が「文字」であることを示しています。
「hello」は僕が勝手に名付けた変数名です。これを「mozi」などに書き換えても問題ありません。ただの名前なので。
ここで、C言語らしい(めんどくさい)記述があります。それがhelloの後ろの「[6]」です。これは6文字分を用意しなさい、という意味です。6文字限定です。入れたい文字の数(Helloの5文字+終端を表す文字の「\0」で、計6文字)を確認して、過不足なくメモリ上に6文字分の領域を確保します。
この表現も、新しい言語ではコンピュータが勝手に文字数を調べて、必要十分な文字数分のデータ領域を確保してくれることが多いです。ですが、数値の型の指定と同様に、C言語ではそのような「おせっかい」はしません。
機械の性能を限界まで引き出すときには、データ管理などを人間が詳細に行う必要があります。そのため、データ管理ができるに越したことはありません。

変数helloに文字が入ったので、その文字を「printf(“%s \n”, hello);」で出力します。
またまたC言語らしく、「%s」で「文字(char)として出力してね」と丁寧にコンピュータに指示しています。

最後に、「return 0;」で「main()」関数が終了したことをコンピュータに知らせます。
「0」を返していますが、「int」型の数値なら何でもよいです。
数値に意味を持たせるなら、戻ってくる数値毎に処理を記述しないといけないのですが、このプログラムにはその記述がないので、どんな数値が戻ってきても無視されます…

コメント